Pentru a include pachetul nixpkgs în depozitul utilizat de distribuția NixOS, a fost propus un mod de compilare repetabilă, care permite identificarea cazurilor de infiltrare a codului cu backdoor-uri, similar incidentului cu proiectul XZ. Metoda de protecție prezentată permite detectarea modificărilor în arhivele cu codul sursă al rundei, care nu se află în depozitele de cod.
Esenta metodei constă în faptul că codul sursă al noii versiuni a aplicației este compilat de două ori — prima dată din codul descărcat din depozitul git, iar a doua din codul distribuit în arhive finale. Dacă fișierele binare obținute în urma compilației diferă, apare un motiv de suspiciune cu privire la existența unor modificări ascunse în depozit sau în fișierul arhivat cu cod.
Amintim că, în cazul proiectului XZ, depozitul de cod nu conținea modificări suspecte. Componentele rău intenționate care formau backdoor-ul erau livrate în interiorul fișierelor utilizate în setul de teste pentru a verifica corectitudinea extractorului XZ. Backdoor-ul se activa la nivelul sistemului de compilare, iar codul sursă XZ coincidea cu codul din depozit. Macros-urile m4 care activau backdoor-ul pentru instrumentul Automake erau incluse doar în arhiva finală cu cod și lipseau din depozit.
Backdoor-ul din XZ a fost infiltrat de un atacator care a reușit să obțină statutul de întreținător al proiectului. Infiltrarea backdoor-ului a fost imediat neobservată datorită faptului că distribuțiile compilează în principal pachete descărcând cod din arhive finale, deoarece la descărcarea codului pentru compilare se poate utiliza doar o sumă de control pentru a verifica integritatea fișierului arhivat și pentru a folosi oglinzi. Atentia principală la verificarea codului se concentrează pe analiza conținutului depozitului, astfel încât diferențele neoficiale din arhive nu pot fi întotdeauna identificate imediat.
Pentru a simplifica verificarea conformității fișierelor arhivă și a instantaneelor din depozit, corespunzătoare versiunilor, unele proiecte deschise, cum ar fi PostgreSQL, au introdus un sistem de generare repetabilă a arhivelor. În acest caz, se oferă un instrument care permite utilizatorului să-și creeze propriul arhivă din cod, în totalitate conformă cu arhiva disponibilă pentru descărcare. Dacă arhiva creată independent și arhiva furnizată de proiectul principal vor diferi, acest lucru indică o compomitere a depozitului sau a arhivei de referință.
Problema este că o astfel de metodă este practicată doar în anumite cazuri, în timp ce multe proiecte continuă să includă în arhive artefacte suplimentare, absente din depozitul principal, cum ar fi paginile man, documentația, exemplele, scripturile pentru crearea pachetelor pentru distribuții și fișiere suplimentare de compilare. Acest lucru se întâmplă în principal din motive istorice și din particularitățile proceselor de formare a versiunilor. O simplă verificare a conformității conținutului depozitului și al arhivei nu este adecvată în acest caz.
Ca soluție, s-a propus să se colecteze fișierele binare de versiune atât din depozit (de exemplu, se poate folosi arhiva generată automat în GitHub pentru eticheta versiunii), cât și din arhiva pregătită de întreținător, comparând apoi rezultatul. Ca experiment, includerea unei astfel de verificări este propusă momentan doar pentru pachetul „xz”. Dacă experimentul se dovedește de succes, se speră să fie utilizat și în alte pachete din nixpkgs.
Sursa: opennet.ro
