vicces, hogy nem programozo letedre ilyen jol tudod, hogy mit kellene vagy nem kellene csinalnunk. de ha mar szoba hoztad, nezzuk ki is esett pofara (ugye nem az ominozus tavalyi, csendben javitot linux kernel bugok ota bassza a csorodet (btw, van azota uj, erdekel? ;-), hogy pofara estel, es most probalsz elegtetelt venni?).
egy egyszeru peldaval illusztralom, hogy mi is tortent valojaban. ugye mindenki hallott mar az strcpy() nevu csodarol ('man strcpy' ha nem). ennek a fuggvenynek megvan az a jo tulajdonsaga, hogy eleg gyors, de cserebe nem olyan robusztus, mint lehetne. pl, ervenytelen mutatokkal meghivva siman segfault-ol, vagy nem megfeleloen megvalasztott meretu celpuffernel siman tulszalad rajta.
mindezen fogyatekossagai ellenere meg senki nem vadolta meg azzal (na jo, OpenBSD-t leszamitva, de az 'strlcpy cure is worse than the disease', szoval az nem szamit), hogy bugos. ahelyett dokumentalt, hogy mit csinal es az ot hasznalo programozotol elvaras, hogy betartsa a szabalyokat.
persze az strcpy() csak egy pelda, kb. minden program minden fuggvenye (akar publikus konyvtare vagy csak a progi sajat belso hasznalatuja) tele van ilyen 'elvarasokkal' (angolul asszem contract-nak hivnak), es sajnos a legtobb programozasi nyelv nem teszi lehetove, hogy minden ilyet kodban is kifejezzunk (es mar forditaskor megtalaljuk az ilyen szabalyok be nem tartasabol eredo hibakat), ezert marad a dokumentalas (mar amikor), ill. a kodolvasas, teszteles, stb (meg van egy kulon kis tudomany a statikus ill. dinamikus kodellenorzesre, metacompilation, model checking meg tarsai, ha valakit erdekel).
visszaterve az expand_stack()-re, itt sincs semmi gond vele, csak vannak bizonyos elvarasok, amiket az ot hivonak be kell tartani, es ez az, ami nem sikerult minden esetben. egeszen pontosan ket hivas erdekes. az egyik az, ami a userland verem automatikus noveleset vegzi (ide kerult az igazi javitas), a masik pedig egy erdekes belso allat (get_user_pages()), onnan siman kiszedtem az egesz veremnovelest, mindjart elmondom miert.
olyan ket evvel ezelott egy masik bug javitasa soran mar belefutottam ebbe a get_user_pages()-be, ami a kernel belso infrastrukturaja arra, hogy szukseg eseten fizikai memoriaba kenyszeritse a kivant userland memoriatartomanyt (hogy azutan oda segfault veszelye nelkul tudjon irni pl). a problema az, hogy ez a hivas is kepes kivaltani a veremszeru tartomanyok automatikus novekedeset, ami egyaltalan nem tervezett tulajdonsaga, hanem sok evvel ezelott orokolte egy ptrace-szel kapcsolatos kodkonszolidaciobol (hogy a ptrace-nek miert volt ra szuksege, az egy kulon rejtely). en anno megkerdeztem ket linux VM gurut is (akpm meg Hugh Dickins) es egyiknek sem volt otlete ra, hogy vajon mi a francert is vannak igy a dolgok. most viszont itt volt a kivalo alkalom, hogy megszabaduljak ettol (az elozo bugnal vegulis nem tettem meg, mert az egesz bugfix befuccsolt, ugyanis tul sok mindent kellett volna atirni, es a nyereseg nem lett volna eleg nagy).
na, osszefoglalva, a DA mogott allo jomadarak jo kis 'wild-goose chase'-re kuldtek minket, es trey allitasaval ellentetben az eredeti advisory nem segitett semmit, a PoC 'exploit' volt az, ami megmutatta, hogy hol is volt az igazi problema (a masodik advisory szovege is pont olyan gagyi volt, mint az elsoe).
a bug, amit igazabol talaltak, az persze letezik, es DoS-ra kivalo, viszont privilegium emelesre onmagaban nehez kihasznalni, mert minden automatikus veremnoveles soran a kernel kinullazza a megnovelt verem legalso lapjat, ami a kernelbe nyulo vma eseten ugye azt jelenti, hogy egy random kernel memorialap hirtelen 0-ba allitodik - ezt vagy tuleli vagy nem. viszont ha letezik tetszoleges kernel memoriat olvaso bug valahol, akkor annak segitsegevel nagyon pontosan lehet elvegezni ezt a nullazast es akkor tenyleg ki lehet hasznalni tetszoleges privilegium emelesre. vegul, de nem utolso sorban, az egesz bug nem triggerelheto, ha valaki rendesen hasznalja a grsec-et, vagyis a PaX flag-ekre is mandatory control-t hasznal, minden mas gyengitett felallas es ilyenkor jol latszik, hogy miert.
trey, szerintem meg kene fogadnod a sajat tanacsodat, es kicsit kisebb arccal kene futtatni ezt a blogot, mert ha meg sincs igazad, akkor elkerulheto a kinos pofaraeses esete.