Hochschule für Tracking, Wirtschaft und Kultur Leipzig
Schwere Datenschutzverstöße in der App der HTWK Leipzig

07 May 2022 by lab-cat

Die App

Startseite der HTWK-App

Die Hochschule für Technik, Wirtschaft und Kultur Leipzig bietet seit November die HTWK App über die beiden großen App-Stores sowie über ihre Website zum download an. Mit der App können die Student*innen unter anderem den Newsfeed der Hochschule lesen, verantwortliche Personen sowie deren Kontaktdaten finden und aktuelle Kantinengerichte nachschlagen. Die App komprimiert im Wesentlichen einige Informationen der Website und macht sie auf dem Handy besser navigierbar.

Die HTWK App ist laut entsprechender Pressemitteilung eine Abwandlung einer App der Bildungsportal Sachsen GmbH, die auch die TU Chemnitz als Basis für ihre App nutzt. Die BPS GmbH ist eine Firma von 10 großen sächsischen Hochschulen und betreibt vor allem E-Learning Produkte. Der Quellcode der HTWK-App ist (nach unserer Kenntnis) nicht öffentlich einsehbar.

Methoden

Aus Interesse haben wir die App einmal genauer unter die Lupe genommen. Dabei nutzten wir Werkzeuge der statischen Analyse sowie das Mitschneiden des erzeugten Webverkehrs.

Technische Details

Wir haben die Version 1.0.2 der Android-App untersucht.

Für die statische Suche nach gängigen Tracking- und Werbebibliotheken nutzten wir die Plattform Exodus Privacy sowie das FOSS-Werkzeug Apktool mit einem Wrapper-Script von IzzyOnDroid.

Zur Einsicht des Webverkehrs nutzten wir den Android Emulator von Android Studio und leiteten den Verkehr über den freien HTTP-Proxy mitmproxy.

Ergebnisse

Einbindung von Trackingbibliotheken

Der automatisch generierte Report von Exodus Privacy gibt 9 gefundene Tracker von 4 Firmen von:

Ein weiteres Werkzeug (Apktool) bestätigt das Ergebnis.
No libsmali.txt entry for /com/shaded/fasterxml/jackson, this library will be ignored.

