Chyba nie ma takiej firmy ani agencji rządowej, która by nie korzystała z plików PDF. Aby zapewnić autentyczność dokumentów, często używają one podpisów cyfrowych. Po otwarciu podpisanego pliku w dowolnej przeglądarce PDF program wyświetla flagę, która informuje, przez kogo dokument został podpisany, i umożliwia sprawdzanie poprawności podpisu.
Zespół badaczy z kilku niemieckich uniwersytetów postanowił przetestować rzetelność podpisów w plikach PDF. Podczas konferencji Chaos Communication Congress (36С3) Władysław Mładenow z Uniwersytetu Ruhry w Bochum omówił rezultaty przeprowadzonego badania.
Zadaniem naukowców było zmodyfikowanie zawartości podpisanego dokumentu PDF bez unieważnienia podpisu. W teorii cyberprzestępcy mogą w ten sposób dodać do podpisanego pliku fałszywe informacje lub złośliwą zawartość. W końcu klienci, którzy otrzymają podpisany dokument z banku, najprawdopodobniej będą mu ufać i klikną wszelkie zawarte w nim łącza.
Zespół zbadał 22 popularne przeglądarki plików PDF dla różnych platform. Wyniki prezentujemy poniżej.
Struktura pliku PDF
Najpierw omówimy format PDF. Każdy plik składa się z czterech głównych części: nagłówka (Header), który pokazuje wersję PDF; sekcji (Body), która pokazuje treści widziane przez użytkownika; sekcji odnośników zewnętrznych (Xref), czyli katalogu z listą obiektów znajdujących się w treści i ich lokalizacją (do wyświetlania zawartości); i stopki (Trailer), od której przeglądarki plików PDF zaczynają czytać dokument. Stopka zawiera dwa ważne parametry, które informują program, gdzie rozpocząć przetwarzanie pliku i gdzie rozpoczyna się sekcja Xref.
W omawianym formacie zintegrowana jest przyrostowa funkcja aktualizacji, która pozwala użytkownikowi na przykład zaznaczyć część tekstu i wstawić komentarz. Z technicznego punktu widzenia funkcja dodaje trzy kolejne sekcje: aktualizacje treści, nowy katalog Xref i nowa]ą stopkę. Dzięki temu można zmienić sposób, w jaki obiekty są widoczne dla użytkownika, oraz dodać nową zawartość. Podpis cyfrowy to w zasadzie również aktualizacja przyrostowa, dodająca do pliku inny element i odpowiednie sekcje.
Atak wykorzystujący zapisywanie przyrostowe (Incremental saving attack, ISA)
Najpierw zespół próbował dodać do pliku dodatkowe sekcje z inną aktualizacją przyrostową za pomocą edytora tekstu. W rzeczywistości nie był to atak – badacze użyli funkcji udostępnionych przez twórców tego formatu. Gdy użytkownik otworzy plik, który został zmodyfikowany w ten sposób, czytnik PDF zwykle wyświetli komunikat informujący, że podpis cyfrowy jest prawidłowy, ale dokument został zmodyfikowany. Niestety taki komunikat niewiele mówi niedoświadczonym użytkownikom. Co gorsza, jeden z czytników plików PDF (LibreOffice) nie pokazywał nawet takiej wiadomości.
Kolejny eksperyment polegał na usunięciu dwóch ostatnich sekcji (czyli dodania aktualizacji do treści, ale nie nowego odnośnika i stopki). Część aplikacji odmówiło pracy z takim plikiem. Dwie przeglądarki plików PDF zorientowały się, że brakuje tych sekcji, i automatycznie dodały je bez powiadamiania czytelnika o zmianie zawartości. Trzy inne otworzyły plik bez zastrzeżeń.
Następnie badacze zastanawiali się, co by się stało, gdyby po prostu skopiowali podpis cyfrowy do własnej, „ręcznej” aktualizacji. Dwie przeglądarki — Foxit i MasterPDF — nie miały z tym problemu.
W sumie 11 z 22 przeglądarek PDF okazało się podatne na te proste manipulacje. Co więcej, sześć z nich nie wyświetliło absolutnie żadnych informacji, że otwarty dokument został zmodyfikowany. W pozostałych pięciu przypadkach, aby dowiedzieć się o zmianach, użytkownik musiał wejść do menu i sprawdzić poprawność podpisu cyfrowego samodzielnie (po otwarciu pliku nie były widoczne żadne informacje).
Atak polegający na zawijaniu podpisu (Signature wrapping attack, SWA)
Po podpisaniu dokumentu do treści zostają dodane dwa istotne pola w postaci aktualizacji przyrostowej: /Contents, które zawiera podpis, i /ByteRange, które dokładnie opisuje to, co zostało podpisane. Ten ostatni zawiera cztery parametry: określenie początku pliku, liczba bajtów przed kodem podpisu, bajt określający miejsce zakończenie kodu podpisu oraz liczba bajtów po podpisaniu. Wynika to z faktu, że podpis cyfrowy jest sekwencją znaków wygenerowaną na drodze kryptografii z kodu dokumentu PDF. Oczywiście podpis nie może zarejestrować się sam, więc obszar, w którym jest przechowywany, jest wykluczony z procesu obliczania podpisu.
Badacze próbowali dodać kolejne pole /ByteRange tuż po podpisaniu. Zawarte w nim pierwsze dwie wartości pozostały niezmienione, w przeciwieństwie do adresu końca kodu podpisu. W rezultacie pojawiło się dodatkowe miejsce w pliku pozwalające na dodanie szkodliwych obiektów, jak również sekcja Xref z opisem. Teoretycznie, jeśli plik został odczytany poprawnie, przeglądarka plików PDF ignorowała tę sekcję. Jednak 17 z 22 aplikacji było narażonych na atak.
Fałszowanie podpisu uniwersalnego (Universal signature forgery, USF)
W celu uzyskania poprawności pomiaru zespół badawczy postanowił również sprawdzić standardową sztuczkę wykorzystującą testy penetracyjne, w której wartości pól są zastępowane nieprawidłowymi lub są zwyczajnie usuwane. Jeśli chodzi o sekcję /Contents, okazało się, że gdy prawdziwy podpis został zastąpiony przez wartość 0x00, dwa programy mimo wszystko zatwierdzały go.
A co w przypadku, gdy podpis pozostanie na swoim miejscu, ale usunięta zostanie sekcja /ByteRange (czyli informacje o tym, co dokładnie zostało podpisane)? Lub wstawimy zero zamiast rzeczywistych wartości? W obu przypadkach niektóre przeglądarki zatwierdzały taki podpis.
W sumie w 4 z 22 programów znaleziono błędy wdrożeniowe, które mogłyby zostać wykorzystane do niepożądanych celów.
Poniższa tabela pokazuje, że na takie oszustwa podatne jest aż 21 z 22 przeglądarek plików PDF. Oznacza to, że niemal dla wszystkich (za wyjątkiem jednej) można utworzyć plik PDF ze szkodliwą zawartością lub fałszywymi informacjami, które użytkownik zobaczy jako aktualne.
Co ciekawe, jedyną aplikacją, która nie poddała się żadnemu z trików badaczy, była Adobe Reader 9. Jednak jest ona podatna na lukę RCE i używają jej tylko użytkownicy systemu Linux, ponieważ dla nich jest to najnowsza dostępna wersja.
Wnioski
Jakie wnioski możemy wyciągnąć z tych eksperymentów? Po pierwsze, nie należy zbytnio ufać podpisom cyfrowym w plikach PDF. Jeśli widzisz zielony ptaszek, niekoniecznie oznacza to, że podpis jest prawidłowy.
Po drugie, nawet podpisany dokument może stwarzać zagrożenie. A zatem zanim otworzysz jakikolwiek plik otrzymany przez internet lub klikniesz jakiś zawarty w nim link, upewnij się, że na komputerze zainstalowane jest niezawodne rozwiązanie zabezpieczające.