Buffer overflow
Från Unix.se, den fria unixresursen.
En buffer overflow ("buffertöverflöde") är en typ av problem i program som uppstår när programmet skriver mer i en buffert än vad som allokerats.
Om bufferten ligger på stacken kan man bland annat skriva över returadressen för en funktion, som lagras efter de olika variablerna. Lämpligt är då att peka returadressen till bufferten man skrev över, där man då lagrat lämplig maskinkod för att starta exempelvis ett skal. Oftast får inte maskinkoden innehålla värdet 0 (0x00), eftersom det signalerar en strängs slut, och då slutar oftast programmet kopiera. Detta kan ställa till besvär eftersom många maskinkodsinstruktioner för de flesta arkitekturer har just 0x00 någonstans i sig, och då får man försöka hitta en annan instruktion som gör samma sak. I x86 kan man t.ex. istället för mov eax,0
skriva xor eax, eax
.
Om bufferten i stället ligger på heapen, alltså dynamiskt allokerat minne, kan man istället skriva över olika kontrollstrukturer som är lagrade efter bufferten. Dessa är olika för olika implementationer av malloc(), så exakt hur man gör för att utnyttja en buffer overflow på heapen varierar för olika operativsystem.
Ett sätt att försöka skydda sig mot stack-baserade buffer overflows är att operativsystemet sätter stacken till icke-exekverbar. Tyvärr går inte detta att göra på x86 eftersom det bara går att sätta antingen läs- eller skrivbehörighet, där läsbehörighet också innebär att man har rätt att exekvera. Det är detta som AMD har åtgärdat med sitt nya "virusskydd" NX. (Att sätta stacken icke-exekverbar är inte heller ett fullständigt skydd, men det är åtminstone en bit på vägen.)
Liknelse
En buffer overflow kan liknas vid en massa pappersbitar som ligger i ett glas med vatten. Du fyller på vatten tills glaset fylls till randen, detta är när bufferten är helt full. Men i stället för att sluta hälla fortsätter du och pappersbitarna och vattnet rinner ut och lägger sig på bordet. Tänk nu att pappersbitarna är fyllda med bokstäver, och det ligger en tidning under vattenglaset. Om nu vattnet hälls upp tills så att pappersbitarna lägger sig över tidningen och torkar så kan rent teoretiskt ett nytt meddelande framträda i tidningen, utan att du märker att det inte stämmer. Till exempel kan det vara ett falskt utfärdande om att man omedelbart ska söka skydd undan t.ex. krig. När du sedan söker skydd kommer någon och länsar ditt hus.
Den ovanstående liknelsen är naturligtvis osannolik, men i datorer är spelreglerna annorlunda, och buffer overflows blir då inte omöjliga.
Externa länkar
- Smashing The Stack For Fun And Profit (http://www.phrack.org/phrack/49/P49-14)
- Secure programmer: Countering buffer overflows (http://www-106.ibm.com/developerworks/linux/library/l-sp4.html)