Hamburger Verkehrsverbund (HVV): Absturzberichte ohne Einwilligung – Deutschlandticket Teil5

1. hvv switchHVV

Im Rahmen der Artikelserie »Deutschlandticket« werden einige Apps von Tarif- und Verkehrsverbünden stichprobenartig auf ihr Datensendeverhalten geprüft. Mittels eines Intercepting-Proxys wird das Verhalten der Apps hauptsächlich beim Start analysiert. Es wird geprüft, wohin eine App eine Verbindung aufbaut und welche Daten dabei übermittelt werden. Die Ergebnisse sollen Aufschluss darüber geben, wie datenschutzfreundlich eine App in der Standardkonfiguration ist.

Im vorliegenden Beitrag wird die App hvv switch analysiert. Die Analyse erfolgt unter Android. Die Ausgangslage für den nachfolgenden Test der App ist wie folgt:

  • Betriebssystem: Android 10 (Xiaomi Mi A1)
  • App-Version: 1.14.0 (Android)
  • Verbreitung: Über 100.000 Downloads (Google Play Store)
  • Exodus Privacy: In der Version 1.14.0 (Android) sind 6 Tracker integriert

Nachfolgend wird kurz das Datensendeverhalten der App beleuchtet.

Dieser Beitrag ist Teil einer Artikelserie:

2. Datensendeverhalten

Unmittelbar nach dem Start, noch bevor überhaupt eine Interaktion stattfindet, werden die nachfolgenden Verbindungen initiiert:

  • Google Firebase (firebaseinstallations.googleapis.com)
  • Google Firebase Crashlytics (firebase-settings.crashlytics.com)
  • Mapbox (config.mapbox.com)
  • PayPal (www.paypalobjects.com)
  • FFW Deutschland GmbH (config-cdn.cellular.de)

Auszugsweise werde ich nachfolgend die Verbindung zu Crashlytics und PayPal darstellen.

[1] Eine initiale Verbindung erfolgt zu Google Firebase Crashlytics (USA), einem Dienst für die Erstellung/Auswertung von Absturzberichten [firebase-settings.crashlytics.com]:

GET /spi/v2/platforms/android/gmp/1:802503347109:android:572f5e621394125bcef64c/settings?instance=64b8ff338a0bef927284b4dc202e0f2c766bdbde&build_version=223&display_version=1.14.0&source=4 HTTP/1.1
X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa
X-CRASHLYTICS-DEVICE-MODEL: Xiaomi/Mi A1
X-CRASHLYTICS-INSTALLATION-ID: bb9080fe068144bcb07078e70674b49c
X-CRASHLYTICS-OS-DISPLAY-VERSION: 10
Accept: application/json
X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.5
User-Agent: Crashlytics Android SDK/18.3.5
X-CRASHLYTICS-API-CLIENT-TYPE: android
X-CRASHLYTICS-GOOGLE-APP-ID: 1:802503347109:android:572f5e621394125bcef64c
X-CRASHLYTICS-OS-BUILD-VERSION: 10037230
Host: firebase-settings.crashlytics.com
Connection: close
Accept-Encoding: gzip, deflate

Eine Datenübermittlung bei einem Absturz sieht dann wie folgt aus [crashlyticsreports-pa.googleapis.com]:

POST /v1/firelog/legacy/batchlog HTTP/1.1
User-Agent: datatransport/3.1.8 android/
Content-Type: application/json
Accept-Encoding: gzip, deflate
X-Goog-Api-Key: AIzaSyBrpSYT4FFL09reHJi6H9FYdeiSnUTOv2M
Host: crashlyticsreports-pa.googleapis.com
Connection: close
Content-Length: 31086

