1/ evidentne je to implementacni chyba - dala by se takova vec neresit, bylo-li by to psane ve vyssim prog. jazyku?
2/ tj. chyba nepujde zneuzit, pokud user-process ani nebude mit pravo cist dane soubory. proc neni bezna praxe, ze:
- root vlastni dane system soubory (napr. na /etc/ ): tj jen system je muze prepisovat
- pro kazdou sluzbu je vytvoren "uzivatel" (/bin/nologin, napr NetworkManager,...), /etc jsou pouze pro cteni pro group tohoto uzivatele
- chmod -R o-rwx
3/ to s temi Android, kamery,tiskarny,routery... je docela pruser, patche pro to uz nikdy nevyjdou. Znamena to, ze od ted vse (starsiho data) s "linux = easy h4x"?!
Chyba imho není na routerech prakticky zneužitelná. Musíte na tom zařízení něco spustit. Realita je taková, že když už se na takovém zařízení podaří něco spustit, má to obvykle root práva. Takže to, že si mohu zvýšit práva mě opravdu vytrhne. V takových krámech se práva moc neřeší.
K bodu 1) protože je to práce se stránkovacími tabulkami jejichž formát je specifikován na bitové úrovni, nejsem si jist, jestli by šel použít vyšší programovací jazyk tak, aby umožňoval pracovat s daty na bitové úrovni, zároveň zajišťoval vícevláknový přístup a to neprimitivním způsobem - většina vyšších programovacích jazyků tyhle věci řeší tak,. že volají jádro.
A pak si nemyslím, že by to ve vyšším programovacím jazyce mělo eliminovat chybu. Race-condition bez problému udělám v Javě, v PHP, v Pythonu, neexistuje jazyk, který by to efektivně řešil. Snad je nějaké čistě paralelní jazyky, které by ale samy o sobě potřebovaly backend v céčku .
nebola by tam mozno chyba spojena s CoW, ale boli by tam ine chyby :-D
Tak komplexna vec ako kernel nikdy nebude bez chyb. Je to rozhranie cez ktore aplikacie komunikuju s HW, ktoreho firmware obsahuje chyby a nedokonalosti. Niekedy sa musia robit workaroundy nie preto ze sa chce, ale preto ze to inak nejde.
Jenže ty další chyby budou i v tom C kernelu. Rust jenom eliminuje část chyb, které C neřeší, nevytváří nové možnosti pro chyby (ono se není co divit, když ten jazyk vznikl právě díky zkušenosti lidí s programováním v C/C++ a desítky let později). Workaroundy se nedělají, protože to jinak nejde, ale protože máme tuny historického kódu, který se nedá jen tak zahodit a napsat to správně. Každý programátor zažívá podobnou situaci dnes a denně.
Boze ... vysledkem kazdyho programovani je driv nebo pozdejs ... strojak. A pod tim programovanim je tudiz 1-N ruznych vrstev, kde kazda jedna muze a taky obsahuje chyby. Pisu 1, ne 0, protoze i CPU sam o sobe je (minimalne z casti) programovatelny, a ... taky obsahuje chyby.
Tudiz je uplne jedno v cem programujes, ale cim tzv vyssi jazyk, tim vic vrstev a tudiz i vic chyb, ktere navic programator sam nemuze ovlivnit a nemusi o nich vubec vedet klidne dlouhy roky.
Ccko je pomerne blizko k tomu strojaku, dava programatorovi temer 100% kontrolu nad vysledkem a tudiz se take prave on musi postarat o osetreni vsech moznych (a i nemoznych) stavu. Vyssi jazyky lecos resej za nej a plati se jim za to vice ci mene krvava dan v podobe tristniho vykonu - treba prave proto, ze resi situace, ktere v dane casti kodu vubec ani teoreticky nastat nemohou.
Tak to si laskave nastudujte o cem je Rust. Jeho hlavni vyhodou je totiz kontrola vseho mozneho, vicemene na urovni typove kontroly. Z c-cka zname kontrolu 'const' - kdyz mame v hlavicce funkce napsano ze parametr je pointer na const, tak kompilator zabrani v tele funkce modifikovat obsah toho na co ten pointer ukazuje. Rust tohle vyrazne rozsiruje na mnoho dalsich pripadu, ktere lze take odhalit jiz v dobe kompilace.
No vidis, a prave to, ze v lze k tymz datum(a/nebo kodu) pristupovat jako ke stringu, poli, bajtum, nebo bitum je naprosto nejzasadnejsi plus, protoze to je skutecnej programatorskej power.
Nejvetsi dobytci programujou prave v tzv "vyssich" jazycich a nedokazou si ani ohlidat, jestli je na vstupu vazne cislo. ... 10E10 prece je taky cislo ... zejo ... to je pak diveni se, kdyz to nekde o kilometr dal vybleje jakou neosetrenou vyjimku ... protoze se spoleha na to, ze ono to samo ...
Nejvetsi dobytci si nevazi prace druhych ani sve vlastni, a proto nepouzivaji knihovny ani programovaci jazyk, ktery triviality vyresi za ne. Misto toho jsou odsouzeni venovat pri psani jakehokoliv programu den na reimplementaci parsovani cisel, ktera preteceni hlasi spravnym zpusobem, spravne resi preteceni v mantise i v exponentu nerozhodi ji chybejici cislice pred nebo za desetinnou teckou ani nuly navic.
jj, on to za ne vyresi ... 0xdafc ... je taky cislo. Nebo jeste lip .. 0x457 ... . To si takhle skladnik neco zada, klepne o klavesu vedle ... a ono to veme jako pocet ... a muzem samo pokracovat ... takovy pole "cislo" totiz vpohode schroupne i binarni tvar, pripadne i osmickovej ... coz sou vsechno bezny zpusoby, jakejma ten skladnik zadava pocet sroubu ... mno hlavne ze si programator usetril ten jeden radek kodu a misto toho pouzil 100MB knihovnu.
Tak samozrejme "duveruj ale proveruj". Validovat vstupy je potreba vzdy. Ale pokud mam vstup z klavesnice tak je proste typu string (typicky unicode-string) a musim pouzit _spravnou_ validacni funci/regulak pokud mi knihovni funkce prevadi i veci ktere nechci. Pokud pouziji nevhodny jazyk,
tak jsem odsouzen k tomu, ze musim premyslet i o tom, jaky typ mam v netypove promene a podle
toho volit tak banalni vec jako je porovnani. Pak vznikaji chyby prave z toho, ze se programator musi prizpusobovat programovacimu jazyku, misto toho aby ho vyuzival. (Tim porovnanim narazim treba na PHP - dava programatorovi zdani, ze dvojrovnitko funguje na hexazapisu md5 sum (konretni pripad stringu) spravne, ale ouha...:http://stackoverflow.com/questions/22140204/why-md5240610708-is-equal-to-md5qnkcdzo. ) To jsou pak "vyssi" jazyky, ktere jsou z hlediska kontroly spravnosti programu na nizsi urovni nez je strojovy kod.
Tohle by si zasloužilo hlubší průzkum. Rust rozhodně nezabrání algoritmickým chybám (včetně race condition). Nicméně je možné, že zrovna atributy stránek (pro zápis, copy-on-write, ...) by se daly implementovat s pomocí typového systému Rustu. Pak je možné, že by to u takové implementace nebyla chyba algoritmu ale chyba práce s typy, což by se odhalilo již při kompilaci.
Google Minijail, hraju si teď s tím.
https://www.linux.com/news/minijail-googles-tool-safely-run-untrusted-programs