Vad är Stack Smashing? Kan det fixas?

0
169
Shutterstock/Gabor Tinz

Varje minut av produktionsstopp kostar i allmänhet ett företag pengar. Om din ansökan har en allvarlig fråga som orsakar stackkrossning, är du ute efter en åktur. Lär dig vilken stackkrossning som är på förhand och vad som kan göras åt det!

Vad är Stackkrossning ?

< p> Arbetar som kvalitetssäkringsingenjör kommer man förr eller senare att stöta på termen stack smashing . Som utvecklare kommer man sannolikt att upptäcka den här termen ännu tidigare, särskilt om man har infört ett fel i koden, vilket orsakar en krossad stack. Det är relativt enkelt (som i & # 8216; något lätt & # 8217; ) för en utvecklare att göra ett misstag som introducerar stackkrossning. När du lär dig mer om stackkrossning är användaren troligen redan skadad.

Stackkrossning kan hända ofrivilligt & # 8211; till exempel när utvecklaren introducerade ett fel som orsakade stackkrossning & # 8211; eller skadligt & # 8211; en angripare som på något sätt försöker flyta över eller korrumpera stacken i ett program.

Stackkrossning är en något löst definierad term som kan peka på olika problem och kan komma från en mängd olika källor. De två mest framträdande frågorna som kan orsaka stackkrossning är; 1) att skriva/överallokera för mycket data i en viss del av stacken och därigenom skriva över en annan del av stacken, och 2) där någon extern källa (skadlig eller inte) skrivit över ett annat programs stack, även om detta är mycket mindre vanligt.

Så vad är en stack? Detta är också en löst definierad term. Generellt sett hänvisar en stack till en programbearbetningsstack, en stack med funktioner som definierats i ett givet program/en viss programvara.

Annonsering

Börja med att föreställa dig en stapel badrumsplattor staplade upp, redo att används av en plattsättare. Detta är en ganska bra representation av en datorstapel, med några modifieringar. Om varje kakel var lite förskjuten från den tidigare skulle det vara en bättre bild, och vi kommer snart att se varför.

Shutterstock/Piotr Debowski

Bild att varje staplad sida är en funktion i datorprogrammet. Den mest grundläggande funktionen är på botten och kan till exempel vara huvudfunktionen () i ett C- eller C ++ – program. C och C ++ är två programmeringsspråk som använder stacken i stor utsträckning.

Var och en av dessa funktioner i C/C ++ – programmet kommer att ha ett namn och sannolikt en uppsättning inkommande variabler och utgående variabler. I förenklade termer, bild om en av dessa variabler hade en längd på tio tecken och någon annan funktion av misstag skrev 100 tecken till den variabeln. Detta kan förstöra hela stacken.

När det gäller exemplet ovan, tänk dig att någon med en hammare slår den första plattan lite för hårt och därigenom krossar alla andra brickor. Eh voila; stack smashing 😉

Analogin fungerar eftersom, precis som alla brickor nu är trasiga i vår fiktiva minnesbild, kommer en krossad stack att resultera i & # 8216; trasiga funktioner & # 8217; om du vill. Varje kakeloffset är en funktion kapslad djupare & # 8211; mer om trasiga funktioner i nästa avsnitt.

Felsökning Smashed Stack (s)

Medan tekniskt en hänvisning till & # 8216; trasiga funktioner & # 8217; kanske inte är helt korrekt, det vill säga det finns sannolikt bara en trasig funktion, och det kan till och med inte vara någon trasig funktion när det finns en extern attack eller ett felaktigt program, det är ett utmärkt sätt att tänka på en krossad stack.

Annonsering

Plötsligt kan variabel- och funktionsnamn förväxlas, och en backtrace (flödet av funktioner som datorn tog för att komma fram till en viss funktion som kraschade och (i vårt exempel) krossade stacken) är inte meningsfullt längre.

Generellt sett, när vi tittar på en backtrace, kommer det att ha ett tydligt flöde av funktioner som kallades. Medan ett kraschande program inte omedelbart kan kallas & # 8216; hälsosamt, & # 8217; när det gäller backtracing/debugging är det här en & # 8216; hälsosam & # 8217; backtrace ser ut som:

När en stack är skadad, dock blir felsökning mycket svårare. Stapeln kan se ut så här:

