Ukryty w serwisie 4programmers.net fingerprinter po cichu zbiera szczegółowe informacje o komputerach użytkowników serwisu

2

Według mojej najlepszej wiedzy, na stronie 4programmers.net znajduje się ukryty pod pozorem obsługi języka Markdown fingerprinter zbierający szczegółowe informacje o komputerach użytkowników.

Zbierane przez fingerprinter informacje o komputerze obejmują między innymi:

  • pojemność pamięci RAM komputera
  • liczbę rdzeni procesora
  • producenta i model karty graficznej
  • głębię koloru trybu graficznego
  • rozdzielczość ekranu
  • offset strefy czasowej
  • zainstalowane czcionki
  • typ procesora
  • zainstalowane pluginy
  • platformę, na której uruchomiona jest przeglądarka (Windows/Mac/Linux/etc)
  • czy komputer jest wyposażony w ekran dotykowy
  • czy uruchomiony jest adblock
  • czy informacja o języku jest zespoofowana
  • czy informacja o rozdzielczości ekranu jest zespoofowana
  • czy informacja o systemie operacyjnym jest zespoofowana
  • czy informacja o przeglądarce jest zespoofowana
  • język interfejsu użytkownika
  • user-agent przeglądarki

Tymczasem polityka prywatności serwisu, jeśli chodzi o informacje techniczne o naszych komputerach, wyraża się jasno jedynie o adresie IP i nazwie przeglądarki (user agent).

Fingerprinter jest uruchamiany na naszych komputerach bez pytania nas o zgodę zaraz po wejściu na stronę 4programmers.net. Z zebranych informacji liczony jest hash, który następnie jest przesyłany w postaci ciasteczka na serwer.

Dzieje się tak niezależnie od tego, czy zaakceptowaliśmy politykę prywatności, ani czy mieliśmy chociażby szansę się z nią zapoznać, ani od tego, czy mamy konto w serwisie.

Jeżeli bowiem wejdziemy na stronę serwisu i klikniemy link "Polityka prywatności", to w momencie wyświetlenia polityki prywatności na naszym ekranie jest już za późno — fingerprint jest już dawno przesłany na serwer.

Nie pomaga usunięcie ciasteczka — w przypadku braku ciasteczka, fingerprinter jest uruchamiany ponownie w czasie naszej najbliższej wizyty w serwisie, przejścia do innej podstrony, etc. Ciasteczko przyjmuje wówczas najczęściej dokładnie taką samą wartość, jaką miało przed usunięciem.

Daremne wydają się także zmiany ustawień przeglądarki — efekty działania fingerprintera można zaobserwować pomimo ustawienia "Tracking prevention" na najwyższym poziomie "Strict" i włączonej opcji "Send do not track requests" w ustawieniach przeglądarki Microsoft Edge.

Fingerprinter znajduje się pod URLem https://4programmers.net/js/markdown.js — wyraźnie widać, nie tylko polityka prywatności, ale również nazwa pliku jest bardzo myląca i sugerująca, że jest to niewinny plik mający jakiś związek z Markdownem.

Samo odwołanie do pliku JS fingerprintera w kodzie HTML strony również jest niepozorne, sprawiające mylne wrażenie, że jest to kod do obsługi Markdown:

<script async src="/js/markdown.js"></script>

(źródło powyższego kodu HTML: 4programmers.net)

Jeżeli z uwagi na przemilczenia w polityce prywatności, zechcemy zapoznać się z kodem uruchamianego na naszych komputerach fingerprintera, napotkamy kolejną przeszkodę: kod fingerprintera został bowiem poddany "minifikacji", co w praktyce sprawia, że jest zupełnie nieczytelny bez użycia dodatkowych narzędzi.

Na domiar złego, według mojej najlepszej wiedzy użyty w serwisie 4programmers.net fingerprinter zawiera błąd mogący prowadzić na Firefoksie do zmniejszenia entropii i w konsekwencji zwiększenia prawdopodobieństwa kolizji, a w ostatecznym rozrachunku do mylnego przypisywania użytkownikom serwisu cudzej aktywności.

2

Rzeczywiście wygląda jak fingerprinter.

0

@Manna5: Bo to jest fingerprinter - prawdopodobnie fingerprintjs2.

I co ja mam teraz z tym zrobić? Zgłosić do UODO?

11

Takie pytanie - totalnie abstrahując od głównego tematu wątku - w jaki sposób przeglądarka może mieć dostęp do takich rzeczy jak ilość rdzeni CPU czy rozmiar RAM? Jeszcze rozumiem rozdzielczość ekranu czy user-agent, ale jak to możliwe, że jakiś JS, który powinien działać ze względów bezpieczeństwa w sandboksie, może widzieć takie rzeczy?

A co do danych osobowych - ekspertem nie jestem, ale wydaje mi się, ze nie ma tutaj naruszenia. Zauważ, że (jak zresztą sam piszesz) te dane są zbierane po stronie klienta, potem jakoś przetwarzane i hashowane. A co za tym idzie - to, co trafia na serwer nie zawiera tych informacji, a jedynie jakiś hash, który można porównać. To trochę jakby zarzucić 4P że zna hasła userów. Nie, nie zna haseł, a jedynie jest w stanie je zweryfikować na podstawie jakiegoś hasha. W sensie - nie wiem czy masz hasło kotek123 czy 456piesek, a jedynie jestem w stanie stwierdzić, czy wprowadzone hasło zwraca taki sam hash, co hasło podane podczas rejestracji. Wracając do Twojego zarzutu - wydaje mi się, że przechowywanie jakiegoś zahashowanego fingerprinta spełnia wymogi RODO w zakresie anonimizacji - nie da się na tej podstawie ustalić kim jest dany user, a jedynie ustalić, czy typ nie został wcześniej zbanowany. Ale nic, poza faktem bycia na czarnej liście, z tego nie odczytasz.

