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.