Ne tak úplně. Vlastně vůbec ne. Od kdy je Linus uznávaný expert na kryptografii? Vždyť linuxový RNG je zbytečně složitý, a kvůli tomu má slabiny které by jednodušší konstrukce neměla: http://eprint.iacr.org/2006/086.pdf
To vylepšování je obyčejné XOR. To je OK, pokud je výsledek RDRAND náhodný se špatnou entropií, nebo třeba i konstantní. Bohužel, XOR není jednosměrná operace, takže je snadné vymyslet operand který entropii sníží, pokud známe druhý operand. A procesor ho samozřejmě zná, vždyť s ním zrovna operuje.
Pochopitelně je třeba určit, kdy se dělá XOR do paměti, a kde je uložený druhý operand. Až na to, že to není zrovna těžký problém, RDRAND není zrovna běžná instrukce, takže její zavolání jasně signalizuje že jsme v kódu RNG. API linuxového kernelu se moc nemění, a adresa bufferu bude nejspíš v nějakém registru.
Tady to hezky rozebírá nějaký Taylor Hornby: http://pastebin.com/A07q3nL3
Taky je potřeba si uvědomit, že může být velký problém tohle detekovat. RNG jsou složité, jsou dobré důvody je obfuskovat, takže analýza křemíku bude dost těžká (a nikdo se nad tím nepozastaví). Tenhle exploit může být aktivovaný jen za nějakých podmínek, a výsledek může být spočítaný tak, aby se entropie snížila jen pro někoho kdo zná heslo (třeba může existovat klíč který má NSA, a RDRAND = SHA1(interní čítač + ID procesoru + NSA_KEY) XOR (aktuální buffer s entropií)). Výsledek linuxového RNG potom bude deterministický generátor, ke kterému má NSA klíč, ale důkaz by vyžadoval umět prolomit současný kryptografický hash, takže není proveditelný.
TL;DR ve stylu Linuse: Jsi ignorant, Linusi, děláš do věcí kterým nerozumíš.
Tak jsem si otevřel random.c a myslel jsem, že budu moct tebe a Taylora setřít, že jste ignoranti, ale vypadá to, že je generátor náhodných čísel opravdu napadnutelný. Myslel jsem, že výsledné náhodné číslo vznikne nějakou složitou kryptografickou funkcí z původního čísla a rdrand, ale všechna ta složitá kryptografie probíhá už před získáním náhodného čísla z CPU a pak už dochází pouze ke XORU a kopírování zmanipulovatelného čísla do výstupu.
Takže Linusi, otevři si random.c, arch/x86/kernel/cpu/rdrand.c a /arch/x86/include/asm/archrandom.h a chvilku přemýšlej. Myslím, že by stačilo pár řádků přehodit a modifikovat (nezahazovat předchozí náhodné číslo, udělat hash současného a předchozího a až tento hash použít ke generování výsledného čísla) a výsledek by byl daleko důvěryhodnější.
Jenže všechna složitá kryptografie je k ničemu, když nakonec někdo generuje taková čísla, aby po XORu vznikla známá posloupnost. Dokážu si představit, jak sestavit procesor, aby jádro Linuxu se současným generátorem vytvářelo sekvenci např. 0, 1, 2, 3, ... Stačí aby procesor detekoval požadavek pro náhodná čísla, zkontroloval následující instrukce, našel v cache, s čím se bude provádět xor, spočítal vhodný výstup a nechal výsledek zpracovat předem známým způsobem na výrobcem požadovaný výsledek. Myslím, že se to prakticky ničím nedá detekovat, jedině podrobnou analýzou procesoru.
Musí:
1) poznalo by se to debugováním
2) mohly by vznikat chyby v programu způsobené nesprávným zápisem
Věřit nemůžeme prakticky ničemu, víme, že zadní vrátka se vyskytují poměrně často. Ale zas je zbytečné být paranoidní a myslet si, že BSA sleduje, jestli náhodou do Linuxu nestahuju MS Office a proto mi podstrčila síťovou kartu, která na mě všechno bonzuje přes router s bezpečnostní dírou pro komunikaci se serverem CIA.
Tak jsem se v tom trochu vrtal, abych treba dokazal ze nemate pravdu :D. A dopracoval jsem se k tehle asi klicove funkci :
void get_random_bytes_arch(void *buf, int nbytes)
1074 {
1075 char *p = buf;
1076
1077 trace_get_random_bytes(nbytes, _RET_IP_);
1078 while (nbytes) {
1079 unsigned long v;
1080 int chunk = min(nbytes, (int)sizeof(unsigned long));
1081
1082 if (!arch_get_random_long(&v))
1083 break;
1084
1085 memcpy(p, &v, chunk);
1086 p += chunk;
1087 nbytes -= chunk;
1088 }
1089
1090 if (nbytes)
1091 extract_entropy(&nonblocking_pool, p, nbytes, 0, 0);
Coz na prvni pohled vypada ze se z HW generovaneho RND udela jeste SHA1 (ve funkci "extract_entropy", nicmene konstrukce na radku 1090,1091 se podle mne neprovede asi nikdy. Nebo se pletu ?
Souhlasim s odkazovanym textem, sice by to nebylo tak jednoduche, ale cesta to urcite je.
Reseni by mohlo byt oddelit od sebe rdrand a to prixorovani, tedy udelat tam jakousi "frontu". Dalsi zlepseni by bylo pridani nejake nelinearity (=hodne jednoduchy algoritmus). Docela dobre by se na to mohly hodit BCD instrukce x86 kdyby je z AMD64 nevyhodili, konecne by pro ne zase bylo nejake vyuziti ;-).
Já souhlasím s tím, že lidé často požadují něco, o čem nemají ani páru a tak je šasto hloupé jim vyhovovat. Navíc v tomto případě to mohou udělat po svém, jenže bez těch znalostí to prostě nepůjde. Já sám jsem danou problematiku viděl pouze z TGV (obyčejně se říká z rychlíku, ale to bych mohl něco pochytit).
Ono je to tím, že lidé obvykle chtějí X a někdo jim "vysvětlí", že aby bylo X, tak stačí Y. A z nějakého důvodu pak část populace přepne a chce Y, nikoliv X. Protože tak nějak předpokládají, že z Y se stane X, přičemž v hlavě se objeví chybný blok, že jedině z Y se může stát X. Jde to do takového extrému, že jim pak můžete nutit X horem dolem, ale oni budou stejně trvat na Y.
Děje se to neustále a prakticky všude, ať už je to design software, politika nebo malování pokojů. Pak se to opravdu často vyhrotí do extrému. V případě štěstí ten člověk nakonec připustí, že mu nejde o to, aby jste použil barvu Dulux, ale o to, aby ta zeď byla krásná sytá rudá barva, aby se na tom ta velká černá LCD televize dobře vyjímala. A že mu akorát někdo kdysi kdesi řekl, že Dulux dělá právě takové barvy.
Je to přirozená lidská vlastnost. Ti rozumnější ji akceptují, ti vychytralí ji zneužijí. Každého čas od času naštve. Člověk není racionální. Člověk je iracionální a ještě ke všemu predikovatelně iracionální.
Přes DMA (Direct Memory Access) může každá periférie zapisovat, ale hlavně číst libovolné místo v paměti, bez vědomí procesoru (natož operačního systému). Představ si co dokáže vhodně navržený firmware třeba síťové karty, což je v reálu samostatný počítač s vlastním procesorem... ;-)
Upřímně mi to nepřipadá jako zvláštní riziko. Kdyby se ukázalo, že nějaký výrobce propašoval do driveru backdoor, byl by rozcupován na kousky, a jeho business by skončil.
Jako daleko rizikovější vidím proces tvorby open source software. K vývoji se může připojit prakticky kdokoliv, chvíli dodávat kód, a pak někde něco "opomenout" nebo "vylepšit".
Open source je fajn, kod v repozitaroch je dostupny komukolvek a moze byt skontrolovany kymkolvek. Ale vacsina distribucii vam serviruje uz hotove binarne image / balicky z ich serverov a repozitarov. Aka je realna zaruka toho, ze su skutocne buildovane z daneho kodu ktory vidite. Kazda firma / organizacia pripravujuca distro moze mat tajne repozitare s patchmi, ktore sa aplikuju az pri buildovani kernelu / balickov. Toto by mohlo byt realne skor vo velkych sukromnych firmach typu canonical alebo red hat, kde vyvoj nie je celkom transparentny. A vzhladom na oblubenost a rozsirenost tychto distier je mozny aj zaujem nsa a podobnych organizacii. Realne si dovolim pochybovat o tom, ze sa najde niekto, kto prelieza a checkuje skompilovane binarne image. Takto sa lahko moze dostat backdoor do serveru / routra a pod.
Ovela silnejsou zarukou by mohla byt globalna organizacia zastresujuca vyvoj open source (typu free software foundation). Tato by drzala repozitare so zdrojakmi a zdrojaky kazdeho checknuteho release-u balicku / projektu by boli digitalne podpisane. Okrem ineho by spravovala buildovaci toolchain (gcc,make,...), ktory by bol tiez skontrolovany a digitalne podpisany. Instalacia systemu by prebiehala stiahnutim a kontrolou buildovacieho toolchainu, stiahnutim podpisanych zdrojakov kernelu a balickov a ich naslednou kompilaciou priamo na cielovej masine (najblizsie je tomu gentoo). Potom by ste si mohli byt istejsi, ze system, ktory vam bezi, je skutocne kosher.
Presne tak. Na certifikaty a cerfikacne autority este dojde. Nieco,co je podpisane certifikatom nieje bezpecnejsie ako to bez podpisu. HTTPS a podobne sracky davaju pouzivatelovi len pocit bezpecia.
Pocit bezpecia je ale iluzia.
Ako zistim, ze certfikat je platny?
OK overim si ho u vydavatela.
Ako si overim doverihodnost vydavatela?
OK overim si jeo doverihodnost u niekoho ineho.
Ako zistim, ze ten u koho som si overoval platnost je doverihodny?
OK overimsi to zase u niekoho.
Ako zistim, ze ten u koho som si overoval doverihodnost je doverihodny?
...
...
...
Vo finale niikdy neziskam istotu, ze ma prave niekto nepodvadza a nesleduje?
Ziadna komunikacia nemoze byt dostatocne bezpecna.
Ak sa odpojim od internetu a budem zit v zvukotesnej, dokonale tlmenej(ziadne vybracie) kovovej klietke, ktora neprepusti ziadne vlnenie(akusticke, elektromagnetice,...) ale to potom nebude komunikcia.
„Kdyby se ukázalo, že nějaký výrobce propašoval do driveru backdoor, byl by rozcupován na kousky, a jeho business by skončil.“
Sony propašovalo do svých CD backdoor, neskončilo. https://en.wikipedia.org/wiki/Sony_BMG_CD_copy_protection_scandal
HP propašovalo do svých storage backdoor, neskončilo. https://slashdot.org/topic/datacenter/hp-keeps-installing-secret-backdoors-in-enterprise-storage/
RuggedCom propašoval do své SCADA backdoor, neskončil. http://seclists.org/fulldisclosure/2012/Apr/277
Nezapominejme na nedavno-zverejneny backdoor Microsoftu do Outlooku a Skype; ikdyz to je SW, efekt je stejny. Neskoncil.
http://www.technobuffalo.com/2013/07/11/microsoft-gave-the-nsa-direct-backdoor-access-to-outlook-skype/
+ tiskárny křičí do světa své sériové čísla http://en.wikipedia.org/wiki/Printer_steganography
Přesně z toho důvodu bych nedával backdoor do procesoru, jak říká předřečník - je to totiž „relativně“ izolovaná součástka, zvenku jí můžeš zkusit data podstrčit nějak po síti, ale pak dost záleží na OS, jestli je do procesoru nasype v očekávaném pořadí, navíc v optimalizovaném kódu dnešních kompilátorů aby se prase vyznalo :-). Třeba ta síťovka mi právě proto přijde mnohem lepší.
Jenže takhle se ti konspirace nabaluje:
* výrobci routerů, budiž
* co OpenWRT? buď musíš ten backdoor dostat i tam (do kernelu? neříkám, že je to nemožné, ale jsou tam zase stovky očí, které si toho můžou všimnout) nebo musíš mít HW backdoory na nejnižší vrstvě i v routeru tak, aby to alternativní operační systém neviděl
* co ryze HW detekce, která uvidí, že tam teče něco někdy, kdy nemá (rušení rádia od vysílání mobilního telefonu, LINK-ACT ledka na nejlevnějším switchi - do nich taky budeme dávat backdoory?)
* cílíš na lidi, u kterých se dá očekávat, že si budou hrát se sítí na nejnižší úrovni - třeba si nasmaží network stack do FPGA nebo postaví Ronju. Zase veliké riziko, že si „tajných paketů“ dřív nebo později někdo všimne - prostě až bude něco debugovat.
Mno jelikoz drtiva vetsina sitovek sou realteky, ktery neumej vubec nic ... tak se nemame moc ceho bat ;D.
Ale samo, skutecna sitovka muze klido ve vlastni rezii navazovat konexe na IP vrstve => napriklad preposilat veskery traffic, aniz by o tom system mel paru. Pokyn ji muze prijit klidne zvenku. Dokonce se to docela casto v ruznych variacich pouziva - prave proto, aby se procesor nemusel zabejvat sitovanim, coz v pripade realteku musi.
Ja by som sa necudoval, keby par vyvolenych vyrobcov (ci uz vedome, alebo nevedome) preposielaju aj "ethernet specke nevyhovujuce" sumy. Teda, ze si sietovka vygeneruje nieco, co nie je paket, ale len nieco ako sum a ina sietovka, ci cisco router, ked sum so specifickym paternom chyti, tak ho preposle vo svojom idle case dalej... Kto uz len dnes monitoruje svoje pripojenia na fyzickej vrstve?
Je to podobne, ako ked vas procak pocka, kym mu cez ruky preleze par specifickych bajtov, kedy sa prepne do specifickeho rezimu... Vid "hacknutie" hdd s instalaciou vlastneho kodu (to sa mi brutalne pacilo)...