DiGA Kalmeda: Gesundheits-App mit Microsoft-Tracker

Die ersten Gesundheit-Apps auf Kassenkosten sind seit Oktober 2020 nun verfügbar. Aktuell sind im offiziellen Verzeichnis zwei Apps hinterlegt:

Laut Angaben des Bundesinstituts für Arzneimittel und Medizinprodukte (BfArM) wird vor der Aufnahme ist das App-Verzeichnis geprüft, ob eine App die Anforderungen an

  • Sicherheit
  • Funktionstauglichkeit
  • und Datenschutz

erfüllt.

Im vorliegenden Beitrag werfen wir einen kurzen Blick auf das Datensendeverhalten der App Kalmeda (Version 1.5.3), von der mynoise GmbH – dieses kurze App-Review ersetzt natürlich keinen Penetrationstest bzw. ausführliche Sicherheitsprüfung.

App-Start: Unmittelbar nach dem Start (keine Interaktion des Nutzers)

[1] Unmittelbar nach dem Start der App kontaktiert die App einen Microsoft-Service (App Center), der Absturzberichte und Analysedaten erhebt und verarbeitet. Unter anderem werden folgende Informationen übermittelt [in.appcenter.ms]:

  • sid (958aac5f-d9e7-417e-8fd4-f25ec10544ec):  Identifikationsmerkmal, das dem Gerät einmalig zugewiesen wurde
  • model (Xiaomi Mi A1): Hersteller und Gerätemodell
  • osVersion (Android): Welches System genutzt wird
  • appVersion (1.5.3): Version der Kalmeda-App
  • appNamespace (de.mynoise.kalmeda): Paketname der App
  • […]

Die komplette Übermittlung:

POST /logs?api-version=1.0.0 HTTP/1.1
Content-Type: application/json
Install-ID: 900892bc-f68d-4e6e-9683-1b7262496fe7
App-Secret: 021f67c3-6b2c-4cda-89b3-5a48f7ebffc7
Content-Length: 532
User-Agent: Dalvik/2.1.0 (Linux; U; Android 10; Mi A1 Build/QQ3A.200805.001)
Host: in.appcenter.ms
Connection: close
Accept-Encoding: gzip, deflate

{"logs":[{"type":"startSession","timestamp":"2020-10-19T08:26:33.960Z","sid":"958aac5f-d9e7-417e-8fd4-f25ec10544ec","device":{"wrapperSdkVersion":"1.5.0","wrapperSdkName":"appcenter.xamarin","wrapperRuntimeVersion":"11.0.2.0","sdkName":"appcenter.android","sdkVersion":"1.4.0","model":"Mi A1","oemName":"Xiaomi","osName":"Android","osVersion":"10","osBuild":"QQ3A.200805.001","osApiLevel":29,"locale":"de_DE","timeZoneOffset":120,"screenSize":"1080x1920","appVersion":"1.5.3","appBuild":"116","appNamespace":"de.mynoise.kalmeda"}}]}

Grundsätzlich ist der Wunsch, Absturz- und Analysedaten zu erhalten, aus Entwicklersicht nachvollziehbar. Allerdings fallen Gesundheitsdaten nach EU-DSGVO Art. 9 unter die Kategorie der besonders schützenswerten Daten. In diesem Kontext ist der Einsatz externer (Analyse-)Dienstleister fraglich und höchst umstritten. Weiterhin wurde vom Nutzer keine Zustimmung eingeholt, Absturz- und Analysedaten an den Drittanbieter Microsoft zu übermitteln. Das Tracking wird unmittelbar nach dem Start der App initialisiert.

[2] Ebenfalls unmittelbar nach dem Start nimmt die App Kontakt zu Servern der mynoise GmbH auf, um Details zur Open-ID-Konfiguration abzufragen [account.kalmeda.de]:

GET /.well-known/openid-configuration HTTP/1.1
Host: account.kalmeda.de
Connection: close

Registrierung

Nach dem Download einiger Daten erscheint ein Button »Los geht’s«. Anschließend erscheint ein Screen für die Registrierung mit E-Mail-Adresse und Passwort. Mit einem Häkchen wird erst jetzt eine Einwilligung in die AGB bzw. Datenschutzbestimmungen des Dienstes eingeholt – das Tracking hat allerdings schon stattgefunden. Das Passwort zur Registrierung muss mindestens sechs Zeichen lang sein, einen Großbuchstaben, eine Zahl und ein Sonderzeichen enthalten. Das Häkchen bei Newsletter setze ich nicht – hierfür wird der Dienstleister KLICK TIPP (Unternehmenssitz UK) verwendet.

E-Mail-Adresse und Passwort werden anschließend an Kalmeda übermittelt:

POST /api/v1/Profile HTTP/1.1
Accept: application/json
Content-Type: application/json
Content-Length: 59
Host: account.kalmeda.de
Connection: close

{"email":"test@testmail.de","password":"secret0815!"}

