Jedna z posledních bezpečnostních aktualizací opravila problém, který dostal číslo CVE-2009-1235. Podle autora příspěvku, přišel k této systémové chybě zcela náhodou. Místo správného příkazu ioctl použil totiž omylem příkaz fcntl (Překlep). Funkce fcntl si pak již neověřila správně parametry a kernel panic byl na světě.
Kód, který způsobil pád vypadá takto:
#include
#include
int main() { fcntl(0, TIOCGWINSZ, 0); return 0; }
Správně se však TIOCGWINSZ má používat takto:
#include#include
int main()
{
unsigned short buff[4];
ioctl(0, TIOCGWINSZ, &buff);
printf("%d %d %d %dn", buff[0], buff[1], buff[2], buff[3]);
return 0;
}
Co mi však připadne zajímavější je chování Apple. Ten když dostal oznámení o chybě (kernel panic), prakticky nereagoval a odpovídal pouze problém se řeší, vyčkejte. Teprve až autor přišel na to, že se tato chyba dá zneužít (Při použití správných parametrů přepisuje určité segmenty paměti. Blíže viz odkaz níže.) Apple zareagoval a začal to řešit.
Z tohoto chování vyplývají dvě věci (za předpokladu, že tento příklad nebyl vyjímkou):
- Apple nevěnuje přílišnou pozornost chybám, které dostává nahlášeny od uživatelů, zřejmě probíhá jen zběžná kontrola a nijak se neanalyzuje zda je možné chybu zneužít. (Chyba byla v systému 4 roky a 3 měsíce, Apple ji měl nahlášenou od srpna 2008)
- Pokud se jedná o bezpečnostní chybu a vy ji nahlásíte jako bezpečnostní chybu a popíšete způsob jak ji zneužívat, Apple zareaguje rychle. (Autor příspěvku zjistil nebezpečnost chyby v červenci 2009 a v srpnu 2009 byl již patch hotov)
Druhá věc, která mě zarazila byla nekonzistentnost tvrzení Apple a blogu. Na blogu se píše, že problém existuje již od Mac OS X 10.4, avšak Apple tvrdí že problém je pouze v Mac OS X 10.5.