Kolejny XSS w Google Colaboratory

18 września 2018, 17:25 | Teksty | komentarze 2
: zin o bezpieczeństwie - pobierz w pdf/epub/mobi.

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:

  • Szukałem XSS-a w aplikacji Google Colaboratory (aplikacja, która opiera się o Jupyter Notebook, umożliwiając współdzielenie tekstu w MarkDown i wykonywanego po stronie chmury google’owej kodu pythonowego),
  • Odkryłem, że korzysta ona z biblioteki Mathjax,
  • Znalazłem błąd w bibliotece MathJax w makrze \unicode{}, które pozwoliło mi na wykonanie dowolnego kodu JS.

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…

Ponowne włączenie Assistive MathML

… 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:

  1. Najpierw klikam prawym przyciskiem na „zwykłym” tekście i dostaję standardowe menu z Colaboratory,
  2. Następnie klikam prawym przyciskiem na konspekcie – i tam dostaję menu z MathJaxa.

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.)!

Rys 1. Możliwość włączenia Assistive MathML z poziomu menu MathJaksa

Rys 1. Możliwość włączenia Assistive MathML z poziomu menu MathJaksa

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.

Efekt widać na rysunku 2.

Rys 2. XSS po włączeniu Assistive MathML

Rys 2. XSS po włączeniu Assistive MathML

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.

Przechowywanie informacji o Assistive MathML

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:

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:

  1. Mamy XSS w domenie absolutnie-cokolwiek.google.com,
  2. Wykonujemy tam kod:   document.cookie="mjx.menu=assistiveMML%3atrue; Domain=.google.com; Path=/"
  3. W efekcie, ciasteczko mjx.menu=assistiveMML%3atrue jest wysyłane do wszystkich poddomen google.com.

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:

Efekt widoczny na filmie:

Podsumowanie

Z powyższego opisu można wyciągnąć dwa istotne wnioski:

  • Jeśli w ramach bug bounty uda nam się znaleźć jeden błąd, to warto szukać błędów „dookoła” tego błędu.
  • Jak używamy zewnętrznych bibliotek JS, to warto w trakcie ich audytów zerknąć gdzie one mogą zapisywać dane. Jak pokazuje przykład MathJaksa, może się okazać, że dane z konfiguracji aplikacji mogą zostać nadpisane przez ciasteczka!

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

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



Komentarze

  1. Kamil

    Extra robota i extra opis!

    Życzę kolejnych sukcesów w przyszłości!

    Odpowiedz
  2. Bubała

    Wielki + za to że opisujesz step-by-step swoje odkrycia, ciekawe to jest ;)

    Odpowiedz

Odpowiedz