Die Registrierung muss anschließend bestätigt werden, indem ein Link im E-Mail-Postfach angeklickt wird.

Im Hintergrund generiert die App dann noch eine eindeutige UserID und übersendet diese mit weiteren Informationen an Kalmeda:

POST /userprogress/api/v1/UserProgress HTTP/1.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkEzNDgzMDUyNEI3NTM4MTRFNDIzOTk2QjY3N0M2N0JGMjYxN0NEN0IiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJvMGd3VWt0MU9CVGtJNWxyWjN4bnZ5WVh6WHMifQ.eyJuYmYiOjE2MDMwOTc4NDUsImV4cCI6MTYwMzUyOTg0NSwiaXNzIjoiaHR0cHM6Ly9hY2NvdW50LmthbG1lZGEuZGUiLCJhdWQiOlsiaHR0cHM6Ly9hY2NvdW50LmthbG1lZGEuZGUvcmVzb3VyY2VzIiwiS2FsbWVkYS5JZGVudGl0eSJdLCJjbGllbnRfaWQiOiJLYWxtZWRhLUFwcCIsInN1YiI6IjE0NWNmYTBmLTQxMTQtNDllYy1hZTI3LWQzZmE5ZTViYmZkZCIsImF1dGhfdGltZSI6MTYwMzA5Nzg0NSwiaWRwIjoibG9jYWwiLCJyb2xlIjoiVXNlciIsInNjb3BlIjpbImVtYWlsIiwib3BlbmlkIiwicHJvZmlsZSIsInJvbGUiLCJLYWxtZWRhLklkZW50aXR5Iiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.Ft7MwbL4h5qDA_MNkBG18-j-KuwylWrZ7_tMHU8BktGGi7E7Q0Iy2Kp6Yif32D7D3BWvolHteDw9jYyt5cmcRy-YUHvSei5w3ksh-Gl1MrFB9wIPCeKL9xmw8d3TMjwhznrDS1FppnzwKMdssJkB19QjQtMdjI0hceEMCP3NCGtOnc_kunCk7FQerDhTx768u-11BsXd8K9X06UUQJtMu_W1ofGmOL_ZZEIhVM-_NduHx6YA59WXMRnKPOaoC3ZPiCkMKlNyoqFexKtl7F3Px8t0NH-RIwGONMVGgDOwo2BnMNjV-988gAxz_wFh-pSWkA_KiyjjbiLEZXsbKNx-tyEtPBKMaFOHu-Ep0L0Ga9wLpdCs18mNLVLtS_X6iwPdJ7_4YKjZZkJUfvUZq-WbxZWXf7Vgs9uVfnd4H93OIlhWnf8wh3mlf3NUsc-hnLWteDOY5b5M-TgMMGrjcxiTceY2Pcn_EBB2sOKzOYCkDRcRqDN1DFnnO0luRW9wWdxrrKwNZSMV-XMqrJDFo8o_w2qGAdsaSsBGtQgTqzYQS5xf53pV07lB633vnCj_0yme0ccUs_UrtYBJTIUFHt2v1oTbMyqPPre10kAVCG-CzHvUoXNabA_RIZV9SdD68BMkwPHaphmoorYNZnOR38peF3reXk3zmhgKYIAM5mMgGgA
Content-Type: application/json
Content-Length: 703
Host: cloud.kalmeda.de
Connection: close

{"userId":"145cfa0f-4114-49ec-ae27-d3fa9e5bbfdd","key":"De.MyNoise.Kalmeda.Core.UserProgress.Models.KalmedaUserProgress`1[[De.MyNoise.Kalmeda.Core.InfoPopup.Models.UserInfo, De.MyNoise.Kalmeda.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]","value":"{\"Items\":[{\"AcceptedTermsOfServiceVersion\":0,\"AcceptedPrivacyPolicyVersion\":4,\"SeenUpdateNotesVersion_iOS\":4,\"SeenUpdateNotesVersion_Android\":4,\"HasKalmedaStartFinished\":false,\"HasAnamneseFinished\":false,\"ShouldSendLocalNotifications\":true,\"GetShouldSendFollowUpEmails\":true,\"HasKalmedaGoFinished\":false,\"De.MyNoise.Kalmeda.Core.Base.Model.IBaseModel<TPrimaryKey>.Id\":1}]}","date":"2020-10-19T10:57:28.034902+02:00"}

Persönliches Profil

Anschließend soll man Angaben zu Alter und Geschlecht machen, seit wann der Tinnitus schon existiert, wie sich dieser auf das Leben auswirkt etc. Alle Infos werden erneut an Kalmeda übermittelt:

