Studysmarter - XSS und mögliche Accountübernahme

Philipp Fruck | 01. Jun 2021 | Originally published by Pius Walter

Cyber Security Thumbnail

Was ist StudySmarter?

StudySmarter ist eine Lernplattform für Schüler und Studenten. Die Web-App bietet die Möglichkeit, Lernkarten zu erstellen und diese über die Website und entsprechende Apps zu lernen. Laut StudySmarter handelt es sich um eine preisgekrönte Lern-App.

“Die preisgekrönte Lern-App für Studenten und Schüler.”

https://www.studysmarter.de/

Laut der offiziellen Website sind rund 900.000 Studenten registriert, von denen tausende täglich aktiv sind.

“Über 900.000 Studenten warten auf dich […] Täglich lernen Tausende Studenten mit der StudySmarter Lernapp, erstellen & teilen ihre Lernunterlagen.”

https://www.studysmarter.de/studium/

Was ist Cross-Site-Scripting (XSS)?

Cross-Site-Scripting ist der Prozess des Ausnutzens einer Computer-Sicherheitslücke in Web-Applikationen durch Einfügen von Informationen in einem Kontext, in dem sie nicht vertrauenswürdig sind, in einen anderen Kontext, in dem sie vertrauenswürdig sind. Dieser Artikel beschreibt einen Cross-Site-Scripting (XSS)-Angriff, der auf StudySmarter funktioniert und direkt mit der API interagiert.

XSS ermöglicht die Ausführung von bösartigem Quellcode direkt auf dem Client des Benutzers durch JavaScript. JavaScript bietet außerdem die Möglichkeit, auf Browser-Ressourcen zuzugreifen und diese unbemerkt an Server zu senden, die von den Angreifern gehostet werden. XSS kann unter anderem ausgenutzt werden, um den Inhalt von Webseiten für einen Benutzer zu verändern oder um auf Inhalte wie Cookies zuzugreifen, um Sitzungsinformationen zu erhalten. Darüber hinaus ist es möglich, mittels JavaScript Bitcoins auf dem Rechner des Benutzers zu minen.

Der konkrete Fall: StudySmarter

Im Folgenden möchten wir zum einen zeigen, welche Möglichkeiten die XSS-Schwachstelle tatsächlich bietet und welche Folgen sie hat, und zum anderen das Vorgehen im Detail erläutern. Jede dieser Schwachstellen wurde an der Webanwendung von StudySmarter Version w-7.6.3 getestet.

Möglichkeiten durch die XSS-Schwachstelle

Jede der Galerien zeigt zwei Bilder. Das linke Bild zeigt einen Screenshot der Webanwendung ohne Anzeige der Lösung der Lernkarte. Zu diesem Zeitpunkt wurde die Schwachstelle noch nicht ausgenutzt und der JavaScript-Quellcode wurde noch nicht geladen. Das rechte Bild zeigt das Ergebnis, das durch die XSS-Schwachstelle ausgenutzt wurde.

Fall 1

Dieser Fall zeigt, wie ein Alert über JavaScript in die Website injiziert werden kann. Natürlich kann anstelle des harmlosen Alerts auch schädlicher JavaScript-Quellcode ausgeführt werden, der für den Benutzer nicht sichtbar ist.

Bild einer Flashcard mit der Frage, ob XSS funktioniert Bild, das XSS in Aktion zeigt

Fall 2

Wie bereits beschrieben, kann auf Daten, die von StudySmarter in lokalen Browser-Ressourcen gespeichert werden, zugegriffen werden. Eine Ausgabe von sensiblen Benutzerinformationen nach einem solchen Zugriff ist in der folgenden Galerie zu sehen.

Bild der Flashcard, die überprüft, ob benutzerspezifische Informationen gesammelt werden Bild mit gesammelten Benutzerdaten

Fall 3

Um zu zeigen, dass auch Daten von anderen Webseiten abgerufen und in den StudySmarter-Quellcode injiziert werden können, wurde im folgenden Beispiel dieser Blogbeitrag durch eine fehlerhafte HTML-Sanitisation in die Lösung der Flashcard eingebettet.

Bild der Lernkarte mit der Aufforderung, den Blogeintrag zu zeigen Bild, das den Blogeintrag zeigt

Schließlich kann auch der folgende JavaScript-Quellcode zur Weiterleitung auf eine beliebige Website verwendet werden. Diese wird aktiv, sobald die Antwort auf der Karteikarte angezeigt wird oder die Übersicht aller Karteikarten mit Antworten geladen wird.

<img src="//image.png" onerror="location.href = 'https://www.p-fruck.de/blog/studysmarter-xss/'" />

Ablauf im Detail

Die PATCH-Anfrage, die StudySmarter vom Frontend an die API im Backend stellt, sendet bereits kodierte HTML-Tag-Daten weiter. Daher haben wir uns gefragt, ob die Validierung ausschließlich auf der Client-Seite erfolgt.

Um dies zu überprüfen, wurde die zuvor gesendete PATCH-Anfrage entsprechend modifiziert und mit rohem HTML-Inhalt gesendet, um die Validierung zu umgehen. Die folgende Anfrage führte schließlich zum Erfolg.