Libraries detected:
-------------------
* Android Support v4 (/android/support/v4): Development Framework, Apache-2.0
* AndroidX Activity (/androidx/activity): Utility, Apache-2.0
* Android Jetpack Annotations (/androidx/annotation): Utility, Apache-2.0
* AppCompat (/androidx/appcompat): Utility, Apache-2.0
* Biometric (/androidx/biometric): Utility, Apache-2.0
* Browser (/androidx/browser): Utility, Apache-2.0
* Constraint Layout Library (/androidx/constraintlayout): Utility, Apache-2.0
* Androidx Core (/androidx/core): Utility, Apache-2.0
* Androidx Fragment (/androidx/fragment/app): Development Aid, Apache-2.0
* Lifecycle (/androidx/lifecycle): Utility, Apache-2.0
* Media (/androidx/media): Utility, Apache-2.0
* Room (/androidx/room): Utility, Apache-2.0
* Android Activity Saved State (/androidx/savedstate): Utility, Apache-2.0
* Android Jetpack VersionedParcelable (/androidx/versionedparcelable): Utility, Apache-2.0
* AndroidX Widget ViewPager2 (/androidx/viewpager2): UI Component, Apache-2.0
* Butter Knife (/butterknife): Utility, Apache-2.0
* Amplitude Android SDK (/com/amplitude): Mobile Analytics, MIT; Tracking
* Play Install Referrer Library (/com/android/installreferrer): Utility, Proprietary; NonFreeDep,NonFreeNet,Tracking
* Glide (/com/bumptech/glide): Utility, BSD-2-Clause
* Facebook SDK for Android (/com/facebook): Social Network, Proprietary; NonFreeDep,Tracking
* Facebook Ads (/com/facebook/ads): Advertisement, LicenseUnknown; Ads
* Facebook Analytics (/com/facebook/appevents): Mobile Analytics, Proprietary; Tracking
* Fresco (/com/facebook/fresco): Utility, MIT
* Hermes JS Engine (/com/facebook/hermes): Utility, MIT
* Infer (/com/facebook/infer): Utility, MIT
* React Native (/com/facebook/react): Development Framework, MIT
* SoLoader (/com/facebook/soloader): Utility, Apache-2.0
* Stetho (/com/facebook/stetho): Utility, MIT
* Google Ads (/com/google/ads): Advertisement, LicenseUnknown; Ads
* Firebase Data Transport (/com/google/android/datatransport): Utility, Apache-2.0; NonFreeNet
* ExoPlayer (/com/google/android/exoplayer2): Utility, Apache-2.0
* Google Analytics (/com/google/android/gms/analytics): Mobile Analytics, Proprietary; NonFreeDep,Tracking
* Google Fit (/com/google/android/gms/fitness): Utility, Proprietary; NonFreeDep
* Google Maps API (/com/google/android/gms/maps): Map, Proprietary; NonFreeDep,NonFreeNet
* Android Vision (/com/google/android/gms/vision): Utility, Proprietary; NonFreeDep
* Google Mobile Services (/com/google/android/gms): Development Framework, Proprietary; NonFreeDep
* Google Material Design (/com/google/android/material): Utility, Apache-2.0
* Google Play Core (/com/google/android/play/core): Utility, Proprietary; NonFreeNet,NonFreeDep
* Firebase (/com/google/firebase): Utility, LicenseUnknown; NonFreeNet,NonFreeDep
* Firebase Analytics (/com/google/firebase/analytics): Mobile Analytics, LicenseUnknown; Tracking
* Maps SDK for Android (/com/google/maps/android): Map, Apache-2.0; NonFreeNet
* DBFlow (/com/raizlabs/android/dbflow): Utility, MIT
* Segment (/com/segment/analytics): Mobile Analytics, MIT; Tracking
* OkHttp (/com/squareup/okhttp): Utility, Apache-2.0
* Stripe Android SDK (/com/stripe/android): Payment, MIT
* Android Image Cropper (/com/theartofdev/edmodo/cropper): Utility, Apache-2.0
* expo-application (/expo/modules/application): Utility, MIT
* expo-constants (/expo/modules/constants): Utility, MIT
* expo-error-recovery (/expo/modules/errorrecovery): Utility, MIT
* expo-file-system (/expo/modules/filesystem): Utility, MIT
* expo-font (/expo/modules/font): Utility, MIT
* expo-image-loader (/expo/modules/imageloader): Utility, MIT
* expo-keep-awake (/expo/modules/keepawake): Utility, MIT
* expo-permissions (/expo/modules/permissions): Utility, MIT
* expo-screen-orientation (/expo/modules/screenorientation): Utility, MIT
* expo-splash-screen (/expo/modules/splashscreen): Utility, MIT
* expo-sqlite (/expo/modules/sqlite): Utility, MIT
* expo-web-browser (/expo/modules/webbrowser): Utility, MIT
* Smart Location Library (/io/nlopez/smartlocation): Utility, MIT
* JavaX Dependency Injection (/javax/inject): Utility, Apache-2.0
* Kotlin (/kotlin): Utility, Apache-2.0
* kotlinx.coroutines (/kotlinx/coroutines): Utility, Apache-2.0
* ShortcutBadger (/me/leolin/shortcutbadger): UI Component, Apache-2.0
* AppAuth for Android (/net/openid/appauth): Utility, Apache-2.0
* Bouncy Castle (/org/bouncycastle): Utility, MIT
* react-native-unimodules (/org/unimodules): Utility, MIT

Offending libs:
---------------
* Amplitude Android SDK (/com/amplitude): Tracking
* Play Install Referrer Library (/com/android/installreferrer): NonFreeDep,NonFreeNet,Tracking
* Facebook SDK for Android (/com/facebook): NonFreeDep,Tracking
* Facebook Ads (/com/facebook/ads): Ads
* Facebook Analytics (/com/facebook/appevents): Tracking
* Google Ads (/com/google/ads): Ads
* Firebase Data Transport (/com/google/android/datatransport): NonFreeNet
* Google Analytics (/com/google/android/gms/analytics): NonFreeDep,Tracking
* Google Fit (/com/google/android/gms/fitness): NonFreeDep
* Google Maps API (/com/google/android/gms/maps): NonFreeDep,NonFreeNet
* Android Vision (/com/google/android/gms/vision): NonFreeDep
* Google Mobile Services (/com/google/android/gms): NonFreeDep
* Google Play Core (/com/google/android/play/core): NonFreeNet,NonFreeDep
* Firebase (/com/google/firebase): NonFreeNet,NonFreeDep
* Firebase Analytics (/com/google/firebase/analytics): Tracking
* Maps SDK for Android (/com/google/maps/android): NonFreeNet
* Segment (/com/segment/analytics): Tracking

17 offenders.