{"userId":"145cfa0f-4114-49ec-ae27-d3fa9e5bbfdd","key":"De.MyNoise.Kalmeda.Core.UserProgress.Models.KalmedaUserProgress`1[[De.MyNoise.Kalmeda.Core.Onboarding.Models.AnamnesisModel, De.MyNoise.Kalmeda.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]","value":"{\"Items\":[{\"Gender\":2,\"Birthday\":\"1990-01-18T00:00:00\",\"TinnitusSince\":\"2020-02-04T00:00:00\",\"BurdenValue\":0.691,\"FinalBurdenValue\":0.5,\"Kinds\":25,\"Symptoms\":52,\"TinnitusConstantChaningRatio\":0.5,\"TinnitusLeftRightRatio\":0.155,\"TinnitusLoudSilentRatio\":0.755,\"TinnitusHighLowRatio\":0.5,\"De.MyNoise.Kalmeda.Core.Base.Model.IBaseModel<TPrimaryKey>.Id\":1}]}","date":"2020-10-19T11:06:59.727109+02:00"}

Während der Nutzung tauscht die App diverse Informationen mit dem Dienstleister aus.

Kurzcheck der Datenschutzerklärung

Die Datenschutzerklärung ist relativ umfangreich. Von besonderem Interesse im App-Kontext ist die Ziffer 15. »Nutzung der App«. Dort wird der Nutzer dann auf Microsoft AppCenter hingewiesen:

Im Rahmen der Funktionsgewährleistung ist in der Kalmeda-App zusätzlich die Funktionsstatusmeldung bei Abstürzen vom Microsoft AppCenter ( http://appcenter.ms ) hinterlegt der Drittanbieter (Microsoft Corporation) fragt bei Abstürzen folgende Informationen ab:

Geräteart (Hersteller und Version),
Betriebssystemversion,
App-Version der Kalmeda-App sowie
Screen beziehungsweise Funktionsaufruf (Ort, nicht Ort des Users) des Absturzes.

Interessant ist in diesem Zusammenhang der folgende Hinweis:

Die Speicherung dieser gesonderten Daten übernimmt Microsoft – wir haben auf den Speicherort keinen Einfluss.

Microsoft speichert die Daten also irgendwo. Wo wurde vertraglich offenbar nicht vereinbart. Zumindest eine vertragliche Zusicherung auf Speicherung innerhalb der EU wäre hier wohl sinnvoll gewesen. Weiterhin heißt es:

Diese Daten sind nicht zuordenbar durch uns auf einen einzelnen User innerhalb des eigenen KALMEDA-Speicherkonzeptes und sind physisch vollständig getrennt.

Durch »uns« bedeutet an dieser Stelle wohl die mynoise GmbH. Wenn man ganz spitzfindig ist, dann könnte man nun fragen: Sind die Daten (Absturz- und Analysedaten) denn für Microsoft zuordenbar?

Fazit

Wie bereits angedeutet halte ich die Integration eines Trackers bzw. Analysediensten bei Gesundheits-Apps für problematisch. Grundsätzlich hat jedes Modul theoretisch Zugriff auf alles, was der App erlaubt ist. Wir vertrauen also darauf, dass Werbe- und Analytik-Module von Drittanbietern in Apps integriert werden und anschließend im Hintergrund ihre Arbeit verrichten. Welche Daten diese Module allerdings sammeln und an die Drittanbieter übermitteln, dass wissen teilweise nicht einmal die App-Entwickler selbst, die diese Module in ihre Apps integrieren. In Bezug auf Gesundheits-Apps, die höchst sensible Daten verarbeiteten, bedeutet das letztendlich: Werbe- und Analytik-Module haben darin schlichtweg nichts verloren – es ist vollkommen indiskutabel, diese in Gesundheits-Apps zu integrieren. Oder allgemein formuliert: In Apps, in denen sensible Daten verarbeitet werden, darf kein proprietärer und intransparenter Fremdcode integriert werden. Das ist jedenfalls mein Standpunkt zu diesem Thema. In diesem Zusammenhang wäre es sinnvoll, wenn Kalmeda zumindest beim App-Start um Erlaubnis fragt, ob Analyse- und Absturzberichte an Microsoft übermittelt werden dürfen. Der Nutzer hat allerdings überhaupt keine Wahl und kann dies später auch nicht über die Einstellungen beinflussen bzw. einen Opt-Out vornehmen.

Die weiteren Datenflüsse der App bewegen sich – soweit ich das beurteilen kann – im Rahmen der Funktionserbringung.

Für Unklarheit sorgt nach wie vor, ob in DiGAs zum Abruf der Verordnung (eRezept) eine Zwei-Faktor-Authentisierung (2FA) nun verpflichtend ist oder nicht. Diverse Dokumente, Richtlinien und Leitfäden (BSI TR 03161, ISO 29115, DSGVO, Das Fast Track Verfahren für digitale Gesundheitsanwendungen (DiGA) nach § 139e SGB V) widersprechen sich hier. In Kalmeda konnte ich eine solche 2FA jedenfalls nicht feststellen.

Unterstütze den Blog mit einem Dauerauftrag! Mitmachen ➡