Ted tomu uplne nerozumim, Debian se snazi, aby bylo mozne cely Debian vcetne balicku prekompilovat na lokalnim stroji?
Debian nepouzivam, ale docela me to prekvapilo - to do ted neslo? Pouzivam FreeBSD a tam je tohle standard od prvopocatku (minimalne od verze 2.2.5). Balicky (ports) muzu bud kompilovat nebo stahovat binarni a stejne tak cely system (world). Neresi to mozna napadeni kompilatoru, ale tady je to napsane, jakoby si clovek nemohl doma prekompilovat cely Debian...
Samozřejmě že jde.
Rozdíl je v tom, že když si FreeBSD port zkompilujeme já a ty a porovnáme to, nejspíš se budou výsledky lišit. Buď proto, že já jsem NSA, nebo proto, že to prostě nekompiluje deterministicky. Debian se snaží o to, aby se výsledky nelišily, a nebyl tak prostor pro spekulace.
Najdi si příručku C a podívej se, co dělají třeba makra __DATE__, __TIME__,...
Jinak někde jsou u kompilátoru další "bezpečnostní" funkce - rozhází v binárce data a funkce náhodně, aby hacker měl problém se k funkcím/datům v binárce dostat automaticky. Tam po diffu bude stejných tak 3-5%, a to ještě v případě, že binárka bude zkompilovaná na jednom stroji v jednom dni...
Tak cílem toho projektu je právě všechna tato "makra" a jiné build-time závislé řetězce nahradit něčím deterministickým. Co se týče CPP maker, tak je to popsáno zde ve wiki stránce TimestampsFromCPPMacros.
A úplně konkrétně odstranění náhodnosti v buildu může vypadat například takto pro libjpeg-turbo
S tou randomizací address space myslíte ASLR (PIC a PIE) nebo ještě něco jiného - viz poznámka o linkeru od andre+?
Zkus si například spustit Vim a dát příkaz :ver
Já mám hned na prvním řádku řekněme mám:
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan 2 2015 19:05:59) potom Compiled by tisnik atd.
Ty tam budeš mít na 99% něco jiného, minimálně těchto pár bajtů tedy bude v binárce odlišných. Dtto JVM a asi i stovky dalších aplikací...
Upresnim, pricipielne jde predevsim o to, ze kdyz si vemes zdrojaky, udelas jejich audit, zjistis, ze v nich neni nic zavadnyho a prekompilujes je, ziskas binarku, ktera je do posledniho bitu totozna s tou, kterou ti posle distribuce.
Aktualni stav je totiz takovy, ze ty mas zdrojaky a binarku ale nejsi schopen overit, zda ta binarka je vysledkem kompilace tech zdrojaku, nebo je v ni jeste neco dalsiho. A pokud mas jako bonus cinknutej kompilator, tak ti nepomuze ani to, ze si vse kompilujes sam (z tech proverenejch zdrojaku).
Princip chapu a rozumim i tomu, ze jelikoz nepouzivam Debian resp.Linux, tak to vidim jinak. Pro me je bezna distribuce ve zdrojacich a kompilace vseho (dela se to koneckoncu automatizovane).
Chapu to spis tak, ze nejak chteji resit prave moznost cinknuteho kompilatoru. A to me zajima...
No a prave aby to resit mohli, potrebujou zajistit, ze kdyz tisicovka lidi neco prekompiluje, je to vzdycky stejny. Pak mas slusnou sanci, ze tvoje stejna binarka cinkla neni. A nebo je ... stejne jako u ty tisicovky ;D.
IMO to je stejne ponekud sisyfovska prace. Vzdycky to totiz bude zaroven o totoznych verzich vsech dev nastroju.
No ja nevim, jestli to ta tisicovka bude kompilovat tim samym kompilatorem (a pod 'tim samym' myslim kompilatory, ktere alespon nekdy v minulosti byly zkompilovany stejnym kompilatorem) tak to stejne zadny dukaz neni.
To jde jedine pomoci bootstrapu, kdy nejprve primitivnim minikompilatorem psanem primo v asembleru, jehoz nezavadnost si muze kazdy overit, zkompilujeme nejaky slozitejsi, u nejz nam jiz staci overit bezzavadnost zdrojaku, a to opakujeme, dokud se nedostaneme ke gcc :)
Staci, ked par ludi bootstrapne balicek kompilatoru. Ti potom mozu zverejnit, ze balicek s gcc ma checksum XYZ. Dalsi si to mozu overit rovnako ako ti prvi, alebo tym prvym budu verit (preto, ze to potvrdil niekto pre nich doveryhodny).
Ludia IMHO nemusia vediet, cim kompiluju. Proste to skompiluju a ked nezavisly stroj overi spravne checksum vygenerovaneho baliku, tak sa balik skompiloval spravne a bud sa (umyselny) bug v kompilatore neprejavil alebo sa prejavil vsetkym rovnako. Staci jeden doveryhodny clovek, co si tym presiel od bootstrapu a ten by odhalil problem.
<humor>
jine reseni, je mit vsecko v systemu ulozeno jako zdrojaky.
a v okamziku kdyz spustim prikaz, tak se duveryhodnym kompilatorem
zkompiluje kompilator a pak se zkompiluje binarka.
po ukonceni behu se binarky zas odstrani z pameti, na disku zadny binarni
spustitelny soubor nebude.
</humor>
Nejde ani tak o to, aby si člověk sám překompiloval Debian. To nikdo dělat nebude (proč taky?) Jde o to zaručit, že binárky jsou opravdu z daných zdrojáků, který kompiler je konkrétně generoval, ideálně s kterými verzemi knihoven, kterými přesnými options atd. To je v dnešní době důležitá věc a jsem rád, že to Debian chce řešit. Zbývá doufat, že se navržený přístup nejen osvědčí, ale že se i rozšíří na další hlavní distra.