{
    "logRequest": [
        {
            "requestTimeMs": 1683622867061,
            "requestUptimeMs": 97842172,
            "clientInfo": {
                "clientType": "ANDROID_FIREBASE",
                "androidClientInfo": {
                    "sdkVersion": 29,
                    "model": "Mi A1",
                    "hardware": "qcom",
                    "device": "tissot",
                    "product": "lineage_tissot",
                    "osBuild": "QQ3A.200805.001",
                    "manufacturer": "Xiaomi",
                    "fingerprint": "xiaomi/tissot/tissot_sprout:8.0.0/OPR1.170623.026/8.1.10:user/release-keys",
                    "locale": "de",
                    "country": "DE",
                    "mccMnc": "26201",
                    "applicationBuild": "223"
                }
            },
            "logSourceName": "GDT_CLIENT_METRICS",
            "logEvent": [
                {
                    "eventTimeMs": 1683622867054,
                    "eventUptimeMs": 97842166,
                    "sourceExtension": "Cg4Ijan1/f8wEOzg+P3/MBoLCgkIgIAFEICAgAUiFWRlLmhvY2hiYWhuLmh2dnN3aXRjaA==",
                    "timezoneOffsetSeconds": 7200,
                    "networkConnectionInfo": {
                        "networkType": "WIFI",
                        "mobileSubtype": "Telekom"
                    }
                }
            ],
            "qosTier": "DEFAULT"
        },
        {
            "requestTimeMs": 1683622867062,
            "requestUptimeMs": 97842173,
            "clientInfo": {
                "clientType": "ANDROID_FIREBASE",
                "androidClientInfo": {
                    "sdkVersion": 29,
                    "model": "Mi A1",
                    "hardware": "qcom",
                    "device": "tissot",
                    "product": "lineage_tissot",
                    "osBuild": "QQ3A.200805.001",
                    "manufacturer": "Xiaomi",
                    "fingerprint": "xiaomi/tissot/tissot_sprout:8.0.0/OPR1.170623.026/8.1.10:user/release-keys",
                    "locale": "de",
                    "country": "DE",
                    "mccMnc": "26201",
                    "applicationBuild": "223"
                }
            },
            "logSourceName": "FIREBASE_CRASHLYTICS_REPORT",
            "logEvent": [
                {
                    "eventTimeMs": 1683622866935,
                    "eventUptimeMs": 97842046,
                    "sourceExtensionJsonProto3": "{\"sdkVersion\":\"18.3.5\",\"gmpAppId\":\"1:802503347109:android:572f5e621394125bcef64c\",\"platform\":4,\"installationUuid\":\"bb9080fe068144bcb07078e70674b49c\",\"buildVersion\":\"223\",\"displayVersion\":\"1.14.0\",\"session\":{\"generator\":\"Crashlytics Android SDK/18.3.5\",\"identifier\":\"NjQ1QTBCOUEwMkYxMDAwMTJGRDZDQTcwMDkzNjgxQzY=\",\"startedAt\":1683622810,\"endedAt\":1683622866,\"crashed\":false,\"app\":{\"identifier\":\"de.hochbahn.hvvswitch\",\"version\":\"223\",\"displayVersion\":\"1.14.0\",\"installationUuid\":\"bb9080fe068144bcb07078e70674b49c\"},\"os\":{\"platform\":3,\"version\":\"10\",\"buildVersion\":\"REL\",\"jailbroken\":false},\"device\":{\"arch\":9,\"model\":\"Mi A1\",\"cores\":8,\"ram\":3746222080,\"diskSpace\":53953421312,\"simulator\":false,\"state\":0,\"manufacturer\":\"Xiaomi\",\"modelClass\":\"lineage_tissot\"},\"events\":[{\"timestamp\":1683622811,\"type\":\"error\",\"app\"[...],
                    "timezoneOffsetSeconds": 7200,
                    "networkConnectionInfo": {
                        "networkType": "WIFI",
                        "mobileSubtype":"Telekom"
                }
            }
        ],
            "qosTier":"DEFAULT"
        }
    ]
}

Auch wenn ich aus Entwicklersicht den Wunsch zum Erhalt/Auswertung von Absturzberichten absolut nachvollziehen kann, ist dies ein Zugriff auf Informationen im Endgerät und damit ohne informierte Einwilligung nach § 25 Abs. 1 TTDSG unzulässig. Der Zugriff auf die Informationen der Gerätedaten berührt die Integrität/Privatsphäre der Endeinrichtung des Nutzers und unterfällt somit dem Anwendungsbereich des TTDSG. Zum Betrieb einer App ist die Übersendung von Absturzberichten nicht »unbedingt erforderlich« und fällt daher nicht unter die Ausnahmeregelung nach § 25 Abs. 2 TTDSG.

