April 2, 2021

Luca App Source Code Audit II: Die ersten zwei(!) Sicherheitslücken

Einschub: Informationsbeschaffung, was man im Sourcecode finden können sollte und was sich außerhalb sonst noch so findet.

Den Luca Android Sourcecode fand ich schon bei erster Draufsicht nicht so sonderlich leserlich. Das ist überwiegend einfach eine Hölle aus undokumentierten Lambda Statements. Man kann entweder anhand der Methodennamen raten, welcher Codeschnipsel was machen sollte (falls die Namen nicht durch Lambdas weg rationalisiert wurden), oder man kann versuchen, das gegen das das Sicherheitskonzept gegenzulesen und darauf hoffen, das Konzept und Implementierung übereinstimmen (wobei der Sinn der Übung natürlich in der Annahme besteht, dass sie das nicht tun).

Das Sicherheitskonzept enttäuscht nicht. Statt klarer Formulierung, wird man direkt in der Einleitung erstmal mit Gendergrütze begrüßt. Da weiß man wenigstens sofort, für wen es eigentlich geschrieben wurde, und das es mit ein wenig Flexibilität bei den Begrifflichkeiten gelesen werden will. Lange Rede, kurzer Sinn: es lohnt sich, erstmal einen kleinen Umweg über die Datenschutzerklärung (Sicherheitskopie) zu machen und da finden sich dann folgende Passagen (“C. ERHEBUNG PERSONENBEZOGENER DATEN im luca System”):

Wenn Sie sich in der luca App registrieren: Nach Eingabe Ihrer Kontaktdaten und erfolgreicher Verifizierung Ihrer Telefonnummer werden Ihre Kontaktdaten durch die luca App mit dem sog. Nutzergeheimnis (individuell im luca System generierter Schlüssel) verschlüsselt und an die luca App übertragen. Die Verschlüsselung dient der Sicherheit Ihrer Daten. Das Nutzergeheimnis verbleibt bis zum Einchecken bei einem Gastgeber ausschließlich in Ihrer luca App und ist somit in Ihrem Besitz. Wir sind für diese Datenverarbeitungen verantwortlich.

Äh… Ja? Also die App verschlüsselt die Kontaktdaten und übertragt sie an… sich selbst?! Was genau soll das Nutzergeheimnis sein? Wo kann man das nachlesen? Wenn damit mein privater Schlüssel gemeint ist, warum verbleibt der dann nur bis Einchecken bei einem Gastgeber in meinem Besitz? Leitet sich “Geheimnis” neuerdings von “geh heim” ab?

Wenn Sie sich mit der luca App bei einem Gastgeber einchecken: Ihr Nutzergeheimnis wird mit dem Schlüssel eines zuständigen Gesundheitsamtes verschlüsselt.

Wait! What?! Also ich verschlüssele erst meine Kontaktdaten, gebe dann die verschlüsselten Daten und den Schlüssel an den Gastgeber weiter, welcher beides nochmal mit dem Schlüssel eines zuständigen Gesundheitsamtes verschlüsselt, damit er das danach selbst nicht mehr lesen kann?!

Oder ist die Idee hier, das der Gastgeber mir mitteilt, welches Gesundheitsamt für ihn zuständig wäre, ich mir dann den Schlüssel herunterlade und selber verschlüssele? Aber was machen wir denn dann, wenn ich statt Smartphone diesen Schlüsselanhänger mit aufgedrucktem QR Code verwende? Kommt der Schlüssel dann per Fax und ich darf erst rein, wenn ich meine Daten manuell mit Bleistift verschlüsselt habe?

Wenn ein Gastgeber Ihre Kontaktdaten einem Gesundheitsamt freigibt: Um mögliche Kontaktpersonen zu identifizieren, können Gesundheitsämter von Gastgebern die Freigabe von Kontaktdaten für den bestimmten Zeitraum des jeweiligen Aufenthalts anfordern. Hierzu kann das Gesundheitsamt eine Anfrage über das luca System an den Gastgeber stellen. Der Gastgeber erhält dadurch die Möglichkeit, die betreffenden Kontaktdaten der Personen, die sich bei ihm eingecheckt haben zu entschlüsseln und dem Gesundheitsamt zur Verfügung zu stellen

Dafuq?! Was bitteschön gehen denn jetzt auf einmal den Gastgeber die Kontaktdaten an? Da sind wir dann doch genau wieder bei der Situation mit den Papierlisten, nur in teuer und kompliziert!

