Czy pliki binarne TrueCrypta były skompilowane z dostępnych źródeł?

dodał 25 października 2013 o 22:55 w kategorii Krypto  z tagami:
Czy pliki binarne TrueCrypta były skompilowane z dostępnych źródeł?

Zapewne część z Was korzysta z TrueCrypta pod Windows. Czy ktoś jednak sam skompilował go z dostępnych źródeł? Jeśli nie, to czy słusznie ufacie opublikowanym plikom binarnym? Ktoś postanowił to sprawdzić, skompilował i porównał wynik.

Publikacja kodu źródłowego jest dobrym krokiem w stronę zapewnienia przejrzystości projektu i zwiększenia poziomu zaufania użytkowników. Cóż jednak po opublikowanym kodzie źródłowym, jeśli znakomita większość użytkowników korzysta ze skompilowanych plików binarnych, weryfikując w najlepszym przypadku tylko ich zgodność z sygnaturami opublikowanymi na stronie producenta oprogramowania? Taka sytuacja dotyczy wielu programów, szczególnie na platformie Windows, gdzie mało kto bawi się we własnoręczną kompilację swoich plików. Dodatkowo w przypadku TrueCrypta nie wiadomo, kto jest jego autorem, co budzi zrozumiałe wątpliwości użytkowników.

Powtarzalna kompilacja nie jest prosta

Udowodnienie, że opublikowane pliki wykonywalne są skompilowane z opublikowanych plików źródłowych jest wbrew pozorom bardzo trudnym zadaniem (projekt TOR poradził sobie z nim dopiero kilka tygodni temu). Na treść wyniku kompilacji wpływa bardzo wiele czynników na poziomie konfiguracji sprzętu, oprogramowania i użytych narzędzi oraz bibliotek. By otrzymać wynik idealnie zgodny trzeba nie tylko zreplikować w 100% pełne środowisko, użyte do kompilacji oryginału, ale także zrobić to dokładnie tego samego dnia, o tej samej godzinie, minucie i sekundzie (informacje o czasie kompilacji są zapisywane w pliku wynikowym) oraz użyć tych samych certyfikatów do podpisania plików wynikowych i tych samych parametrów kompilacji. Nawet to nie gwarantuje, że suma kontrolna otrzymanego pliku będzie zgodna z oryginalną. Jak zatem odpowiedzieć na pytanie, czy TrueCrypt został skompilowany wyłącznie z dostępnych źródeł, bez żadnych nieprzewidzianych dodatków? Student kanadyjskiego uniwersytetu Xavier de Carné de Carnavalet stanął przed tym zadaniem – i mu podołał. Przeczytajcie, jak to zrobił.

Wszystko da się zrobić, trzeba tylko chcieć

Xavier zaczął od pobrania z oficjalnej strony projektu plików binarnych TrueCrupta 7.1a dla Windows oraz kodu źródłowego tej samej wersji. Zweryfikował sygnatury PGP pobranych plików, by potwierdzić ich autentyczność – wszystko się zgadzało. Następnie przystąpił do odtworzenia środowiska kompilacji, opisanego w pliku Readme.txt zawartym w archiwum kodu źródłowego. W tym celu pobrał i zainstalował następujące elementy:

Następnie upewnił się, że posiada dokładnie te same wersje, z których korzystali twórcy TrueCrypta oraz wszystkie aktualizacje, wydane przed dniem kompilacji wersji 7.1a, czyli przed 2012-02-07. Upewnił się także, że wszystkie programy zostały zainstalowane w odpowiednich ścieżkach, co również ma wpływ na końcowy wynik kompilacji a następnie uruchomił proces kompilacji w Visual Studio.

Skąd biorą się różnice

Jak możecie się domyślać, pliki wynikowe nie pasowały do pobranych ze strony TrueCrypta. Nie pasował nawet rozmiar, zatem nie było mowy o zgodności sum kontrolnych. Oczywiście różnice te mogły wynikać co najmniej z dwóch czynników – innych dat i godzin kompilacji oraz z braku identycznych podpisów cyfrowych. Xavier przystąpił zatem do analizy porównawczej plik po pliku. Zaczął od TrueCrypt.exe.