Der obligatorische (Cookie-)Consent-Banner wird erst nach der Datenübermittlung eingeblendet – zu spät, denn bis zu diesem Punkt sind die Daten bereits abgeflossen:

Cookie-Banner

Dieser Banner erfüllt die Anforderungen an eine ausdrückliche, informierte, freiwillige und aktive Einwilligung nicht. Unter anderem beginnt die Datenverarbeitung bereits, bevor eine notwendige Einwilligung eingeholt wurde.

Selbst wenn ein Betroffener beim Einwilligungsbanner den Button Nein, ich lehne die Auswertung ab angetippt hat, werden dennoch weiterhin Absturzberichte erfasst und übersendet. Deutlich wird dies, sobald man in der App die Datenschutzeinstellungen über Einstellungen -> Privatspähre-Einstellungen anpassen öffnet:

Datenschutzeinstellungen

Was sagen die Datenschutzhinweise dazu?

Wir haben in die hvv switch App ein SDK (Software Developer Kit) von Google Firebase eingebunden, um die Nutzung unserer App besser verstehen und das Angebot verbessern zu können. Anbieterin ist die Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Ireland. Google Firebase stellt verschiedene Produkte zur Verfügung, von denen wir Analytics für Firebase und Crashlytics verwenden. Die über Google Firebase erhobenen, pseudonymisierten Informationen über die Nutzung unserer App geben uns z. B. Aufschluss über die Anzahl der App-Öffnungen in einem Zeitraum, über App-Abstürze, liefern Erkenntnisse zu besonders beliebten Funktionen sowie über die Anzahl von In-App-Käufen und die Gesamtzahl an Nutzenden in einem bestimmten Zeitraum. Weitere Informationen zur Datenverarbeitung durch Google Firebase findest du unter https://www.firebase.com/terms/privacy-policy.html .

[…]

Bei Crashlytics werden Daten zum Betrieb der App, einschließlich der Art des verwendeten Betriebssystems, Informationen zu Störungen beim Betrieb (Art, Zeitpunkt und Dauer der Störung sowie Nutzung der App zum Zeitpunkt der Störung) und Geräteinformationen verarbeitet. Anhand dieser Daten können wir beim Auftreten von Störungen oder Problemen beim Betrieb der hvv switch App einen Überblick über verschiedene Störungen erhalten und diese anhand ihrer Relevanz für die Nutzung gewichten, um eine effiziente Fehlerbehebung zu gewährleisten und die Stabilität der App sicherzustellen. Die Datenverarbeitung beruht auf Art. 6 Abs. 1 lit. f DSGVO. Wir haben ein berechtigtes Interesse, Stabilitätsprobleme, die die Qualität der hvv switch App beeinträchtigen, zu identifizieren und zu beheben. Dadurch erhöhen wir auch die Nutzungsfreundlichkeit der hvv switch App für unsere Kundinnen und Kunden. Da die Verarbeitung der Daten in pseudonymisierter Form erfolgt und du zu jeder Zeit die Nutzung dieser Daten durch die hvv switch App in den Privatsphäre-Einstellungen der hvv switch App unterbinden kannst (Widerspruch), ist ein überwiegendes entgegenstehendes berechtigtes Interesse nicht erkennbar.

Es genügt nicht, die Datenverarbeitung allein auf Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse) zu stützen. Die HVV schreibt selbst:

Bei Crashlytics werden Daten zum Betrieb der App, einschließlich der Art des verwendeten Betriebssystems, Informationen zu Störungen beim Betrieb (Art, Zeitpunkt und Dauer der Störung sowie Nutzung der App zum Zeitpunkt der Störung) und Geräteinformationen verarbeitet.

