info: pgs-soft.comWielu 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 „Zaloguj lub Zarejestruj się aby zobaczyć!” 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:Zaloguj lub Zarejestruj się aby zobaczyć!
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:
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.
- 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 drugi wymagał użycia blankietu dowodu osobistego i odpowiedniego fontu. Tutaj z pomocą przyszło…Zaloguj lub Zarejestruj się aby zobaczyć!, na którego stronach można znaleźć wystarczająco dokładne wzory dokumentów:
Odnalazłem też wywiad (Zaloguj lub Zarejestruj się aby zobaczyć!) w którym przeczytałem, że w aktualnym wzorze dowodu osobistego użyty został darmowy font Lato autorstwa Łukasza Dziedzica (Zaloguj lub Zarejestruj się aby zobaczyć!), 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łemZaloguj lub Zarejestruj się aby zobaczyć!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 pakietuZaloguj lub Zarejestruj się aby zobaczyć!będącego wrapperem bibliotekiZaloguj lub Zarejestruj się aby zobaczyć!, wypróbowałem teżZaloguj lub Zarejestruj się aby zobaczyć!orazZaloguj lub Zarejestruj się aby zobaczyć!.
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 aZaloguj lub Zarejestruj się aby zobaczyć!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 mamyZaloguj lub Zarejestruj się aby zobaczyć!, 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 iZaloguj lub Zarejestruj się aby zobaczyć!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.
Zaloguj
lub
Zarejestruj się
aby zobaczyć!