Detta är ett exempel på ett stack-krossproblem som inträffade i MySQL, databasservern (se bilagan log.txt till MySQL Bug 37815 för hela utdata) under 2008, vilket orsakade att databasserverdemon (mysqld) avslutades. p> Även om operativsystemets bibliotek libc.so.6 i det här fallet verkar ha hanterat stacken smashing ganska bra (med hjälp av en del förstärkningsfunktioner i __fortify_fail-funktionen) fanns problemet någonstans i koden och har sedan rättats.

Observera också att i det här fallet ser vi inte lösta funktionsnamn, vi visar bara det binära namnet (intressant nog verkar problemet ha varit i klienten (mysql) som orsakar servern (mysqld) att avslutas) som är mysql, tillsammans med en minnesadress för funktionen: mysql [0x8051565], mysql [0x80525c7] och mysql (main + 0x4f8) [0x8053198].

Annons

Normalt, när vi använder felsökningssymboler (ref nedan för en artikel om GDB som förklarar vad felsökningssymboler är i detalj), skulle vi se funktionsnamn med variabler, och även med vissa nivåer av binär optimering/minifiering på plats skulle vi åtminstone se funktionsnamn, precis som vi ser i det första & # 8216; friska & # 8217; ovanför.

I fallet med en krossad stack garanteras dock aldrig utdata från funktionsnamn, variabelnamn eller värden och ofta kompletterar mumbo-jumbo 🙂 Vi kan till och med se olika funktionsnamn eller en helt trasslig stack (en annan lingo som ofta används av IT-folk) av olika funktionsnamn som inte ger mycket mening (och sannolikt är fiktiva/osanna eftersom stacken skrivs över på något sätt).

Detta gör det svårare för både testingenjören (som kan få många olika resultat för en enda bugg, vilket komplicerar känd buggfiltreringsmekanismhantering) såväl som utvecklaren (som sannolikt kommer att behöva använda steg-för-steg-spårning eller en omvänd exekveringsfelsökare som RR för att upptäcka felet till hands).

Vad ska jag göra när du möter Stack Smashing?

Om du stöter på stackkrossning är det första du vill göra att förstå problemet och miljön lite bättre för att känna källan. Om du har en populär webbserver exponerad på Internet med massor av spelanvändare som försöker vinna en turnering medan servern också bryter Bitcoin, vill du anta möjligheten till fel spel och ta reda på om någon rör sig med server.

I de flesta fall kommer emellertid problemet bara att vara ett programfel. Medan jag säger & # 8216; bara & # 8217; , problemet kan vara mycket viktigt, kan leda till driftstopp för tjänster, kan kosta mycket pengar och slutligen kanske inte kunna åtgärdas. Till exempel kan en databasserver krascha kontinuerligt när den startas på grund av att data är i ett visst tillstånd i kombination med en brist eller begränsning i koden.

Om en sådan situation förvärras av att inte stapla krossar, eller med andra ord, inte kunna skapa en ren backtrace av problemet, kommer felsökning att vara mer involverad och ibland nästan omöjlig. Rädsla dock inte, samma grundläggande felsökning som med något fel eller applikationsfel/krasch/problem förblir detsamma.

Annons

Läs noga varje bit av loggfilerna före, under och efter problemet inträffade. Ta några säkerhetskopior och försök sedan igen. Misslyckas det igen eller inte? Undersök felen, delarna av stacken och till och med ramarna (dvs. enskilda stackfunktioner som visas, som do_the_maths-funktionen i vår ursprungliga & # 8216; hälsosamma & # 8217; stack-spårning) kan placeras i dina favoritsökmotorer.

Att sammanfoga (med ett mellanslag) de mest selektiva (överst) kraschramarna och söka efter samma online hittar dig ofta en befintlig felrapport för problemet du står inför. I fallet med stackkrossning är det troligt att dessa ramar (funktionsnamn) har blivit förvirrade och därför inte längre kan användas på samma sätt. Om du ser ett påståendemeddelande (ett utvecklingsinställd påstående i koden) av något slag, sök också efter det.

Logga alltid in en ny felrapport om problemet inte verkar vara loggat online ännu (du kan hjälpa andra som ser samma sak!) och ge så mycket information om problemet som du kan hitta. Tusentals buggrapporter mot lika många applikationer loggas online varje dag. Förhoppningsvis är supportteamet för din stack-smashing-applikation till hands för att hjälpa dig snabbt.

Du kanske också vill läsa vår felsökning med GDB: artikeln Komma igång, eftersom den bygger vidare på hur C- och C ++ -program (och andra) kan felsökas med GDB-felsökaren. Det förklarar vidare koncepten för en stack i detalj.