Nekontrolovaný formátovací řetězec - Uncontrolled format string
Nekontrolovaný formátovací řetězec je typ zranitelnost softwaru objeveny kolem roku 1989, které lze použít v bezpečnostní exploity.[1] Původně považované za neškodné, využití formátovacích řetězců lze použít pád program nebo spustit škodlivý kód. Problém pramení z použití nezaškrtnutý vstup uživatele jako formátovací řetězec jistě parametr C funkce provádějící formátování, například printf ()
. Uživatel se zlými úmysly může použít % s
a %X
formátovat tokeny, mimo jiné k tisku dat z zásobník volání nebo možná jiná umístění v paměti. Jeden může také psát libovolná data na libovolná místa pomocí % n
formátovat token, který příkazy printf ()
a podobné funkce pro zápis počtu bytů naformátovaných na adresu uloženou v zásobníku.
Detaily
Typický exploit využívá kombinaci těchto technik k převzetí kontroly nad ukazatel instrukce (IP) procesu,[2] například vynucením programu, aby přepsal adresu funkce knihovny nebo zpáteční adresu v zásobníku ukazatelem na nějaký nebezpečný shell kód. Parametry výplně do specifikátorů formátu se používají k řízení počtu výstupů bajtů a %X
token se používá k vyskakování bajtů ze zásobníku, dokud není dosažen začátek samotného formátovacího řetězce. Začátek formátovacího řetězce je vytvořen tak, aby obsahoval adresu, kterou % n
token formátu lze poté přepsat adresou škodlivého kódu, který má být spuštěn.
Toto je běžná chyba zabezpečení, protože chyby formátu byly dříve považovány za neškodné a vedly k chybám zabezpečení v mnoha běžných nástrojích. MITRE CVE Projekt uvádí zhruba 500 zranitelných programů k červnu 2007 a analýza trendů jej řadí mezi 9. nejohroženější typ zranitelnosti v letech 2001 až 2006.[3]
Chyby formátovacího řetězce se nejčastěji objevují, když si programátor přeje vydat řetězec obsahující data dodaná uživatelem (buď do souboru, do vyrovnávací paměti nebo k uživateli). Programátor může omylem psát printf (vyrovnávací paměť)
namísto printf ("% s", vyrovnávací paměť)
. První verze interpretuje nárazník
jako formátovací řetězec a analyzuje všechny pokyny k formátování, které může obsahovat. Druhá verze jednoduše vytiskne řetězec na obrazovku, jak programátor zamýšlel. Obě verze se chovají identicky při absenci specifikátorů formátu v řetězci, což vývojáři usnadňuje, aby si chybu nevšiml.
Chyby formátu vznikají, protože konvence předávání argumentů C nejsou typově bezpečné. Zejména varargy
mechanismus umožňuje funkce přijmout libovolný počet argumentů (např. printf
) tím, že „vyskočí“ tolik argumenty mimo zásobník volání jak si přejí, důvěřovat časným argumentům, aby určily, kolik dalších argumentů má být vyskočeno a jaké typy.
Chyby formátovacích řetězců se mohou vyskytovat i v jiných programovacích jazycích kromě C, jako je Perl, i když se objevují s menší frekvencí a obvykle je nelze zneužít k provedení kódu podle volby útočníka.[4]
Dějiny
Chyby formátu byly poprvé zaznamenány v roce 1989 fuzz testování práce provedená na University of Wisconsin, která objevila "interakční efekt" v C shell (csh) mezi jeho historie příkazů mechanismus a chybová rutina, která předpokládala bezpečný vstup řetězce.[5]
Použití chyb formátu řetězce jako vektor útoku byla objevena v září 1999 uživatelem Tymm Twillman během a bezpečnostní audit z ProFTPD démon.[6] Audit odhalil snprintf
které přímo předávaly data generovaná uživateli bez formátovacího řetězce. Rozsáhlé testy s vymyšlenými argumenty funkcím stylu printf ukázaly, že použití tohoto pro eskalaci oprávnění bylo možné. To vedlo k prvnímu zveřejnění v září 1999 na internetu Bugtraq mailing list týkající se této třídy zranitelností, včetně základního zneužití.[6] Bylo to ještě několik měsíců, než se bezpečnostní komunita dozvěděla o plných nebezpečích zranitelnosti formátovacích řetězců, protože se začaly objevovat exploity pro jiný software využívající tuto metodu. První exploity, které tento problém přivedly ke společnému povědomí (poskytnutím vzdáleného přístupu root pomocí spuštění kódu), byly publikovány současně na Bugtraq seznam v červnu 2000 do Przemysław Frasunek[7] a osobu používající přezdívku tf8.[8] Seminární práce „Format String Attacks“[9] podle Tim Newsham byla zveřejněna v září 2000 a další podrobné technické vysvětlení byly publikovány v září 2001, jako např Využití zranitelnosti řetězců formátutýmem Teso.[2]
Prevence v překladačích
Mnoho překladačů může staticky kontrolovat řetězce formátů a vytvářet upozornění na nebezpečné nebo podezřelé formáty. v GNU Compiler Collection, příslušné příznaky kompilátoru jsou, -Stěna
,-Formát
, -Wno-format-extra-args
, - Zabezpečení formátu
, -Formát-neliterální
, a -Wformat = 2
.[10]
Většina z nich je užitečná pouze pro zjišťování chybných formátovacích řetězců známých v době kompilace. Pokud formátovací řetězec může pocházet od uživatele nebo ze zdroje mimo aplikaci, musí aplikace před použitím ověřit formátovací řetězec. Je také třeba dávat pozor, pokud aplikace generuje nebo vybírá řetězce formátu za běhu. Pokud je použita knihovna GNU C, -D_FORTIFY_SOURCE = 2
parametr lze použít k detekci určitých typů útoků, ke kterým dochází za běhu. The -Formát-neliterální
kontrola je přísnější.
Detekce v binárních souborech kompilovaných x86
Na rozdíl od mnoha dalších bezpečnostních problémů je hlavní příčina zranitelnosti formátovacích řetězců relativně snadno detekovatelná v spustitelných souborech zkompilovaných x86: Pro printf
-family functions, správné použití implikuje samostatný argument pro formátovací řetězec a argumenty, které mají být formátovány. Chybné použití těchto funkcí lze zjistit pouhým spočítáním počtu argumentů předaných funkci; „nedostatek argumentů“[2] je pak silným indikátorem toho, že byla funkce zneužita. Počítání počtu argumentů je na x86 často usnadněno kvůli konvenci volání, kdy volající odstraní argumenty, které byly vloženy do zásobníku, přidáním do ukazatele zásobníku po volání, takže jednoduché prozkoumání korekce zásobníku poskytne počet argumenty předané do printf
- rodinná funkce.
Viz také
- Skriptování mezi aplikacemi využívá podobný druh programovací chyby
- Cross-site skriptování
printf
scanf
- syslog
- Nesprávné ověření vstupu
- Vložení SQL je podobný útok, který je úspěšný, když není filtrován vstup
Reference
- ^ „CWE-134: Uncontrolled Format String“. Běžný výčet slabosti. MITER. 2010-12-13. Citováno 2011-03-05.
- ^ A b C http://julianor.tripod.com/bc/formatstring-1.2.pdf
- ^ „Distribuce typu chyby v CVE“. 2007-05-22.
- ^ Bugtraq: Formátujte chyby zabezpečení řetězců v programech Perl
- ^ Miller, Barton P .; Fredriksen, Lars; Bryan (prosinec 1990) [1989]. „Empirická studie spolehlivosti utilit UNIX“ (PDF). Komunikace ACM. 33 (12): 32–44. doi:10.1145/96267.96279. S2CID 14313707.
- ^ A b Bugtraq: Exploit pro proftpd 1.2.0pre6
- ^ „Vzdálené zneužití kořenového adresáře WUFTPD 2.6.0“ - MARC, Červen 2000 Przemysław Frasunek
- ^ „WuFTPD: Providing * remote * root since at least 1994“ - MARC od tf8
- ^ Bugtraq: Format String AttacksTim Newsham Září 2000
- ^ Varovné možnosti - Používání GNU Compiler Collection (GCC)
Další čtení
- Cowan, Crispin (srpen 2001). FormatGuard: Automatická ochrana před chybou tisku ve formátu řetězce (PDF). Sborník z 10. bezpečnostního symposia USENIX.
- Cowan, Crispin (leden – únor 2003), Softwarové zabezpečení pro systémy s otevřeným zdrojovým kódem Zabezpečení a soukromí IEEE, IEEE Computer Society
- Klein, Tobias (2004). Přetečení vyrovnávací paměti a Format-String-Schwachstellen - Funktionsweisen, Exploits und Gegenmaßnahmen (v němčině) (1. vyd.). dpunkt.verlag . ISBN 3-89864-192-9. (vii + 663 stránek)
- Seacord, Robert C. (Září 2005). Zabezpečené kódování v C a C ++. Addison Wesley. ISBN 0-321-33572-4.
externí odkazy
- Úvod do zneužití formátovacího řetězce 02.05.2013, autor Alex Reece
- scut / team-TESO Využití zranitelnosti řetězců formátu v1.2 9. 9. 2001
- Klasifikace hrozeb WASC - formátování řetězcových útoků
- Standardy bezpečného kódování CERT
- Iniciativa CERT Secure Coding
- Známá zranitelnost na projektu CVIT společnosti MITRE.
- Bezpečné programování s GCC a GLibc (2008), Marcel Holtmann