Zum hauptinhalt springen

Seit dem 1. April ist Bubatz legal, Datenlecks aber weiterhin nicht

Minenarbeiter-Miniaturen auf einem übergroßen Brokolli

Kiffer aller (Bundes-)Länder vereinigt euch und jubelt, seit dem 01.04. ist Bubatz legal1. In freudiger Erwartung auf den 01.07., an dem die nächsten Regelungen aus dem Cannabis-Gesetz in Kraft treten, sprießen nun in ganz Deutschland die Cannabis Social Clubs (CSCs) aus dem Boden und brauchen zum Wachsen nicht nur Samen, Wasser und viel Licht, sondern natürlich auch gute Software. So gibt es schon jetzt eine ganze Reihe Anbieter, die den neuen Markt gerochen2 haben und speziell auf CSCs ausgerichtete Software anbieten.

Als wir davon gehört haben, hatten wir gleich so ein Kratzen im Hals und ein schlechtes Bauchgefühl – das sich leider bestätigte: Nach kurzer Zeit fanden wir ein Datenleck mit Details von mehr als 1.000 CSC-Interessierten - und das Resultat von schlechter Gesetzgebung.

Große Ziele …

Es fing alles harmlos an: mit einer Instagram-Werbung für CanGuard, einen Anbieter von Rundum-Sorglos-Software-Lösungen für CSCs (offiziell “Anbauvereinigungen”).
Von Registrierung der Club-Mitglieder über Lagerverwaltung und die nötige Compliance-Dokumentation bis zu einem Satzungs-Generator für den Verein soll einmal alles dabei sein.
Und natürlich: Alles sicher und Datenschutzkonform.

Screenshot: Datensicherung - Sicherheit - Euer Club, eure Daten. Konforme Verwaltung aller Clubinformationen

Auch im Discord-Channel von CanGuard schürt der Gründer hohe Erwartungen.
Wenige Tage, bevor wir auf CanGuard aufmerksam wurden, fragte dort ein User, ob es ein Datenleck gäbe, da er plötzlich viel SPAM per E-Mail bekäme. Der Gründer antwortet, dass Datenschutz Kern ihres Produkts sei und ihnen besonders am Herzen liege. Das Produkt soll so sicher sein, dass selbst bei einem Datenleck niemand an die E-Mail-Adressen käme:

Screenshot: Discord. Posts: Auf gar keinen Fall!! Eure Daten sind von unserer Seite max Save. Um das nochmal zu erklären, weil mir die Angelegenheit wirklich am Herzen liegt. 1. haben wir bisher keine weitere Äußerung in der Richtung gemeldet bekommen. 2 kennen wir selber eure Mailadressen nicht sondern können nur über CanGuard Kontakt zu euch aufnehmen. Das ist z.B eine von vielen Vorsorgemaßnahmen, damit genau so etwas nicht passiert. Selbst bei einem Datenleck könnte euch kein externer anschreiben. Wir haben so viele Faktoren davor gebaut da ein funktionierender Datenschutz der Kern unseres Projekts ist. Und da investieren wir lieber etwas mehr Zeit als zu wenig. Trotzdem danke für das Feedback. Jetzt kennst du auch unsere Haltung dazu.

Trotz diesen Versprechungen haben wir den Dunst der Stunde 💨 genutzt, uns als CSC registriert und dabei die Entwicklungs-Tools unseres Browsers mitlaufen lassen. So können wir sehen, welche Daten zwischen der Website und unserem Rechner übertragen werden.

Wir wissen, wer mit (an)bauen will

Nach dem Login können wir jetzt unseren Club administrieren, die Mitglieder verwalten und so weiter. Dabei fällt uns eine Anfrage an die CanGuard-Server auf: Die Liste der Mitglieder wird von https://api.canguard.de/user/all?club=[CLUB_ID]&invitation=accepted&role=user abgerufen ([CLUB_ID] ist dabei natürlich die Nummer unseres frisch gegründeten CSCs🍃). Die Antwort sah dann so aus (Details natürlich ersetzt):