3

No ciekawi mnie ta nazwa markdown.js, jakaś taka nieadekwatna

1

@1a2b3c4d5e: Moim zdaniem wyraźnie wskazuje na zamiar ukrycia fingerprintera, tym bardziej że kwestia fingerprintingu została zupełnie przemilczana w polityce prywatności.

2

Ciekawe, że na https://4programmers.dev/ tego pliku nie ma.

0

@szatkus1: W kodzie źródłowym na GitHubie też chyba nie ma, co moim zdaniem jeszcze bardziej wskazuje na zamiar ukrycia fingerprintingu.

Tymczasem zgodnie z https://www.eff.org/pl/deeplinks/2018/06/gdpr-and-browser-fingerprinting-how-it-changes-game-sneakiest-web-trackers:

How should this work in practice? User consent means an informed, unambiguous action (such as change of settings from “no” to “yes”).[8] In order to be able to rely on this legal ground, companies that use fingerprinting would have to, in the first place, reveal the fingerprinting before it is executed and, then, wait for a user to give their freely-given informed consent. Since the very purpose of fingerprinting is to escape user’s control, it is hardly surprising that trackers refuse to apply this standard.

cerrato napisał(a):

Takie pytanie - totalnie abstrahując od głównego tematu wątku - w jaki sposób przeglądarka może mieć dostęp do takich rzeczy jak ilość rdzeni CPU czy rozmiar RAM? Jeszcze rozumiem rozdzielczość ekranu czy user-agent, ale jak to możliwe, że jakiś JS, który powinien działać ze względów bezpieczeństwa w sandboksie, może widzieć takie rzeczy?

Są do tego API.

A co do danych osobowych - ekspertem nie jestem, ale wydaje mi się, ze nie ma tutaj naruszenia. Zauważ, że (jak zresztą sam piszesz) te dane są zbierane po stronie klienta, potem jakoś przetwarzane i hashowane. A co za tym idzie - to, co trafia na serwer nie zawiera tych informacji, a jedynie jakiś hash, który można porównać. To trochę jakby zarzucić 4P że zna hasła userów. Nie, nie zna haseł, a jedynie jest w stanie je zweryfikować na podstawie jakiegoś hasha. W sensie - nie wiem czy masz hasło kotek123 czy 456piesek, a jedynie jestem w stanie stwierdzić, czy wprowadzone hasło zwraca taki sam hash, co hasło podane podczas rejestracji. Wracając do Twojego zarzutu - wydaje mi się, że przechowywanie jakiegoś zahashowanego fingerprinta spełnia wymogi RODO w zakresie anonimizacji - nie da się na tej podstawie ustalić kim jest dany user, a jedynie ustalić, czy typ nie został wcześniej zbanowany. Ale nic, poza faktem bycia na czarnej liście, z tego nie odczytasz.

Moim zdaniem samo zbieranie, nawet po stronie klienta, to już przetwarzanie w rozumieniu GDPR.

A w przypadku 4programmers mamy taki przypadek, że hash z tych danych jest przesyłany na serwer.

Dodatkowo hashe są liczone w taki sposób, że dysponując odpowiednim zapleczem, często da się te hashe "odwrócić".

A gdyby ktoś się zastanawiał, czy hash może identyfikować użytkownika na gruncie GDPR, to https://www.eff.org/pl/deeplinks/2018/06/gdpr-and-browser-fingerprinting-how-it-changes-game-sneakiest-web-trackers:

It is also worth noting that under the GDPR “identification” does not require establishing a user’s identity. It is enough that an entity processing data can indirectly identify a user, based on pseudonymous data, in order to perform certain actions based on such identification (for instance, to present different ads to different users, based on their profiles). This is what EU authorities refer to as singling-out[2], linkability[3], or inference.[4]

0

Sprawa Fingerpruntu jest dyskusyjna. Z jednej strony sam piszesz, że użytkownik ze względu na błędy niedoskonałości w logice FP może być zidentyfikowany jako inny, z drugiej z kolei powolujesz się na GDPR i dowodzisz, że użytkownik może być zidentyfikowany jednoznacznie.
Myślę ogólnie, że warto dodać do regulaminu informacje, bo nie zaszkodzi. Ale z tego co pamiętam z tłumaczenia prawników przymusu nie ma dopóki nie udostępniasz tych danych do innych serwisów.

0
jurek1980 napisał(a):

Sprawa Fingerpruntu jest dyskusyjna. Z jednej strony sam piszesz, że użytkownik ze względu na błędy niedoskonałości w logice FP może być zidentyfikowany jako inny,

Tam jest bug, który czasami powoduje, że hash jest źle wyznaczony.

z drugiej z kolei powolujesz się na GDPR i dowodzisz, że użytkownik może być zidentyfikowany jednoznacznie.

Niczego takiego nie dowodzę, a nawet uważam, że błędna identyfikacja może prowadzić do poniesienia surowszej odpowiedzialności za naruszenie.

Myślę ogólnie, że warto dodać do regulaminu informacje, bo nie zaszkodzi.

Należało to zrobić przed rozpoczęciem fingerprintingu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1