Tegnap söröztünk egy jót Aikonnal, és szóba került, hogy milyen jó is lenne, ha rámennék itt a blogon a "bitközelibb" sebezhetőségekre, pl. kernel bugokra és hasonlókra. Kivitelezési szempontból azonban van egy pár bökkenő:
- Töredelmesen bevallom (de ez szerintem eddig is kiderült), hogy csak igen felületes ismeretekkel rendelkezem a korszerű hardverközeli exploit módszerek terén
- Az előzővel összefügg, hogy egy-egy ilyen bug felgöngyölítése és dokumentálása általában egy tapasztalt szakembernek is igen sok idejébe kerül, nekem pedig időből egyre kevesebb van (no nem kell semmi rosszra gondolni :)
Minden esetre a dolog nem hagyott nyugodni, úgyhogy ma csak azért is nekiálltam néhány vonatkozó bugreport átnyálazásának. A próbálkozások igazolták a fenti állításokat: rendszeres posztokat ilyen témában még egy darabig biztosan nem fogok tudni produkálni.
De! Arra gondoltam, mi lenne, ha megpróbálnánk ezeket a problémákat közös erővel megoldani? Tegyünk egy próbát:
Maksymilian Arciemowicz felfedezett egy problémát a NetBSD, az OpenBSD és még néhány gyártó printf megvalósításában, a probléma részleteit pedig viszonylag szűkszavúan dokumentálta itt. A trükkös kérdés a következő: miért kell a formátumsztringben string típust megadni, miért nem jó a float, illetve milyen más vezérlőkarakterrel képzelhető el az esi és az edi regiszterek felülírása?
A válaszokat kommentben várom, motiváció képpen az első helyes megfejtőnek felajánlok egy sört/tábla csokit, amit a következő sörözésen (vagy más eseményen ahol képviseltetem magam) behajthat!
Ja igen, egyebek mellett ez egy remek lehetőség arra, hogy buta falme-ek helyett mindenki, akinek szüksége van rá megmutassa, mennyire fasza gyerek :)
P1ngW1n 2009.10.31. 20:48:05
xorl.wordpress.com/
buherator · http://buhera.blog.hu 2009.11.01. 09:35:21
Tegnap egyébként hegesztettem az oldalsó linkeken, most már többek között xorl is ott van.
sghctoma · http://sghctoma.extra.hu 2009.11.01. 15:28:32
eloszor is, az emberke allitasa, miszerint "function getint() will be started a few times." hulyeseg (vagy marha faradt vagyok, es nagyon benezek valamit :) ).. printf talal egy csillagot a format string-ben, beolvassa a fieldwidth-et, aztan felzabalja az osszes utana kovetkezo csillagot.. viszont amikor a printf program hivja a printf fuggvenyt, akkor az az egesz format stringet megkapja parameterkent, mind az osszes csillaggal egyutt, es ezt o nem igazan szereti, jol el is szall tole..
SL-n maga a printf program nem enged tobb csillagot egymas utan a format string-ben, tehat ott igy nem lehet elohozni a hibat..
NetBSD-n nekem nem a __vprintf_unlocked-ban, hanem egyel "beljebb", a strlen-ben segfault-ol.. itt a strlen argumentuma a printf programnak megadott masodik argumentum (ha a peldanal maradunk, 666).. a strlen a 666 cimrol nem tud olvasni, ezert szall el.. a __vprintf_unlocked csak akkor hivja a strlen fuggvenyt, ha stringet akarunk megjeleniteni, ezert kell string tipus a format string-be..
hat, kb. ennyi..
synapse · http://www.synsecblog.com 2009.11.02. 14:32:07
synapse
sghctoma · http://sghctoma.extra.hu 2009.11.02. 22:43:56
mint mar az elozo kommentemben is irtam, a printf fuggveny a ludas, az szall el.. tulajdonkeppen ugyanaz van vele, mint a printf programmal: nem csekkolja, hogy csillag utan csillag jon-e.. maradjunk a Maksymilian altal adott peldanal, tehat hivjuk meg igy a printf-et:
printf("%*********s", 666);
a printf-en belul meghivodik a __vfprintf_unlocked a kovetkezo parameterezessel:
__vfprintf_unlocked(fp, "%*********s", 666);
(az elso argumentum a standard out filepointere)
ez a fuggveny szepen fogja a format string-et, elmegy benne az elso csillagig (vfwprintf.c:878), veszi az argumentumlista elso elemet (666), es beallitja erre az ertekre a width-et.. ezutan fogja a format string kovetkezo karakteret, es mivel az is csillag, veszi az argumentumlista kovetkezo elemet, es megint beallitja a width-et.. a bokkeno az, hogy csak egy argumentumunk van, a 666.. szoval az a 8 felesleges csillag szepen szedegeti a stack-rol az ertekeket.. a kilencedik csillagnal mar benne jarunk a __vfprintf_unlocked-ot hivo printf stack frame-jeben, egesz pontosan a printf format string-jenek cimen vagyunk.. a kovetkezo ertek a stack-en ugye a printf-nek megadott 666..
a csillagok elfogytak, jon egy s, beolvassuk string cimnek a 666-ot.. mivel ez nem egy ervenyes cim, mikor megprobalja hasznalni a fuggveny (vfwprintf.c:1333), megkapjuk a varva vart SIGSEGV-t.. ha nem 's' szerepel a format string-ben, akkor ugye a 666-ot nem memoriacimkent hasznaljuk, ezert nem szall el..
egy megjegyzes: irtam az elozo kommentemben, hogy a live NetBSD-n a strlen-ben szallt el a program.. a tippem az, hogy a 'rendes' NetBSD-ben levo __vfprintf_unlocked-ban a strlen inline-kent van jelen, ezert az segfault-ol..
synapse · http://www.synsecblog.com 2009.11.03. 10:16:14
Kerestem gyorsan forrast:
cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/vfwprintf.c?annotate=1.18
Na itt 1333-on makrot fog ugye hivni. Ennek a define-jat nem talaltam meg sehol a fent emlitett oldalon, ami igy alapjaban veve eleg erdekes.
Viszont ami mindenkepp erdekelne, hogy miert van szerinted koze az inline -kent valo forditasnak ahhoz, hogy a segfault mashol jon elo.
synapse
sghctoma · http://sghctoma.extra.hu 2009.11.03. 10:45:17
ott van az a definicio, a 74. sorban..
ha a strlen inline-kent van jelen, akkor nem tortenik fuggvenyhivas, mert ugye a strlen kodja direktben ott van a __vfprintf_unlocked-ban.. szoval ugyananugy a strlen kodjan segfault-ol, csak csak ez a kod nem kulon fuggvenyben van..
synapse · http://www.synsecblog.com 2009.11.03. 11:44:10
Erre gondoltam en is, persze ez a bug termeszeten semmit nem valtoztat, csak a gdb irja ki hogy ott meg van egy extra fgv hivas (meg egy elhanyagolhato prolog es epilog).
Anyway, nice work :)
buhera: Amugy a kezdemenyezesnek igencsak latom ertelmet, ha lenyugodtak nalam a kedelyek akkor majd esetleg betudok segiteni de nem igerek semmit a kozeljovoben. Ha ennek ellenere postolsz, azert ra probalok nezni.
synapse
buherator · http://buhera.blog.hu 2009.11.03. 16:38:57
Ja, és a sör természetesen behajtható!
sghctoma · http://sghctoma.extra.hu 2009.11.03. 21:41:54
ctrl+f csodakra kepes :P
persze, nem valtoztat semmit, csak azert irtam le, mert az elso hozzaszolasban mondtam, hogy mashol szall el, es tisztazni akartam a dolgot..
@buherator:
egyetertek synapse-szal, jo a kezdemenyezes, nagyon.. raadasul keves oram van, es jelenleg melo sincs, szoval fogok tudni idot szakitani ilyesmire..
a sort nem, de a tabla csokit behajtom :) nem iszom alkoholt.. ha meg nehanapjan megis, az tuti nem sor..
amugy most en is belelkesedtem, ez izgalmasabb, mint crackme-ket oldogatni..
buherator · http://buhera.blog.hu 2009.11.03. 21:45:49
sghctoma · http://sghctoma.extra.hu 2009.11.03. 22:01:50
buherator · http://buhera.blog.hu 2009.11.03. 22:13:57
sghctoma · http://sghctoma.extra.hu 2009.11.04. 08:22:11
synapse · http://www.synsecblog.com 2009.11.04. 09:25:01
kicsit napirajzosan: fassegondoltavolna :D
synapse
sghctoma · http://sghctoma.extra.hu 2009.11.04. 13:52:17
conscience 2009.11.15. 22:59:55
Ezt a posztot khm... imádom. Izgatottan várom a folytatást. Nem mellékesen, ez két buherator szobrot ér. Egyet az interaktív fejtörőért, egyet pedig a low-level témáért.
Mellékes kérdésként felvetem (bár valószínűleg feltevésem csak zsibbadtságomból adódik), hogy vajon ez a hiba képessé teszi-e kihasználóját az IP manipulálására?
Most jól magatokrahagylak, mert rendesen rámfér egy KV.
Utószó gyanánt még szeretném ismét megköszönni ezt a remek posztot. Csak így tovább :)
conscience 2009.12.16. 07:14:44