{
	"success": true,
	"message": "OK",
	"data": [
		{
			"_id": "660da9ed1234567890abcdef",
			"first_name": "Alex",
			"last_name": "Mustermensch",
			"user_name": "alex.mustermensch",
			"email": "alex.mustermensch@example.com",
			"password": "$2b$10$9NPwgu7eCnDLLhoFT9uYjuoKtE8WNMwFcrURYvWVZvAg567.sjQcG",
			"role": "user",
			"status": "active",
			"postal_code": "12345",
			"date_of_birth": "1970-01-01T00:00:00.000Z",
			"club": "660da9ed1234567890abcdfa",
			"invitation": "accepted",
			"createdAt": "2024-03-24T19:11:41.968Z",
			"updatedAt": "2024-03-24T19:28:20.944Z"
		},
		...
	]
}

Bei /user/all wurden wir gleich hellhörig 👀. Was würde wohl passieren, wenn man die Filter club, invitation und role einfach wegließe? Der einfachste Weg, das herauszufinden, ist es auszuprobieren:

Screenshot: API-Anfrage nach /user/all, geschwärzte Daten im Format wie oben

Denn tatsächlich bekommen wir jetzt plötzlich nicht mehr nur die Mitglieder unseres “““CSC””” zu sehen, sondern mehr als 1.200 Nutzer*innen – mutmaßlich alle Nutzer*innen von CanGuard mit den zu ihnen hinterlegten Daten:

  • User-ID
  • Vor- und Nachname
  • E-Mail-Adresse
  • bcrypt-gehashtes Passwort
  • Rolle (user oder clubowner)
  • ID des zugeordneten Clubs
  • Geburtsdatum
  • Postleitzahl
  • Status (active oder inactive)
  • Einladungs-Status (invited oder accepted)
  • Datum der Registrierung sowie der letzten Änderung am Profil

Einige der Felder sind optional und nicht bei allen Nutzer*innen ausgefüllt, z.B. PLZ, Nachname, Geburtsdatum.

Wir sind andere Kiffer*innen?

Wenn wir in so kurzer Zeit bereits auf die erste Lücke stoßen, schnuppern wir doch nochmal lieber etwas tiefer rein.

Bei einem kurzen Queerlesen des Quelltextes sahen wir die Schnittstelle, die verwendet wird, wenn man Nutzer*innen nach ihrer Registrierung in den eigenen CSC aufnehmen möchte:

https://api.canguard.de/user/updateMemberByAdmin?_id=[User-ID]
(statt [User-ID] stand dort die Nummer der Nutzer*in, die wir in den Club lassen wollten)

Spannenderweise wird die gleiche Schnittstelle auch aufgerufen, wenn man sein eigenes Passwort vergessen hat und es zurücksetzt.
Dort steht dann statt [User-ID] unsere eigene Nutzer*innen-ID.

Screenshot: API-Update /user/updateMemberByAdmin, gesetztes Passwort und Daten wie oben

Doch leider funktioniert das nicht nur für unseren eigenen Account.
Wenn wir statt der eigenen User-ID die von anderen Nutzer*innen eintragen, können wir das Passwort eines anderen Accounts ändern und uns daraufhin in diesen fremden Account einloggen.3 Praktischerweise liefert CanGuard in der Antwort dann gleich noch die E-Mail-Adresse des Accounts für den Login mit.

Dafür brauchen wir nur die ID des Accounts den wir übernehmen wollen, und die kennen wir ja bereits. Wir haben ja gerade eine Liste aller Accounts bekommen – inklusive ihrer ID.

Dein Club, mein Club, das sind doch alles bürgerliche Kategorien

Und nicht nur fremde Accounts konnten wir verändern, bei den Clubs sah es ähnlich aus. Wenn wir unseren eigenen Club anpassen, wird eine Anfrage an die Schnittstelle https://api.canguard.de/club/updateClub/[Club-ID] gesendet (statt [Club-ID] stand dort die Nummer unseres Clubs)

Doch auch hier wieder das gleiche Spiel: Wenn wir statt der ID unseres Clubs die ID eines anderen Clubs eintragen, können wir diesen beliebig verändern. Beispielsweise können wir den Namen des Clubs, die Beschreibung oder die Adresse ändern:

Screenshot: API-Update /club/updateClub, Name eines Clubs überschrieben

✍️ Auf zum Report

Solch gravierende Lücken müssen schnellstmöglich geschlossen werden. Daher haben wir wie immer einen Report geschrieben, mit allem, was wir zu den Lücken herausfanden, inklusive Bauanleitung, um die Lücken nachzuvollziehen.4

Diesen haben wir am 27.03. an das Unternehmen, sowie die zuständige Landesdatenschutzbehörde von Niedersachsen und das CERT-Bund beim BSI gesendet.
Dabei bitten wir die Unternehmen immer, den Eingang der Nachricht zu bestätigen und uns mitzuteilen, wie lange sie etwa für das Schließen der Lücke brauchen werden.

An dieser Stelle hat es uns noch etwas verwirrt, unter welcher Mailadresse CanGuard bzw. die ThingBring GmbH als Betreiber nun wirklich zu erreichen sein möchte. Auf der Kontaktseite steht als Adresse info [at] canguard.de, in der Datenschutzerklärung dann zwei Adressen mit der Endung @thingbring.de.

Sicherheitshalber haben wir uns an alle drei Adressen gewandt – jedoch war dies nur bei der Ersten erfolgreich. Alle E-Mails an thingbring.de konnten nicht zugestellt werden, aus einem einfachen Grund: Diese Domain war nicht registriert5.

Screenshot: thingbring.de verfügbar auf einer Domainregistrierungsseite für 5,97€

12 Stunden später bekamen wir von CanGuard eine Eingangsbestätigung mit der Ankündigung, das Leck “umgehend” zu beheben.