await fetch(
"https://prod.studysmarter.de/users/<USER_ID>/subjects/<SUBJECT_ID>/flashcards/<FLASHCARD_ID>/", {
    "credentials": "include",
    "headers": {
        "Accept": "application/json, text/plain, /",
        "Accept-Language": "de,en-US;q=0.7,en;q=0.3",
        "Content-Type": "application/json",
        "Authorization": "Token <TOKEN>"
    },
    "referrer": "https://app.studysmarter.de/",
    "body": "{
        \"flashcard_image_ids\":[],
        \"tags\":[],
        \"flashcardinfo\":{
            \"question_html\":[{
                \"text\":\"Does XSS work here?\",
                \"is_correct\":true
            }],
            \"answer_html\":[{
                \"text\":\"<XSS>\",
                \"is_correct\":true
            }],
            \"shared\":2,
            \"hint_html\":[],
            \"solution_html\":\"\",
            \"id\":<SUBJECT_ID>,
            \"flashcard_images\":[]
        }
    }",
    "method": "PATCH",
    "mode": "cors"
});

Nach dem Neuladen der StudySmarter Webanwendung wurde der HTML-Quellcode, der über die modifizierte PATCH-Anfrage an das Backend gesendet wurde, ohne weitere Bearbeitung ausgegeben.

Was ist das Ergebnis?

Die Haupt-Sicherheitsbedrohung liegt jedoch nicht nur in der XSS-Schwachstelle selbst, sondern in der Art und Weise, wie StudySmarter Benutzer an der API im Backend authentifiziert.

Um die Daten für jeden einzelnen Benutzer festzulegen und zu laden, wird jedem Benutzer ein eindeutiger Token zugewiesen. Dieser Token wird nach unserem Kenntnisstand bei der Registrierung generiert und ist ab diesem Zeitpunkt gültig. Er ist der Schlüssel zu allen im Backend gespeicherten Daten der Benutzer. Darüber hinaus erhält jeder Benutzer eine eindeutige Benutzer-ID.

Sowohl die eindeutige Benutzer-ID als auch der zugehörige Token werden im lokalen Speicher des Browsers abgelegt. JavaScript kann problemlos auf diesen Speicher zugreifen und diese Daten ohne weitere Interaktion des Benutzers lesen, verändern, weiterleiten oder löschen.

Aufgrund der folgenden drei Punkte

  • Durch die Cross-Site-Scripting (XSS)-Schwachstelle kann beliebiger, bösartiger JavaScript-Code in die Webanwendung von StudySmarter injiziert werden
  • Der bei der Registrierung generierte Token läuft nicht ab und kann nicht vom Benutzer selbst erneuert werden (z.B. durch Ab- und Anmelden oder Ändern des eigenen Passworts)
  • Der Token wird im lokalen Speicher des Browsers abgelegt und kann jederzeit einfach per JavaScript ausgelesen werden

Benutzerdaten (einschließlich der eindeutigen Benutzer-ID sowie des Tokens) können durch einen geeigneten XSS-Angriff aus dem lokalen Speicher ausgelesen, an einen Server gesendet und dort gespeichert werden. Nach Angaben von StudySmarter nutzen täglich tausende von Studenten die entsprechende Lernplattform, so dass Angreifern eine ausreichend große Anzahl von Nutzerprofilen zur Verfügung steht. Aufgrund des Problems der unbegrenzt gültig definierten Token können Angreifer die gesammelten Authentifizierungs-Tupel zeitlich unbegrenzt nutzen.

Welche Maßnahmen sollten ergriffen werden?

  • Schließen der XSS-Schwachstelle durch Sanitation des entsprechenden HTML-Quellcodes
  • Sensible Informationen (wie Benutzer-ID und Token) sollten nicht per JavaScript abrufbar sein
  • Sensible Informationen sollten in Cookies gespeichert und mit dem HttpOnly-Attribut vor JavaScript-Aufrufen geschützt werden
  • Implementierung eines neuen Token-Systems, das kurzlebige Token unterstützt
    • Löschen aller vorhandenen nicht ablaufenden Token

Verlauf und Updates

Der Verlauf sowie der Kontakt mit dem StudySmarter Team wird im Folgenden beschrieben.

16.04.2021

Wir haben die Sicherheitslücke entdeckt und das StudySmarter-Team umgehend informiert.

17.04.2021

StudySmarter antwortete auf unsere Nachricht bereits am nächsten Tag (Wochenende) mit dem Hinweis, dass sie bereits dabei sind, das Problem zu beheben. Zusätzlich wurde ein Termin für die folgende Woche vereinbart.

20.04.2021

Heute fand das persönliche Treffen mit den Verantwortlichen von StudySmarter statt und die identifizierten Schwachstellen wurden besprochen.

27.05.2021

Als Bestätigung für das Schließen der Schwachstelle wurde folgende Antwort gegeben:

“Wir konnten die von Ihnen gefundene XSS-Schwachstelle in der StudySmarter API inzwischen schließen. Es war etwas knifflig, da wir unseren Benutzern die Möglichkeit geben wollen, beliebiges HTML in ihre Karteikarten einzufügen, um einen möglichst einfachen Ablauf bei der Erstellung von Inhalten zu gewährleisten. Aber mit Hilfe eines hochmodernen HTML-Sanitization-Tools sind wir nun in der Lage, jede Art von XSS-Angriff in unserer API zu filtern, um sicherzustellen, dass er gar nicht erst unsere Datenbank erreicht. Danke, dass Sie uns auf die Schwachstelle hingewiesen haben und StudySmarter zu einer sichereren Plattform machen!”

Simon Hohentanner, COO, StudySmarter

01.06.2021

Um sicherzustellen, dass sowohl die Webanwendung als auch alle mobilen Anwendungen nach dem Schließen der Sicherheitslücke noch von den Benutzern aktualisiert werden konnten, wurde die Veröffentlichung des Beitrags um einen vereinbarten Zeitraum verzögert.


Pius Walter & Philipp Fruck