Was ist das hier? Eine Runde stille Post, bei der wir uns alle gegenseitig unsere Passwörter ins Ohr flüstern? Wenn ich die dritte Passage ernst nehmen soll, dann hat irgendwer die Grundlagen von Kryptographie (ein “Geheimnis” ist dazu da, geheim gehalten zu werden) nicht verstanden, in der zweiten Passage lauert eine MITM Attacke und bei mindestens einem Akteur (Luca oder Gastgeber), steckt der Haustürschlüssel von außen.

Tja, die Datenschutzerklärung ist schonmal Kauderwelsch, durch das man bereits als Informatiker nur schwer durch steigt. Für Otto Normalbürger könnten das genauso gut 14(!) DIN A4 Seiten “Lorem Ipsum” Text sein. Ich bin ja kein Anwalt, aber ist ein Nutzungsvertag auf dieser Grundlage nicht eigentlich sittenwidrig und damit nichtig? Was würde daraus folgen, wenn die Bundesländer ihre Bürger durch die Hintertüre des Hausrechtes (“ohne App kein Zugang zu…”) zur Nutzung von Luca zwingen? Frage für einen Freund.

Das müssen wir uns dann doch mal in der Praxis ansehen

Wer mit Luca eine Veranstaltung durchführen will, muss sich zunächst als Gastgeber auf der Website registrieren, was einem auch sehr einfach gemacht wird:

Betreiber == Gastgeber. Man beachte wie schön das in der Menuzeile, nicht aber im Text gegendert wird.

Es folgt der übliche Sermon mit dem Abnicken der AGBs und der Datenschutzerklärung (das unverständliche Kauderwelsch, siehe oben - es ist rechtlich von Vorteil, wenn ihr das euren Kumpel in Schwerin, seinen Sohnemann oder dessen Katze machen und euch dann die Screenshots geben lasst), sowie Angabe einer Emailadresse, an die ein Bestätigungslink geschickt wird. Danach wird man von folgendem Schmuckstück begrüßt:

Das Interface ist jetzt auf Englisch, weil der Browser einen entsprechenden Accept-Language Header sendet. Das hat er aber eigentlich auch schon im vorherigem Screenshot getan.

Den Dialog muss man einen Moment auf sich wirken lassen, um von der vollen Wucht seiner Tragweite getroffen zu werden.

Übersetzung (für Kryptologen): “Hallo Bob, ich bins, dein Kumpel Charlie! Hier ist dein Schlüssel, von dem ich ganz sicher keine Kopie mehr habe. Großes Indianerehrenwort!”

Der Schlüssel ist dann ein 64 Zeichen langer Hex String (einige Stellen zur Sicherheit mit “X” unkenntlich gemacht), kein X.509 Zertifikat, wie man es vielleicht erwarten würde, sondern etwas hausgemachtes (Notiz für Zukunfts Patrick: da nochmal genauer hinschauen):

8bb6fXXXX62de8066190bbXXXX93de4c957942c2dXXXX216b77b68ac8ac5deXX

Die Aussage, dass ein Gesundheitsamt nur mit Einverständnis des Gastgebers an seine Gästeliste drankommt (siehe Kauderwelsch, Passus 3) kann man also schonmal getrost in die Tonne treten. Luca ist (theoretisch) im Besitz des Gastgeberschlüssels und damit in der Lage, dieses Einverständnis stellvertretend zu erteilen.

Missbrauchsszenario #1 Eine Fensterscheibe wird eingeschlagen und die Polizei sucht Zeugen! Statt sich vom Restaurant nebenan die Papiergästeliste geben zu lassen, wird beim Gesundheitsamt ein Amtshilfeantrag gestellt und Luca verpflichtet, Kopien des Gastgeberschlüssels für Strafverfolgungszwecke zu speichern.

Der Unterschied zur Gästeliste auf Papier ist jetzt, dass deutschlandweit alle Restaurants abgefragt werden können und zwar ohne Zutun oder Kenntnis des Restaurantbesitzers. Denkt euch selber eine Formulierung aus, warum man das zur Verfolgung schwerster Straftaten, Terroristen, Kinderschänder und Urheberrechtsverletzer brauchen würde. Wenn euch auf die Schnelle nichts einfällt, nehmt einfach das hier.

Schlimmer geht immer!

