Coronapoint.de Sicherheitslücke

In meinem Wohnort gibt es seit einigen Wochen mehrere Corona Schnelltestzentren. Ein Anbieter davon ist Coronapoint (https://www.coronapoint.de/). Da dieses Geschäftsmodell sich scheinbar in den aktuellen Zeiten gut rentiert, sind Stand heute am 27.04.2021 mittlerweile 15 Zentren in Nordrhein-Westfalen eröffnet worden, weitere in Planung.

Meine Familie hat sich dort bereits mehrfach testen lassen, das hat immer gut funktioniert. Man erhält sein Ergebnis per E-Mail als PDF und zusätzlich noch einen Link zum Download des PDF per QR-Code Karte.

Das PDF ist verschlüsselt, das Passwort wird per separater E-Mail gesendet und steht zusätzlich noch auf der QR-Code Karte. Das Passwort besteht aus den Zeichen 0-9/A-F, also sind es 65536 mögliche Kombinationen.

Zunächst habe ich mir gedacht, dass das Passwort bei einem PDF mit dieser Anzahl möglicher Kombinationen nun nicht wirklich sicher ist. Aber da das PDF auf normalen Wegen nicht in andere Hände kommt, sollte das einigermaßen ausreichen.

Dann habe ich mir jedoch den Link angeschaut, der per QR-Code Karte aufgerufen wird. Dieser ist wie folgt aufgebaut:

https://e.coronapoint.de/result.php?testid=1234567&uuid=abcdefgh-ijkl-mnop-qrst-uwvxyzabcdef

Es fällt auf, dass dort ein Parameter testid verwendet wird. Zusätzlich gibt es noch eine uuid, die zufällig generiert ist. Hier in meinem Beispiel habe ich die korrekten Werte für meinen Test natürlich ersetzt. Aufgrund meiner Terminvereinbarung sah ich, dass der Parameter testid den gleichen Wert hatte, wie mein vereinbarter Termin. Das ist also scheinbar die eindeutige Identifizierung des Termins und des Tests inklusive Ergebnis.

Nun gut, normalerweise sollte man irgendwelche eindeutigen IDs vielleicht nicht herausgeben (vor allem, wenn es vermutlich die ID eines Datenbank Eintrags ist). Da bietet es sich an, eine zufällige ID zu generieren und diese mit der internen ID zu verknüpfen, so dass nur jemand auf die Daten zugreifen kann, der die korrekte zufällige ID hat (diese ist nicht in vernünftiger Zeit zu erraten).

Da der Anbieter aber im Link einen Parameter uuid mit einer solchen zufälligen ID verwendet, erwartete ich, dass diese Prüfung stattfindet.

Dem war jedoch nicht so! Ich konnte durch einfaches Hochzählen des Parameters testid andere PDFs herunterladen. Als Parameter für uuid konnte man irgendetwas eintragen.

Das ist natürlich fatal.

Mit einer passenden Bibliothek zum Generieren und Auslesen von PDF Dokumenten (z.B. für Java https://pdfbox.apache.org/), habe ich dann ausprobiert, wie lange es dauert, ein solches mit dieser 4-stelligen hexadezimalen Kombination verschlüsseltes PDF Dokument zu öffnen. Ich zähle stumpf von 0000 bis FFFF hoch, die verwendete Bibliothek schafft das in meinen Tests im Schnitt in einigen Sekunden.

Da bietet es sich an, ein kleines Programm zu schreiben, das die Test IDs hochzählt, das PDF dazu herunterlädt und dann das Passwort errät. Dieses beispielhafte Programm findet man hier: https://github.com/bertreuer/coronapoint-disclosure

Zusätzlich prüft das Programm noch auf das Vorkommen des Wortes "positiv". Damit erhält man nun eine Textdatei von Corona positiv getesteten Personen der letzten Tage inklusive deren vollständigen persönlichen Daten, also Name, Adresse, E-Mail und Telefonnummer.

Ich habe den Anbieter gemäß responsible disclosure am Samstag, 17.04.2021, kontaktiert, über diese Sicherheitslücke informiert und eine Frist von zwei Wochen gesetzt, um die Lücke zu schließen.

Dieser scheint die Lücke nun spätestens am Samstag, 24.04.2021, geschlossen zu haben. In meinen Tests kann ich nun nur noch das PDF herunterladen, wenn ich vorher das korrekte Geburtsdatum der getesteten Person eingebe und am Link auch die korrekt verknüpfte UUID steht. Mit fremden UUIDs ist ein Herunterladen nicht möglich.

Soweit so gut, jedoch ist die Kommunikation des Anbieters unterirdisch, es hat schlicht gar keine stattgefunden. Die Lücke wurde stillschweigend geschlossen, ohne dass ich hierüber informiert worden bin.

Ich vermute stark, dass der Anbieter hier gemäß DSGVO alle getesteten Personen informieren müsste, dass deren persönliche Daten missbraucht worden sein könnten. Das ist bis Stand heute nicht passiert.