Początek skompilowanego pliku

Początek skompilowanego pliku

Początek oryginalnego pliku

Początek oryginalnego pliku

Jak widać, już w nagłówku pliku różnice znajdują się w trzech miejscach. Analiza wskazała, że pierwsza różnica (offset 000000F8) to znacznik czasu utworzenia pliku, druga (offset 00000148) to suma kontrolna nagłówka a trzecia (offset 00000188) to tablica certyfikatów. Wszystkie różnice w nagłówku pliku mają zatem wytłumaczenie.

Czwarta różnica pojawia się w ok. 2/3 długości pliku i jest to zapis daty kompilacji – również zrozumiały, zaś piąta różnica znajduje się na samym końcu pliku i jest to brak certyfikatu, którym podpisany był oryginalny plik. Poza tymi pięcioma różnicami plik był identyczny.

Kolejnym weryfikowanym plikiem był TrueCrypt Format.exe. Zawierał on dokładnie te same różnice co TrueCrypt.exe. Następnie analizie został poddany sterownik truecrypt.sys – tam różnic było więcej. Oprócz standardowych zmian daty i czasu pojawiły się różnice w innym miejscu pliku. Część z nich została wyjaśniona jako zmiana ścieżki źródłowej jednego z elementów kompilacji, jednak po skompilowaniu z identyczną ścieżką nadal część różnic w postaci 16 bajtów pozostała. Dalsza analiza wykazała, że powodem zmian był identyfikator GUID, generowany dla potrzeb debuggingu każdorazowo dla nowej kompilacji. Identyczne różnice znalazły się także w sterowniku dla wersji 64-bitowej.

Dla kompletu pozostał już tylko plik instalatora TrueCrypt Setup 7.1a.exe, zawierający wszystkie powyżej opisane pliki. W tym wypadku różnica – oprócz już wyjaśnionych fragmentów – wynosiła jedynie 4 bajty, które okazały się sumą kontrolną. Na zakończenie Xavier porównał jeszcze utworzone pliki z plikami oryginalnymi, pozbawionymi podpisów cyfrowych i potwierdził, że powyższe wyjaśnienia opisały wszystkie stwierdzone różnice.

Xavier przeprowadził także deasemblację  obu wersji plików za pomocą MinGW-w64 i stwierdził, że jej wyniki są w 100% identyczne, zatem pliki są identyczne nie tylko na poziomie binarnym, ale także funkcjonalnym. Xavier dla porządku wykonał identyczne operacje dla wersji 7.0a oraz 6.3a i doszedł do tych samych wniosków.

Podsumowanie

W oparciu o eksperyment wzorcowo przeprowadzony przez Xaviera można stwierdzić, że pliki binarne TrueCrypta w wersji dla Windows, udostępniane obecnie na stronie projektu, zostały skompilowane z udostępnionych w tym samym miejscu źródeł. Czego zatem nie można na 100% stwierdzić:

  • tego, ze zawsze udostępniane były te same pliki (chociaż tu może pomóc archive.org i inne archiwa i kopie)
  • tego, że kompilator Microsoftu nie dodaje czegoś od siebie w każdym przypadku (problem zaufania do kompilatora jest jeszcze bardziej złożony)
  • tego, że w kodzie źródłowym nie schowano jakiejś bardzo sprytnej tylnej furtki, której działanie nie jest oczywiste dla osób ten kod czytających (ten problem planuje rozwiązać inicjatywa audytu kodu źródłowego TrueCrypta).

Mimo tych zastrzeżeń praca Xaviera daje użytkownikom TrueCrypta całkiem sensowne poczucie komfortu i bezpieczeństwa. A jeśli ktoś nie ufa Xavierowi – zawsze może skompilować sam i podzielić się z nami wynikiem.