Weitere 6 Tage später hatten wir jedoch immer noch nichts Neues gehört.
Also haben wir nochmal nachgefragt – doch nachdem sie anscheinend in der Zwischenzeit an ihrem E-Mail-Setup herumgebastelt haben, konnten nicht mal mehr E-Mails an die bisher funktionierende canguard.de E-Mail-Adresse zugestellt werden :(.
Zum Glück standen in der Datenschutzerklärung auch Handynummern, bei denen wir es via SMS probiert haben.

Auch auf die SMS gab es keine Antwort. Am nächsten Tag haben sie aber versucht, ihren E-Mail-Empfang zu reparieren - und zu unserer Überraschung die Plattform gleich komplett offline genommen.

Am 05.04., also noch einen Tag später, hatten wir zwar immer noch keine Antwort, dafür hat CanGuard zumindest die Nutzer*innen über das Datenleck informiert.6

Dabei informierte CanGuard die Nutzer*innen aus unserer Sicht angenehm ehrlich:
Sie nennen konkret die betroffenen Daten und sagen auch, dass sie nicht ausschließen können, dass außer uns noch jemand an die Daten gekommen ist – auch wenn sie darauf keine Hinweise hätten. Außerdem empfehlen sie den Nutzer*innen, sicherheitshalber ihre Passwörter auch auf anderen Webseiten zu ändern.

Fazit

Warum erzählen wir hier davon?
Mit “nur” etwas mehr als 1.000 Accounts ist CanGuard eher ein kleiner Fall und die Software steckt erkennbar noch in den Kinderschuhen. Trotzdem denken wir, dass es sinnvoll ist, darüber öffentlich zu berichten.

Erstens sind wir der festen Überzeugung: Wenn ein Produkt marktreif genug ist, um Kund*innen-Daten zu speichern, muss es auch reif genug sein, diese für sich zu behalten.

Zweitens hoffen wir, dass dieser Artikel eine gewisse Breitenwirkung hat und andere Anbieter von ähnlichen CSC-SaaS-Lösungen nochmal genau schauen, was sie da eigentlich gebaut haben.
Wir wollen wirklich nicht, dass solche Software jetzt nach den Testzentren, den Lieferdiensten und der Bildungssoftware der nächste Running Gag bei uns wird.

Normalerweise würden wir an dieser Stelle den Anbietern vorhalten, dass sie diese Daten überhaupt sammeln. Datensparsamkeit wäre doch sinnvoller.
Doch das Grundproblem liegt hier nicht nur bei den Software-Anbietern, sondern im Cannabisgesetz selbst:

Denn das Gesetz verlangt, dass die CSCs viele Daten über ihre Mitglieder erheben müssen: Name, Geburtsjahr, abgegebene Menge, etc.
Diese Daten müssen zudem 5 Jahre aufbewahrt und teilweise sogar an die zuständige Behörde übermittelt werden. Netzpolitik.org schreibt dazu: “Beim Dealer ist mehr Datenschutz”.

Dabei sollte auch hier Datensparsamkeit gelten und so wenig Daten wie möglich gespeichert werden müssen:
Denn Daten, die gar nicht erst gesammelt und aufbewahrt werden, können auch nicht wegkommen.

So müssten sich Cannabis-Connoisseur*innen keine Sorgen um ihre Daten machen und könnten sich auf wichtigere Dinge konzentrieren: Zum Beispiel, warum die Pizza schon wieder alle ist.

🤝

Unsere Rechercheergebnisse haben wir mit Daniel Laufer und Carla Spangenberg vom rbb geteilt, deren Artikel auf tagesschau.de ihr hier lesen könnt.

Timeline

  • 2024-03-23 13:50 - Wir finden erste Lücken bei CanGuard
  • 2024-03-27 11:03 - Report an CanGuard, ThingBring, zuständige Landesdatenschutzbehörde von Niedersachsen & CERT-Bund
  • 2024-03-27 11:04 - E-Mail bounced, ThingBring.de ist gar nicht registriert
  • 2024-03-27 23:13 - Antwort vom CanGuard
  • 2024-04-03 14:07 - Nachfrage, ob Lücken geschlossen sind
  • 2024-04-03 14:07 - Mail bounced, “Recipient rejected”
  • 2024-04-03 17:29 - Erneute Nachfrage
  • 2024-04-03 17:29 - Mail bounced wieder, “Recipient rejected”
  • 2024-04-03 22:10 - E-Mail mit erneuter Nachfrage
  • 2024-04-03 22:10 - Mail bounced immer noch, “Recipient rejected”
  • 2024-04-03 22:15 - SMS an Gründer und Datenschutzbeauftragten
  • 2024-04-04 11:00 - E-Mail-Zustellung wurde wohl repariert, wir schicken E-Mail mit erneuter Nachfrage
  • 2024-04-04 18:09 - wir bemerken, dass die CanGuard-App abgeschaltet wurde
  • 2024-04-05 07:15 - CanGuard benachrichtigt ihre Nutzer per E-Mail über das Datenleck

An solch einem Artikel sitzen wir als Kollektiv deutlich länger als eine Woche, vom Finden der Lücken, über das Schreiben der Reports, den Umgang mit den betroffenen Unternehmen bis zur Veröffentlichung dieses Posts.

Falls er euch gefällt, könnt ihr uns gerne unterstützen.


  1. Wie ihr seht haben wir den Jugendsprachkurs bei Karl Lauterbach (61 Jahre) gemacht. ↩︎

  2. süßlich, fruchtig, blumig und ein bisschen wie frischer Schweiß 👃 ↩︎

  3. Natürlich haben wir das nicht mit fremden Accounts getestet, sondern uns selbst mehrere Accounts angelegt und dann an diesen gegenseitig getestet. ↩︎

  4. Wer dazu mehr wissen will: Zusammen mit Linus haben wir auf dem rc3 einen Talk zum Melden von Sicherheitslücken gehalten: “Deine Software, die Sicherheitslücken und ich” ↩︎

  5. Damit sich niemand diese Domain schnappt und damit Unsinn anstellt, haben wir sie sicherheitshalber vor dieser Veröffentlichung reserviert und CanGuard angeboten, sie ihnen kostenlos zu übertragen. ↩︎

  6. Spannenderweise informierte CanGuard per E-Mail, obwohl im Discord-Post noch behauptet wurde, dass sie durch “funktionierenden Datenschutz” gar keine Kenntnis von den E-Mail-Adressen hätten. ↩︎