Co Niebezpiecznik zrobił źle, czyli jak nie anonimizować zrzutów ekranu

Październik 10, 2017 Tomasz Zieliński

Wielu pracowników PGS Software z zainteresowaniem śledzi publikacje serwisu Niebezpiecznik.pl, który od dawna propaguje dobre praktyki bezpieczeństwa teleinformatycznego, a niewłaściwe piętnuje. Tym bardziej więc zaskoczył nas obrazek w tekście „Zgłoszenie utraty dowodu – czy musi wyświetlać tyle danych?” z końca września 2017. Był nim pochodzący z serwisu obywatel.gov.pl zrzut ekranu z dowodem osobistym zawierającym rozmyte dane autora tekstu. Jak się okazało – rozmyte nie dość mocno.

Zrzut ten wyglądał mniej więcej tak:

Był to link do większego obrazka, którego fragment wyglądał tak:

Litery, choć mocno rozmyte, tworzą dające się odczytać imię i nazwisko autora tekstu. Czyżby powiększony obrazek mógł zdradzić więcej danych? Postanowiłem przyjrzeć się temu tematowi i podjąć próbę rekonstrukcji pozostałych pól.

Przed dalszą lekturą koniecznie otwórz w osobnej zakładce następujący link: https://niebezpiecznik.pl/wp-content/uploads/2017/09/zgloszen-id.png

Użyte narzędzia

Na pierwszy ogień wziąłem rozmyte imiona rodziców, w oryginale prawie niemożliwe do odczytania – można było jedynie oszacować długość obu słów. Przyjąłem algorytm działania składający się z następujących kroków:

  • Wygenerowanie słownika najpopularniejszych imion w Polsce
  • Nakładanie kolejnych imion na blankiet dowodu osobistego i aplikowanie filtru rozmycia
  • Porównanie wynikowego obrazu z pierwowzorem

Krok pierwszy udało się pokonać w kilka minut, listy imion z częstotliwością występowania można znaleźć np. w witrynach fanów heraldyki czy na stronach szkół rodzenia.

Krok drugi wymagał użycia blankietu dowodu osobistego i odpowiedniego fontu. Tutaj z pomocą przyszło… MSWiA, na którego stronach można znaleźć wystarczająco dokładne wzory dokumentów:

Odnalazłem też wywiad (http://nietylko.design/001-marcin-malicki/) w którym przeczytałem, że w aktualnym wzorze dowodu osobistego użyty został darmowy font Lato autorstwa Łukasza Dziedzica (http://www.latofonts.com/team/), pobrałem go i zainstalowałem.

Font Lato nie przydał się jednak, bo – jak wykazał eksperyment – generator obrazu dowodów osobistych w wersji online używa Ariala lub czegoś wystarczająco do Ariala podobnego.

Wyznaczenie pozycji, rozmiaru i wariantu czcionki wymagało eksperymentów na kilku rzeczywistych zrzutach ekranu. Na rzuconą w firmie prośbę o pomoc zareagowali Jurek, Bartek, Krzysiek i Paweł – dzięki panowie! Wyposażony w kilka kompletów wzorcowych plików byłem w stanie określić wszystkie parametry i generować napisy niemal idealnie odtwarzające teksty z formularza utraconego dowodu osobistego.

Po przeskalowaniu obrazu z blankietem zyskałem możliwość generowania obrazów dokumentu z dowolną zawartością:

Kolejnym krokiem przygotowań było programowe odtworzenie efektu rozmycia, który zaaplikowano na zrzucie ekranu opublikowanym w Niebezpieczniku. Konieczna była znajomość którejś z rozmytych sekcji, ze stuprocentową pewnością mogliśmy obstawiać imię, nazwisko i obywatelstwo.

Wypróbowałem rozmycie Gaussa z różnymi wartościami parametrów. Funkcją podobieństwa była średnia wartość odchylenia wartości pikseli od wzorca, obliczona przez bibliotekę ImageMagick. Podczas realizacji tej części powstawały robocze ilustracje jak poniżej:

Oczywiście wszystkie kroki eksperymentów były na bieżąco automatyzowane.

Tego typu prace idą mi najsprawniej w C# i Visual Studio, korzystałem z pakietu Magick.NET będącego wrapperem biblioteki ImageMagick, wypróbowałem też AForge.NET oraz .NET Image Library.

Imiona rodziców

Po skompletowaniu narzędzi wystarczyło wziąć listę imion, filtr Gaussa z wyznaczonymi parametrami i funkcję porównującą, by odczytać z oryginału imię ojca a chwilę później i matki. Co więcej – dysponując dwoma długimi słowami byłem w stanie wyliczyć jeszcze dokładniejsze parametry funkcji rozmycia. Pomogło to potem w identyfikacji kolejnych pól, np. daty urodzenia – tu trudniej wykryć różnicę między występującymi obok siebie rozmytymi cyframi “3”, “8” czy “9”.

(ilustracja poglądowa)

PESEL, numer dowodu i inne

Dalej było z górki. Odtworzona data urodzenia zdradza sześć pierwszych cyfr numeru PESEL, ostatnia cyfra jest wartością kontrolną, przedostatnia musi być nieparzysta (mamy do czynienia z mężczyzną). Do przepuszczenia przez algorytm pozostaje raptem 5000 możliwych kombinacji, więc PESEL poddaje się po kilku chwilach.

Numer dowodu jest teoretycznie trudniejszy, bo trzy litery i sześć cyfr to kilkanaście miliardów kombinacji. W praktyce udaje się łamanie go w sekcjach po kilka znaków, tym bardziej, że dwie pierwsze litery można wytypować z daty wystawienia dokumentu a cyfra kontrolna eliminuje 90% błędnych odczytów.

Prawdopodobne miejsce zamieszkania można określić na bazie pola z organem wydającym dokument – tu mamy jeszcze prościej, bo na zrzucie opublikowanym w Niebezpieczniku pozostawiono początek nazwy organu: “Prezydent [……]”, przy czym zamazane pole z nazwą miejscowości jest dość długie. Okazuje się, że prezydentów miast mamy niewiele ponad setkę, a właściwą pozycję można wytypować gołym okiem.

Na ilustracji powyżej widzimy przykład problemu, który wystąpił w analizowanym zrzucie ekranu w polu z miejscem urodzenia – ogonek diakrytyczny wystawał poza obszar rozmycia. Tym samym z kilkudziesięciu tysięcy możliwych wartości tego pola do weryfikacji pozostaje raptem kilka – wystarczy wytypować nazwy oczekiwanej długości, w których tzw. „polskie znaki” pojawią się na oczekiwanej pozycji.

Data ważności i wystawienia dokumentu są już tylko formalnością. Dzieli je równo dziesięć lat, więc odczyty wzajemnie się korygują.

Podsumowanie

Jak pokazałem wyżej, jeden nie dość dobrze zanonimizowany zrzut ekranu może posłużyć do odtworzenia wszystkich danych zapisanych w dowodzie osobistym autora, zaś publikacja taka może zdarzyć się nawet firmie zajmującej się profesjonalnie bezpieczeństwem IT.

Przed publikacją niniejszego tekstu planowałem skontaktować się z autorem, jednak nie zdążyłem – redakcja Niebezpiecznika wcześniej poprawiła już rozmycie pól na ilustracji i opublikowała tekst opisujący przyczyny przeoczenia.

Dziś opisany atak może zostać przeprowadzony jedynie przez te osoby, które znajdą poprzednią wersję ilustracji w cache przeglądarki. Jeśli na początku lektury zrealizowałeś/aś polecenie otworzenia obrazka w osobnej zakładce, raczej nie znajdziesz już na swoim dysku owej poprzedniej wersji. Dziękuję za współpracę.

Uwaga: w niniejszym tekście można znaleźć imię i nazwisko autora cytowanego artykułu. Wszystkie pozostałe dane widoczne w tekście lub na ilustracjach zostały spreparowane i nie mają związku z danymi rzeczywistymi.

Dodatek: jak poprawnie anonimizować zrzuty ekranu

Obrazek wzorcowy:

Źle: zbyt słabo rozmyty numer można zrekonstruować w sposób opisany w tekście

Źle: także tu wyjściowa sekwencja cyfr może dać się odtworzyć

Bardzo źle: filtr “zawirowanie” można odwrócić – cyferki będą jedynie nieznacznie postrzępione

Nadal źle: kilka cyfr pozostaje widocznych, ilość rozmazanego “tuszu” niesie informację o pozostałych

Źle: jeden rząd pikseli nie został rozmazany, duża szansa na pełne odtworzenie treści

Dość dobrze: mocne rozmycie sprawia, że informacje o poszczególnych cyfrach zostały utracone, jednak pola zmiennej długości nadal zdradzają pewne dane o oryginale

Bardzo dobrze: kompletny brak informacji o pierwotnej zawartości

Opisane techniki dotyczą edycji zwykłych bitmap, czyli plików takich, jak JPG, GIF czy PNG. Jeśli anonimizujesz PDF-y czy pliki Worda, zwróć uwagę, czy wstawiane jednokolorowe prostokąty nie są przypadkiem wektorowymi obiektami osadzanymi na tle oryginalnych obrazów. Jeśli tak się stanie, pierwotne bitmapy będzie można wydobyć z pliku przy znikomym nakładzie pracy. Niektóre formaty danych zawierają też osadzone w metadanych miniaturki, warto usunąć je przed publikacją plików.

Najnowsze wpisy