Exploit -
Exploit programování
Exploitování je základem hackingu. Programy nejsou nic víc než komplexní sada
pravidel, sledující určitý tok činností, která počítači říká, co má dělat.
Exploitování programu znamená přinutit program vykonat to, co chcete vy, dokonce
i když byl původně program navržen tak, aby tomu zabránil. Protože program může
dělat jenom to, k čemu byl navržen, bezpečnostní díry jsou ve skutečnosti vady
nebo přehlédnutí v návrhu programu nebo v prostředí, ve kterém je spuštěn. K
nalezení těchto chyb je zapotřebí kreativního ducha, stejně tak jako k jejich
předejití. Někdy jsou tyto chyby produktem relativně zřejmých programátorských
chyb, ale existují méně zřetelné chyby, které napomohly zrození složitěj ších
exploitovacích technik, které mohou být aplikovány na mnoha rozdílných
místech. Programy mohou dělat pouze to, k čemu byly naprogramovány. Bohužel to,
co je napsáno, se nemusí shodovat s tím, co programátor zamýšlel. Tento princip
se dá vysvětlit pomocí tohoto vtipu: Muž se prochází lesem a najde na zemi
kouzelnou lampu. Instinktivně ji zvedne, otře a tím vyvolá džina. Ten mu
poděkuje za to, že ho pustil ven, a nabídne mu, že mu splní tři přání. „Jako
první,“ povídá muž, „bych chtěl milion dolarů.“ Džin ukáže prstem a objeví se
před ním kufr plný peněz. Muž se zaraduje a pokračuje: „Potom bych chtěl
Ferrari.“ Džin opět ukáže prstem a z kouře se vynoří Ferrari. A muž pokračuje:
„A konečně, chtěl bych být neodolatelný pro ženy.“ Džin na něj ukáže prstem a
muž se změní v balíček čokolády. Stejně tak, jako džin splnil přesně to, co po
něm muž chtěl, program udělá přesně to, co mu zadá programátor, ačkoliv výsledky
nemusí být vždy takové, jaké byly zamýšleny. A občas mohou být i katastrofální.
Programátoři jsou lidé a občas to, co napíšou, není přesně to, co chtěli napsat.
Například jedna hodně častá programátorská chyba se nazývá off-by-one. Jak už
napovídá jméno, je to chyba, kdy se programátor splete o jedničku. Stává
se to častěji, než byste si mysleli, a dá se to krásně prezentovat na tomto
úkolu: stavíte plot v délce 20 m, po dvou metrech bude sloupek, kolik sloupků
budete potřebovat? Samozřejmá odpověď je 10, ale to je špatně, doopravdy jich je
potřeba 11. Tento typ chyby off-by-one se často nazývá fencepost error a dochází
k ní v případech, kdy programátor místo počtu prstů spočítá počet mezer mezi
nimi nebo naopak. Dalším příkladem je, když se programátor snaží vybrat rozsah
čísel nebo položek ke zpracování, jako třeba od N do M. jestliže N = 5 a M = 17,
kolik položek se musízpracovat? Asi byste odpověděli že M – N, nebo 17 – 5, tedy
12. Ale to není správně, protože tam je ve skutečnosti M – N + 1 položek, tedy
13. Může se to zdát matoucí a ono to doopravdy takové je, a to je právě ten
důvod, proč k těmto chybám tak často dochází. Takové chyby často bývají
nepostřehnuty, protože se programy netestují pro úplně všechny vstupní možnosti,
a jejich efekt se neprojeví při normálním běhu programu. Avšak jednou se chyba
projeví a může dojít k lavinovému efektu, který ovlivní logiku celého zdánlivě
bezpečného programu a stane se bezpečnostní slabinou.
Jeden nedávný případ se
stal v OpenSSH, což je bezpečný terminálový komunikační program navržený tak,
aby nahradil nezabezpečené a nešifrované služby jako je třeba telnet, rsh a rcp.
Byla ovšem nalezena chyba typu off-by-one v kódu pro alokaci kanálu, která se
poté hodně exploitovala. Kód
obsahoval tento příkaz if:
if (id < 0 || id >
channels_alloc) { a měl správně vypadat takto:
if (id < 0 || id >=
channels_alloc) { V lidské řeči chybný kód říká „jestliže je ID menší než 0 nebo
je větší než počet alokovaných kanálů, spusť případný kód“, ten správný zní
„jestliže je ID menší jak 0 nebo větší nebo rovno počtu alokovaných kanálů,
spusť případný kód.“
Jednoduchá chyba off-by-one dovolila další exploitování programu, takže normální
uživatel přihlašující se do systému mohl získat jeho plná administrátorská
práva. Toto rozhodně programátoři při návrhu tak zabezpečeného programu, jako je
OpenSSH, nezamýšleli, ale počítače pouze vykonávají to, co jim bylo přikázáno
vykonat, nic víc, nic míň. Další situace, která vede k vytváření
programátorských chyb, je když se program rychle modifikuje pro zvýšení
funkcionality. Zatímco se zvyšuje prodejnost a cena produktu, program se stává
složitějším a náchylnějším k vzniku a přehlédnutí chyb. Webový server Microsoft
IIS byl navržen k poskytování statického a interaktivního obsahu uživatelům. Aby
toho bylo dosaženo, program musí dovolit uživatelům čtení, zápis a spouštění
programů a souborů pouze v určitých adresářích. Bez tohoto omezení by měli
uživatelé plnou kontrolu nad systémem, což je z bezpečnostního hlediska
nepřípustné. Aby tomu IIS zabránilo, obsahuje kód na kontrolu cesty, který
zabrání použití zpětného lomítka ( backslash) pro zpětný průchod adresářovou
strukturou. S přidáním podpory znakové sady Unicode vzrostla složitost programu.
Unicode je znaková sada kódovaná dvěma bajty a je navržena tak, aby podporovala
všechny jazyky, včetně např. čínštiny či arabštiny. Využitím dvou bajtů místo
jednoho se umožnilo použití desítek tisíc možných znaků, na rozdíl od dvou set
původních. Toto rozšíření ale také znamenalo, že se zpětné lomítko dalo
zakódovat více různými způsoby. Například %5c se v Unicode převede na zpětné
lomítko, ale až po kontrole cesty. Takže použitím %5c místo \ bylo rovněž možné
procházet adresáři. Červi Sadmind a Code- Red zneužívali tuto přehlédnutou chybu
v konverzi znaků v Unicode k předěláníwebových stránek.