Bei keiner der Trackingbibliotheken konnten wir einen Vorteil für die User*innen erkennen. Aus welcher Motivation die Bibliotheken eingebunden wurden ließe sich nur vermuten. Allerdings ist durch das Vorhandensein der Tracker noch nicht erwiesen, dass sie auch aktiv sind und Informationen die User*innen an Dritte weitergeben.

Facebook

Die App sendet unseren Beobachtungen nach regelmäßig Trackinginformationen über das genutzte Handy und die User*innen an Facebook.

Technische Details

mitmproxy-weboberfläche mit regelmäßigen Requests an die apis der TU-Chemnitz und Facebook

Die App sendet alle 30 Sekunden ein POST-Request an https://www.facebook.com/adnw_sync2 mit exakten Informationen über das System und die Appversion im Header sowie beispielsweise folgenden Daten im Body:

payload: {
    "request": {
        "bidder_token_info": "fill",
        "feature_config": "fill",
        "prefetch_urls": "fill"
    },
    "bundles": {},
    "context": {
        "COPPA": "false",
        "APPBUILD": "17",
        "ID_CACHE_TS_MS": "-1",
        "KG_RESTRICTED": "false",
        "CAPPED_IDS": "[]",
        "VALPARAMS": "{
			\"is_emu\": \"true\",
			\"apk_size\": \"23587469\",
			\"timezone_offset\": \"3600000\",
			\"app_started_reason\": \"LAUNCHER_FOUND_API21\",
			\"is_debuggable\": \"false\",
			\"debug_value\": \"N\\/A\",
			\"build_type\": \"N\\/A\"
		}",
        "UNITY": "false",
        "ACCESSIBILITY_ENABLED": "false",
        "APPNAME": "HTWK Leipzig",
        "HAS_EXOPLAYER": "true",
        "AFP": [GESTRICHEN],
        "SESSION_TIME": "1652369024.740",
        "PLACEMENT_ID": "",
        "MAKE": "Google",
        "REQUEST_TIME": "1652369024.762",
        "CARRIER": "Android",
        "SDK_CAPABILITY": "[3,4,5,7,11,16,17,18]",
        "TEMPLATE_ID": "0",
        "CLIENT_REQUEST_ID": [GESTRICHEN],
        "DENSITY": "3.5",
        "AD_REPORTING_CONFIG_LAST_UPDATE_TIME": "0",
        "SCREEN_HEIGHT": "771",
        "SDK_VERSION": "6.3.0",
        "SCREEN_WIDTH": "411",
        "ID_SOURCE": "NO_GMS",
        "SDK": "android",
        "OSVERS": "9",
        "OS": "Android",
        "ANALOG": "{	
			\"charging\":\"0\",
			\"available_memory\":\"825855268\",
			\"total_memory\":\"1565986626\",
			\"battery\":\"100.0\",
			\"free_space\":\"234569823\"
		}",
        "DATA_PROCESSING_OPTIONS": "null",
        "ROOTED": "2",
        "MODEL": "AOSP on IA Emulator",
        "FUNNEL_CORE_EVENTS": "4101,4146,4127,4106,4123,4104,4411,4412,4410",
        "FUNNEL_LOGGED": "false",
        "BUNDLE": "de.leipzig.htwk.app",
        "ASHAS": [GESTRICHEN],
        "LOCALE": "en_US",
        "NETWORK_TYPE": "1",
        "IDFA": "",
        "ATTRIBUTION_ID": "",
        "APPVERS": "1.0.2",
        "DATA_PROCESSING_OPTIONS_COUNTRY": "null",
        "INSTALLER": "com.aurora.store",
        "DATA_PROCESSING_OPTIONS_STATE": "null",
        "IDFA_FLAG": "0",
        "SESSION_ID": [GESTRICHEN]
    }
}

Auffällig dabei ist das Verpacken von (unserialisierten) Json-Strings als Werte der Attribute VALPARAMS und ANALOG.

HTWK-App Datenschutzerklärung

Die ausgeleiteten Daten umfassen unter anderem Informationen über:

  • die Hardware (Modell, Speicher, Akkuladestand, Bildschirmgröße, Internetverbindung, …)
  • das Betriebssystem (Androidversion, Zeitzone, Sprache, Barrierefreiheit angeschaltet, …)
  • die App (Version, App-Store, wieso die App gestartet wurde, …)

Damit könnte Facebook durch die HTWK-App genug Informationen erhalten, um dem Konzern eine eindeutige Identifizierung des/der User*in (durch Fingerprinting) zu ermöglichen, sowie ihn/sie über mehrere Apps und Systeme hinweg zu verfolgen.