Nach dem Download des Gastgeberschlüssels kann man seine erste Veranstaltung anlegen. Dazu gibt es verschiedene Optionen.

Es macht keinen Unterschied, was ihr wählt.

Egal für welche ihr euch entscheidet, ihr werdet nach folgenden Dingen gefragt:

  1. Name für die Veranstaltung
  2. Postalische Adresse
  3. Telefonnummer unter der ihr erreichbar seid.
  4. Ob ihr geofencing zum Checkout anbieten wollt und wenn ja, wie groß der Radius sein soll.

Nichts davon wird überprüft (und muss es eigentlich auch nicht). Danach bekommt ihr die Möglichkeit ein PDF mit QR Code zu generieren, dass ihr ausgedruckt in einem Aufsteller auf jedem Tisch in eurem Restaurant stellen könnt (low tech Variante). Eure Gäste müssen das dann mit der App scannen und den Checkin an Luca übermitteln (sofern sie Netz haben).

Missbrauchsszenario #2 Ein Gast scannt unter Aufsicht des Kellners den Aufsteller mit QR Code. Was das Smartphone dann macht, ob es überhaupt etwas macht, bzw. ob wirklich die echte Luca App läuft, kann der Kellner nicht überprüfen (will er vermutlich auch nicht, denn dem Hygieneprotokoll wurde genüge getan und er hat keinen Grund, sein Trinkgeld durch unangenehme Fragen zu gefährden).

Lassen wir das mal einen Moment lang sacken…

Die Erfahrung im Sommer 2020 hat gezeigt, dass die Polizei schamlos Missbrauch mit Gästelisten betreibt, wenn sie kann. Spätestens ab diesem Zeitpunkt wurden überwiegend nur noch Falschangaben gemacht. Jetzt sind wir endlich digitalisiert und haben mit Luca eine Hightechlösung, bei der man nicht einmal mehr nachvollziehen kann, ob sich jemand überhaupt in die Gästeliste eingetragen hat! Bei der Papierlösung konnte die Polizei wenigstens noch Streife gehen und Ausweise abgleichen. Das entfällt hier jetzt vollständig!

Wir knüpfen unsere “Konzepte” für Lockdown Lockerungen also an eine überteuerte Lösung, die völlig unnötig Daten erhebt, diese versucht mit einem riesen Zinnober an Crypto-Fu abzusichern, daran scheitert und letztendlich auch noch trivial umgangen werden kann. Wir reden hier nicht über einen Bug im Code, den man fixen könnte, sondern über (Anfänger-)Fehler im Design! Und zwar die Art von (Anfänger-)Fehler, die die einem sofort mit dem nacktem Arsch ins Gesicht springt und fragt: “hast du Lack gesoffen?”

An dieser Stelle möchte ich die Gelegenheit nutzen, um auf dieses kleine Juwel in den AGB (ihr wisst schon, das andere Kauderwelsch, dass ihr abnicken sollt) hinzuweisen:

8. Haftungsbeschränkung

   1. luca haftet unbeschränkt für (a) die Verletzung des Lebens, des Körpers oder der Gesundheit durch luca, lucas gesetzliche Vertreter oder Erfüllungsgehilfen; (b) vorsätzlich oder grob fahrlässig verursachte Schäden durch luca, lucas gesetzliche Vertreter oder Erfüllungsgehilfen; (c) Schäden aufgrund des Fehlens einer garantierten Beschaffenheit; und (d) Forderungen aus dem Produkthaftungsgesetz (ProdHaftG).

Tja, mal schauen, wir ermutigen also Menschen auf Konzerte zu gehen und sich dadurch einem vermeidbarem Infektionsrisiko aussetzen, weil…

  • wir ihnen eine App geben, über die sie das Gesundheitsamt im Zweifelsfall kontaktieren kann.
  • Corona nur ein harmloser Schnupfen ist (zumindest wenn die App zuschaut. Da trauen sich die Viren nicht so viel).
  • wir uns nicht vorstellen können, dass irgendwer, der sich (wider erwarten) auf einem Konzert angesteckt hat, Viren danach außerhalb einer von Luca getrackten Veranstaltung (sagen wir, auf der Heimfahrt mit dem Zug) weitergeben würde.

Sagt mal Leute, ihr sucht das Gasleck auch mitm Streichholz, oder?

Update: Teil III (in eigener Sache) und Teil IV