Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Mikołajki z sekurakiem! od 2 do 8 grudnia!
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Mikołajki z sekurakiem! od 2 do 8 grudnia!
Trzy miesiące temu opisywałem na Sekuraku XSS-a, którego znalazłem w aplikacji Google Colaboratory. Przed przystąpieniem do czytania tego tekstu, zalecam wrócić do tego poprzedniego, bowiem w tym niejako rozwijam tamten temat.
Natomiast w największym skrócie, co się poprzednio wydarzyło:
Od strony czysto technicznej, ten błąd nie był w samym MathJaksie, tylko we wtyczce, która jest w nim domyślnie włączona, nazywającej się: Assistive MathML.
Zanim twórca MathJaksa naprawił błąd w swojej bibliotece, Google – w ramach łatki – po prostu wyłączyło Assistive MathML. Wydawało się to sensowne podejście, bowiem główna przyczyna XSS-a została całkowicie wyłączona…
… o ile oczywiście nie istnieje sposób na ponowne włączenie tej wtyczki!
Któregoś razu, klikając sobie po Google Colaboratory i szukając w nim kolejnych błędów, zauważyłem, że jak dodam kod LaTeX w nagłówku markdownowym i kliknę na niego w postaci wyrenderowanej w konspekcie, wyświetla się wówczas menu MathJaxa.. Co ciekawe, to menu nie pojawiało się w zwykłym tekście. Widać to na poniższym wideo:
Dlaczego to menu jest takie ważne? Bo dzięki niemu odkryłem, że istnieje możliwość włączenia ponownie wtyczki Assistive MathML (Rys 1.)!
Okazało się, że po włączeniu tej opcji w menu, byłem w stanie wykonać identycznego XSS-a jak poprzednio, tj. jeszcze raz użyć kodu np.
$ \unicode {41<img src=1 onerror=alert(document.domain)>} $
Efekt widać na rysunku 2.
Czy to oznacza, że mamy już na tacy gotowego XSS-a i możemy prosić o bounty? Niezupełnie. Na razie Assistive MathML udało się włączyć ręcznie poprzez menu. Otwarta pozostaje kwestia ustalenia, czy można tę opcję włączyć komuś innemu.
Zacząłem więc przeglądać miejsca, w których MathJax mógłby zapisywać informację o włączonym Assistive MathML. W pierwszej chwili stawiałem na localStorage, lecz tam było pusto. Drugim typem były ciasteczka i tam rzeczywiście znalazłem następujący zapis:
mjx.menu=assistiveMML%3Atrue
Fakt, że są to właśnie ciasteczka jest fantastyczną wiadomością, bo można ustawić ciasteczko, które będzie wysyłane do innych poddomen tej samej domeny. Opisywałem to kiedyś w tekście pt. Gmail i Google+ – czyli opowieść o dwóch XSS-ach. W największym skrócie atak sprowadza się do tego, że:
Atak zasymulowałem przez przypięcie w /etc/hosts domeny some-random-domain.google.com do 127.0.0.1, a następnie wykonałem w niej kod:
<!doctype html><meta charset=utf-8>
<button onclick=exploit() style=font-size:48px>Set cookie and redirect to Colaboratory!</button>
<script>
function exploit() {
const COLAB_URL = "https://colab.research.google.com/notebooks/welcome.ipynb";
document.cookie = "mjx.menu=assistiveMML%3atrue; Domain=.google.com; Path=/";
location = COLAB_URL;
}
</script>
Efekt widoczny na filmie:
Z powyższego opisu można wyciągnąć dwa istotne wnioski:
Google wypłaciło bounty w tej samej wysokości co dla poprzedniego XSS-a w Colaboratory (tj. $3133,7) pomimo faktu, że ten przypadek niewątpliwie jest trudniejszy w praktycznym wykorzystaniu (wymaga bowiem XSS-a w innej aplikacji). Z tego chyba można wyciągnąć wniosek, że w google’owym bug bounty warto szukać XSS-ów przez ciasteczka ;-)
— Michał Bentkowski
Extra robota i extra opis!
Życzę kolejnych sukcesów w przyszłości!
Wielki + za to że opisujesz step-by-step swoje odkrycia, ciekawe to jest ;)