Die Übersendung der Daten steht im klaren Widerspruch zu den Datenschutzinformationen der HTWK-App, die behaupten “Unsere App setzt keine Cookies oder Trackingverfahren ein.”

Matomo/piwik

Beim Aufrufen verschiedener Fenster der App werden Daten an die Trackingsoftware piwik der HTWK gesandt. Dies geschieht ohne vorherige Aufklärung oder Einverständniserklärung des/der User*in. Die Überwachung wird unter anderem durch das Anzeigen der Datenschutzerklärung aktiviert, in denen behauptet wird, dass kein Tracking stattfände.

Vermutlich lassen sich die Anfragen darauf zurückführen, dass verschiedene Fenster der App tatsächlich Inhalte von der HTWK-Website abrufen. In der Datenschutzerklärung der Website wird Matomo erwähnt, jedoch ist die dort genannte Widerspruchsmöglichkeit des Opt-Out-Cookies in der App nicht umsetzbar.

AWS

Bei jedem App-Start wird das HTWK-Logo vom Amazon Web Services Content-Delivery-Network bei cloudfront.net abgefragt. Dabei werden Informationen über das Betriebssystem übermittelt. Eine einfache Alternative wäre das Speichern des Bildes als Teil der App gewesen. Verglichen damit ist die derzeitige Lösung unsauber und insbesondere nicht datensparsam.

Zudem wird beim Start der App die URL https://exp.host/status angefragt, welche sich ebenfalls mit AWS in Verbindung bringen lässt.

Die Domains der authoritariven Nameserver von exp.host sind regestriert auf Namen verschiedener Amazon-Firmen.

Zusammenfassung und Bewertung

Meme: "Freie Software mit Studierendenbeteiligung" wird abgelehnt, "Properitäre Software mit Studierendentracking" wird angenommen

Die HTWK-App nutzt Tracking um Informationen über die Nutzer*innen zu sammeln und weiterzugeben. All dies geschieht ohne Widerspruchsmöglichkeit für die User*innen.

Das Tracking mit einer wahrheitswidrigen Datenschutzerklärung ist eindeutig verwerflich und illegal. Dabei ist der nachgewiesene Umfang beim Facebook-Tracking besonders frappierend.

Für uns liegt die Ursache dieses Datenschutz-Totalschaden in einer offenkundig mangelnden Sensibilität für das Thema seitens der Hochschule. Als Konsequenz fordern wir im ersten Schritt eine Entfernung aller Tracker aus der HTWK-Software anstatt lediglich die Datenschutzbedingungen der App anzupassen. Um eine Wiederholung des Vorfalls zu verhindern, fordern wir zudem eine Offenlegung der gesamten Codebasis der HTWK Leipzig und der BPS GmbH. Dies würde die Überprüfbarkeit der durch die Student*innen genutzten Software wesentlich erhöhen und Partizipation ermöglichen. Darüber hinaus ist eine Offenlegung auch grundsätzlich ein Zeichen einer modernen Informationspolitik einer wissenschaftlichen Einrichtung: Public Money, Public Code!

Zuletzt hoffen wir auf einen konstruktiven Umgang der Verantwortlichen mit der Kritik und klare Schritten in Richtung Transparenz und Datenschutz.


Update 16.05.

Aktualisierte Datenschutzerklärung der HTWK-App

Die Hochschule hat auf unsere Meldung reagiert und eine neue App-Version 1.0.4 (Play-Store 1.0.12) veröffentlicht, in der die Anzahl der Tracking-Bibliotheken stark reduziert wurde. Die App ist infolge dessen um ca. 40% der ursprünglichen Größe geschrumpft. Wir können keinen kritischen Datenverkehr mehr auf die App zurückführen.

Zudem wurden die Nutzer*innen in einer Mitteilung über die Vorfälle informiert und die Datenschutzinformationen angepasst, um den aktuellen Stand der Erkenntnis zu reflektieren. Wir erlauben uns an dieser Stelle, auf die Lizenz unserer Inhalte zu verweisen.

Wir freuen uns über die schnelle Reaktion der Hochschule und hoffen auf eine baldige Veröffentlichung des Quellcodes.


Wir freuen uns über Fragen und Kritik an unsere E-Mail Adresse. Sollten uns Fehler unterlaufen sein bitten wir ebenfalls um Benachrichtigung, so dass wir diese im Text richtigstellen können.