
Exploit-Beispielcode für CVE-2021-33831
Die Anwendung wird zur Kontaktnachverfolgung von Personen gemäß der deutschen Infektionsschutzgesetze eingesetzt, um Covid-19-Infektionsketten nachvollziehen zu können. Sie wurde von einem Studentenprojekt namens iCampus erstellt und wird nicht nur an der Hochschule Wildau, sondern auch an der BTU Cottbus-Senftenberg verwendet. Rund 10.000 Personen sind betroffen. Gäste der Hochschulen sind verpflichtet, diese Anwendung zu nutzen.
Die Anwendung besteht aus einem Vue-Frontend und einem Laravel-Backend.
Das Backend stellt den Registrierungs-Endpoint für Gastnutzer /corona-app-backend/api/account/register bereit,
der die Registrierung von Gästen der Hochschule ermöglicht. Angehörige der Hochschule können sich mit ihrer Single-Sign-on-Benutzername/Passwort-Kombination anmelden.
Dieser Registrierungs-Endpoint ist nicht gegen die automatisierte Erstellung von Benutzern geschützt (z. B. durch ein Captcha). Sobald ein Programm über /corona-app-backend/sanctum/csrf-cookie ein CSRF-Cookie und über /corona-app-backend/account ein Session-Token erhält, kann es Benutzer erstellen. So viele es möchte. So lange es möchte. Zu viele Fake-Benutzer machen es einer Gesundheitsorganisation praktisch unmöglich, Infektionsketten nachzuverfolgen, was dies zu einer Art Denial-of-Service-Angriff macht.
Die Registrierung eines Benutzers ist ein POST an den Registrierungs-Endpoint, der das CSRF-Cookie und das Session-Token enthält, mit folgender JSON-Nutzlast:
{"first_name":"John","last_name":"Doe","telephone":"099182","email":null,"accept":true}
Entweder müssen die Felder E-Mail oder Telefon gesetzt sein. Beide werden nicht verifiziert (abgesehen von Syntaxprüfungen).
Mit einer gültigen Benutzersitzung können über den Endpoint /corona-app-backend/api/visit Besuche (Check-ins in Räume) erstellt werden.
Ein Besuch ist ein POST an den Visit-Endpoint, der das CSRF-Cookie und das Session-Token enthält, mit folgender JSON-Nutzlast:
{"room":"15-K01","visited_on":"2021-05-09T22:01:00.000Z","exited_on":"2021-05-10T21:59:00.000Z"}')
Der Wert des room-Felds kann aus einer Liste bezogen werden, die über den Raum-Endpoint /corona-app-backend/api/rooms abgerufen werden kann und ein JSON mit allen Räumen der Hochschule liefert. Für einen erfolgreichen Aufruf benötigt man lediglich das CSRF-Cookie und das Session-Token.
Das Problem ist mit CVE-2021-33840 vergleichbar, geht aber viel weiter.
Außerdem enthält die Anwendung keinerlei Verschlüsselung in Frontend-/Backend-Teilen (abgesehen von der Transportverschlüsselung über https). Das Backend erhält unverschlüsselte JSON-Daten und liefert unverschlüsselte JSON-Daten.
Der vollautomatische Exploit-Code in der Programmiersprache Perl erstellt 500 Benutzer (aus zufälligen Namensdatenbanken) mit zufälligen, aber gültig aussehenden Telefonnummern, und alle Benutzer werden in einen Raum eingecheckt. Vollautomatisch. Eine Zeitverzögerung von 5s/request wurde eingefügt, um den Server nicht zu überlasten und keinen etwaigen vorhandenen Schutz auszulösen. Der Exploit lief erfolgreich vollautomatisch ab, und ich meldete das Problem einschließlich der erstellten Fake-Benutzer noch am selben Tag der Hochschule.
Bevor ich einen Raum auswählte, stellte ich sicher, dass der Raum an diesem Tag nicht besucht worden war. Dies ist möglich, da die Anwendung einen Zähler enthält, der angibt, mit wie vielen Personen man in einem bestimmten Raum Kontakt hatte. Wenn man also einen Raum besucht und dieser Zähler 0 ist, war in diesem Zeitraum niemand anderes in diesem Raum.
Die Anwendung war außerdem von einer RCE durch CVE-2021-3129 betroffen, die ich am 12.04.2021 der Hochschule meldete.
Das aktuelle Problem wurde am 31.05.2021 gemeldet.
Für beide Meldungen erhielt ich am Tag nach der Meldung eine Eingangsbestätigung per E-Mail. Danach habe ich nichts Weiteres erhalten.
Eine Anfrage zum Quellcode der Anwendung ist in Bearbeitung.