Powtarzalne kompilacje aplikacji VPN: co dowodzi zgodność
Zgodna przebudowa wiąże dystrybuowany plik binarny z zadeklarowanym kodem źródłowym i narzędziami. Nie mówi nic o usłudze VPN stojącej za tym plikiem ani o jej logach.
Powtarzalność jest właściwością łańcucha dostaw: te same zadeklarowane dane wejściowe muszą dawać ten sam artefakt. Dla klienta VPN to stwierdzenie wiąże pobrany instalator z kodem źródłowym i łańcuchem narzędzi, które każdy może przebudować. Nie mówi nic o usłudze, z którą łączy się klient.
Pożyteczne pytanie jest więc wąskie i ma odpowiedź. Czy projekt publikuje procedurę i czy twój konkretny artefakt jest z nią zgodny?
Gdzie kompilacja przestaje być deterministyczna
Kompilatory wbudowują znaczniki czasu, ścieżki bezwzględne i nazwy hostów kompilacji, o ile im tego nie zabroniono. Archiwa zapisują kolejność plików i czasy modyfikacji, linkery zmieniają wynik wraz z wersją łańcucha narzędzi, a równoległa kompresja może przestawić bloki. Każda z tych rzeczy sprawia, że dwie kompilacje tego samego źródła różnią się w bajtach, choć nie dzieje się nic złowieszczego. Deterministyczność wpisuje się w kompilację inżyniersko, nigdy nie dziedziczy się jej domyślnie.
Projekt, który twierdzi, że jest powtarzalny, musi wskazać stosowaną normalizację: stałe znaczniki czasu, zmapowane ścieżki, posortowane wpisy archiwum, przypięte wersje kompilatora i zależności. Bez tej listy rozbieżności nie da się zinterpretować, bo przestrzeń dopuszczalnych zmian jest niezdefiniowana.
Zadeklarowane dane wejściowe też muszą być kompletne. URL repozytorium bez taga nie jest rewizją, plik blokady bez skrótu nie jest zbiorem zależności, a skrypt kompilacji, który pobiera narzędzie w czasie działania, ma dane wejściowe, których nikt nie potrafi przypiąć. Każda luka staje się później różnicą. Uzupełnij listę, zanim cokolwiek porównasz, bo niekompletna lista nie może zawieść w sposób, który coś znaczy.
| Input | How it drifts | What pins it |
|---|---|---|
| Source | Branch moves after release | Commit hash in the build metadata |
| Toolchain | Compiler patch level differs | Container image digest |
| Packaging | Archive order and mtimes vary | Normalised archive settings |
Co porównanie faktycznie sprawdza
Niezależna strona przebudowuje w zadeklarowanym środowisku i porównuje wynik z opublikowanym artefaktem. Identyczność bitowa to forma mocna; udokumentowany krok normalizacji, w którym zapisaną różnicę odwraca się i wyniki wtedy się zgadzają, to forma słabsza, ale wciąż użyteczna.
Porównanie dotyczy pliku binarnego. Podpis odpowiada na inne pytanie: wiąże wydanie z kluczem, a klucz z tożsamością, i projekt może mieć ważne podpisy nad artefaktami, których nikt nie przebudował. Oba testy się sumują, a nie zastępują.
sha256sum wireguard-installer.msi gpg --verify wireguard-installer.msi.sig wireguard-installer.msi
Uruchom oba przed instalacją i porównaj skrót z opublikowanym dla tego samego wydania i platformy. Skrót zgodny ze stroną dostawcy dowodzi, że pobranie dotarło nietknięte; przebudowany plik binarny zgodny z opublikowanym skrótem dostawcy dowodzi czegoś mocniejszego o tym, jak powstał.
Dlaczego rozbieżność nie jest dowodem manipulacji
Większość rozbieżności pochodzi z danych wejściowych, których nikt nie kontrolował. Inne wydanie poprawki kompilatora, ścieżka kompilacji, która wyciekła do symboli debugowania, ustawienie regionalne, które zmieniło kolejność sortowania, albo krok pakowania zastosowany po porównaniu dają inny skrót niż uczciwa praca.
Dlatego rozbieżność trzeba czytać wobec udokumentowanej procedury, zanim stanie się historią. Jeśli procedura przypina wszystko, a różnica pozostaje niewyjaśniona, to prawdziwe znalezisko warte zgłoszenia projektowi. Jeśli procedura milczy o pakowaniu, różnica może być całkowicie oczekiwana.
Symetria też ma tu znaczenie: zgodność nie dowodzi, że kod źródłowy jest wolny od wad, a jedynie że plik binarny mu odpowiada. Dobrze zbadany kod i kod powtarzalny to różne właściwości, a projekt może mieć jedną bez drugiej.
Co twierdzenie mówi o usłudze stojącej za aplikacją
Klient to program na twoim urządzeniu; usługa to serwery, systemy kont i zasady przechowywania gdzie indziej. Powtarzalność ogranicza pierwsze i nie mówi nic o drugim, niezależnie od tego, jak starannie zweryfikowano instalator.
Konfiguracja punktu końcowego może się też zmienić po instalacji, przez ustawienia zdalne lub profil kontrolowany przez dostawcę. Te zmiany przychodzą przez sieć i nie obejmuje ich żaden skrót obliczony przed połączeniem.
Czytaj twierdzenie w jego rzeczywistym zakresie, a potem osobno sprawdź sąsiednie pytanie: co dostawca rejestruje i w jakiej jurysdykcji odpowiada na żądania. Zweryfikowany plik binarny i niezweryfikowana usługa mogą współistnieć, i właśnie ten przypadek kontrola łańcucha dostaw ma pokazać, a nie naprawić.