20 czerwca 2010

Dane wieczyście dostępne [Aktualizacja]

Zapraszam do zapoznania się z poniższym artykułem autorstwa Łukasza Lubosza.
Jakiś czas temu Ministerstwo Sprawiedliwości uruchomiło pod adresem http://ekw.ms.gov.pl/pdcbdkw/pdcbdkw.html serwis umożliwiający dowolnym osobom wgląd w rejestr ksiąg wieczystych. Rejestr ten przechowuje informacje o stanie prawnym nieruchomości, w szczególności zawarte są tam dane właściciela, szczegółowy opis nieruchomości oraz zajęcia prawne i hipoteki. Do czasu uruchomienia systemu jedyną możliwością uzyskania dostępu do księgi wieczystej danej nieruchomości (na przykład w celu potwierdzenia prawa własności człowieka, który właśnie chce nam sprzedać dom), był wniosek w odpowiednim sądzie rejonowym o odpis z danej księgi. Procedura typowo biurokratyczna, długawa i zupełnie nienowoczesna. Wychodząc naprzeciw potrzebom petentów, ministerstwo uruchomiło system informatyczny, który miał znacząco ułatwić dostęp do tych danych. Ułatwił – aż za bardzo.
Obsługa systemu jest bardzo prosta, wpisujemy symbol księgi wieczystej składający się z kodu wydziału sądu, numeru dokumentu oraz cyfry kontrolnej (dla jeszcze większego ułatwienia formularz na stronie sam oblicza wymaganą cyfrę kontrolną) i następnie po wpisaniu odpowiedniego kodu captcha możemy swobodnie przeglądać pełną zawartość księgi wieczystej.

Sprawdźmy jak to działa.

Dzięki dodatkowi dla przeglądarki firefox pod nazwą HttpFox możemy przyjrzeć się komunikacji między serwerem a naszą przeglądarką. Wszystkie dane są wysyłane za pośrednictwem metody POST:
Nie ma tu nic ciekawego, znane nam dane formularza, akcja i kod captcha. Ciekawie zaczyna się dziać, gdy podejrzymy kolejne zapytanie, wykonywane w momencie próby uzyskania dostępu do pełnej księgi:
Zauważmy, że pojawił się enigmatyczny parametr idKsiegi, jest to wewnętrzny identyfikator rekordu w bazie danych. Od tej chwili możemy przeglądać sobie całą księgę. Składa się ona z sześciu stron. Przełączanie między nimi jest realizowane poprzez wywołania AJAX - POST o tych samych parametrach, co jej otwarcie i dodatkowo zmienną xml, która przyjmuje wartości zależne od wywoływanej strony.

Gdzie tkwi problem?

Błąd implementacji tkwi w niepoprawnym sprawdzaniu parametrów sesji. Aplikacja w sesji uwierzytelnionej kodem captcha zachowuje jedynie parametry kodEci, numerKw i cyfraKontr. Parametr idKsiegi jest pomijany, a to on odpowiada za pobranie właściwych danych w sesji. Więc jeżeli posiadamy otwartą, uwierzytelnioną sesję w której wyszukaliśmy jakąkolwiek księgę, to do jej końca mamy dostęp do wszystkich danych z rejestru. Sytuację upraszcza fakt, iż publiczne identyfikatory w bazie danych nie są losowane, a inkrementowane od numeru 1...

Spróbujmy zatem zdobyć dane osobowe losowych, zupełnie nieznanych nam osób. Na początek przyjmijmy, że interesuje nas imię i nazwisko oraz numer pesel (jeżeli jest dostępny). Pierwszą rzeczą będzie automatyczne pobieranie treści strony. Interesujące nas dane dostępne są na stronie Dział II każdej księgi.
Aby uzyskać dostęp do wielu ksiąg, wystarczyłoby wielokrotnie wywołać zapytanie POST z oryginalnymi parametrami podanymi w czasie wyszukiwania księgi i zmienionym parametrem idKsiegi. My jednak chcemy w pełni automatycznie zrzucić sobie wymagane dane możliwie wszystkich osób zapisanych w księgach wieczystych.

Krok pierwszy: automatyzacja wywołań.

Aby nie zajmować sobie głowy automatycznym otwieraniem czy podtrzymywaniem sesji, postanowiłem napisać prostą aplikację działającą wewnątrz przeglądarki. Wykorzystałem do tego celu javascript z popularną biblioteką jQuery oraz PHP. Dane chcemy ładować do aplikacji poprzez AJAX, jednak pojawia się tu pewna trudność. Otóż nowoczesne przeglądarki aby zapobiec atakom XSS uniemożliwiają nam ładowanie danych poprzez AJAX ze źródeł innych niż domena z której dane wywołanie zostało uruchomione. Aby obejść to zabezpieczenie prosimy firefox o chwilowe „rozluźnienie” polityki bezpieczeństwa wywołując przed każdym zapytaniem AJAX instrukcję JavaScript:
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
Od tej chwili, po zaakceptowaniu wyjątku bezpieczeństwa możemy już beztrosko pobierać sobie treść dowolnych ksiąg do naszej aplikacji (poniżej okno przykładowego programu służącego do tego celu).
Całość jednorazowego wywołania wygląda tak:

try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
} catch (e) {
alert("UniversalBrowserRead perm denied");
}

$.post('http://ekw.ms.gov.pl/pdcbdkw/pdcbdkw.html', {t_action: "przeglAkt", idKsiegi: i, kodEci: $('#wsid').val(), numerKw: $('#kwid').val(), cyfraKontr: $('#kont').val(), xml: "Dz2"}, function(data){ $.post('worker.php', {payload: data, id: i}); })

Oczywiście wstawiane wartości pochodzą z pól formularza.

Krok drugi: wyciągamy dane.

Jak widać w funkcji callback, wywołujemy lokalny skrypt worker.php z dwoma parametrami. Pierwszy to pełna zawartość strony księgi wieczystej, a drugi to po prostu jej identyfikator wewnętrzny. W pliku worker.php dokonujemy banalnego parsowania za pomocą wyrażeń regularnych:

    $id = $_POST['id'];
    $str = $_POST['payload'];

    if (preg_match("/pierwsze.*?45\"\>(.*?)\
    {
        $imie = $matches[1];
    }
    if (preg_match("/onego.*?45\"\>(.*?)\
    {
        $nazwisko = $matches[1];
    }
    if (preg_match("/PESEL.*?45\"\>(.*?)\
    {
        $pesel = $matches[1];
    }

    if ($imie && $nazwisko)
    {
        $fw = fopen("output.txt", "a");
        fwrite($fw, $id.",".$imie.",".$nazwisko.",".$pesel."\n");
        fclose($fw);
    }

Do pliku w formacie CSV przekierowujemy jedynie te rekordy, w których znaleźliśmy imię i nazwisko (niektóre nieruchomości nie należą do osób fizycznych).

Krok trzeci: próbujemy.

Czy to działa? Działa. W nieco ponad dwie sekundy udało się wydobyć dane sześciu osób:
Oczywiście możliwości są znacznie większe, możemy dowolnie parsować strony ksiąg wieczystych uzyskując pełne dane o nieruchomości, zajęciach, hipotekach itp. Zamieszczony tu przykład to jedynie bardzo prosta aplikacja napisana w około godzinę, osoby zainteresowane danymi osobowymi będą w stanie poświęcić znacznie więcej czasu na udoskonalenie tego sposobu. Generalnie w tej chwili możliwe jest skopiowanie całego rejestru.

Jak zabezpieczyć?

Po pierwsze usunąć błędy programistyczne związane z utrzymaniem sesji oraz mechanizmem captcha. Następnie proponowałbym wstępną rejestrację do systemu oraz jeszcze jeden krok uwierzytelniający (na przykład adres nieruchomości, której księgę chcemy przejrzeć). Dobrym rozwiązanie może być też ograniczenie ilości wywołań aplikacji w jednostce czasu oraz śledzenie klientów zachowujących się podejrzanie i blokowanie im czasowo aplikacji.

Konkluzja

Pomysł Ministerstwa Sprawiedliwości mający na celu oszczędzenie nam, obywatelom, czasu jest godny pochwały, lecz wykonanie wręcz przeciwnie. Administracja publiczna, posiadająca o nas wszystkie dane, powinna taką aplikację jak dzisiaj przedstawiona poddać rygorystycznym testom bezpieczeństwa. W tej chwili za pomocą prostych, ogólnodostępnych narzędzi, każdy może stać się posiadaczem szczegółowych danych osobowych wielu obywateli. Pozostaje zapytać, czy ktoś przede mną uzyskał nieograniczony dostęp do rejestru i czy nie zobaczymy niedługo bazy danych obywateli posiadających nieruchomość na popularnych serwisach wymiany plików... Czy mamy do czynienia tylko z niedopatrzeniem czy największym w historii wyciekiem danych osobowych? Opinię pozostawiam czytelnikom.

Autorem powyższego artykułu jest Łukasz Lubosz (e-mail: lukasz.lubosz Na Gmailu). Korzystając z okazji, chciałbym wszystkich czytelników jeszcze raz zaprosić do współpracy.

[Aktualizacja]
Oficjalny komunikat na stronie internetowej Ministerstwa Sprawiedliwości informuje o trwającej obecnie  aktualizacji serwisu:
Być może więc administratorzy postanowili jednak lepiej zabezpieczyć serwis oferujący wgląd do ksiąg wieczystych?

[Aktualizacja 21.06.2010 r.]
Wygląda na to, że po dość długiej przerwie technicznej, administratorom serwisu http://ekw.ms.gov.pl/pdcbdkw/pdcbdkw.html udało się zamknąć omówioną powyżej lukę.

Warto nadmienić, że w całej sprawie głos zabrał również Generalny Inspektor Ochrony Danych Osobowych:
(...) internetowy dostęp do ksiąg wieczystych nie może się opierać tylko na zasadzie, że księgi wieczyste są jawne i każdy ma możliwość ich przeglądania. Jak wynika z obecnie obowiązujących przepisów prawa nie można ksiąg wynosić z sądu. Zatem, czy umożliwienie ich przeglądania w Internecie można traktować, jako przeglądanie poza budynkiem sądu.