Șir de format necontrolat - Uncontrolled format string
Șirul de format necontrolat este un tip de vulnerabilitate software descoperit în jurul anului 1989, care poate fi utilizat în exploit-uri de securitate . Inițial considerat inofensiv, exploatările de șiruri de format pot fi utilizate pentru a bloca un program sau pentru a executa cod dăunător. Problema provine din utilizarea intrării de utilizator necontrolate ca parametru șir de format în anumite funcții C care efectuează formatare, cum ar fi printf(). Un utilizator rău intenționat poate utiliza %sși %xformata jetoane, printre altele, pentru a imprima date din teancul de apeluri sau, eventual, din alte locații din memorie. Se poate scrie, de asemenea, date arbitrare în locații arbitrare folosind %nsimbolul format, care comandă printf()și funcții similare pentru a scrie numărul de octeți formatat la o adresă stocată în stivă.
Detalii
Un exploit tipic folosește o combinație a acestor tehnici pentru a prelua controlul indicatorului de instrucțiuni (IP) al unui proces, de exemplu prin forțarea unui program să suprascrie adresa unei funcții de bibliotecă sau adresa de returnare din stivă cu un pointer către un anumit program rău intenționat. shellcode . Parametrii de umplere pentru specificatorii de format sunt folosiți pentru a controla numărul de octeți ieșiți, iar %xsimbolul este folosit pentru a scoate octeți din stivă până când se ajunge la începutul șirului de format. Începutul șirului de format este creat pentru a conține adresa pe care %ntoken-ul de format o poate suprascrie cu adresa codului rău intenționat de executat.
Aceasta este o vulnerabilitate obișnuită, deoarece erorile de format erau considerate anterior inofensive și au dus la vulnerabilități în multe instrumente comune. Proiectul CVE al MITRE enumeră aproximativ 500 de programe vulnerabile începând cu iunie 2007, iar o analiză a tendințelor îl clasează pe locul 9 cu cel mai raportat tip de vulnerabilitate între 2001 și 2006.
Bug-urile de șiruri de format apar cel mai frecvent atunci când un programator dorește să scoată un șir care conține date furnizate de utilizator (fie într-un fișier, într-un buffer sau utilizator). Programatorul poate scrie greșit printf(buffer)în loc de printf("%s", buffer). Prima versiune se interpretează bufferca un șir de format și analizează orice instrucțiuni de formatare pe care le poate conține. A doua versiune tipărește pur și simplu un șir pe ecran, așa cum intenționează programatorul. Ambele versiuni se comportă identic în absența specificatorilor de format din șir, ceea ce face ușor ca greșeala să treacă neobservată de dezvoltator.
Erorile de format apar deoarece convențiile de trecere a argumentelor lui C nu sunt sigure pentru tipuri . În special, varargsmecanismul permite funcțiilor să accepte orice număr de argumente (de exemplu printf) prin "popping" cât de multe argumente din stiva de apeluri doresc, având încredere în argumentele timpurii pentru a indica câte argumente suplimentare trebuie să apară și de ce tipuri .
Bug-urile de șiruri de format pot apărea în alte limbaje de programare în afară de C, cum ar fi Perl, deși apar cu o frecvență mai mică și de obicei nu pot fi exploatate pentru a executa codul la alegerea atacatorului.
Istorie
Bug-urile de format au fost observate pentru prima dată în 1989 prin munca de testare fuzz efectuată la Universitatea din Wisconsin, care a descoperit un „efect de interacțiune” în shell-ul C (csh) între mecanismul său de istoric de comandă și o rutină de erori care presupunea intrarea șirului sigur.
Utilizarea bug-urilor de șiruri de format ca vector de atac a fost descoperită în septembrie 1999 de Tymm Twillman în timpul unui audit de securitate al demonului ProFTPD . Auditul a descoperit un snprintfcare a transmis direct datele generate de utilizator fără un șir de format. Testele extinse cu argumente inventate pentru funcțiile în stilul printf au arătat că utilizarea acestui lucru pentru escaladarea privilegiilor era posibilă. Acest lucru a condus la prima postare în septembrie 1999 pe lista de discuții Bugtraq cu privire la această clasă de vulnerabilități, inclusiv un exploit de bază. Cu toate acestea, au trecut încă câteva luni până când comunitatea de securitate a devenit conștientă de pericolele depline ale vulnerabilităților șirurilor de format, deoarece exploatările pentru alte programe software care folosesc această metodă au început să apară. Primele exploit-uri care au adus problema la conștientizarea comună (prin furnizarea accesului root la distanță prin executarea codului) au fost publicate simultan pe lista Bugtraq în iunie 2000 de către Przemysław Frasunek și o persoană care utilizează porecla tf8 . La scurt timp au fost urmate de o explicație, postată de o persoană folosind porecla de lamagra . „Format bugs” a fost postat pe lista Bugtraq de Pascal Bouchareine în iulie 2000. Lucrarea seminală „Format String Attacks” de Tim Newsham a fost publicată în septembrie 2000 și alte lucrări detaliate cu explicații tehnice au fost publicate în septembrie 2001, cum ar fi Exploatarea vulnerabilităților șirului formatului. , de echipa Teso .
Prevenirea în compilatoare
Mulți compilatori pot verifica în mod static șirurile de format și pot produce avertismente pentru formate periculoase sau suspecte. În Compiler Collection GNU , indicatorii de compilare sunt relevante, -Wall, -Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteral, și -Wformat=2.
Cele mai multe dintre acestea sunt utile numai pentru detectarea șirurilor de format greșit, care sunt cunoscute în timpul compilării. Dacă șirul de format poate proveni de la utilizator sau de la o sursă externă aplicației, aplicația trebuie să valideze șirul de format înainte de a-l utiliza. De asemenea, trebuie să aveți grijă dacă aplicația generează sau selectează șiruri de format din mers. Dacă se utilizează biblioteca GNU C, -D_FORTIFY_SOURCE=2parametrul poate fi utilizat pentru a detecta anumite tipuri de atacuri care apar în timpul rulării. -Wformat-nonliteralVerificarea este mai stricte.
Detectare
Contrar multor alte probleme de securitate, cauza principală a vulnerabilităților șirului de format este relativ ușor de detectat în executabilele compilate x86: Pentru printffuncțiile -familie, utilizarea corectă implică un argument separat pentru șirul de format și argumentele care trebuie formatate. Utilizările defectuoase ale acestor funcții pot fi identificate prin simpla numărare a numărului de argumente transmise funcției; o „deficiență de argument” este atunci un indicator puternic al faptului că funcția a fost utilizată greșit.
Detectare în binare compilate x86
Numărarea numărului de argumente este de multe ori ușor pe x86 datorită unei convenții de apelare în care apelantul elimină argumentele care au fost împinse pe stivă prin adăugarea la indicatorul stivei după apel, astfel încât o simplă examinare a corecției stivei dă numărul de argumentele trecute printffuncției -familie. '
Vezi si
- Scripturile între aplicații exploatează un tip similar de eroare de programare
- Scripturi între site-uri
printfscanf- syslog
- Validare necorespunzătoare a intrării
- Injecția SQL este un atac similar care reușește atunci când intrarea nu este filtrată
Referințe
Lecturi suplimentare
- Cowan, Crispin (august 2001). FormatGuard: protecție automată împotriva Vulnerabilităților șirului de format printf (PDF) . Lucrările celui de-al 10-lea Simpozion de securitate USENIX.
- Cowan, Crispin (ianuarie-februarie 2003), Software Security for Open-Source Systems , IEEE Security & Privacy, IEEE Computer Society
- Klein, Tobias (2004). Buffer Overflows und Format-String-Schwachstellen - Funktionsweisen, Exploits und Gegenmaßnahmen (în germană) (1 ed.). dpunkt.verlag . ISBN 3-89864-192-9. (vii + 663 pagini)
- Seacord, Robert C. (septembrie 2005). Codificare securizată în C și C ++ . Addison Wesley . ISBN 0-321-33572-4.
linkuri externe
- Introducere în exploatarea șirurilor de format 02.05.2013, de Alex Reece
- scut / team- TESO Exploiting Format String Vulnerabilities v1.2 2001-09-09
- Clasificarea amenințărilor WASC - Formatarea atacurilor de șiruri
- Standarde CERT Secure Coding
- CERT Secure Coding Initiative
- Vulnerabilități cunoscute la proiectul CVE al MITRE.
- Secure Programming with GCC and GLibc (2008), de Marcel Holtmann