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.”
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.”
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.
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.
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.
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.
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.
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.
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/'" />
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.
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
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.
Der Verlauf sowie der Kontakt mit dem StudySmarter Team wird im Folgenden beschrieben.
Wir haben die Sicherheitslücke entdeckt und das StudySmarter-Team umgehend informiert.
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.
Heute fand das persönliche Treffen mit den Verantwortlichen von StudySmarter statt und die identifizierten Schwachstellen wurden besprochen.
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
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.