Ukontrolleret formatstreng - Uncontrolled format string

Ukontrolleret formatstreng er en type softwaresårbarhed opdaget omkring 1989, som kan bruges i sikkerhedsudnyttelser . Oprindeligt tænkt ufarligt kan formatstrengudnyttelser bruges til at crash et program eller til at udføre skadelig kode. Problemet stammer fra brugen af ukontrolleret brugerinput som formatstrengparameteren i visse C -funktioner, der udfører formatering, f.eks printf(). En ondsindet bruger kan blandt andet bruge tokens %sog %xformatere til at udskrive data fra opkaldsstakken eller muligvis andre steder i hukommelsen. Man kan også skrive vilkårlige data til vilkårlige steder ved hjælp af %nformatetokenet, som kommandoer printf()og lignende funktioner til at skrive antallet af bytes, der er formateret til en adresse, der er gemt på stakken.

detaljer

En typisk udnyttelse bruger en kombination af disse teknikker til at tage kontrol over instruktionsmarkøren (IP) i en proces, for eksempel ved at tvinge et program til at overskrive adressen på en biblioteksfunktion eller returadressen på stakken med en markør til nogle ondsindede shellcode . Polstringsparametrene til formatspecifikationer bruges til at styre antallet af bytes -output, og %xtoken bruges til at pope bytes fra stakken, indtil begyndelsen af ​​selve formatstrengen er nået. Starten på formatstrengen er udformet til at indeholde den adresse, %nformatformatet derefter kan overskrive med adressen på den ondsindede kode, der skal udføres.

Dette er en almindelig sårbarhed, fordi formatbugs tidligere blev anset for at være harmløse og resulterede i sårbarheder i mange almindelige værktøjer. MITRE's CVE- projekt lister omkring 500 sårbare programmer fra juni 2007, og en trendanalyse rangerer det som den 9. mest rapporterede sårbarhedstype mellem 2001 og 2006.

Formatstrengbugs vises oftest, når en programmør ønsker at udsende en streng, der indeholder brugerleverede data (enten til en fil, til en buffer eller til brugeren). Programmereren kan fejlagtigt skrive i printf(buffer)stedet for printf("%s", buffer). Den første version fortolker buffersom en formatstreng og analyserer alle formateringsinstruktioner, den kan indeholde. Den anden version udskriver simpelthen en streng til skærmen, som programmereren havde til hensigt. Begge versioner opfører sig identisk i mangel af formatspecifikationer i strengen, hvilket gør det let for fejlen at gå ubemærket hen over udvikleren.

Formateringsfejl opstår, fordi C's argument, der består konventioner, ikke er typesikre . Især varargstillader mekanismen funktioner at acceptere et vilkårligt antal argumenter (f.eks. printfVed at "poppe" så mange argumenter ud af opkaldsstakken, som de ønsker, og stole på de tidlige argumenter for at angive, hvor mange yderligere argumenter der skal poppes, og af hvilke typer .

Formatstrengfejl kan forekomme på andre programmeringssprog udover C, f.eks. Perl, selvom de vises med mindre frekvens og normalt ikke kan udnyttes til at udføre kode efter angriberens valg.

Historie

Formatbugs blev først noteret i 1989 ved fuzz -testarbejdet udført ved University of Wisconsin, som opdagede en "interaktionseffekt" i C -shell (csh) mellem dens kommandohistorikmekanisme og en fejlrutine, der antog sikker strengindgang.

Brugen af ​​formatstrengfejl som angrebsvektor blev opdaget i september 1999 af Tymm Twillman under en sikkerhedsrevision af ProFTPD -dæmonen . Revisionen afdækkede en, snprintfder direkte videregav brugergenererede data uden en formatstreng. Omfattende tests med konstruerede argumenter til printf-stilfunktioner viste, at det var muligt at bruge dette til privilegium-eskalering. Dette førte til den første opslag i september 1999 på Bugtraqs mailingliste vedrørende denne klasse af sårbarheder, herunder en grundlæggende udnyttelse. Det var dog stadig flere måneder, før sikkerhedssamfundet blev opmærksom på de fulde farer ved sårbarheder i formatstrengen, da bedrifter for anden software ved hjælp af denne metode begyndte at dukke op. De første bedrifter, der bragte problemet til almindelig bevidsthed (ved at give fjernadgang via root via kodeudførelse ) blev offentliggjort samtidigt på Bugtraq -listen i juni 2000 af Przemysław Frasunek og en person, der bruger kaldenavnet tf8 . De blev kort efterfulgt af en forklaring, indsendt af en person, der brugte kaldenavnet lamagra . "Format bugs" blev sendt til Bugtraq -listen af ​​Pascal Bouchareine i juli 2000. Det seminal papir "Format String Attacks" af Tim Newsham blev offentliggjort i september 2000, og andre detaljerede tekniske forklaringspapirer blev offentliggjort i september 2001, f.eks. Exploiting Format String Sårbarheder , af team Teso .

Forebyggelse i kompilatorer

Mange kompilatorer kan statisk kontrollere formatstrenge og producere advarsler for farlige eller mistænkte formater. I GNU Compiler Collection , de relevante oversætterflag er, -Wall, -Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteral, og -Wformat=2.

De fleste af disse er kun nyttige til at opdage dårlige formatstrenge, der kendes på kompileringstidspunktet. Hvis formatstrengen kan komme fra brugeren eller fra en ekstern kilde til applikationen, skal applikationen validere formatstrengen, før den bruges. Der skal også udvises forsigtighed, hvis applikationen genererer eller vælger formatstrenge i farten. Hvis GNU C-biblioteket bruges, kan -D_FORTIFY_SOURCE=2parameteren bruges til at registrere visse typer angreb, der forekommer i løbetid. Den -Wformat-nonliteralkontrol er strengere.

Opdagelse

I modsætning til mange andre sikkerhedsproblemer er grundårsagen til sårbarheder i formatstreng relativt let at opdage i x86 -kompilerede eksekverbare filer: For printf-familiefunktioner indebærer korrekt brug et separat argument for formatstrengen og de argumenter, der skal formateres. Fejlagtig brug af sådanne funktioner kan opdages ved blot at tælle antallet af argumenter, der sendes til funktionen; en 'argumentmangel' er derefter en stærk indikator på, at funktionen blev misbrugt.

Påvisning i x86-kompilerede binære filer

Det er ofte let at tælle antallet af argumenter på x86 på grund af en opkaldskonvention, hvor den, der ringer, fjerner de argumenter, der blev skubbet ind på stakken ved at tilføje til stabelmarkøren efter opkaldet, så en simpel undersøgelse af stakkorrektionen giver antallet af argumenter overført til printf-familiefunktionen. '

Se også

Referencer

Yderligere læsning

eksterne links