Der Zugriff auf die Informationen der Gerätedaten berührt die Integrität/Privatsphäre der Endeinrichtung des Nutzers und unterfällt somit dem Anwendungsbereich des TTDSG. Hierbei ist besonders zu betonen, dass die Vorgänge bereits vor jeglicher Interaktion mit dem Nutzer stattfinden. D.h. der Nutzer hatte keine Möglichkeit, in den Zugriff auf Informationen in seiner Endeinrichtung oder in die Übermittlung seiner Daten einzuwilligen. Art. 6 Abs. 1 lit. f DSGVO ist hier also nicht entscheidend, sondern ob auf dem Endgerät eine Speicherung von Informationen erfolgt (bspw. Cookies) oder eine Information aus dem Endgerät ausgelesen wird. Beides ist nach § 25 TTDSG einwilligungsbedürftig, sofern nicht unbedingt »technisch erforderlich«.

[2] Unmittelbar nach dem Start werden auch Verbindungen zu PayPal (Kalifornien, USA) initiiert [www.paypalobjects.com]:

GET /rdaAssets/magnes/magnes_android_rac_v6.json HTTP/1.1
User-Agent: Dalvik/2.1.0 (Linux; U; Android 10; Mi A1 Build/QQ3A.200805.001)
Host: www.paypalobjects.com
Connection: close
Accept-Encoding: gzip, deflate

Hierbei wird eine JSON-Datei geladen. Was sagen die Datenschutzhinweise dazu?

Wir haben in die hvv switch App ein SDK (Software Developer Kit) von PayPal eingebunden, um dir einen einfachen Zahlweg mit PayPal anbieten zu können. Anbieter ist die PayPal (Europe) S.à.r.l. et Cie, S.C.A., 22-24 Boulevard Royal L-2449, Luxemburg. PayPal verwendet dieses SDK aus Gründen des Risikomanagements, um seine Dienste sowie seine Kundinnen und Kunden vor Betrug und Missbrauch zu schützen. Mittels des SDK werden von PayPal neben deiner IP-Adresse auch Geräteinformationen sowie Daten zur technischen Nutzung und Standortdaten erfasst und verarbeitet. Wir haben keinen Einfluss auf diese Datenübertragung und -verarbeitung. Mehr Informationen über die Datenverarbeitung durch PayPal findest du unter https://www.paypal.com/de/webapps/mpp/ua/privacy-full?locale.x=de_DE.

Entscheidend ist:

Wir haben keinen Einfluss auf diese Datenübertragung und -verarbeitung.

Doch, das habt ihr. Man kann PayPal bspw. erst dann einbinden, wenn ein Betroffener/Nutzer tatsächlich vorhat, über diesen datenschutzunfreundlichen Bezahldienstleister ein Ticket zu erwerben. Ansonsten ist es technisch einfach nicht erforderlich, diesen Aufruf bereits beim Start der App zu initiieren.

Du kannst den Blog aktiv unterstützen!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

3. Fazit

In der aktuell vorliegenden Version entspricht die App des HVV nicht den gesetzlichen Anforderungen an die DSGVO und das TTDSG. Die Übermittlung von Absturzberichten ist einwilligungsbedürftig. Die Absturzberichte lassen sich über die Einstellungen zwar deaktivieren, allerdings ist die Umsetzung via Opt-Out rechtlich gesehen nicht in Ordnung. Zusätzlich zu diesen rechtlichen Mängeln erfolgt beim Start der App unnötigerweise eine Kontaktaufnahme mit PayPal. Dies sollte jedoch erst geschehen, wenn ein Betroffener/Nutzer tatsächlich vorhat, über diesen datenschutzunfreundlichen Bezahldienstleister ein Ticket zu erwerben. Leider hat sich auch die Stichprobe aus Hamburg (HVV) als enttäuschend herausgestellt.

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

Ich freue mich auf Deine Beteiligung zum Artikel

HilfeWenn du Ergänzungen oder konkrete Fragen zum Beitrag hast, besuche das offizielle Forum. Dort kann der Beitrag diskutiert werden. Oder besuche den Chat, um dein Anliegen zu besprechen. zur Diskussion ➡

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.