Klimafreundlicher als Verbrenner sind Elektroautos durch die zunehmende Verbesserung des Strommixes fast immer, beim Datenschutz stehen sie dagegen fast immer schlechter da: Man kann schließlich nur sehr selten mit Bargeld laden. An einer Aufzeichnung der genutzten Ladesäulen für eine Abrechnung kommt man also nicht vorbei. Aber bei der Verwendung von den beliebten Ladeapps fühlt man sich auch darüber hinaus schnell überwacht: Wer erhält da alles Daten von meiner Reise? In diesem Test wollen wir uns den Datenverkehr von fast alle relevanten Ladeapps mal anschauen. Die gute Nachricht: Man braucht die Apps nicht unbedingt und es gibt Lösungen, die sowohl günstig als auch datenschutzfreundlich sind. Der Test hat sich aus technischen Gründen auf Android-Apps beschränkt, aber vieles davon lässt sich auf iOS übertragen.
Kapitelübersicht
1. Fazit und Empfehlung: So lädst du datenschutzfreundlich
2. Firebase, Analytics, Werbetracking – wie schlimm ist das?
3. Übersicht über alle Testergebnisse
4. Was man gegen das Tracking tun kann
5. Alle Kurztests inklusive Beispiele der übertragenen Daten
1. Empfehlung und Fazit: So lädst du datenschutzfreundlich
Die Welt der Ladeanbieter ist kompliziert: Die einen bieten Plastikkarten zum Laden an, die anderen funktionieren nur über die App. Die einen haben einen festen Preis, die anderen einen variablen Preise je nach Ladesäule. Das alles mit dem Datenschutz zusammenzubringen, kann überfordern.
Für alle, die gerade in die Welt der Elektroautos einsteigen, habe ich die Testergebnisse hier in eine einfache Praxisempfehlung zusammengefasst: Such dir aus diesen vier verschiedenen Kategorien 2-3 Anbieter heraus. Damit hast du ein datenschutzfreundliches Setup, das nicht teuer ist und mit dem du fast überall laden kannst.
1. Ladekarte von einem lokalen Energieversorger: Wenn der Ladepreis eine große Rolle spielt, such dir einen günstigen Anbieter aus diesen drei regionalen Verbünden. Am ehesten findest du etwas in dieser nach Postleitzahlen sortierten Liste der 250 internen Roaming-Partner von Ladenetz.de – das ist der größte Verbund der lokalen Energieversorger. Vereinzelt findet man Schnäppchen ab 0,38 € AC (Langsamladung) und 0,48€ DC (Schnelladung). Je nach Wohnort ist vielleicht auch einer der 68 Partner aus dem Ladeverbund+ oder das sehr kleine Tank-E-Netzwerk interessanter. Vor allem für die Laternenparker, die nicht mit eigenem Strom laden können, kann eine günstige Karte für die eigene Region viel Geld sparen. Daher lohnt es sich, hier ein bisschen Zeit zu investieren, um die zahlreichen Angebote zu prüfen: Möglicherweise hat der Energie-Anbieter bei dir vor Ort einen Sonderpreis für seine eigenen Ladesäulen. Oder du findest einen Anbieter aus einer anderen Region, der sehr günstig ist, aber auch Kunden ohne Stromvertrag oder Wohnsitz in seinem Gebiet annimmt. Das kann allerdings auch manchmal Probleme geben, wenn du dann damit vorwiegend teuer im Ausland lädst. Die direkten Apps der drei Anbieter braucht man nicht unbedingt, aber sie sind einwandfrei (Kurztests: Ladenetz, Ladeverbund, Tanke-E). Ladeverbund+ und TankeE kann man auch ohne Google Play Services ohne Einschränkung nutzen, wenn man sie über Aurora bezieht. Du kannst aber auch alle drei Ladesäulenkarten einfach im Browser öffnen und mit einem Shortcut auf den Startbildschirm deines Smartphones legen: Ladenetz-Karte, Ladeverbund+-Webapp und TankE-Webapp. Ein sehr günstiger Anbieter, den man auch noch in diese Kategorie zählen könnte, ist Aldi Süd: Hier kann man direkt mit Giro- oder Kreditkarte zum Festpreis Strom tanken (aktuell 0,29€ für AC-Stationen und 0,39€ für AC/DC-Stationen). Anders als bei Lidl geht das ohne Einkauf und ohne App. Ladesäulen findet man einfach über die Browser-Karte, es gibt gar keine App.
2. Ein Universalanbieter mit Festpreis und großer Abdeckung: Den brauchst du, denn vom kleinen lokalen Stadtwerk bekommst du zwar eventuell eine günstige Karte vor Ort, aber mit den maximal 100.000 Ladesäulen in Europa kann es in manchen Situationen oder im Urlaub knapp werden. Eine App oder Ladekarte, die bei großer europaweiter Abdeckung einen immer noch guten Preis bietet, ist die optimale Ergänzung. Hier eine Übersicht über die großen Festpreis-Anbieter, die ich aus Datenschutzperspektive empfehle. Vor allem Personen mit eigener Lademöglichkeit dürften auch nur mit einer dieser Karten froh werden.
Anbieter | Abdeckung Europa |
AC €/kwh | DC €/kwh | Monats- gebühr? |
Empfehlung |
---|---|---|---|---|---|
EWE Go App Website Kurztest |
400.000 | 0,59 € | 0,64 € | nein | App oder Ladekarte (nur via App bestellbar) |
Lichtblick Website Kurztest |
200.000 | 0,55 € 0,44 €¹ |
0,75 0,54 €¹ |
nein | nur Ladekarte |
Maingau Energie Website Kurztest |
410.000 | 0,54 € 0,69 €² 0,49 €¹ |
0,64 € 0,79 €² 0,59 €¹ |
nein | nur Ladekarte |
ODR MobilityMe (EnBW) Website Kurztest |
400.000 | 0,55 € | 0,68 € | 4,99 € | App (mit Tricks) oder Ladekarte |
¹ Preis exklusiv für Energiekunden
² Preis für europäisches Ausland
3. EV-Map: Ich verwende sehr gerne diese Open-Source-App (Website | Kurztest) für die Ladesäulensuche. Der Vorteil: Du kannst dir Filter für deine Ladekarten- und Ladeapps erstellen, die du besitzt und schnell zwischen den Anbietern umschalten. Außerdem kannst du so auch schnell über den integrierten Dienst von chargeprice.app die Preise an einer Säule vergleichen, so dass du im Zweifel dort auch mit der richtigen Ladeapp oder Ladekarte lädst. Der Nachteil: Die Ladesäulen stammen entweder von der Community der altehrwürdigen Website goingelectric.de. Dann hat man oft Fotos und die Möglichkeit, nach Ladekarten (nicht nur nach den Netzwerken dahinter) zu filtern. Die andere Option sind die Daten des Projekts openchargemap.org: damit gibt’s dann keinen Ladekarten-Filter (weil die Zuordnung von Ladekarten zu Netzwerken mühsame Pflege und Hintergrundwissen erfordert). Aber dafür ist die Openchargemap-Quelle dann bei Ländern mit offiziellen Verzeichnissen (z.B. Deutschland und Frankreich) komplett. Auf der Website gibt es eine Liste der Datenquellen. Ich verwende daher standardmäßig goingelectric.de als Quelle und nutze nur im Notfall openchargemap.org, weil man dort nicht erfährt, welche seiner Ladekarten man an einer Säule nutzen kann.
Im Prinzip kannst du auch nur diese App zum Suchen dabei haben und zum Bezahlen dann Ladekarten aus Plastik. EV-Map kannst du bei F-Droid oder im Play Store finden, mit leicht unterschiedlichem Aufbau. Alternativen dazu sind die App Moovility (Website | Kurztest), die auch gut abgeschnitten hat oder die Webseite chargeprice.app. Für Deutschland gibt es außerdem eine hochoffizielle Browser-Karte der Bundesnetzagentur mit allen Ladesäulen. Diese Karte ist die umfangreichste von allen. Einen etwas anderen Datenbestand haben die Karten auf Basis von Openstreetmap: Hier sind auch viele (aber bei weitem nicht alle) Ladesäulen eingetragen. Auf Android nutzte ich das am liebsten über Osmand.
4. Anbieter mit variablen Preisen: Es gibt einige Anbieter, die variable Preise bieten. Die brauchst du im Normalfall nicht, aber sie können für folgende Situationen nützlich sein:
Per App kommt aus Datenschutzgründen eigentlich nur Bosch Charge My EV (Website | Kurztest) in Frage. Die Preise sind eher hoch. Mit 500.000 Ladepunkten in Europa ist es aber eine empfehlenswerte Notfallvariante, mit der du in schlecht ausgebauten Regionen wie Rumänien mit einer tadellosen App vielleicht doch noch eine Ladesäule in der Nähe findest. Auch für die wenigen Ladesäulen, die keine RFID-Funktion haben, ist das eine Notfalloption. Wirelane bringt als dritte Option nicht viel, weil es vermutlich identisch mit dem Netzwerk ist, dass du mit einer Karte von deinem lokalen Energieversorger abdeckst. Die Bosch-App funktioniert aber nicht für alternative Androids ohne Google Play Services.
Nur per RFID-Plastikkarte lassen sich drei weitere Anbieter aus diesem Segment datenschutzfreundlich nutzen. Und zwar, weil sie eine Ladesäulen-Map für den Browser anbieten. Die brauchst du ja, um vor dem Laden die Preise zu prüfen. Diese Kombi aus RFID-Karte und Browser-Map gibt es bei Chargemap, Chargenow und Freshmile. Preislich machen die drei vor allem bei Langsamladesäulen im Ausland Sinn, man kann dort manchmal für um die 0,35€ bis 0,45€/kwh laden. Bei dem Prepaid-Anbieter Freshmile muss man etwas rechnen (kwh-Preis + Minutenpreis) und bei Chargenow braucht man erst einen Login, bevor man die Preise online checken kann.
Und der wichtigste Tipp zum Schluss: Vielleicht geht es ja auch ganz ohne Auto. Das ist am umweltfreundlichsten und dann brauchst du auch keine Ladeapp!
2. Firebase, Analytics, Werbetracking - ist das schlimm?
In den Tests haben die meisten Anbieter Google Firebase oder ein Analysetool installiert, einige auch Werbetracking. Hier eine kurze Einführung, welche Datenschutzprobleme daraus entstehen:
Google Firebase ist ein Paket aus mehrere Tools, das die Bereitstellung und Entwicklung von Apps erleichtert. Manche Dienste wie das Cloud Messaging stellen Funktionen für den Betrieb bereit, andere liefern im Hintergrund Daten für die Entwickler. Wenn es hier im Test um Firebase geht, dann ist fast immer Firebase Crashlytics gemeint. Dieser Dienst registriert die Installation der App mit einer ID. Wenn die App abstürzt, kann das Google Android Betriebssystem die herumliegenden Datenreste der App zusammensammeln und an Google versenden. Von dort kann sie das Unternehmen, das die App entwickelt, dann abrufen und auswerten. Im Prinzip ist das eine gute Idee, aber man muss eben Google und dem Unternehmen vertrauen, dass sowohl die IDs als auch die gesammelten Daten nicht in falsche Hände gelangen. Für Missbrauch der Daten gibt es keine Beweise, aber es liegt nahe, dass Google die Installationsereignisse auch für Marketing verwenden könnte. Eine entsprechende Klage in Sachen Firebase gegen Google läuft bereits in den USA. Solange das Tool und seine Verwendung im Dunkeln liegt, mag es viele nicht stören, während andere gerade deshalb ein ungutes Überwachungsgefühl durch die Meldung der Installation und die mögliche, nicht kontrollierbare Datenübertragung an Google empfinden. Einer rechtlichen Prüfung hält das Tool vermutlich nicht stand, nach den Kriterien der DSK müsste Firebase für den technischen Betrieb absolut notwendig oder erwünscht sein, damit es ohne Einwilligung installiert werden kann. Beides lässt sich kaum konstruieren, da das Tool ja weder für die Nutzenden als Absturzsammler erkennbar geschweige denn gewünscht ist noch für den Betrieb der aktuellen Softwareversion benötigt wird. Mit der Variante eines optionalen öffentlichen Betatests steht zudem eine datenschutzfreundliche Alternative zur Verfügung.
Die eingesetzten Analysetools (wie Mixpanel, Launchdarkly oder Firebase Analytics) dürften aus genau dem gleichen Grund ohne Einwilligung nicht zulässig sein, wenn man mal von Randmeinungen absieht. Die herrschende rechtliche Bewertung in Deutschland habe ich sehr umfangreich vor allem in Teil 2 meiner Artikelserie zum TTDS-Gesetz beleuchtet, welches für Analysesoftware viel entscheidender ist als die Datenschutz-Grundverordnung. Die realen Schäden dürften bei Ladeapps relativ gering sein, Verhaltensdaten können aber immer zu einer Manipulation führen und zum Beispiel in teure Abos treiben (weiterführend dazu mein Kommentar: Es gibt kein Grundrecht auf Analyse). Im Kern geht es in diesem Kontext aber eher wieder um das Gefühl, dass einem ständig eine angestellte Person des Unternehmens beim Suchen von Ladesäulen und der Bedienung der App über die Schulter schaut. Alle Analysetools sind pseudonym, das heißt das Verhalten wird in dauerhaft trennbaren Profilen aufgezeichnet und kann oft auch einzeln betrachtet werden – bis hin zum Abspielen einzelner Sitzungen und den ausgeführten Klicks. Die Daten sind oft wesentlich ausführlicher als die Statistiken, die Energieunternehmen allein durch die Abrechnungsdaten erstellen können (wer lädt wann und wie lange an welchen Säulen). Andererseits enthalten sie aber eben auch nur technische Benutzungsdaten wie angeklickte Buttons und keine Ortsdaten. Die Zusammenführung der Analysedaten mit realen, persönlichen Daten oder der Ladehistorie kann durch die meisten Tools nicht standardmäßig durchgeführt werden, technisch ist das mit etwas Zusatzaufwand möglich, man müsste aber zunächst gemeinsame IDs für beide Datenbanken etablieren. Nur in der App Bonnet sind mir im Test solche zusammengeknüpften IDs aufgefallen (dort mehr dazu), sonst nicht.
Anders sieht es wiederum bei dem aus, was ich im Test unter Werbetracking zusammengefasst habe. Diese Tools sind dafür ausgelegt, Verhaltensdaten auch auf anderen Plattformen einzubeziehen und Personen mit einem bestimmten Verhalten zu Marketingzielgruppen zusammenzufassen. Dafür werden nicht selten Handynummer oder E-Mail-Adresse in eine ID umgewandelt, die auch auf anderen Plattformen erkannt wird. So kann es dann durchaus vorkommen, dass man nach dem Ladevorgang bei Twitter oder Facebook plötzliche Werbung für den gleichen Ladeanbieter oder anderen Firmen der gleichen Branche zu sehen bekommt. Diese Daten werden auch umfangreich getauscht, vermietet oder gehandelt, so dass man keine Kontrolle mehr ausüben kann. Diese Variante wäre in jedem Fall einwilligungspflichtig, wobei in vielen Fällen auch mit Einwilligung die DSGVO gebrochen wird, weil zum Beispiel Informations- und Löschpflichten nicht ordentlich ausgeführt werden. Da die Marketingdaten auch für die Verhaltensmanipulation verwendet werden, kann man hier auch von einem größeren realen Schaden ausgehen – man wird für Jahre mit seinen Interessen wie Fahrzeugmarke oder Ladehäufigkeit ansprechbar. Im Unterschied zu werbefinanzierten Diensten hat man hier noch nicht einmal etwas davon.
3. Übersicht über alle Ergebnisse
Den Datenverkehr von insgesamt 41 Ladeapps habe ich unter die Lupe genommen – hier findest du einen Überblick und weiter unten dann die einzelnen Testergebnisse. Dass Apps im Normalfall nicht datenschutzkonform sind und die Behörden keine Bußgelder vergeben, ist in den letzten Jahren leider klar geworden (5 Jahre DSGVO: Mangelhafte Durchsetzung auch in Deutschland). Die vielen problematischen Ergebnisse überraschen also nicht.
Legende
Bezeichner | Beschreibung |
---|---|
⭐ | Wird nicht eingesetzt |
😠 | Aktiv, aber deaktivierbar |
😡 | Wird eingesetzt |
¹ Keine Bezahlfunktion integriert, Ladekarte, App oder Bankkarte zusätzlich notwendig.
Testüberblick
Alle Apps wurden ohne Einwilligung bzw. mit abgelehnter Einwiligung getest.
Name | Google Firebase | Analyse- tracking |
Werbe- tracking |
Karte | SaaS | Hoster |
---|---|---|---|---|---|---|
ADAC/EnBW | 😡 | 😡 | ⭐ | Google Maps | Microsoft Azure | 🇺🇸 Microsoft Azure |
Aral Fuel & Charge | 😡 | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Amazon |
Be Charge | 😡 | 😡 | ⭐ | Google Maps | – | 🇺🇸 Amazon |
My BMW | 😡 | 😡 | ⭐ | Google Maps | Countly | 🇺🇸 Microsoft |
Bonnet | 😡 | 😡 | 😡 | ? | – | 🇺🇸 Amazon |
Bosch Charge My EV | ⭐ | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Amazon |
Chargemap | 😡 | 😡 | 😡 | Google Maps | – | 🇫🇷 Outscale |
Chargenow | ⭐ | 😡 | ⭐ | Google Maps | Microsoft | 🇺🇸 Microsoft |
DKV Mobility | ⭐ | ⭐ | ⭐ | Here | – | 🇺🇸 Akamai |
Easy Charging Quality (z.B. Entega) | 😡 | 😡 | ⭐ | Google Maps (Browser) | – | 🇳🇱 Interbox |
Name | Google Firebase | Analyse- tracking |
Werbe- tracking |
Karte | SaaS | Hoster |
eCharge+ | 😡 | ⭐ | ⭐ | Google Maps | Google Firebase | 🇺🇸 Amazon |
Electromaps | 😡 | 😡 | 😡 | Google Maps | Amazon Cognito | 🇺🇸 Amazon |
Elli Charging | 😡 | 😡 | ⭐ | Google Maps | – | |
elvah | 😡 | 😡 | ⭐ | Mapbox | Amazon | 🇺🇸 Amazon |
EnBW/ADAC | 😡 | 😡 | ⭐ | Google Maps | Microsoft Azure | 🇺🇸 Microsoft Azure |
Enel X | 😡 | 😡 | 😡 | Google Maps | – | 🇺🇸 Imperva |
E.ON Drive | 😡 | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Amazon |
EV Map (Play Store)¹ |
⭐ | ⭐ | ⭐ | Google Maps | – | – |
EV Map (F-Droid)¹ |
⭐ | ⭐ | ⭐ | Mapbox | – | – |
EWE Go | ⭐ | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Amazon |
Name | Google Firebase | Analyse- tracking |
Werbe- tracking |
Karte | SaaS | Hoster |
Freshmile | 😡 | ⭐ | ⭐ | Mapbox | – | 🇫🇷 Outscale |
Hyundai | ⭐ | 😡 | ⭐ | Google Maps | Microsoft | 🇺🇸 Microsoft |
Ionity | 😡 | 😡 | ⭐ | Google Maps | Amazon Cognito | 🇺🇸 Amazon |
Jucr | 😡 | 😡 | 😡 | ? | ? | 🇺🇸 Amazon |
ladenetz.de¹ | ⭐ | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Microsoft |
Ladeverbund+ | ⭐ | ⭐ | ⭐ | Google Maps (Browser) | – | 🇺🇸 Amazon |
Lichtblick Fahrstrom | 😡 | ? | ? | Google Maps | ? | ? |
Lidl Plus | 😡 | 😡 | 😡 | Google Maps | ? | 🇺🇸 Akamai |
Maingau Autostrom | 😡 | ⭐ | ⭐ | Mapbox | – | 🇺🇸 Amazon |
Mercedes Me | 😡 | 😡 | ⭐ | Here | – | 🇺🇸 Microsoft |
Name | Google Firebase | Analyse- tracking |
Werbe- tracking |
Karte | SaaS | Hoster |
Moovility¹ | ⭐ | ⭐ | ⭐ | Google Maps (Browser) | – | 🇩🇪 Hetzner |
Nextcharge | 😡 | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Hewlett Packard |
ODR mobilityME | 😠 | ⭐ | ⭐ | Google Maps | – | 🇺🇸 Amazon |
Plugshare¹ | 😡 | 😡 | 😡😡 | Google Maps | – | 🇺🇸 Amazon |
Plugsurfing | 😡 | ⭐ | 😡 | Google Maps | – | 🇺🇸 Amazon |
Renault | 😡 | 😡 | 😡 | Google Maps | SAP | 🇺🇸 Amazon |
TankE-Netzwerk | ⭐ | ⭐ | ⭐ | Google Maps (Browser) | – | 🇺🇸 Amazon |
Tesla | 😡 | 😡 | ⭐ | Google Maps | – | 🇺🇸 Amazon & Akamai |
Vattenfall InCharge | 😡 | 😡 | ⭐ | Google Maps | Microsoft Azure | 🇺🇸 Microsoft |
Virta | 😡 | 😡 | ⭐ | Google Maps | – | 🇺🇸 Amazon |
Wirelane | ⭐ | ⭐ | ⭐ | Google Maps | – | 🇩🇪 Hetzner |
Name | Google Firebase | Analyse- tracking |
Werbe- tracking |
Karte | SaaS | Hoster |
¹ Keine Bezahlfunktion integriert – Ladekarte, App oder Bankkarte zusätzlich notwendig.
4. Was man gegen das Tracking tun kann
Die Lieblingsapp hat Tracking? Das muss nicht sein. Vielfach hat sich einfach noch nicht herumgesprochen, dass die hier kritisierten Tools ohne Einwilligung rechtswidrig sind. Eine freundliche E-Mail und evtl. eine kritische Nachfrage einige Wochen später kann schon viel bewirken. Ansonsten kann man aber auch die Keule auspacken:
1. Mit einer formlosen Beschwerde an die je nach Impressumsanschrift zuständige Landes-Datenschutzbehörde kann man oft nach 6-12 Monaten ein Ergebnis erwarten. Dafür einfach auf die beobachteten Datenverbindungen in diesem Artikel hinweisen und zusätzlich mit der App PCAPDroid die kritisierten Verbindungen auf dem eigenen Smartphone belegen. Dafür muss man nicht den Verkehr entschlüsseln, wie ich es getan habe, sondern ein Screenshot, der die aufgerufenen Server wie beispielsweise firebaseinstallations.googleapis.com belegt, reicht schon aus. Wie man PCAPDroid einsetzt, habe ich hier erklärt: Verbindungen prüfen mit PCAPdroid. Bei Fragen gerne im Kuketz-Forum melden.
2. Wer über die Mittel und eine gute Rechtsanwältin oder einen guten Rechtsanwalt verfügt: Die Androhung einer Unterlassungsklage kann erheblich schneller zu einer Verbesserung führen, aber auch Kosten entstehen lassen.
3. Über Werbe- und Trackingblocker kann man sich auch technisch schützen, gerade bei Google Firebase könnte es aber zu Konflikten mit der App-Funktionalität kommen, da manchmal von dort auch Konfigurationsdaten geladen werden.
Suchst du mehr Infos zu Ladeapps und Preisen? Energieheld.de hat einen Preis-Vergleich – Ladekarten für Elektroautos und E-Tankstellen durchgeführt. Einen ausführlichen Test zu Ladeapps hat außerdem die Stiftung Warentest veröffentlicht, wobei meiner Meinung nach beim Prüfpunkt Datenschutz wenig paxisnahe Kriterien wie Mängel in der Datenschutzerklärung herangezogen wurden. Ladenetz ist die einzige App, die ich aus dem Testfeld des Artikels empfehlen kann. Sie erhielt dort den siebten Platz und bei der Benutzerfreundlichkeit leider nur ein „ausreichend“.
3. Die Kurztests im Detail
Die vielen Tests konnte ich nur mit einer oberflächlichen Einordnung und Bewertung durchführen. Das heißt, ich konnte den gefundenen IDs nicht immer mir viel Sorgfalt nachgehen, sondern habe oft nur aus meiner Erfahrung bewertet, für was die Verbindung da sein könnte und ob eine ID personenbeziehbar sein könnte.
- ADAC e-Charge & EnBW mobility+
- Aral Fuel & Charge
- Be Charge
- BMW (My BMW)
- Bonnet
- Bosch Charge My EV
- Chargemap
- Chargenow
- DKV Mobility
- Easy Charging Quality (z.B. Entega)
- eCharge+
- Electromaps
- Elli Charging
- elvah
- EnBW mobility+ & ADAC e-Charge
- Enel X Way
- E.ON Drive
- EV Map
- EWE Go
- Freshmile
- Hyundai (Charge myHyundai)
- Ionity
- Jucr
- ladenetz.de
- Ladeverbund+
- Lichtblick Fahrstrom
- Lidl Plus
- Maingau Autostrom
- Mercedes Me
- Moovility
- Nextcharge
- ODR mobilityME
- Plugshare
- Plugsurfing
- Renault (My Renault)
- Shell Recharge
- Tesla
- TankE-Netzwerk
- Vattenfall InCharge
- Virta
- Wirelane
EnBW/ADAC
Eine der beliebtesten Ladeapps ist mobility+ von EnBW. Das liegt daran, dass man ein wirklich großes Netz von 400.000 Ladepunkten in 17 Ländern Europas geboten bekommt. Außerdem kann man die App im Rahmen einer ADAC-Mitgliedschaft auch mit vergünstigten Preisen einsetzen (ADAC e-Charge).
Direkt nach dem Start:
[1] Google Firebase
POST https://firebaseinstallations.googleapis.com/v1/projects/enbw-mobilityplus/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.enbw.ev x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 6354A322A1A157BD38190F451031613421A07213 x-goog-api-key: AIzaSyBj5wi2_wN7f-N9nY9JFZDghYwvRKEZmuo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 { „appId“: „1:481460993887:android:7ab7c042e8403e39“, „authVersion“: „FIS_v2“, „fid“: „fhyMdxgcTUmEv5qjq8F6zI“, „sdkVersion“: „a:17.1.0“ }
Wenn man sich anschließend gegen das Tracking entscheidet („Auswahl speichern“), werden Verbindungen zu folgenden Diensten aufgebaut:
[2] Google Maps (Verbindung konnte nicht entschlüsselt werden)
[3] Microsoft Azure Cloud, wo ein Teil der Appfunktionalität offenbar von EnBW gehostet wird.
GET https://enbw-emp.azure-api.net/skinning/api/v1/partner?&partnerKey=ENBW HTTP/1.1 Accept: application/json Ocp-Apim-Subscription-Key: c7097f4712dd4c20aae95ff6ad95d171 Accept-Language: de platform: Android appVersion: 8.3.0 (build 217) osVersion: 30 versionCode: 217 deviceModel: SM-G900F Cookie: ARRAffinitySameSite=78573bd266cd96f01cdb67a787db49fa16bcbe38547dd180b7f44ec92c953b2e;Path=/;HttpOnly;SameSite=None;Secure;Domain=ev-backend.azurewebsites.net Host: enbw-emp.azure-api.net Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.10.0 partnerKey: ENBW
[4] Medallia, ein Dienstleister für personalisierte Angebote. Bei den Verbindungen zu der dazugehörigen Domain thunderhead.com konnte ich auf die Schnelle keine installationsbezogene ID erkennen, der SiteKey bleibt nach Neuinstallation identisch. In der Datenschutzerklärung der „mobbility+“-App wird allerdings behauptet, dass Thunderhead eine gerätebezogene ID erhält.
GET https://eu2.thunderhead.com/one/rt/js/interaction-map?siteKey=ONE-FUMS5P3O9U-1772&uri=android%3A%2F%2Femobility HTTP/2.0 datamimetype: application/json if-none-match: „ONE-FUMS5P3O9U-1772-1193528-0-52917122“ accept-encoding: gzip user-agent: okhttp/4.10.0 siteKey: ONE-FUMS5P3O9U-1772 uri: android://emobility
[5] Airship. Der Personalisierungsdienstleister wird unter der Domain asnapieu.com häufig kontaktiert.
POST https://remote-data.asnapieu.com/api/remote-data/deferred/4N72E5WbTaK9njcKuwGLFQ/android/1d692072-2863-4434-bfef-cc7e0b8bba3f?language=de&country=DE&sdk_version=16.8.0&ts=1689142429466 HTTP/1.1 Content-Type: application/json Authorization: Bearer eyJhbGciOiJIUzM4NCJ9.eyJhdWQiOiI0TjcyRTVXYlRhSzluamNLdXdHTEZRIiwiaWF0IjoxNjg5MjU3MTQwLCJleHAiOjE2ODkyNjA3NDAsInN1YiI6IjBmZjk0ZTRmLTRmYzEtNDlmMS1iMTI1LTNhNTVhYWNjNzI3MCIsInVhLXNjcCI6ImxlZ2FjeV9jaGFubmVsIn0.0k2w9zLr8mn9iZw8GMrSeyiH9YY7Z1ehFM2A10FTuQ-1YHDVr4hJlsTvGbbEHS7S Accept: application/vnd.urbanairship+json; version=3; X-UA-App-Key: 4N72E5WbTaK9njcKuwGLFQ User-Agent: (UrbanAirshipLib-android/16.8.0; 4N72E5WbTaK9njcKuwGLFQ) Host: remote-data.asnapieu.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 297 { „channel_id“: „0ff94e4f-4fc1-49f1-b125-3a55aacc7270“, „platform“: „android“, „state_overrides“: { „app_version“: „8.3.0“, „locale_country“: „DE“, „locale_language“: „de“, „notification_opt_in“: false, „sdk_version“: „16.8.0“ }, „tag_overrides“: [ { „set“: { „device“: [] } } ], „trigger“: { „goal“: 1, „type“: „active_session“ } }
Die Channel ID von Airship ändert sich bei jeder Installation. Nutzt ein User zusätzlich auch andere Channels (z.B. ein zweites Smartphone), dann kann Airship das Verhalten innerhalb mehrerer verschiedener Channels einem User zurordnen. Daher dürfte die ID nach TTDSG § 25 eigentlich nicht ohne Einwilligung aus dem Gerät gelesen werden. „Channels represent the various devices, users, and addresses that make up your audience. Channels are a concept fundamental to Airship; understanding the various applications of channels can help you better understand and target your audience.“
Airship fehlt außerdem in der Datenschutzerklärung der „mobbility+“-App.
Fazit EnBW: Die App zeichnet Nutzerverhalten mit personenbezogenen IDs für die Personalisierung auf und sendet Analysedaten an verschiedene Drittanbieter. Die rechtlichen Rahmenbedingungen werden dabei nicht eingehalten. Die Datenschutzerklärung klärt außerdem nicht über alle Datenübertragungen auf. Ich würde die App nicht nutzen. Wer wirklich unbedingt mit EnBW oder ADAC laden möchte, kann aber die App einmalig installieren (ohne Google Play Store geht das mit dem Aurora Store), ein Konto (idealerweise mit einer dafür angelegten E-Mail-Adresse) anlegen, eine Zahlungsmethode zum Beispiel per Lastschrift eintragen und die Ladekarte aus Plastik bestellen. Danach kann man die App wieder löschen. Das funktioniert problemlos und die Datenschutzproblematik ist zu vernachlässigen, da die generierten IDs für alle Tracker installationsbezogen sind und so keine Verbindung zu anderen Datenpunkten hergestellt werden kann. Die Abrechnung der Ladevorgänge kommt dann monatlich per E-Mail. Die Suche nach Ladepunkten kann man dann am besten mit EV Map erledigen. Die offizielle Browser-Ladekarte von EnBW ist nur für einen groben Überblick geeignet, da man weder Orte suchen noch nach Schnell- und Langsamladern filtern kann.
Aral Fuel & Charge
Die Aral Fuel & Charge App ist wohl vor allem für Dienstwagen und Firmenflotten gedacht. Ich habe die App nur kurz ohne Login genutzt, hinzu kamen Entschlüsselungsprobleme.
Die Verbindungen:
[1] Google Firebase war dennoch gleich zu Beginn der App sichtbar.
POST https://firebaseinstallations.googleapis.com/v1/projects/composed-arbor-150510/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.trafineo.aral x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 86A51EE8401994FE0A77B5A664F67B4715BBBB82 x-goog-api-key: AIzaSyDfiUNeeH73w6zhsvVsEy2ytrjkwkt4EYo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:596825424792:android:072a836b08aaccf42da1ed“, „authVersion“: „FIS_v2“, „fid“: „fUwNXohyQe2cq0maWEUecB“, „sdkVersion“: „a:17.0.1“ }
[2] Trafineo ist der App-Partner von Aral, der die App auf einem Amazon-Server betreibt.
GET https://appservices.trafineo.com/v6/versioning/android HTTP/2.0 authorization: Bearer user-agent: Android/11/SM-G900F/aral/3.4.0/ accept-encoding: gzip No content
[3] Google Maps, die Verbindung konnte nicht entschlüsselt werden.
Fazit: Auch wenn es bei meiner Analyse Probleme mit der Entschlüsselung gab, konnte ich alle aufgebauten Verbindungen der App interpretieren. Außer Google Firebase, Google Maps und dem Appserver fanden sich keine Verbindungen, was schon einigermaßen gut ist. Die App kann man daher benutzen, ohne sich rundum analysiert zu fühlen. Mit einer Installationsmeldung und Absturzberichten an Google Firebase, die auch personenbezogene Daten enthalten könnten, muss man aber rechnen.
Be Charge
Be Charge ist die Ladeapp des italienischen Mineralölkonzerns Eni.
Die Verbindungen:
[1] Google Firebase wird über die Installation der App und auch das enthaltene SDK Onesignal informiert.
POST https://firebaseinstallations.googleapis.com/v1/projects/bechargeapp/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.bepower.BeCharge x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 8E08793F360965C390B430C1371DDB4548082888 x-goog-api-key: AIzaSyA2iUYVoW0rD0HLVA_maf03muwOk3N_A9s User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:900775279483:android:9564b8c519187533“, „authVersion“: „FIS_v2“, „fid“: „fQBEHUKgTVyQZX1XXe2QV-„, „sdkVersion“: „a:17.1.3“ } POST https://firebaseinstallations.googleapis.com/v1/projects/onesignal-shared-public/installations HTTP/1.1 x-dynatrace: MT_3_3_473357825_1-0_323f900b-b2fc-483f-8155-86392889e963_0_666_20 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.bepower.BeCharge x-firebase-client: H4sIAAAAAAAAAEWRSW7DMAxFr2JoHQ22UDTNVaIsFIt2BWsIJNZoEeTupYe6Sz5-kZ9fT_YJtuAdLFZ2uT6ZHSEhu7DBF-B9LmBkp4QWbbORUI1sz6IT52bKGHyiUryLVm19m2z4Qd-TqmtJpRqbXMne8egTr24irjfp0MelECTbgAt8wm-a90FMNQ5m3wO_F5pgZLWxfqXxGOdTRRsCFCP7HMWOxQzJeZLtZlZopN7dLfccO_T_jpgdBCOngPCHko2wk_Xpvs-iz2mJgE4W-nDzoMaQCx20qZFM10cuuIZFAR1KtGUE3JLQmp2YswhL9KxTnebqzNUbu71uJzZDqbSM_qJjr19ismGxqAEAAA X-Android-Cert: 8E08793F360965C390B430C1371DDB4548082888 x-goog-api-key: AIzaSyAnTLn5-_4Mc2a2P-dKUeE-aBtgyCrjlYU User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:754795614042:android:c682b8144a8dd52bc1ad63“, „authVersion“: „FIS_v2“, „fid“: „dDI2XTydTXS9aY8IjCN_UG“, „sdkVersion“: „a:17.1.3“ }
[2] Dynatrace ist ein Cloud-Anbieter, ich vermute, dass hiermit die Leistungsfähigkeit der App überwacht wird oder auch Nutzungsanalyse betrieben wird. Diese Verbindungen waren leider auch Tage nach der letzten Nutzung im Hintergrund aktiv.
POST https://bf25527obn.bf.dynatrace.com/bf?type=js3&sn=v_4_srv_5_sn_B76DHLO5D0LNV0NA98L1TEASP195FBVP_app-3A14ca53528d23560f_1_ol_0_perc_100000_mul_1_rcs-3Acss_0&svrid=5&flavor=cors&vi=RRWBHRUTWJNOPLHBPABNUWVWHPPNQHBI-0&modifiedSince=1690812845219&rf=http%3A%2F%2Flocalhost%2F&bp=3&app=14ca53528d23560f&crc=3136648428&en=lbcifmz0&end=1 HTTP/2.0 content-length: 1477 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 content-type: text/plain;charset=UTF-8 accept: */* origin: http://localhost x-requested-with: com.bepower.BeCharge sec-fetch-site: cross-site sec-fetch-mode: cors sec-fetch-dest: empty referer: http://localhost/ accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Raw $a=1%7C1%7C_load_%7C_load_%7C-%7C1691246262605%7C1691246269333%7Cdn%7C36%7Csvtrg%7C1%7Csvm%7Ci1%5Esk0%5Esh1%7Ctvtrg%7C1%7Ctvm%7Ci1%5Esk0%5Esh1%2C2%7C7%7C_event_%7C1691246262605%7C_vc_%7CV%7C6728%5Epc%7CVCD%7C4981%7CVCDS%7C8%7CVCS%7C3313%7CVCO%7C6765%7CVCI%7C0%7CVE%7C0%5Ep0%5Ep151200%5Eps%5Esdiv.gm-style%3Ediv%3Afirst-child%3Ediv%3Anth-child%282%29%7CS%7C4370%2C2%7C8%7C_event_%7C1691246262605%7C_wv_%7ClcpE%7C-%7ClcpSel%7C-%7ClcpS%7C3016%7ClcpT%7C6604%7ClcpU%7C-%7ClcpLT%7C0%7Cfcp%7C6604%7Cfp%7C5798%7Ccls%7C0.0061%7Clt%7C4108%2C2%7C4%7C_onload_%7C_load_%7C-%7C1691246265052%7C1691246265484%7Cdn%7C36%7Csvtrg%7C1%7Csvm%7Ci1%5Esk0%5Esh1%7Ctvtrg%7C1%7Ctvm%7Ci1%5Esk0%5Esh1%2C3%7C5%7Cg14.2.12%7Cxhr%7Cg14.2.12%7C1691246265097%7C1691246265484%7Cdn%7C36%7Cxu%7C%2Fassets%2Fi18n%2Fen.json%7Csvtrg%7C1%7Csvm%7Ci1%5Esk0%5Esh1%7Ctvtrg%7C1%7Ctvm%7Ci1%5Esk0%5Esh1%7Cxrt%7Cb1691246265146e0f0g0h0i0k0l0m311X200T-1z11I1%2C1%7C9%7C_event_%7C1691246262605%7C_view_%7Ctvtrg%7C1%7Ctvm%7Ci1%5Esk0%5Esh1$rId=RID_2418$rpId=$domR=1691246265026$tvn=%2Fexplore$tvt=1691246262605$tvm=i1%3Bk0%3Bh1$tvtrg=1$tvg=explore$w=360$h=616$sw=360$sh=640$nt=a0b1691246262605e28f28g28h28i28k28l28m260o1238p2366q2367r2422s2447t2447u300X200$ni=4g|10|wifi$di=3$url=http%3A%2F%2Flocalhost%2Fexplore$title=BeCharge$sUrl=http%3A%2F%2Flocalhost%2F$latC=0$app=14ca53528d23560f$vi=RRWBHRUTWJNOPLHBPABNUWVWHPPNQHBI-0$fId=446263206_154$v=10269230629181806$vID=16912459539060UBI6GTF4VFQ4D98EDM8KTFESDN0HRG8$time=1691246270980
[3] Onesignal ist ein SDK, das für Push-Notifications eingesetzt wird.
TTP/1.1 200 OK Date: Sat, 05 Aug 2023 14:37:20 GMT Content-Type: application/json; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive access-control-allow-headers: SDK-Version,Content-Type,Origin,Authorization,OneSignal-Subscription-Id access-control-allow-origin: * traceparent: 00-f7d5301953bd545ba1800de609563af4-0afc17ae21c4c18a-01 Via: 1.1 google Alt-Svc: h3=“:443″; ma=86400 CF-Cache-Status: DYNAMIC Strict-Transport-Security: max-age=15552000; includeSubDomains Server: cloudflare CF-RAY: 7f1fc70ac8106d8f-MUC Content-Encoding: gzip [decoded gzip] JSON { „id“: „6f5ef398-3fdb-45ae-a0cb-46f677852599“, „success“: true }
[4] Google Maps ist der Kartenanbieter.
GET https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyAzy-dP951335VtdnSc060jwneM3Q-rahY&callback=dummy HTTP/2.0 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 accept: */* x-requested-with: com.bepower.BeCharge sec-fetch-site: cross-site sec-fetch-mode: no-cors sec-fetch-dest: script referer: http://localhost/ accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Query libraries: places key: AIzaSyAzy-dP951335VtdnSc060jwneM3Q-rahY callback: dummy
[5] bepower.io ist der API-Server von Be Charge, hier werden z.b. die Ladesäulen abgefragt. Der Server ist bei Amazon gehostet.
GET https://api.prod.bepower.io/evc?lat=41.902747&long=12.482801&radiusM=3932.958 HTTP/2.0 accept: application/json x-app-version: 4.11.1 accept-language: de user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 x-api-key: 1TxzudH9RY4VnRjFF4A7YSzXbWyGdjY6qyYdMSGa origin: http://localhost x-requested-with: com.bepower.BeCharge sec-fetch-site: cross-site sec-fetch-mode: cors sec-fetch-dest: empty referer: http://localhost/ accept-encoding: gzip, deflate Query lat: 41.902747 long: 12.482801 radiusM: 3932.958
Fazit: Die App setzt nicht nur ungefragt Google Firebase und eine Analysesoftware ein – letztere ist auch im Hintergrund aktiv, obwohl die App nicht benutzt wird. Das finde ich nicht nachvollziehbar. Ich würde die App deshalb und wegen der vielen Drittanbieter nicht nutzen.
My BMW
BMW hat eine eigene Ladeapp, die über Partner über 540.000 Ladepunkte in Europa anbietet, das ist eine ganze Menge. Die Preise sind etwas komplizierter: Es gibt einen kostenlosen und einen Monatstarif. Wer keine monatliche Gebühr zahlt, muss vorher immer Preise checken. Die fixen Preise sehen hingegen ganz gut aus – aber sind auch nur für Leute, die einen BMW besitzen (es wird die Fahrgestellnummer abgefragt). Fürs Ausland gelten wieder andere Preise und beim Langsamladen muss man nach drei Stunden einen höheren Preis zahlen. Ich konnte die App nur zu einem kleinen Teil prüfen: Trotz Anmeldung war ich nicht in der Lage, Ladesäulen anzuzeigen (evtl. muss man dafür ein Elektroauto registrieren). Außerdem war BMW sicherheitstechnisch recht fortschrittlich: Man erkannte und warnte vor meinem gerooteten Android. Viele Verbindungen konnte ich nicht aufzeichnen.
Die Verbindungen:
[1] Here Maps: BMW war einer von den deutschen Autoherstellen, die Nokias Kartendienst Here vor einiger Zeit gekauft haben. Schön, dass sie es auch wirklich in ihren Apps benutzen. Beim Appstart sendet die App eine Installations-ID und erhält dann einen Token (Bearer
), der für den Kartendienst verwendet wird. Anschließend werden alle Kartendaten mit dieser ID abgefragt. Soweit ich Einblick in den Datenverkehr hatte, fragt Here aber wie Mapbox nur Kacheln ab und erhält keinen genauen Standort. Da die Kacheln gecached werden, können auch nicht so einfach Bewegungsprofile erstellt werden. Here kann dennoch jede Kachelabfrage einer ID zuordnen, was aus Datenschutzsicht auch nicht ganz unproblematisch ist.
POST https://account.api.here.com/oauth2/token HTTP/1.1 Host: account.api.here.com Accept: */* Connection: TE TE: gzip Accept-Encoding: deflate, gzip Authorization: OAuth oauth_consumer_key=“lizS9pzxd3bgXeaziBOuBA“,oauth_nonce=“f35b5a94-3d9b-4579-9fb9-97783ccb647b“,oauth_signature_method=“HMAC-SHA256″,oauth_timestamp=“1691700110″,oauth_version=“1.0″,oauth_signature=“J%2F9qQ5VPx3fst33rMG8aIHkGSsX84bowGCZbFkNkSVQ%3D“ User-Agent: OLP-CPP-SDK/1.15.4 (Android) HERE-SDK-4.14.4.0/explore Content-Type: application/json Content-Length: 84 JSON { „deviceId“: „68e079a6-057b-44e6-8c30-2d452456f6b1“, „grantType“: „client_credentials“ } GET https://vector.hereapi.com/v2/vectortiles/core/mc/12/2179/1421/omv HTTP/1.1 Host: vector.hereapi.com Accept: */* Connection: TE TE: gzip Accept-Encoding: deflate, gzip If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT Authorization: Bearer eyJhbGciOiJSUzUxMiIsImN0eSI6IkpXVCIsImlzcyI6IkhFUkUiLCJhaWQiOiJEOUVJNFlHaHNDZDF1enpmNXVESCIsImlhdCI6MTY5MTcwMDExMSwiZXhwIjoxNjkxNzg2NTExLCJraWQiOiJqMSJ9.ZXlKaGJHY2lPaUprYVhJaUxDSmxibU1pT2lKQk1qVTJRMEpETFVoVE5URXlJbjAuLmItTVUyREdrM0M0N0pmdjQtZTRpbFEuRlFjbE5lY3l3ZW8tSGlDenZWQkx4eDJoVVpDeWhnUjM0X0pFNUR0NHloaWlzZjN4ckJpUXVqMVVsUk9YM2s5TlczZWdCZFdfTzNpYVJadkZVbWIxdHpLTmRzX2xEQ0NMcDAzYnYxdDZLelFQNHhtcFJ1bnZLSFNUTVZsSllPRGc5amtjNE5zWHAxSG9PcXFCMHk1cFdnLl9XSUV4YnJGQjBOdnlSVlhVRlZiSDVDVksxT0JfcWFDOVlvTlBmQ09oVU0.sfSEQcZeyUUSanwaO7PI4KpOt3PB0vO3sd3x_2J7LEx_INM20StkU0-_NL_nUvwvJHBtvzotCTSXC4w3YQZ3F0vQiRZchMrS3qT9yLVOHlDziwgAtFt-NAGAtzcusSMO_llxWbw0hyfupyEqdR_xZpwnk8aSLyflZhpTCSSS7jnYX3lT5RuxJQDmVciY9VnIgYVT6NyoK9Osy0jDxSxAKEi9aZ7FPhN0uEbUt45iFQCFPORSRtB20QPrSUdhd1YAh3-G7l4Kj_PrXXXNjYSTLOSIfhwFiBlRacq5Xf2uvb-9d-pn8AlJDk34DyCTQvMQtJA4cbQowjWxiH52Tj54vA No content
[2] Google Firebase meldet die Installation mit der eindeutifen Firebase-Installations-ID fid
.
POST https://firebaseinstallations.googleapis.com/v1/projects/eadrax-bmw-row-prod/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: de.bmw.connected.mobile20.row x-firebase-client: H4sIAAAAAAAAAFVQy47CMAz8lSpnkuaxEhW_suUQGrcbkQdKTC-If8dsWrR79MzYM54H-wFb8AIWKzt9P5hdICE7MZtcyd7x6BOv7jr2euhmX4BPuQBNUhghuzncEaHwv4wYiLhmDD6NvaJJq7Y5T5FoI5RQnYPVT8AvhXzGvtpY72lpMu8J0SSiM3sKnyraEKCM_ZSj2GCxQnJ-39vAsTdyP59spETXgLAjMTsIG9Tc2mWLPqdKeY_kqz–NyLmXCh3UyPlrbdckJQDKY8fJdqyALaqjPlfzO_j6uvdGDswZxHeXTMtteFy4Eqy8_N8YCuUSimofM2eLxqDKPeZAQAA X-Android-Cert: 87783BD51248FAEA56D3212633BB7823273A8CCB x-goog-api-key: AIzaSyCWiMUC4oAHkZw3Kv1tqXggOVKOEZbuIFc User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:958479630237:android:531bf5a2713c811c6e3974“, „authVersion“: „FIS_v2“, „fid“: „cXcQ4NkyTY2GxXzBqUhTnG“, „sdkVersion“: „a:17.1.2“ }
[3] Dynatrace: Dieses Unternehmen erhält regelmäßig kurze, eher technische Details über die Stabilität der App. Unklar, ob hier IDs enthalten sind. In einem anderen Test konnte ich beobachten, dass Dynatrace auch im Hintergrund aktiv ist, weshalb ich diesem SDK gegenüber skeptisch bin.
GET https://bf55106ilo.bf.dynatrace.com/mbeacon?type=m&srvid=1&app=42138ff3-383a-41ca-b4b8-026ff8fd8274&va=8.243.1.1007&tt=maandroid&pt=0&resp=json&cts=0&ns=1&si=4156203172_1 HTTP/1.1 Connection: close Accept-Encoding: identity, gzip User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: bf55106ilo.bf.dynatrace.com Query type: m srvid: 1 app: 42138ff3-383a-41ca-b4b8-026ff8fd8274 va: 8.243.1.1007 tt: maandroid pt: 0 resp: json cts: 0 ns: 1 si: 4156203172_1
[4] BMW Server: Per API werden Details von BMW abgerufen. Diese ist offenbar von oder mit Hilfe von Countly betrieben, ein Cloud-Analyse-Unternehmen, welches offenbar für gehostete Daten Analysen anbieten kann. Das hier entsprechend immer eine deviceID mitgesendet wird, finde ich nicht so gut, denn dadurch können alle Aktionen in der App einem Gerät zugeordnet werden, auch wenn beispielsweise nur eine Ladesäule auf der Karte angezeigt werden soll. Genau das geschieht eben möglicherweise mit Countly. Der Server selbst liegt dann bei Microsoft, wobei ich nicht sehen kann, ob Countly oder BMW bei Microsoft direkt die Kunden sind.
GET https://api.countly.bmwgroup.com/i?app_key=3002592bb1d2c4d43272b2fc9ef341ec0dc728cb×tamp=1691702211644&hour=23&dow=4&tz=120&sdk_version=23.6.0&sdk_name=dart-flutterbnp-android&session_duration=16&device_id=ffe0a636-7949-47ff-91f7-43aac67277d5&checksum256=dc834f45d278ab0542d65e11830eea2db22986e8edc67e807860cbe3ceaaf039 HTTP/1.1 x-dynatrace: MT_3_5_1577551043_1-0_42138ff3-383a-41ca-b4b8-026ff8fd8274_0_801_75 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.countly.bmwgroup.com Connection: Keep-Alive Accept-Encoding: gzip Query app_key: 3002592bb1d2c4d43272b2fc9ef341ec0dc728cb timestamp: 1691702211644 hour: 23 dow: 4 tz: 120 sdk_version: 23.6.0 sdk_name: dart-flutterbnp-android session_duration: 16 device_id: ffe0a636-7949-47ff-91f7-43aac67277d5 checksum256: dc834f45d278ab0542d65e11830eea2db22986e8edc67e807860cbe3ceaaf039
Fazit: Auch wenn ich die App kaum testen konnte – was ich gesehen habe, reicht mir aus, um von der App abzuraten. Man wird auf Schritt und Tritt von einer Analysesoftware verfolgt und erhält auch gegenüber dem Kartendienst keine anonyme Auskunft. Auch wenn ich nicht genau sagen kann, was die App dann mit Bewegungsdaten macht, wäre mir das schon zu viel Analyse.
Bonnet
Bonnet war mir bis zum Test völlig unbekannt, aber ein Mastodon-Leser hat es vorgeschlagen. Offenbar ein Londoner Unternehmen, bei dem man die Preise je nach Ladenetzwerk bezahlt oder mit bis zu 15% vergünstigt erhält, wenn man ein Abo abschließt. Ob sich das Rechnen für Datenschutzinteressierte überhaupt lohnt, kann man schon nach dem Start bezweifeln:
Die Verbindungen:
[1] Google Firebase mit den Diensten Firebase Installations, Crashlytics, Messaging und das extrem umfangreiche Logging:
POST https://firebaseinstallations.googleapis.com/v1/projects/bonnet-prod/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.bonnet x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 39CC4B0E37BA11A6F1EAF4DBDF8E47C617E96529 x-goog-api-key: AIzaSyDNMAgnsO1nr8OkTdMEM172-QkCFWOz-_g User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 141 [decoded gzip] JSON { „appId“: „1:1003470998483:android:cb43ef59c4a74d74cdfd26“, „authVersion“: „FIS_v2“, „fid“: „ewcb1aftTI6eflWXNeoYCb“, „sdkVersion“: „a:17.1.3“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:1003470998483:android:cb43ef59c4a74d74cdfd26/settings?instance=689dfb43f7efa89da0a4c1067952ba3046c99c0b&build_version=134&display_version=2.14.0&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: 042fd1b0c7b04047968a72cdfdc2af65 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.7 User-Agent: Crashlytics Android SDK/18.3.7 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:1003470998483:android:cb43ef59c4a74d74cdfd26 X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 689dfb43f7efa89da0a4c1067952ba3046c99c0b build_version: 134 display_version: 2.14.0 source: 4 POST https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog HTTP/1.1 User-Agent: datatransport/3.1.9 android/ Content-Encoding: gzip Content-Type: application/json Accept-Encoding: gzip X-Goog-Api-Key: AIzaSyCckkiH8i2ZARwOs1LEzFKld15aOG8ozKo Host: firebaselogging-pa.googleapis.com Connection: Keep-Alive Content-Length: 1598 [decoded gzip] JSON { „logRequest“: [ { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „134“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1691419708676, „eventUptimeMs“: 175220002, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „Cg4Ipofgg50xEIGa4oOdMRoLCgkIgMADEICAgAUiCmNvbS5ib25uZXQ=“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „GDT_CLIENT_METRICS“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1691419708685, „requestUptimeMs“: 175220010 }, { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „134“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1691419678424, „eventUptimeMs“: 175189750, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoAxJ9CgNfYXMg/tqQpuXKgAMozJ7TAjoWCgZfYXN0dWkg/tqQpuXKgAMoyu+WAToWCgZfYXN0ZmQgkM2np+XKgAMog/2YAToUCgVfYXN0aSCgx8Co5cqAAyj/sSNKIgogMTY4NWY5MDM0ODAyNGVlMGEyNDg1N2EyYzhmNTIzMDc=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419678467, „eventUptimeMs“: 175189793, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoAhrYAQp6aHR0cHM6Ly9jZG4tc2V0dGluZ3MuYXBwc2ZseWVyc2RrLmNvbS9hbmRyb2lkL3YxLzA2MDNlMzE3OGZiYmI0YTgwYjc4MTFhMDY2NGI2ODA5ZGNhY2YyNzZiOTk4ZGYyYmUzZTZiNTRlMTA2N2VhY2Ivc2V0dGluZ3MQASAoKMgBMh9hcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04OJjIjKflyoADSNcEUNrFCWoiCiAxNjg1ZjkwMzQ4MDI0ZWUwYTI0ODU3YTJjOGY1MjMwNw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419678476, „eventUptimeMs“: 175189801, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoAhp6ChZodHRwczovL20uc3RyaXBlLmNvbS82EAMYjgIgmwEoyAEyHmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODj4jZKo5cqAA0Cp4TBIbFDY7w5qIgogMTY4NWY5MDM0ODAyNGVlMGEyNDg1N2EyYzhmNTIzMDc=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419679270, „eventUptimeMs“: 175190596, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoARqBAQotaHR0cHM6Ly9ib25uZXRhcHBzLmNvbS9kcml2ZXIvYXBpLzEuMS9tZS9sb2dzEAEgISiRAzIYdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04OIi88KjlyoADUIisJmoiCiAxNjg1ZjkwMzQ4MDI0ZWUwYTI0ODU3YTJjOGY1MjMwNw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419679303, „eventUptimeMs“: 175190628, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoARqAAQosaHR0cHM6Ly9ib25uZXRhcHBzLmNvbS9kcml2ZXIvYXBpLzEuMS9tZS9jYXIQASAhKJEDMhh0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTg44PLwqOXKgANQtfMoaiIKIDE2ODVmOTAzNDgwMjRlZTBhMjQ4NTdhMmM4ZjUyMzA3“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419680866, „eventUptimeMs“: 175192192, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoARqXAQozaHR0cHM6Ly9kbHNkay5hcHBzZmx5ZXIuY29tL3YxLjAvYW5kcm9pZC9jb20uYm9ubmV0EAMYpAEgHyjIATIfYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtODi4nfKp5cqAA0DiphNIdVCWhgZqIgogMTY4NWY5MDM0ODAyNGVlMGEyNDg1N2EyYzhmNTIzMDc=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419683919, „eventUptimeMs“: 175195245, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoARqGAQo3aHR0cHM6Ly9jb252ZXJzaW9ucy5hcHBzZmx5ZXIuY29tL2FwaS92Ni45L2FuZHJvaWRldmVudBADGNcbIAEoyAEyCnRleHQvcGxhaW444K+qq+XKgANA/pYISGtQ9NEJaiIKIDE2ODVmOTAzNDgwMjRlZTBhMjQ4NTdhMmM4ZjUyMzA3“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1691419686290, „eventUptimeMs“: 175197615, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmgKLjE6MTAwMzQ3MDk5ODQ4MzphbmRyb2lkOmNiNDNlZjU5YzRhNzRkNzRjZGZkMjYSFmV3Y2IxYWZ0VEk2ZWZsV1hOZW9ZQ2IaHAoKY29tLmJvbm5ldBIGMjAuMy4zGgYyLjE0LjAoARqXAQo5aHR0cHM6Ly9nY2RzZGsuYXBwc2ZseWVyLmNvbS9pbnN0YWxsX2RhdGEvdjQuMC9jb20uYm9ubmV0EAEgYyjIATIfYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtODjotbWr5cqAA0hcUOKRjwFqIgogMTY4NWY5MDM0ODAyNGVlMGEyNDg1N2EyYzhmNTIzMDc=“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „FIREPERF“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1691419708687, „requestUptimeMs“: 175220013 } ] }
[2] Appsflyer ist ein Marketing-Unternehmen, welches gerne auch Zielgruppen nach installierten Apps anbietet. Ein Teil der Daten ist binär und kann nicht entschlüsselt werden. Im Verlauf der weiteren Appnutzung wird Appsflyer auch weitere Nutzungsdetails wie Häufigkeit des Gebrauchs erhalten.
GET https://gcdsdk.appsflyer.com/install_data/v4.0/com.bonnet?devkey=hGf5f9trtk5FSA5TBfvrg9&device_id=1691419678494-5332151796134004553 HTTP/1.1 Content-Type: application/json Connection: close User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: gcdsdk.appsflyer.com Accept-Encoding: gzip Query devkey: hGf5f9trtk5FSA5TBfvrg9 device_id: 1691419678494-5332151796134004553 POST https://conversions.appsflyer.com/api/v6.9/androidevent?app_id=com.bonnet&buildnumber=6.9.0 HTTP/1.1 Content-Type: application/octet-stream Content-Length: 3544 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: conversions.appsflyer.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 69 fa d6 4f f0 cd cd 6e 8f a4 13 53 0f fd 3d 4c i..O…n…S..=L 0000000010 de fd 49 9f 7b 49 93 95 ca 9c b1 c3 46 67 6b 55 ..I.{I……FgkU 0000000020 16 87 18 ce 65 71 2f a1 e4 a5 63 9f e5 e0 94 31 ….eq/…c….1 0000000030 2d 57 2a cc 88 c0 64 20 b6 ad cc 44 cd 72 75 4e -W*…d …D.ruN 0000000040 68 d5 85 48 5b d9 46 1b 65 3f 49 c5 80 82 d2 b9 h..H[.F.e?I….. 0000000050 0d 4d a3 13 a6 c5 0b 1b 47 b0 88 d3 be f6 df d2 .M……G……. 0000000060 5f c1 95 15 58 df b5 46 ae dd 2d 46 2f 88 c7 75 _…X..F..-F/..u 0000000070 bb 76 7d e3 97 a8 ef 1b e9 dc f3 e2 be 28 0e b2 .v}……….(.. 0000000080 64 ef 54 07 91 46 f8 0b 91 d4 11 26 23 5e 82 f2 d.T..F…..&#^.. 0000000090 d3 ee 89 06 f4 f4 9e 65 27 17 cc 6d 37 5a b6 02 …….e‘..m7Z.. 00000000a0 1c 06 31 78 34 2f 75 0e 72 0b 8c b2 df 56 10 b8 ..1×4/u.r….V.. 00000000b0 14 2c 9d 1c 26 1d f6 e0 21 cd 30 35 9f bc a1 ba .,..&…!.05…. 00000000c0 e3 2f e2 98 76 0b c2 07 c4 50 9d e0 ef b1 7a b8 ./..v….P….z. 00000000d0 55 29 8f b9 f5 b6 fe a9 3e 56 91 a0 d9 a8 c3 38 U)……>V…..8 00000000e0 b5 c0 79 23 37 43 be c2 58 77 64 63 33 11 60 ba ..y#7C..Xwdc3.`. 00000000f0 9c 15 17 bb 27 09 f7 08 5c 2a ce 2e 6a 4b 14 b3 ….’…\*..jK.. 0000000100 80 0f d5 62 c9 8f f0 7f ac 14 c1 84 f8 c3 78 8c …b……….x. 0000000110 cd 26 06 ec 2a e4 ea fa 24 25 64 03 44 c9 c2 15 .&..*…$%d.D… 0000000120 22 40 fa f1 f8 4d 9c 6f 83 e2 08 50 0b 6f 13 30 „@…M.o…P.o.0 0000000130 80 0a 84 6d 9e 38 aa a3 fd 3e b1 cf 39 56 52 3e …m.8…>..9VR> 0000000140 de 54 2b 4f 42 48 bd 34 5b e8 c4 03 5d d2 be bb .T+OBH.4[…]… 0000000150 83 ee da fb 9d 63 96 8e 02 44 18 62 30 a1 3f 84 …..c…D.b0.?. 0000000160 a9 74 4e 1a f5 22 1a 02 48 80 31 d3 a7 02 13 9a .tN..“..H.1….. 0000000170 f3 6a f7 dd 47 08 22 e7 2b 93 20 c1 cf fb 5b b3 .j..G.“.+. …[. 0000000180 f8 dc 02 7c 3b 7d e4 40 5a 19 fa 62 85 fc 86 65 …|;}.@Z..b…e 0000000190 4f 24 8a 15 50 2f f8 34 07 81 c6 76 f9 4e af 41 O$..P/.4…v.N.A 00000001a0 2d d6 1e c3 06 3a 94 cb ac 2f d7 ef 95 09 b8 ae -….:…/…… 00000001b0 71 75 2f 06 ca 4b ee 3d e8 26 89 4b a0 54 8b b2 qu/..K.=.&.K.T.. 00000001c0 ee e1 45 c0 ee d0 89 df 6a 61 be 3f f7 14 cb 6c ..E…..ja.?…l 00000001d0 8c 05 ea 12 cd 6b c6 8e 94 5d 3c 74 86 18 39 76 …..k…] 0000000360 06 d7 80 e3 8a ee 45 6f 3f 20 d8 a3 e3 da 91 49 ……Eo? …..I 0000000370 bd 3c 52 49 53 d8 42 66 38 62 ab d4 95 1d 30 9f .<RIS.Bf8b….0. 0000000380 a4 81 58 80 58 97 11 be 03 2b 17 04 17 62 07 50 ..X.X….+…b.P 0000000390 b3 aa 27 09 9b a1 8c a4 c9 8e 29 b5 6b 3d 23 e6 ..’…….).k=#. 00000003a0 f6 75 5f 68 ce 42 88 c7 68 c4 e7 1b ca 54 66 c5 .u_h.B..h….Tf. 00000003b0 46 5f 8d 4e a2 23 f8 e8 07 95 d2 24 11 8a 08 b9 F_.N.#…..$…. 00000003c0 fe b3 9f c5 f1 a9 c0 3d 39 27 1b 4c 0f c7 e3 f7 …….=9′.L…. 00000003d0 40 c4 d3 13 f4 6d e3 52 a9 4b 1a 82 d7 e5 47 b9 @….m.R.K….G. 00000003e0 b1 8e 19 92 b8 6d 87 da 8d f2 88 da 6a 09 e9 82 …..m……j… 00000003f0 fa 1d 31 e3 5f 6c 4e 80 77 16 c1 34 13 4d c7 37 ..1._lN.w..4.M.7 0000000400 41 1b f8 21 35 01 31 60 50 8e 87 0e 0f 11 50 4e A..!5.1`P…..PN 0000000410 58 b8 ae ea eb 73 bd 65 34 1b 4e f5 be 92 be 10 X….s.e4.N….. 0000000420 ad 43 13 2a d3 58 ef 86 89 4a 36 d6 9b aa 05 47 .C.*.X…J6….G 0000000430 7c 1f ff 4c 2e 7f b7 ab c2 5d bf cd bb a5 2a 88 |..L…..]….*. 0000000440 9d b3 a2 24 91 e0 52 a7 95 65 7f d2 3d f6 6f 61 …$..R..e..=.oa 0000000450 33 93 3c 3f c6 ca 9b 9e 17 0b 06 b0 2f a2 14 b5 3.<?……../… 0000000460 f1 aa 5d 2a 31 71 fa 74 88 99 d3 6a a6 49 53 b6 ..]*1q.t…j.IS. 0000000470 11 4b cc 7d 00 37 51 94 4e 45 9d 70 e3 db 93 84 .K.}.7Q.NE.p…. 0000000480 29 1a e0 89 d3 06 2a dd fc dd 40 19 b2 7d 54 0b )…..*…@..}T. 0000000490 f2 90 35 bd 5e 2f e7 4a 75 c4 76 c3 75 7b 02 7c ..5.^/.Ju.v.u{.| 00000004a0 e1 96 56 6a 4c dc ef 73 14 f5 3d 0c f8 9c 8c b1 ..VjL..s..=….. 00000004b0 9b 81 75 6a c4 10 6c 80 0a 40 5e 01 12 48 1f 26 ..uj..l..@^..H.& 00000004c0 2a 24 c6 08 fd 37 d7 b6 a5 3a 01 41 03 91 31 8e *$…7…:.A..1. 00000004d0 d7 01 36 8f 90 b1 0c b6 5f 81 b9 0b 95 d3 0d 9f ..6….._……. 00000004e0 f0 fd ca d3 9f f1 fd c0 3f f5 5a 6d c5 5f 44 02 ……..?.Zm._D. 00000004f0 59 e0 0b 75 e2 dc 95 79 0b 47 e0 29 6c e5 48 0d Y..u…y.G.)l.H. 0000000500 9a 0f 06 16 2d dd d8 d1 15 f7 e8 a8 da 5a d1 3f ….-……..Z.? 0000000510 b1 ff e6 01 c4 42 ba bc 41 38 3c cd 59 68 37 f4 …..B..A8….. . 0000000560 2b 1b 84 63 e4 d0 71 fa 98 5a e4 51 15 7f 8a 90 +..c..q..Z.Q…. 0000000570 d1 63 9a 2b 5b aa ad 79 25 5e d1 79 87 da 6e fc .c.+[..y%^.y..n. 0000000580 78 48 95 5a 9e 11 b6 ea c1 07 81 5c 4e 4a 07 5a xH.Z…….\NJ.Z 0000000590 8c 7b 8a 18 ef 5e 40 ba e1 a7 66 8b 68 d4 46 ea .{…^@…f.h.F. 00000005a0 98 01 f6 06 4e c1 59 c7 ad 1a 91 44 e6 57 59 27 ….N.Y….D.WY‘ 00000005b0 a8 bf a2 2b 51 f8 da 43 6f 9a 68 65 83 20 59 f3 …+Q..Co.he. Y. 00000005c0 70 c9 62 98 7a c3 29 d3 44 02 d2 91 72 a0 6d 57 p.b.z.).D…r.mW 00000005d0 68 6f d2 54 59 4d e3 0c 3a 47 f7 7e 5e cb cf 23 ho.TYM..:G.~^..# 00000005e0 3d 25 a6 27 bf da 2c da 46 52 18 a6 bc 7d c7 32 =%.‘..,.FR…}.2 00000005f0 4f 63 87 2b e7 ee 01 07 bd 57 56 5d 8e 09 e8 f9 Oc.+…..WV]…. 0000000600 12 68 09 19 bd 3e 84 fe 87 ec 7a ff 24 b3 54 4b .h…>….z.$.TK 0000000610 88 04 dd 1a 45 cb ec 3c b9 91 24 a5 a4 44 ca a3 ….E…..4..S.n. 0000000800 c0 bd bb 25 84 fc 15 bd 34 62 c7 60 84 aa de 9c …%….4b.`…. 0000000810 1d a9 07 60 17 31 43 2b 90 69 76 d4 8a 50 10 ef …`.1C+.iv..P.. 0000000820 40 66 40 65 f6 c8 39 47 c8 86 e7 42 96 ec 02 9d @f@e..9G…B…. 0000000830 e6 e1 9c e7 6d 01 8c 6b ca a5 bb 62 07 4c 3f 15 ….m..k…b.L?. 0000000840 ef f5 b1 80 72 f7 16 77 1b 1d 82 04 8b 1f 84 2b ….r..w…….+ 0000000850 26 3e d6 2c e3 34 a4 82 97 34 f4 29 b1 41 a7 d0 &>.,.4…4.).A.. 0000000860 2c d3 a2 b1 dd dc 21 6a d7 cc 52 0d e2 36 c9 b9 ,…..!j..R..6.. 0000000870 bd 40 3d 0b 3e 5b 23 d6 bd 09 c3 aa a2 e0 9d e5 .@=.>[#……… 0000000880 76 1e 4f a9 e2 ce 2a 7f c6 ac c7 73 09 3f ed 0c v.O…*….s.?.. 0000000890 03 1f 99 e2 5c 32 42 25 27 13 ab 3d e5 6f 50 f4 ….\2B%‘..=.oP. 00000008a0 87 e8 74 c5 e2 a4 b1 1b 9f 1b 14 9d bf 55 f1 2d ..t……….U.- 00000008b0 41 0b 9d 32 08 20 09 97 38 27 7e 6e 58 2d be cc A..2. ..8’~nX-.. 00000008c0 33 10 47 48 eb 43 09 fc a1 79 25 24 4f 90 d9 0d 3.GH.C…y%$O… 00000008d0 23 e6 96 b6 4a 3b fc 54 dc 61 39 d6 55 2f 8c dc #…J;.T.a9.U/.. 00000008e0 4e 38 64 6a 3a 92 ac 93 57 d8 ce 2f 43 71 e9 ad N8dj:…W../Cq.. 00000008f0 3e fb 39 0d f1 a4 82 79 fd 3f 12 6f a3 cc 8e cb >.9….y.?.o…. 0000000900 2c dd 48 ad 3b 1f cd 59 07 7d 09 bb d4 3d f1 8f ,.H.;..Y.}…=.. 0000000910 af c1 98 be 0c 61 59 0e 9e 65 d8 98 8d 6d 5c 1c …..aY..e…m\. 0000000920 b7 f5 a0 0d 82 e6 1c 65 76 23 2d ce 74 3f 52 e0 …….ev#-.t?R. 0000000930 c2 cc 08 cf f5 bc 30 90 79 25 87 1d a0 23 50 9d ……0.y%…#P. 0000000940 ed 63 18 f3 68 fe 10 4a a8 23 f3 a2 d8 9a 59 0e .c..h..J.#….Y. 0000000950 10 e9 f3 9c 3b 95 09 88 39 6e 9d 1c 8c 7b e0 55 ….;…9n…{.U 0000000960 54 ec fe 86 5d b5 06 35 7e 22 e4 fd 7d 7d 42 ae T…]..5~“..}}B. 0000000970 70 83 cf 16 09 c7 d4 77 be e0 71 86 9e d8 a3 f4 p……w..q….. 0000000980 d5 98 52 01 96 ba 26 2e 4f d5 0a f0 f9 69 f2 3b ..R…&.O….i.; 0000000990 1f e9 4e 12 5e 15 f6 0b f2 aa e8 c8 a6 97 ea 2d ..N.^……….- 00000009a0 8a f1 4f 89 47 ea 30 f6 de 3d 63 63 69 82 3b 8e ..O.G.0..=cci.;. 00000009b0 00 c5 a3 ca 3a 4d 81 07 31 93 8b 9a 55 06 c0 32 ….:M..1…U..2 00000009c0 cc e6 10 fb ee 8d f1 dc 4b 22 5b 66 50 aa 3a c2 ……..K“[fP.:. 00000009d0 da 92 78 6f 83 74 6d 16 f7 36 96 eb 8c 72 ae 49 ..xo.tm..6…r.I 00000009e0 2c c9 f3 9e eb 31 c3 98 c6 9d 06 ea 3f 96 27 dc ,….1……?.‘. 00000009f0 9c bd 03 6a a2 3f 28 78 0a 52 1b 53 c6 15 b6 f5 …j.?(x.R.S…. 0000000a00 06 4a e9 b2 8a 8f 38 af d5 d5 ab 79 3b 86 83 34 .J….8….y;..4 0000000a10 18 e7 03 32 34 bb e1 b6 df f1 ad e3 c1 02 65 75 …24………eu 0000000a20 61 e1 7a 00 f1 2c 88 7c 26 83 87 66 26 f3 42 09 a.z..,.|&..f&.B. 0000000a30 ae 40 b2 bd 11 21 b5 0a f1 34 2f de b6 38 0d 16 .@…!…4/..8.. 0000000a40 32 38 31 6f e2 35 07 e6 17 ef 97 f0 7d 4d dd e4 281o.5……}M.. 0000000a50 cf 96 68 da 42 df 5a ed 54 6c 2d 54 3c 3f bb a0 ..h.B.Z.Tl-T<?.. 0000000a60 7e 94 b8 d4 71 66 28 a8 5f 69 e0 6c 84 44 e6 94 ~…qf(._i.l.D.. 0000000a70 96 d0 52 fd ae b7 5a 9e 82 4e c7 c4 e6 ee b3 45 ..R…Z..N…..E 0000000a80 9a b8 d5 14 42 9a 3c 24 5b 85 d9 a4 24 6f dd 5f ….B….. .a…a.\! 0000000b70 93 ae 95 49 57 55 25 54 37 63 c8 10 7f de 38 6b …IWU%T7c….8k 0000000b80 f3 23 c0 fb a1 09 97 d9 42 92 6e 9a 56 31 80 5a .#……B.n.V1.Z 0000000b90 13 c3 4e fd 2d f5 1a 9f fd 0a 75 c7 7c 1e 67 55 ..N.-…..u.|.gU 0000000ba0 81 f7 77 92 e8 8b c0 30 5a c6 73 19 ed be 7b f0 ..w….0Z.s…{. 0000000bb0 4a 33 52 1b 81 91 42 bc 88 51 55 f1 ad 1b 44 f7 J3R…B..QU…D. 0000000bc0 f4 a0 a2 d6 e4 b3 66 27 50 f6 8b 25 be 1c 59 4a ……f’P..%..YJ 0000000bd0 d8 27 12 8e 2e ce a1 ac 9a 55 85 6b 03 61 39 3b .’…….U.k.a9; 0000000be0 a9 5d 94 fb a0 9e e3 3f 81 ce 68 ea e0 f1 c8 fe .]…..?..h….. 0000000bf0 6a b4 17 5d 9c 8b 14 c0 65 04 46 1b 94 12 9f 33 j..]….e.F….3 0000000c00 98 e6 c2 03 2a e2 b2 0c 37 05 b0 ea 53 ef 06 65 ….*…7…S..e 0000000c10 17 f9 80 73 65 bf a0 ec ad 4e 38 78 9c 9e 2c b5 …se….N8x..,. 0000000c20 b4 f0 e2 a4 63 84 d2 e1 f6 ee 69 e7 12 93 c4 11 ….c…..i….. 0000000c30 76 01 e1 d9 f2 db 47 2f 99 1a 04 d4 44 60 0c 11 v…..G/….D`.. 0000000c40 8a 2a 8c dd 3a ca a4 58 61 73 f0 e6 8e a3 15 16 .*..:..Xas…… 0000000c50 83 28 a0 6b 89 ad 83 3d bd 1c 7f 77 2f e6 ed f1 .(.k…=…w/… 0000000c60 33 8d 9a c1 79 a4 f3 b1 85 46 20 bf 4e 79 4e 2d 3…y….F .NyN- 0000000c70 55 e9 fc 31 35 f6 8f 13 6e 0b 24 50 a4 88 79 6f U..15…n.$P..yo 0000000c80 52 04 c2 a7 8c d1 22 71 ba 29 6e 17 89 77 ce 37 R…..“q.)n..w.7 0000000c90 71 51 7d 0b a5 66 d2 c3 91 bf fb 2a a0 2c 49 6f qQ}..f…..*.,Io 0000000ca0 36 ef 38 de 0f 0c e6 e3 a0 2c e2 04 82 6d 75 af 6.8……,…mu. 0000000cb0 a3 5f ae 0f 51 0b b0 f5 96 30 ef f6 f4 74 44 c3 ._..Q….0…tD. 0000000cc0 2c 3b 54 3b 6b 3f d5 2b a6 7b cc 53 6b 7f 57 30 ,;T;k?.+.{.Sk.W0 0000000cd0 3b 4b f6 3c a1 b7 3e 65 fd 75 ca c6 56 38 28 de ;K.e.u..V8(. 0000000ce0 45 bb f6 03 f6 af 77 3e e9 1d d0 41 37 ec 6e 5b E…..w>…A7.n[ 0000000cf0 ab 03 c2 90 4b 7e ed ad 93 0e c6 1a 97 ea 88 c4 ….K~………. 0000000d00 ff ba 41 df 42 2c e7 23 24 66 42 bd d0 4d 11 20 ..A.B,.#$fB..M. 0000000d10 f8 af 82 96 93 0f b5 ea 69 2e fc 32 3d 03 77 0d ……..i..2=.w. 0000000d20 f7 1f c7 ca fe 4a d2 84 7b af 17 18 83 2a 5f 41 …..J..{….*_A 0000000d30 21 c6 4e 86 45 6f bb b0 52 56 65 f5 9c a4 0c 97 !.N.Eo..RVe….. 0000000d40 96 e6 76 3f cc f6 44 9f 7b da 54 7f fd 08 21 b3 ..v?..D.{.T…!. 0000000d50 84 d8 54 46 3e 47 b0 df f7 3e 39 02 f1 58 8c 35 ..TF>G…>9..X.5 0000000d60 a0 42 1f 89 55 ee 29 63 9e 73 6d b5 21 49 09 3c .B..U.)c.sm.!I……+ 0000000da0 6a 43 61 46 bf ab 8b 1f 96 e5 e0 f9 90 62 9e 40 jCaF………b.@ 0000000db0 cf 17 84 93 8d 05 9c 84 99 ae 1f a8 87 15 37 33 …………..73 0000000dc0 17 8f 71 7b c7 57 e8 b8 dd 90 26 c8 99 69 94 bb ..q{.W….&..i.. 0000000dd0 47 18 16 66 26 c7 cb f3 G..f&…
[3] Stripe ist ein Zahlungsdienstleister und erhält bereits Daten, bevor man überhaupt zahlen möchte. Hier ist allerdings noch keine ID sichtbar.
POST https://m.stripe.com/6 HTTP/1.1 Cookie: m= User-Agent: Stripe/v1 AndroidBindings/20.25.1 Accept-Charset: UTF-8 X-Stripe-User-Agent: {„lang“:“kotlin“,“bindings_version“:“20.25.1″,“os_version“:“30″,“type“:“samsung_samsung_SM-G900F“,“model“:“SM-G900F“} Content-Type: application/json; charset=UTF-8 Host: m.stripe.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 271 JSON { „a“: { „c“: { „v“: „de_DE“ }, „d“: { „v“: „Android 11 REL 30“ }, „f“: { „v“: „1080w_1920h_480dpi“ }, „g“: { „v“: „1“ } }, „b“: { „d“: „“, „e“: „“, „k“: „com.bonnet“, „l“: „2.14.0“, „o“: „11“, „p“: 30, „q“: „samsung“, „r“: „samsung“, „s“: „SM-G900F“, „t“: „release-keys“ }, „src“: „android-sdk“, „tag“: „20.25.1“, „v2“: 1 }
[4] Bonnet Server: Per API werden Details vom Server bei Amazon abgerufen. Richtig frech ist, dass dabei immer die Appsflyer-ID mitgesendet ist. So kann Bonnet seine eigenen Daten mit denen von Appsflyer zusammen auswerten und Zielgruppen generieren. Auch die Google Advertising-ID wird evtl. auf manchen Geräten ausgelesen, auf meinem offenbar nicht.
GET https://bonnetapps.com/driver/api/1.1/me/logs?offset=0&limit=5&include_unfinished=true HTTP/2.0 app-platform: android app-version: 2.14.0 device-id: df998669f108abe2 google-advertising-id: 00000000-0000-0000-0000-000000000000 appsflyer-id: 1691419678494-5332151796134004553 app-instance-id: 346221339575a4ef89d7ed32de3b130f accept-encoding: gzip user-agent: okhttp/4.10.0 Query offset: 0 limit: 5 include_unfinished: true
Fazit: Ich habe die App nur einmal gestartet und bereits umfangreiche Analyse- und Marketingeinbettungen gefunden. Einen Account habe ich dann gar nicht mehr angelegt. Wer die App hat, sollte sie sofort deinstallieren, die Aufzeichnung von Interessens- und Verhaltensdaten ist durch die Koppelung der Analysedaten an das reale Profil problematischer als bei den meisten anderen Lade-Apps.
Bosch Charge My EV
Bosch ist nicht sonderlich bekannt als Ladeanbieter. Die App hat eine sehr große Abdeckung (500.000 Ladepunkte in Europa), aber keine festen Preise. In meinem Test schwankten sie von 47 Cent bis 97 Cent pro kwh! Man muss also immer vorher prüfen und mindestens eine weitere Karte dabei haben, wenn die Preise einer einzelnen Säule zu hoch sind. Beim Appstart muss man sich verpflichtend mit einer E-Mailadresse registrieren.
Hier die Verbindungen:
[1] Bosch Server: Per API werden Registrierung und Ladesäulenliste nachgeladen. Der Server ist bei Amazon AWS gehostet.
POST https://api.bosch.bosch-emobility.com/connector/rest/app/authenticated/v4/stations/search/custom HTTP/2.0 accept-language: de accept: application/json content-encoding: gzip user-agent: chargePayboschapp2.8.5/Android 11 authorization: Basic Z3JydGVzdDoxbGFkZS1aaWVnZWw= content-type: application/json; charset=UTF-8 content-length: 103 accept-encoding: gzip [cannot decode] JSON { „coords“: { „lat“: 48.075417037808684, „lon“: 11.072257719933987 }, „plugTypes“: [ „CCS“ ], „rangeInMeters“: 8834 }
[2] Google Maps: Hier konnte ich wieder nicht alle Anfragen entschlüsseln. Google erhält aber den genauen Standort.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Type: application/binary User-Agent: com.bosch.si.boschapp/755 (Linux; U; Android 11; de_DE; SM-G900F; Build/RQ3A.211001.001; Cronet/113.0.5672.24) X-Device-Elapsed-Time: 348386228058324 X-Google-Maps-Mobile-API: com.bosch.si.boschapp,755,11.77.200,11.77.200,android:samsung-klte-SM_G900F Content-Length: 725 Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 00 18 ff ff ff ff ff ff ff ff 00 05 64 65 2d 44 …………de-D 0000000010 45 00 1d 61 6e 64 72 6f 69 64 3a 73 61 6d 73 75 E..android:samsu 0000000020 6e 67 2d 6b 6c 74 65 2d 53 4d 5f 47 39 30 30 46 ng-klte-SM_G900F 0000000030 00 09 31 31 2e 37 37 2e 32 30 30 00 03 64 65 76 ..11.77.200..dev 0000000040 00 3e ff ff fe 09 1f 8b 08 00 00 00 00 00 00 00 .>………….. 0000000050 25 c6 31 8f 93 50 00 00 e0 7b 80 17 75 71 72 77 %.1..P…{..uqrw 0000000060 36 b9 86 f7 28 a5 0c 0e d2 52 e8 b5 50 78 14 28 6…(….R..Px.( 0000000070 5d 9a 57 b8 02 57 5a 5a 28 3d da e9 36 5d 74 e8 ].W..WZZ(=..6]t. 0000000080 60 f4 26 a7 26 2e 7a 71 31 71 f4 07 98 98 38 98 `.&.&.zq1q….8. 0000000090 9b 3a 1a 07 e3 e0 66 62 1c fc a6 ef 2e 03 59 81 .:….fb……Y. 00000000a0 7d 00 1e de f7 d3 59 65 9c e6 7e 54 c9 e3 ff 21 }…..Ye..~T…! 00000000b0 8b 05 a2 9a 72 1d 48 ef 00 0f e1 23 5c 8c 11 b2 ….r.H….#\… 00000000c0 83 d8 95 92 ae 3f 20 35 71 9d 17 51 d8 d0 79 9c …..? 5q..Q..y. 00000000d0 12 02 67 6a 1a 77 e6 2e 5a ba 7e cb 76 22 01 46 ..gj.w..Z.~.v“.F 00000000e0 4d 3f e4 cf 3b c3 b1 dc 1e 04 8e 67 6f b1 93 79 M?..;……go..y 00000000f0 52 1e b6 4f 05 3d af 4d ea 6b dc 9c c6 ae 27 b0 R..O.=.M.k….‘. 0000000100 88 28 4a 7b 34 c8 47 ae b6 86 88 93 34 75 d1 db .(J{4.G…..4u.. 0000000110 58 d9 16 af 64 18 d5 74 a5 e6 26 62 1e 9e 11 f1 X…d..t..&b…. 0000000120 34 6d 95 ba 43 96 b0 d0 e6 5c 9f 2c 0d ec 73 e7 4m..C….\.,..s. 0000000130 fd 28 5b 89 aa a5 67 3a 9e 8e 6c 32 32 39 6d 9e .([…g:..l229m. 0000000140 1a 60 07 8e 2d cf ea cb da 15 38 ba 06 cc 0d a0 .`..-…..8….. 0000000150 38 f6 3b 38 ba a4 c0 53 0a bc a7 3e 80 c7 2a 5b 8.;8…S…>..*[ 0000000160 18 8a a2 af 3b 6e 91 5a 0e 0c 87 49 52 3a 26 1b ….;n.Z…IR:&. 0000000170 ab 2d b3 d5 90 43 b7 b6 8d 4d 79 59 4c ce b6 b8 .-…C…MyYL… 0000000180 b7 c9 1a 3d 51 51 6c c1 73 87 be 10 74 71 80 ab …=QQl.s…tq.. 0000000190 7c 5a 8b bb 7a 50 8d f4 36 b1 92 04 c6 e6 c2 6f |Z..zP..6……o 00000001a0 b4 46 24 17 49 8e c2 ac 64 ab 09 8b 24 b1 ee 25 .F$.I…d…$..% 00000001b0 d5 6e c4 59 73 21 40 13 df 46 fd b2 cd 89 fa bc .n.Ys!@..F…… 00000001c0 b8 e8 36 bd 13 af 81 90 37 91 ca de a4 33 4e 5a ..6…..7….3NZ 00000001d0 2a 6b 4c 71 44 9a 78 6d b8 63 a9 3c 99 39 dc 46 *kLqD.xm.c.K 0000000200 af 68 fa f6 81 be a1 ef fd d8 5b bb 6b eb c5 37 .h……..[.k..7 0000000210 eb ed ae ff 6a df 3f d0 e0 17 4d ef 98 5b 5c 05 ….j.?…M..[\. 0000000220 56 d8 97 cc cf af cf ff 80 d7 cc 6f fa c0 3c f9 V……….o..<. 0000000230 f2 79 7f fc 0f 70 b4 2d 24 01 02 00 00 00 27 00 .y…p.-$…..‘. 0000000240 00 00 92 22 6f 68 74 74 70 73 3a 2f 2f 77 77 77 …“ohttps://www 0000000250 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 2f 6d 61 70 73 .google.com/maps 0000000260 2f 76 74 2f 69 63 6f 6e 2f 6e 61 6d 65 3d 61 73 /vt/icon/name=as 0000000270 73 65 74 73 2f 69 63 6f 6e 73 2f 70 6f 69 2f 71 sets/icons/poi/q 0000000280 75 61 6e 74 75 6d 2f 70 69 6e 6c 65 74 2f 63 69 uantum/pinlet/ci 0000000290 76 69 63 5f 62 6c 64 67 5f 70 69 6e 6c 65 74 2d vic_bldg_pinlet- 00000002a0 32 2d 6d 65 64 69 75 6d 2e 70 6e 67 26 73 63 61 2-medium.png&sca 00000002b0 6c 65 3d 34 4a 1f 64 75 68 23 67 65 74 54 65 78 le=4J.duh#getTex 00000002c0 74 75 72 65 46 6f 72 4c 61 62 65 6c 45 6c 65 6d tureForLabelElem 00000002d0 65 6e 74 28 29 ent()
Fazit: Eine datenschutzrechtlich sehr ordentliche App. Es gibt praktisch nur zwei absolut notwendige Verbindungen: Zum Bosch-Server für die Ladesäulen und zu Google Maps. Leider konnte ich dort nicht alle Daten einsehen und nachvollziehen, so dass man diese App wohl nur für Notfälle braucht: Die Preise an den Ladesäulen sind einfach zu unterschiedlich und nicht selten höher als anderswo. Da finde ich eine Festpreis-Ladeapp nützlicher. Wichtig für Fans von alternativen Androids: Die App funktioniert leider ohne Google Play Services gar nicht.
Chargemap
Chargemap ist ein französischer Multinetzwerk-Anbieter, mit dem man an 350.000 Ladepunkten in Europa laden kann. Die Preise sind von Ladesäule zu Ladesäule unterschiedlich und kommen mir eher teuer vor.
Die App meldet sich bereits kurz nach dem Start bei zahlreichen Dienstleistern:
[1] Google Firebase
POST https://firebaseinstallations.googleapis.com/v1/projects/mobile-83f00/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.chargemap_beta.android x-firebase-client: H4sIAAAAAAAAAFVR226DMAz9FZTnJkDY1Kq_MvqQJqazCEmVuNWmqv8-QwBp4omTc7GPX-IbTKIrGMri_PUS5gaBxFkMmEDamKCvdaM6pauC-NzX7YmBYwFMMP6X0DKsW6WZN0byGJilTkq31W4kR_r5b7Zr16eiN8GliE5OGGR2I-NdoQ92mn8U0yoHT7Qgr4nZfZ3NlB_htrpeafHib_fCkMl4D6mvbZzUCqsnBIebDtGtumYbb2H1dddsecFMXMjoCTZkig78ChWbEmUIY5i7OrLhukCyS8AHB2yD3Zk4xMSLFQrxQvkeEy0tt9zyxiSTbkClka7br1Gqe7AILA4IThyEMwTzNYVudCebk2w-xeV9OYgnpMxj8Xm1eP8BVhOUHPsBAAA X-Android-Cert: 3F3467438E85D04E3C5F42863CC77739C081D7A6 x-goog-api-key: AIzaSyA-6Lz145ZfU3ZIyteCPNKuKW0xe9vFoho User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 141 [decoded gzip] JSON { „appId“: „1:1026659052079:android:f9ebeaa0cb9fe5864bb4da“, „authVersion“: „FIS_v2“, „fid“: „fvr7wVo-SgKCPiYA7zIdIM“, „sdkVersion“: „a:17.1.3“ }
[2] Facebook erhält detaillierte Verhaltensdaten, darunter z.B. Nutzungsdauer und Zeitpunkt.
POST https://graph.facebook.com/v16.0/453515085098970/activities HTTP/1.1 User-Agent: FBAndroidSDK.16.0.0 Accept-Language: de_DE Content-Type: application/x-www-form-urlencoded Content-Encoding: gzip Transfer-Encoding: chunked Host: graph.facebook.com Connection: Keep-Alive Accept-Encoding: gzip [decoded gzip] URLEncoded form format: json sdk: android custom_events: [{„_eventName“:“fb_mobile_activate_app“,“_eventName_md5″:“cb7f3b6cd294afce05ece615d43ea7b9″,“_logTime“:1691248415,“_ui“:“LoadingActivity“,“_session_id“:“c0f667e1-23bd-48ce-99bb-31274fedd150″,“fb_mobile_launch_source“:“Unclassified“,“fb_mobile_pckg_fp“:“54566214e99c358ecdff6e1220558e1c“,“fb_mobile_app_cert_hash“:“PzRnQ46F0E48X0KGPMd3OcCB16Y=\n“}] event: CUSTOM_APP_EVENTS anon_id: XZ1783728f-fa3b-40c8-97ed-d830900fd69a application_tracking_enabled: true advertiser_id_collection_enabled:true advertiser_id: 00000000-0000-0000-0000-000000000000 advertiser_tracking_enabled: false installer_package: com.android.vending extinfo: [„a2″,“com.chargemap_beta.android“,4070192,“4.7.191″,“11″,“SM-G900F“,“de_DE“,“MESZ“,““,1080,1920,“3″,4,12,6,“Europe\/Amsterdam“] application_package_name: com.chargemap_beta.android
[3] Insider, ein Tracking- und Marketingunternehmen, dass platformübergreifende Nutzung analysieren kann.
POST https://mobile.useinsider.com/api/v3/session/start HTTP/1.1 ts: 1691248414899 Content-Type: application/json; charset=UTF-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: mobile.useinsider.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 301 JSON { „calledDueToInsiderIdChange“: false, „device_info“: { „app_version“: „4.7.191“, „battery“: 100, „connection“: „wifi“, „location_enabled“: false, „os_version“: „11“, „push_enabled“: true, „sdk_version“: „13.8.5-nh“ }, „first_run“: true, „insider_id“: „b6db6e3c8be65da3“, „partner_name“: „chargemap“, „udid“: „b6db6e3c8be65da3“ }
[4] Mixpanel, ein App-Analyse-Dienst (der Inhalt war base64-decodiert).
POST https://api.mixpanel.com/track/?ip=1 HTTP/1.1 Content-Length: 797 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.mixpanel.com Connection: Keep-Alive Accept-Encoding: gzip [{„event“:“Integration“,“properties“:{„mp_lib“:“Android“,“$lib_version“:“7.3.1″,“$os“:“Android“,“$os_version“:“11″,“$manufacturer“:“samsung“,“$brand“:“samsung“,“$model“:“SM-G900F“,“$screen_dpi“:480,“$screen_height“:1920,“$screen_width“:1080,“$app_version“:“4.7.191″,“$app_version_string“:“4.7.191″,“$app_release“:“4070192″,“$app_build_number“:“4070192″,“$has_nfc“:true,“$has_telephone“:true,“$wifi“:true,“$bluetooth_version“:“ble“,“token“:“85053bf24bba75239b16a601d9387e17″,“distinct_id“:“f2064d7940f793a1cc5fdeada3099825″,“Project Token“:“f2064d7940f793a1cc5fdeada3099825″},“$mp_metadata“:{}}]
[5] Adapty, ein Dienst für A/B-Tests und Abolösungen, erhält unter anderem eindeutige Geräte-IDs und sendet Verhaltensdaten an Amazon AWS (hier bereits base-64-decodiert).
POST https://api.adapty.io/api/v1/sdk/analytics/profiles/1ca8fd17-c70e-448c-9df3-8314a193aa38/ HTTP/1.1 Content-type: application/vnd.api+json Accept-Encoding: gzip adapty-sdk-profile-id: 1ca8fd17-c70e-448c-9df3-8314a193aa38 adapty-sdk-platform: Android adapty-sdk-version: 2.4.3 adapty-sdk-session: 2c0a6113-c29d-4fd2-ba0e-01ba40383ecb adapty-sdk-device-id: f448c43f-3e03-4e57-90ae-92aee193a093 adapty-sdk-observer-mode-enabled: false Authorization: Api-Key public_live_FBvmw0EM.owEm8AEvsirnVyGYkjJ6 adapty-app-version: 4.7.191 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.adapty.io Connection: Keep-Alive Content-Length: 377 JSON { „data“: { „attributes“: { „installation_meta“: { „adapty_sdk_version“: „2.4.3“, „advertising_id“: „“, „app_build“: „4070192“, „app_version“: „4.7.191“, „device“: „Samsung SM-G900F“, „device_id“: „f448c43f-3e03-4e57-90ae-92aee193a093“, „locale“: „de-DE“, „os“: „11“, „platform“: „Android“, „timezone“: „Europe/Amsterdam“ } }, „id“: „1ca8fd17-c70e-448c-9df3-8314a193aa38“, „type“: „adapty_analytics_profile“ } } POST https://kinesis.us-east-1.amazonaws.com/ HTTP/1.1 X-Amz-Security-Token: IQoJb3JpZ2luX2VjEJ///////////wEaCXVzLWVhc3QtMSJHMEUCIQDnE5uaGKpBDwAurPTVAiTbr0Q4cHoeRTdzunodwocbDgIgbJZqo71qE4NTGjEzFvkeVG/0B1MBlrCsRGSYJAbJCIAqlwQISBADGgw0ODI2MzcwMDM0NTQiDLNxfdp/h8UBRIuqjir0A18ZUXWYDXKu+fZ96BZgYooP9GvZvscZ9E5ylcSMqUp7v21naeEz2Nri+kLrOfAXnSRh3Zcg9gCB59Feat/vm4lh+HNOG1CBKYPNLUrWBwWeWiyxORP+3PGVZXfChtj/7+eIAY+iJYsOnwBySAgWsQwIuYtQ7zkPP8s2mn3USdtYNaON20AbjR4aBroPbA8jFdEbihlwtSwPrcBqxY81e/6xFqUiPedobEZYuWCI7RD8O+PPEVZp2GtA8yS9WwrX3BCK1MF5edBD6aGCsSsnv/YEakNLP2xJE1fFfIM2B79R141NOHuz4KUNM2+pH00Ev8DKYvT0OijiSuJEecORNmtjd99ouzVkf2JX8t5pKXJ3vDZqVVXCRw8qHlkqfqlGNnumX3uy/uCqm+IhwQPxUPUOlpli/867p/7YcvCmXS/WEoRzy/tfBrD8cNb6Pjz6DzIeT01Klj+cxm8N17J9NQG14v79M3DR8JPegVd+0Te/jSSH+wjAra0NQYZQzvsOlrd2apMf63JmQK/xeDBsYooMbXUMU3gjjJ3PvxxIZK4a8nAQMCaSKCTLdiY4vboHNQJ0/lXjTLN/YBpkI5lqfrb8gYr4rQPOc+d0z+eBlwW3K5BXb02WGan6VKJEAyMqGNV1Pd1Kz4owaWJBP90QxbHzXjY5MN+7uaYGOoUCdvMN3ADIQn+IsKxp5gVwPlcOBT0AbFFOqIuw1mVyGKo0wmfYhHsG2rXzmHh0auX9b5tfdq5WL09YIE64CDspyR6OaBSYeQtLKtWWJsiBGd6099/Z/VQOndffcykz1vtkmwyHu8ljCInY+6LtU+Yvc/bqXOS1YN7jW4JEiVUN+1WPhNaWa/7MduPUfgZ+kbML16gtFBryMEFYF7DT8ryHlm8zCp4xy3oqoZIhmPOPkHsLFPgUNe0VrxI1ZwLuRpUDRdJp9yv3Zxv/ApaUV6fdTHiUm5ng496qjeLx4EbH98oYy5J1PQcHez300clP892WFchJM4l9KXZjq2sfTIRoRHNSPyzE Host: kinesis.us-east-1.amazonaws.com X-Amz-Date: 20230805T151439Z X-Amz-Target: Kinesis_20131202.PutRecords Content-Type: application/x-amz-json-1.1 Accept-Encoding: gzip, deflate, br Accept-Language: ru Authorization: AWS4-HMAC-SHA256 Credential=ASIAXAX3IHK7HF7MWROP/20230805/us-east-1/kinesis/aws4_request, SignedHeaders=accept-encoding;accept-language;content-type;host;x-amz-date;x-amz-security-token;x-amz-target, Signature=28acc6f29da2f73dcabc3b5d9aab67a70f2307659ee109af1b005c1375327bf8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Connection: Keep-Alive Content-Length: 536 Raw {„Records“:[{„Data“:“{„event_id“:“9e1ef9a3-0a77-4776-9f7f-3b2edd84f254″,“profile_id“:“cdef2a26-858b-4f3a-a671-f7f9dcfb3b5d“,“session_id“:“a3e1c753-ac01-4151-bc45-1e7c2b09210f“,“event_name“:“app_opened“,“created_at“:“2023-08-05T15:14:39.195Z“,“profile_installation_meta_id“:“f305c9be-2bec-44ba-93f8-2db165b4b3fd“,“platform“:“Android“}“,“PartitionKey“:“f305c9be-2bec-44ba-93f8-2db165b4b3fd“}],“StreamName“:“adapty-data-pipeline-prod“}
[6] Google Doubleclick, ein Werbenetzwerk, erhält vermutlich eindeutige IDs, um Werbeanzeigen in der App oder jenseits davon auszuspielen.
GET https://googleads.g.doubleclick.net/getconfig/pubsetting?app_name=com.chargemap_beta.android&vnm=4070192&eid=318496669%2C318500618%2C318486317%2C318491267%2C318482077%2C318482447%2C318483611%2C318484496%2C318484802%2C318492497%2C318493867%2C318494215%2C318498027%2C318499445%2C318500151%2C318503837%2C318503166%2C318502753&js=afma-sdk-a-v232400999.231004000.1&client=ca-app-pub-6169923457088985&admob_appcc=3266740983 HTTP/2.0 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 (Mobile; afma-sdk-a-v232400999.231004000.1) accept: */* x-requested-with: com.chargemap_beta.android sec-fetch-site: same-origin sec-fetch-mode: cors sec-fetch-dest: empty referer: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/production/sdk-core-v40-impl.html accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Query app_name: com.chargemap_beta.android vnm: 4070192 eid: 318496669,318500618,318486317,318491267,318482077,318482447,318483611,318484496,318484802,318492497,318493867,318494215,318498027,318499445,318500151,318503837,318503166,318502753 js: afma-sdk-a-v232400999.231004000.1 client: ca-app-pub-6169923457088985 admob_appcc: 3266740983
[7] Der Chargemap-Server wird kontaktiert, um die Kartenfunktionalität bereitzustellen.
GET https://righty.chargemap.com/users/default/configuration HTTP/2.0 accept: application/json,application/json authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2OTEyNDg0ODAsImV4cCI6MTY5MTI1NTY4MCwiY2xpZW50X2lkIjo5N30.OvRYB95ehJ7GN-xx67-8BJhBUMayFPwbwp_HUVWixZL8VD1OaeAG-gDTwbf7mDsV5PfKeFhB1Uq_aYOfem2ahwhNwvieJ5RGv426PKctAIPjhlfpKCKTzZDEzEt_n56PsnMDfNpSWNbAPD6mmd8ovQhudH1kfaXyvKhGkMWF9hPW2wFNcz_OIFsBDu_4Ea3eVOLxvLTiVyQpkeRAgq-OsEmuQLQsy8xb_5InOcbOxZEKW5BvdzXqIFTVREnD2aUKwUPwCYV4VwZUSZslsNiahqrcE8k4cvh1tEV9YNJb3hSy-pHvnPi1dxhqCMdQITLGQOwuPpmuV4T5XbAnVAKWKP00eZNcgW6YVH2OT_bdk2cFlAbCnutSTCRsJuWalsxkDGR0MD1B-cEnSxy6z6sTdCmiXi_SCyBFjyBVr0Yd2OwksKt5RbZUzvdJJ0POYN1SfdtMmOAmzAKIVJd-z5ko7GKey0rGzhPjXQXpYJ_gUttiXYZnl7izE4oLxfbGSsOk025MCDIH9WFWBt_P3e6cQzC7jfupE-ysc86AfvsomuCCVleOtQ4h9BI0nd6I_A5mVbQmseBU8ttKw2Wow7Uib0KOrbRm2bCWaJ0sAh27y37KLzj_htaruNUPHtCjQBi_ec8S686_BB9fxbHJAeAvfC0sgqqu80NNGsFA981q-tc accept-charset: UTF-8 user-agent: Ktor client content-type: */* accept-encoding: gzip No content
Fazit: Die App begeht mit der Einbindung von zahlreichen verhaltensbasierten, geräteübergreifenden Trackern massive Datenschutzverstöße. Ein Fall für die Behörden und Gerichte. Bitte unbedingt deinstallieren.
Chargenow
Chargenow ist ein mittelgroßer Ladeanbieter aus dem Umfeld deutscher Autohersteller. Die Preise sind abhängig von der verwendeten Ladesäule, können aber vorab in der Karte abgerufen werden.
Die Verbindungen:
[1] Mixpanel, ein App-Analyse-Dienst (der Inhalt war base64-decodiert).
POST https://api.mixpanel.com/track/?ip=1 HTTP/1.1 Content-Length: 787 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.mixpanel.com Connection: Keep-Alive Accept-Encoding: gzip URLEncoded form [{„event“:“Integration“,“properties“:{„mp_lib“:“Android“,“$lib_version“:“7.3.1″,“$os“:“Android“,“$os_version“:“11″,“$manufacturer“:“samsung“,“$brand“:“samsung“,“$model“:“SM-G900F“,“$screen_dpi“:480,“$screen_height“:1920,“$screen_width“:1080,“$app_version“:“3.41.1″,“$app_version_string“:“3.41.1″,“$app_release“:“360″,“$app_build_number“:“360″,“$has_nfc“:true,“$has_telephone“:true,“$wifi“:true,“$bluetooth_version“:“ble“,“token“:“85053bf24bba75239b16a601d9387e17″,“distinct_id“:“45d34ff2107c23df37a32df803d40170″,“Project Token“:“45d34ff2107c23df37a32df803d40170″},“$mp_metadata“:{}}]
[2] Microsoft wird als Cloudserver für die Funktionalität der App genutzt.
GET https://chargenowidm.b2clogin.com/chargenowidm.onmicrosoft.com/b2c_1a_chargenow_prod_susi/oauth2/v2.0/authorize?redirect_uri=com.digitalchargingsolutions.prod.b2c.android%3A%2F%2Foauthredirect%2F&client_id=ff79c8f4-5ba9-45ae-aa6e-539565d1da47&response_type=code&prompt=login&state=7fsRPkicFhdC0JSFx9tNlg&scope=openid%20offline_access%20ff79c8f4-5ba9-45ae-aa6e-539565d1da47&code_challenge=6p2P4b8LyhXhYgXwZhitm4PZFCcOnSKJ_hegT2hNsm4&code_challenge_method=S256 HTTP/1.1 Host: chargenowidm.b2clogin.com User-Agent: Mozilla/5.0 (Android 11; Mobile; rv:109.0) Gecko/115.0 Firefox/115.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: de-DE Accept-Encoding: gzip, deflate, br DNT: 1 Connection: keep-alive Upgrade-Insecure-Requests: 1 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 Query redirect_uri: com.digitalchargingsolutions.prod.b2c.android://oauthredirect/ client_id: ff79c8f4-5ba9-45ae-aa6e-539565d1da47 response_type: code prompt: login state: 7fsRPkicFhdC0JSFx9tNlg scope: openid offline_access ff79c8f4-5ba9-45ae-aa6e-539565d1da47 code_challenge: 6p2P4b8LyhXhYgXwZhitm4PZFCcOnSKJ_hegT2hNsm4 code_challenge_method: S256
[3] Lokalise organisiert die Spracheinstellung der App und erhält keine personenbezogenen Daten.
GET https://ota.lokalise.co/v2.0/android/ HTTP/1.1 X-Request-Id: 2a438745-4495-4f76-a6db-da8b3b0fd60b X-Lokalise-Api-Key: b455aaa9197b6f628efa3c57d3f063360647638f X-Lokalise-Project-Id: 458638736059c06039ed65.32788671 X-Lokalise-Prerelease: 0 X-Lokalise-Current-Bundle: 0 X-Lokalise-Language: de X-Lokalise-Region: DE X-Lokalise-App-Language: de_DE X-Lokalise-Device-Language: de_DE X-Lokalise-SDK-Build: 221 X-Lokalise-App-Build: 360 X-Lokalise-UID: d6d1ebcf-4b95-4a26-9375-5d58d044b607 User-Agent: Lokalise SDK; 221; Android; com.digitalchargingsolutions.b2c; 360; de; SM-G900F (klte); 11 (30); Host: ota.lokalise.co Connection: Keep-Alive Accept-Encoding: gzip No content
[4] Google Maps stellt den Kartendienst der App.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 382 X-Google-Maps-Mobile-API: com.digitalchargingsolutions.b2c,360,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\x8d\xb7\xed!@XJV\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x013 \x041069 \x01* com.digitalchargingsolutions.b2c2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xcc\x01AH0uPGGN5U7TmhvnFeA-0P3mEXziHzV2x4Nvi21Ux0H-9gK3lDa5AH-DaT6R7EMIJblUMcrHd8cylTDO8Q_t481znlvM-48Hg65Hu8UCin6wobaymkdPwY5iBuLfmcOdQGdzOYBMLw52NoikgR-WaYSqqZfFmSueTrTSZnt7Ms6QKgp2M6nKC3Lb8s-sIA6feynikHWuS1WX\xba\x02\x03360\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03\x93\x00\x00\x00\x04 \x02\x08\x04
Fazit: Einer der wenigen Anbieter, die ohne Googles Firebase arbeiten. Der Kartendienst von Google Maps erhält verschlüsselte Daten, die ich nicht bewerten kann. Der Analysedienst von Mixpanel und das Hosting auch der Nutzerkonten bei Microsoft sind sicher kaum geeignet für einen datenschutzkonformen Betrieb.
DKV Mobility
DKV Mobility stammt auch aus dem Bereich der Tankkarten und Flottenkunden, man kann also nicht als Privatkunde eine DKV-Karte erhalten. Entsprechend habe ich die App auch nicht mit Login getestet. Bis dorthin machte sie aber einen sehr guten Eindruck. So wurde man gesetzeskonform gefragt, ob man in eine Analyse einwilligen will und die Standardeinstellung war ohne Analyse.
Die Verbindungen:
[1] DKV-Server: Die API für die Ladepunkte wird von DKV bei Akamai gehostet. Die App meldet sich auch ohne Login mit einer von der App generierten Geräte-ID.
POST https://my.dkv-mobility.com/apidnext/next-generation/mau-service/save HTTP/1.1 x-api-key: 4d271ca7-5431-4n31-b406-e438e12b2a34 Content-Type: application/json; charset=UTF-8 Content-Length: 56 Host: my.dkv-mobility.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.9.3 JSON { „deviceId“: „a2e6c1e86a294696“, „requestType“: „no_login“ }
[2] Here wird als Kartendienst verwendet. Beim Appstart sendet die App eine Installations-ID und erhält dann eine ID, die für den Kartendienst verwendet wird. Here kann also jede Geo-Anfrage einer ID zuordnen, weshalb es nicht ganz unproblematisch ist, der App einen Standortzugriff zu erlauben. Im Vergleich mit US-amerikanischen Kartendiensten ist es aber von Vorteil, dass Here vorwiegend im Besitz der deutschen Fahrzeughersteller Audi, BMW und Mercedes-Benz Group ist und damit keine Ortungsdaten an Geheimdienste abfließen können.
POST https://account.api.here.com/oauth2/token HTTP/1.1 Host: account.api.here.com Accept: */* Connection: TE TE: gzip Accept-Encoding: deflate, gzip Authorization: OAuth oauth_consumer_key=“4iSOb-VdZnYhiDeo8xZHcg“,oauth_nonce=“81a9e993-25f1-4904-93da-905199ab5b79″,oauth_signature_method=“HMAC-SHA256″,oauth_timestamp=“1691254595″,oauth_version=“1.0″,oauth_signature=“%2FFMDz%2FolgBuEV5xcJ5VJjSR5vFfbFsupyWKTWFPJlNw%3D“ User-Agent: OLP-CPP-SDK/1.15.4 (Android) HERE-SDK-4.14.3.0/explore Content-Type: application/json Content-Length: 84 JSON { „deviceId“: „67a965ef-4e3e-429a-9d1f-5bfab9b604cf“, „grantType“: „client_credentials“ }
[3] Microsoft Cloud: Einige Grafiken sind bei Microsoft gehostet, hier werden aber keinerlei Gerätedaten oder IDs übertragen.
GET https://weudkvproappfwstorage.blob.core.windows.net/configstorage/pins/service_laden_indicator_none_state_occupied_dark_mode_false.svg HTTP/1.1 Host: weudkvproappfwstorage.blob.core.windows.net Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.9.3 No content
Fazit: Eine der wenigen gesetzeskonformen Apps im Test, soweit ich sie ohne Login testen konnte. Mit dem deutschen Kartenanbieter Here und dem Fehlen von Analysesoftware oder Google Firebase ist die App aus Datenschutzsicht besonders empfehlenswert.
Easy Charging Quality (z.B. Entega)
Entega ist ein Energieanbieter aus Darmstadt und mit der Ladekarte und App bekommt man vor allem an dessen Säulen einen festen Preis. Die App, die man auf der Seite von Entega angeboten bekommt, ist aber gar nicht von Entega, sondern von Last Mile Solutions, einem Ladetechnik- und Software-Anbieter aus den Niederlanden.
Die Verbindungen:
[1] Google Firebase wird über die Installation informiert.
POST https://firebaseinstallations.googleapis.com/v1/projects/easy-charging-quality/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.easyChargingQuality.app x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 579669100C23AEA3D7D2EC37576D984A8BF4137A x-goog-api-key: AIzaSyAF6O4YReOnZpqzitpRHIiZ_NI0Tm_0Wzo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 139 [decoded gzip] JSON { „appId“: „1:612538561314:android:7aa5034d8aebadb9956b7b“, „authVersion“: „FIS_v2“, „fid“: „eSvinM8gRWSP9dHPuGwwS8“, „sdkVersion“: „a:17.0.1“ }
[2] Last Mile Solutions Server Hier werden unter anderem die Ladesäulen für die Karte per API angefragt. Der Server registriert die App hier gleich mit einer ID, die vermutlich für die Installation stabil ist. Nicht ideal, aber da man sich vermutlich irgendwann per Login identifizieren muss, kein großes Problem.
POST https://mobile-gateway.evc-net.com/api/v1/appConfig/getAppProfile HTTP/1.1 Accept-Charset: UTF-8 x-api-key: 25691479-c6b3-4f10-b784-1a9abe91377e Content-Type: application/json User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: mobile-gateway.evc-net.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 238 JSON { „androidBundleIdentifier“: „com.easyChargingQuality.app“, „appVersion“: „1.0.12“, „deviceId“: „44c42fabba6eee37“, „iOSBundleIdentifier“: „“, „locale“: „de“, „platform“: „:4.4.0–android-11“, „serviceName“: „ECQ“, „serviceVersion“: „1.0.11“, „webUrl“: „“ }
[2] Piwik: Diese Analysesoftware analysiert profilbezogen die Interaktion mit der App. Das ist mit der personenbeziehbaren _id
eigentlich einwilligungspflichtig. Piwik kann auch selbst installiert werden, hier läuft es aber als Service von Piwik direkt. Das involviert einen weiteren Drittanbieter, was immer schlecht ist. Wer darüber hinwegsehen kann, dass ein Webentwickler am anderen Ende der Leitung die angeklickten Pfade durch die App betrachtet, ist das kein Riesenproblem. Das Analysetool sammelt keine Geo-Parameter aus der Karten- und Ladenutzung. Die Parameter kann man bei Piwik nachschlagen. Die Analyse geht damit aber über eine rein technische Überwachung der Appstabilität und Sicherheit hinaus.
POST https://lastmilesolutions.piwik.pro/ppms.php HTTP/2.0 content-length: 260 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 content-type: application/x-www-form-urlencoded; charset=utf-8 accept: */* origin: https://evc-net.com x-requested-with: com.easyChargingQuality.app sec-fetch-site: cross-site sec-fetch-mode: no-cors sec-fetch-dest: empty referer: https://evc-net.com/ accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 URLEncoded form ping: 1 idsite: bc9ff9b9-2f7a-4ebd-9aff-83482860cdaa rec: 1 r: 518729 h: 17 m: 27 s: 1 url: https://evc-net.com/home/map-view _id: a4bcfd2df006e171 _idts: 1692285793 _idvc: 1 _idn: 0 _viewts: 1692285793 send_image: 0 ts_n: jstc_tm ts_v: 2.16.2 gt_ms: 337 pv_id: vzYMn8
[3] Google Maps Browser: Bei der App handelt es sich offenbar um eine Web-App: Der Kartendienst ist in der Browservariante eingebunden. Das hat Vorteile für den Datenschutz und für Smartphones ohne Google Play Services. Aber die Karten waren sehr langsam auf meinem Gerät.
GET https://maps.google.com/maps/vt/pb=!1m4!1m3!1i14!2i8395!3i5416!2m3!1e0!2sm!3i658398911!3m12!2sde-DE!5e18!12m4!1e68!2m2!1sset!2sRoadmap!12m4!1e26!2m2!1sstyles!2zcy50OjJ8cy5lOmd8cC52Om9mZixzLnQ6NnxzLmU6Z3xwLmM6I2ZmYmZkM2Y4fHo6MnxwLmM6I2ZmYjZjY2Y3fHo6NHxwLmM6I2ZmYjFjOGY2fHo6NnxwLmM6I2ZmYWRjNWY1fHo6OHxwLmM6I2ZmYTljMmY0fHo6MTB8cC5jOiNmZmE1YmZmM3x6OjEyfHAuYzojZmZhMWJjZjIscy50OjJ8cy5lOmwuaXxwLnY6b2ZmfHo6MTN8cC52Om9mZnx6OjE1fHAudjpvZmYscy50OjR8cy5lOmwuaXxwLnY6b2ZmLHMudDozfHMuZTpsLnQuZnxwLmM6I2ZmNmU2ZjcyfHo6MTN8cC5jOiNmZjczNzQ3OHx6OjE1fHAuYzojZmY2ZTZmNzJ8ejoxNnxwLmM6I2ZmNjk2YTZkfHo6MTh8cC5jOiNmZjVmNjA2MyxzLnQ6MzN8cC52Om9mZixzLnQ6Mzd8cC52Om9mZixzLnQ6NDB8cy5lOmd8cC52Om9uLHMudDozNXxzLmU6Z3xwLnY6b2ZmLHMudDozNnxzLmU6Z3xwLnY6b2ZmLHMudDozM3xzLmU6Z3xwLnY6b2ZmLHMudDo2NXxzLmU6Z3xwLnY6b2ZmLHMudDozNHxzLmU6Z3xwLnY6b2ZmLHMudDo4MnxzLmU6Z3xwLnY6b24scy50OjM5fHMuZTpnfHAudjpvbixzLnQ6NDB8cy5lOmwuaXxwLnY6b2ZmLHMudDozNXxzLmU6bC5pfHAudjpvbnx6OjEwfHAudjpvZmZ8ejoxM3xwLnY6b2ZmfHo6MTV8cC52Om9ufHo6MTZ8cC52Om9mZixzLnQ6MzZ8cy5lOmwuaXxwLnY6b2ZmLHMudDozM3xzLmU6bC5pfHAudjpvZmZ8ejoxN3xwLnY6b2ZmfHo6MTh8cC52Om9mZixzLnQ6NjV8cy5lOmwudHxwLnY6b2ZmLHMudDozNHxzLmU6bC5pfHAudjpvZmZ8ejoxNnxwLnY6b24scy50OjM3fHMuZTpsLml8cC52Om9mZixzLnQ6Mzl8cy5lOmwuaXxwLnY6b258ejoxNHxwLnY6b2ZmLHMudDozOHxzLmU6bC5pfHAudjpvZmYscy50OjIwfHMuZTpsLnQuZnx6OjExfHAuYzojZmY1NjYwNzF8ejoxM3xwLmM6I2ZmNjM2ZTgzfHo6MTR8cC5jOiNmZjdjODc5YyxzLnQ6MTMxM3xzLmU6Z3xwLnY6b258ejoxMnxwLnY6b2ZmLHMudDoxMjk3fHMuZTpnfHAuYzojZmZmMGYyZjQscy50OjEyOTl8cy5lOmd8cC5jOiNmZmY5ZjllY3xwLnY6b258ejoxNHxwLmM6I2ZmZjZmNmVlfHo6MTV8cC5jOiNmZmY2ZjZlZXx6OjE2fHAuYzojZmZmNWY1ZjAscy50OjEwNTh8cy5lOmwuaXxwLnY6b2Zm!4e1!6m11!1e12!2i2!19m1!1e0!20m1!1e0!30m1!1f2!39b1!44e1!50e0!23i1376099!23i1379903!26m2!1e5!1e3!28i658 HTTP/2.0 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 accept: */* origin: https://evc-net.com x-requested-with: com.easyChargingQuality.app sec-fetch-site: cross-site sec-fetch-mode: cors sec-fetch-dest: empty accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 No content
Fazit: Ich konnte die App nicht komplett testen: Sie lief in meinem Analyse-Setup zu instabil und ich konnte evtl. auch nicht alle Anfragen abfangen. Das ging aber offenbar auch anderen Nutzenden so, wenn ich mir die Kommentare im Play Store anschaue. Beim Datenschutz ist die App nicht ideal: Die Installation wird an Google gemeldet und der Dienst kann bei möglichen Abstürzen Inhalte aus der App an Google senden. Ein Analysedienst bei dem technischen Anbieter der App erhält Daten – auch das ist nicht optimal. Ich sehe bei den etwas hohen Preisen und der Instabilität trotzdem wenig Chancen, dass man diese mäßigen Datenschutzmängel hinnehmen möchte.
eCharge+
Diese App gehörte früher mal zu Innogy, wurde dann aber von der Compleo-Gruppe übernommen, die wegen einer Insolvenz Anfang des Jahres in das Lüdenscheider Stecker-Imperium Kostal überging. Insofern ist das hier vielleicht auch nur eine Zwischenaufnahme. Die App bietet 185.000 Ladestationen zu mittlerweile gar nicht so guten Preisen.
Nach dem Start finden sich folgende Verbindungen:
[1] Google Firebase wird für die Dienste Firebase Installations und Crashyltics mit eindeutigen Installations-IDs kontaktiert.
POST https://firebaseinstallations.googleapis.com/v1/projects/e-kwh-redsign/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.innogy.echarge x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: CC01BF385CA66B8363580172F7DC30140F687E7A x-goog-api-key: AIzaSyDduMAqBSV3Su7hjk12HlrPuygZwJHAjD8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:762062343546:android:ec36efa9b43b93b1“, „authVersion“: „FIS_v2“, „fid“: „flKylTEfSayEYyBOCFfRz7“, „sdkVersion“: „a:17.1.3“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:762062343546:android:ec36efa9b43b93b1/settings?instance=f55b1e45e2091c16bed2351fd14612b7774e0f07&build_version=11302&display_version=1.13.2&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: 6472a967281b4a5489b9d99f4f2b0898 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.7 User-Agent: Crashlytics Android SDK/18.3.7 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:762062343546:android:ec36efa9b43b93b1 X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: f55b1e45e2091c16bed2351fd14612b7774e0f07 build_version: 11302 display_version: 1.13.2 source: 4
[2] Pay1.de wird als Zahlungsdienstleister eingebunden, erhält zu diesem Zeitpunkt aber noch keine Daten.
GET https://secure.pay1.de/client-api/js/v1/payone_hosted_min.js HTTP/1.1 Host: secure.pay1.de Connection: keep-alive User-Agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 Accept: */* X-Requested-With: com.innogy.echarge Sec-Fetch-Site: cross-site Sec-Fetch-Mode: no-cors Sec-Fetch-Dest: script Accept-Encoding: gzip, deflate Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 No content
[3] Google Firebaseio.com: Diese Datenbanksystem wird offenbar als schnelle Lösung für einen Teil der App-Funktionalität genutzt. Welche Daten dort gelagert werden, wenn man sich per Login identifiziert hat, konnte ich nicht prüfen. Es gab von der App immer wieder zahlreiche Kontakte zu google.com, die ich nicht einsehen konnte, aber vielleicht wird Rechnungsadresse oder Fahrzeug auch nur lokal im Smartphone gespeichert.
GET https://s-usc1a-nss-2015.firebaseio.com/.ws?v=5&ls=m7iVpgcyvMMhk38V3ZUZTTC3QZbgeGrC&ns=echarge-production HTTP/1.1 Host: s-usc1a-nss-2015.firebaseio.com Connection: Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 Upgrade: websocket Origin: https://localhost:4200 Sec-WebSocket-Version: 13 Accept-Encoding: gzip, deflate Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Sec-WebSocket-Key: aOHnN/ciTi2VNDLpFzSK7w== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Query v: 5 ls: m7iVpgcyvMMhk38V3ZUZTTC3QZbgeGrC ns: echarge-production
[4] Google Maps ist als Kartendienst eingebunden. Hier konnte ich mit ein bisschen Glück eine Abfrage einfangen, die aber zusätzlich verschlüsselte Elemente enthielt.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 625 X-Google-Maps-Mobile-API: com.innogy.echarge,11302,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17nE \x16\xcf\xb1aS\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x01\x12 \x041069 \x01*\x12com.innogy.echarge2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGFndbPwnLrTU6flKvRtm75rIvD9XenSBuiPlBanIxTcGJwOo6FfH28yQ2ThGsrIf_YVGwDX_QgnMx7EGxkiRfefYp0IOEKEQNmInCyLS7JzTzcddCxifftnW9f9P_hK_Evvpwoy1ro-LniTZGKy8V4l9qvYxMd_rmHjTwWz1MUQ9Hb6obU\xba\x02\x0511302\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xc9\xe8\xf5n\xf0\x03\x03K\x00\x00\x00\xaa \x0b\x08\x06\x11\x17\x02\xec \x00\x00\x00\x00 \x0b\x08\x08\x11\xdeH\x10\xaf\x00\x00\x00\x00 \x0b\x08\x0c\x11\xc3\x00\xfc\x03\x00\x00\x00\x00 \x0b\x08%\x11′{\x0b\xc1\x00\x00\x00\x00 \x0b\x08-\x112\xe2j\xd7\x00\x00\x00\x00 \x0b\x08\x10\x11o\x11d\xf2\x00\x00\x00\x00\x12Z\x08\x01\x10\x01\x18\x01″R\x12\x1dandroid:samsung-klte-SM_G900F“\x03Web*\x02302\x12com.innogy.echargeM\x00\x00@@X\x00b\x0511302j\x062.34.1K\x00\x00\x00i \x0b\x08\x05\x11\xc6\x82\x8b\xda\x00\x00\x00\x00\x12Z\x08\x01\x10\x01\x18\x01″R\x12\x1dandroid:samsung-klte-SM_G900F“\x03Web*\x02302\x12com.innogy.echargeM\x00\x00@@X\x00b\x0511302j\x062.34.1
[5] eCharge Server: Über eine API werden Details der Karte wie z.B. die Ladestationen und ihre Verfügbarkeit abgefragt. Hier finden sich keine auffälligen Daten.
POST https://api.services-emobility.com/bff/echarge/graphql HTTP/2.0 content-length: 805 accept: application/json, text/plain, */* authorization: Basic RUNIQVJHRV9BUElfVVNSOktKUnp4b0MxbnYh user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 content-type: application/json origin: https://localhost:4200 x-requested-with: com.innogy.echarge sec-fetch-site: cross-site sec-fetch-mode: cors sec-fetch-dest: empty accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 GraphQL { „operationName“: „SearchLocations“, „variables“: { „includeUnknownPlugTypes“: true, „locationArea“: { „latitudeFrom“: 51.48948986170543, „latitudeTo“: 51.54354228599038, „longitudeFrom“: 7.4328819662332535, „longitudeTo“: 7.494680397212506 }, „filterInput“: { „emaids“: [] }, „page“: 0, „pageSize“: 150 }, „query“: „…“ } — query SearchLocations($page: Int, $pageSize: Int, $locationArea: LocationAreaInput!, $filterInput: FilterInput, $includeUnknownPlugTypes: Boolean = true) { locationMarker( page: $page pageSize: $pageSize locationArea: $locationArea filter: $filterInput includeUnknownPlugTypes: $includeUnknownPlugTypes ) { id latitude longitude aggregatedStatus chargeStationOpen chargePointsAvailableCount chargeStationsCount maritime __typename } }
Fazit: Mit vielen Google-Diensten ist diese App definitiv nichts für Datenschutzfreunde. Sieht man von den ersten App-Start ab, die an Google Firebase gemeldet werden, findet sich kein Analysedienst in der App.
Electromaps
Dieser spanische Anbieter dürfte für alle interessant sein, die mit ihrem Elektroauto nach Spanien fahren wollen. Die Abdeckung vor Ort mit der App und dem RFID-Chip ist doch ein gutes Stück besser als mit den deutschen Anbietern. Der Hinweis „enthält Werbung“ im Playstore verheißt aber bereits nichts Gutes.
Die Verbindungen:
[1] Google Firebase: Gleich vier Verbindungen gehen beim Start an die verschiedenen Dienste von Googles Analysetool raus.
GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:366054282439:android:4784e882c6134fe4/settings?instance=091744947c877bfa6e9ca8ff500448e2df36d786&build_version=400071&display_version=4.7.1&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: 0ba9d447ca5f4a17b12e002a64d52fbb X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.2 User-Agent: Crashlytics Android SDK/18.3.2 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:366054282439:android:4784e882c6134fe4 X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 091744947c877bfa6e9ca8ff500448e2df36d786 build_version: 400071 display_version: 4.7.1 source: 4 POST https://firebaseremoteconfigrealtime.googleapis.com/v1/projects/366054282439/namespaces/firebase:streamFetchInvalidations HTTP/1.1 X-Goog-Api-Key: AIzaSyAw2KnsOlbZ8IoQAgADFHW3SJnKhXDru5Y X-Android-Package: com.enredats.electromaps X-Android-Cert: A0CD98AA1B4F26DCE4FDE2C5F7E5F9001492164B X-Google-GFE-Can-Retry: yes X-Accept-Response-Streaming: true Content-Type: application/json Accept: application/json User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfigrealtime.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 150 JSON { „appId“: „1:366054282439:android:4784e882c6134fe4“, „lastKnownVersionNumber“: „0“, „namespace“: „firebase“, „project“: „366054282439“, „sdkVersion“: „21.4.0“ } POST https://firebaseinstallations.googleapis.com/v1/projects/electromaps-app/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.enredats.electromaps x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: A0CD98AA1B4F26DCE4FDE2C5F7E5F9001492164B x-goog-api-key: AIzaSyAw2KnsOlbZ8IoQAgADFHW3SJnKhXDru5Y User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:366054282439:android:4784e882c6134fe4“, „authVersion“: „FIS_v2“, „fid“: „d2Yq3ODDRGKfaK3Pvv7THK“, „sdkVersion“: „a:17.1.3“ } RequestResponseConnectionTiming POST https://firebaseremoteconfig.googleapis.com/v1/projects/366054282439/namespaces/firebase:fetch HTTP/1.1 X-Goog-Api-Key: AIzaSyAw2KnsOlbZ8IoQAgADFHW3SJnKhXDru5Y X-Android-Package: com.enredats.electromaps X-Android-Cert: A0CD98AA1B4F26DCE4FDE2C5F7E5F9001492164B X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6MzY2MDU0MjgyNDM5OmFuZHJvaWQ6NDc4NGU4ODJjNjEzNGZlNCIsImV4cCI6MTY5MzQ5NTE3NCwiZmlkIjoiZDJZcTNPRERSR0tmYUszUHZ2N1RISyIsInByb2plY3ROdW1iZXIiOjM2NjA1NDI4MjQzOX0.AB2LPV8wRAIgXsV2DL9sYefJHPVmXI7_yRPxSPJn-Re_DbhftXGj19QCIEqwQDXrKxXulddC4ZB0F5b6U5Pc8l_E0vBgWScD_Bt4 Content-Type: application/json Accept: application/json X-Firebase-RC-Fetch-Type: BASE/1 Content-Length: 697 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: {}, „appBuild“: „400071“, „appId“: „1:366054282439:android:4784e882c6134fe4“, „appInstanceId“: „d2Yq3ODDRGKfaK3Pvv7THK“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6MzY2MDU0MjgyNDM5OmFuZHJvaWQ6NDc4NGU4ODJjNjEzNGZlNCIsImV4cCI6MTY5MzQ5NTE3NCwiZmlkIjoiZDJZcTNPRERSR0tmYUszUHZ2N1RISyIsInByb2plY3ROdW1iZXIiOjM2NjA1NDI4MjQzOX0.AB2LPV8wRAIgXsV2DL9sYefJHPVmXI7_yRPxSPJn-Re_DbhftXGj19QCIEqwQDXrKxXulddC4ZB0F5b6U5Pc8l_E0vBgWScD_Bt4“, „appVersion“: „4.7.1“, „countryCode“: „DE“, „firstOpenTime“: „2023-08-24T16:00:00.000Z“, „languageCode“: „de-DE“, „packageName“: „com.enredats.electromaps“, „platformVersion“: „30“, „sdkVersion“: „21.4.0“, „timeZone“: „Europe/Amsterdam“ }
[2] Stripe, ein Zahlungsanbieter, erhält bereits Details zur App und zur Installation, obwohl noch gar nichts bezahlt werden muss. Das darf so nicht sein.
POST https://m.stripe.com/6 HTTP/1.1 Cookie: m= User-Agent: Stripe/v1 AndroidBindings/20.17.0 Accept-Charset: UTF-8 X-Stripe-User-Agent: {„lang“:“kotlin“,“bindings_version“:“20.17.0″,“os_version“:“30″,“type“:“samsung_samsung_SM-G900F“,“model“:“SM-G900F“} Content-Type: application/json; charset=UTF-8 Host: m.stripe.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 284 JSON { „a“: { „c“: { „v“: „de_DE“ }, „d“: { „v“: „Android 11 REL 30“ }, „f“: { „v“: „1080w_1920h_480dpi“ }, „g“: { „v“: „1“ } }, „b“: { „d“: „“, „e“: „“, „k“: „com.enredats.electromaps“, „l“: „4.7.1“, „o“: „11“, „p“: 30, „q“: „samsung“, „r“: „samsung“, „s“: „SM-G900F“, „t“: „release-keys“ }, „src“: „android-sdk“, „tag“: „20.17.0“, „v2“: 1 }
[3] Mixpanel, ein App-Analyse-Dienst (der Inhalt ist hier bereits base64-decodiert).
POST https://api.mixpanel.com/track/?ip=1 HTTP/1.1 Content-Length: 2085 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.mixpanel.com Connection: Keep-Alive Accept-Encoding: gzip URLEncoded form data: [{„event“:“$ae_first_open“,“properties“:{„mp_lib“:“android“,“$lib_version“:“7.2.1″,“$os“:“Android“,“$os_version“:“11″,“$manufacturer“:“samsung“,“$brand“:“samsung“,“$model“:“SM-G900F“,“$screen_dpi“:480,“$screen_height“:1920,“$screen_width“:1080,“$app_version“:“4.7.1″,“$app_version_string“:“4.7.1″,“$app_release“:“400071″,“$app_build_number“:“400071″,“$has_nfc“:true,“$has_telephone“:true,“$wifi“:true,“$bluetooth_version“:“ble“,“token“:“a8e7312dfbdf568c88364eaecb6a9f7b“,“time“:1692890374249,“distinct_id“:“1b7c6a86-1183-4ebd-b3b4-1722994549d7″,“$had_persisted_distinct_id“:false,“$device_id“:“1b7c6a86-1183-4ebd-b3b4-1722994549d7″},“$mp_metadata“:{„$mp_event_id“:“ba23148eccad6497″,“$mp_session_id“:“ee467f601c657148″,“$mp_session_seq_id“:0,“$mp_session_start_sec“:1692890374}},{„event“:“screen_walk1″,“properties“:{„mp_lib“:“android“,“$lib_version“:“7.2.1″,“$os“:“Android“,“$os_version“:“11″,“$manufacturer“:“samsung“,“$brand“:“samsung“,“$model“:“SM-G900F“,“$screen_dpi“:480,“$screen_height“:1920,“$screen_width“:1080,“$app_version“:“4.7.1″,“$app_version_string“:“4.7.1″,“$app_release“:“400071″,“$app_build_number“:“400071″,“$has_nfc“:true,“$has_telephone“:true,“$wifi“:true,“$bluetooth_version“:“ble“,“token“:“a8e7312dfbdf568c88364eaecb6a9f7b“,“time“:1692890377178,“distinct_id“:“1b7c6a86-1183-4ebd-b3b4-1722994549d7″,“$had_persisted_distinct_id“:false,“$device_id“:“1b7c6a86-1183-4ebd-b3b4-1722994549d7″},“$mp_metadata“:{„$mp_event_id“:“793c4704c388b1b2″,“$mp_session_id“:“f0e282620dc048b7″,“$mp_session_seq_id“:0,“$mp_session_start_sec“:1692890375}}]
[4] Braze ist eine „Customer Engagement Platform. Hier werden alle Klicks in der App analysiert, um damit bestimmte Marketingaktionen auch auf anderen Kanälen auszulösen.
POST https://sdk.fra-01.braze.eu/api/v3/data HTTP/1.1 Accept-Encoding: gzip, deflate Content-Type: application/json X-Braze-Api-Key: faeae837-e0f4-434c-8c20-32e62f1ff40a Content-Length: 489 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: sdk.fra-01.braze.eu Connection: Keep-Alive JSON { „api_key“: „faeae837-e0f4-434c-8c20-32e62f1ff40a“, „app_version“: „4.7.1“, „app_version_code“: „400071.0.0.0“, „device_id“: „14bece45-da63-4a77-976d-1760fcb3f890“, „events“: [ { „data“: { „n“: „event_location_rejected“ }, „name“: „ce“, „session_id“: „82ce9fee-0f97-449f-8a58-e8df74f66114“, „time“: 1692891038.167, „user_id“: „17fc4a58-88cf-4654-b299-8c61e187235a“ } ], „respond_with“: { „config“: { „config_time“: 1691491195 }, „user_id“: „17fc4a58-88cf-4654-b299-8c61e187235a“ }, „sdk_version“: „23.3.0“, „time“: 1692891056 }
[5] Adjust ist ein weiterer Analysedienst, der stark auf Marketing ausgerichtet ist. Er kann offenbar auch die AAID (Android Werbe-ID) erhalten, was die nutzende Person dann auch auf anderen Plattformen ansprechbar macht.
POST https://app.adjust.com/session HTTP/1.1 Client-SDK: android4.33.0 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: app.adjust.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 973 URLEncoded form gps_adid_attempt: 1 country: DE api_level: 30 event_buffering_enabled: 0 hardware_name: lineage_klte-userdebug 11 RQ3A.211001.001 92502ee78e app_version: 4.7.1 app_token: ty7qnryhlx4w installed_at: 2023-08-01T18:46:17.379Z+0200 session_length: 0 created_at: 2023-08-24T17:27:07.638Z+0200 device_type: phone language: de gps_adid: 00000000-0000-0000-0000-000000000000 connectivity_type: 1 device_manufacturer: samsung display_width: 1080 time_spent: 0 device_name: SM-G900F needs_response_details: 1 os_build: RQ3A.211001.001 updated_at: 2023-08-04T18:19:59.259Z+0200 cpu_type: armeabi-v7a screen_size: normal screen_format: long gps_adid_src: service subsession_count: 1 os_version: 11 android_uuid: 2a060956-98ef-48cc-be7d-0883ae0e10a5 last_interval: 451 environment: production screen_density: high attribution_deeplink: 1 session_count: 1 display_height: 1920 package_name: com.enredats.electromaps os_name: android ui_mode: 1 tracking_enabled: 0 sent_at: 2023-08-24T17:27:07.704Z+0200
[6] Amazon Cognito wird als Servicedienst für die Anmeldung bei der App genutzt. Die Daten habe ich Base64-decodiert.
POST https://cognito-idp.eu-west-1.amazonaws.com/ HTTP/2.0 content-type: application/x-amz-json-1.1 x-amz-target: AWSCognitoIdentityProviderService.SignUp user-agent: aws-sdk-kotlin/0.21.1-beta os/android/3.4.113-lineageos-g76f2c76e68d lang/kotlin/1.8.10 lib/amplify-android/2.5.0 md/samsung/SM-G900F md/locale/de_DE x-amz-user-agent: aws-sdk-kotlin/0.21.1-beta amz-sdk-invocation-id: afaea408-0345-40ac-b9fc-53b8933e089c amz-sdk-request: attempt=1; max=3 content-length: 1376 accept-encoding: gzip Raw {„ClientId“:“******“,“Password“:“********“,“UserAttributes“:[],“UserContextData“:{„EncodedData“:“{„payload“:“{\“contextData\“:{\“ApplicationName\“:\“Electromaps\“,\“ApplicationTargetSdk\“:\“33\“,\“ApplicationVersion\“:\“4.7.1\“,\“DeviceBrand\“:\“samsung\“,\“DeviceFingerprint\“:\“samsung\\\/kltexx\\\/klte:6.0.1\\\/MMB29M\\\/G900FXXU1CRH1:user\\\/release-keys\“,\“DeviceHardware\“:\“qcom\“,\“DeviceName\“:\“SM-G900F\“,\“Product\“:\“klte\“,\“BuildType\“:\“userdebug\“,\“DeviceOsReleaseVersion\“:\“11\“,\“DeviceSdkVersion\“:\“30\“,\“ClientTimezone\“:\“01:00\“,\“Platform\“:\“ANDROID\“,\“ThirdPartyDeviceId\“:\“android_id\“,\“DeviceId\“:\“d8b76477-1890-4796-8477-ce702e673ebb:1692890944027\“,\“DeviceLanguage\“:\“de_DE\“,\“ScreenHeightPixels\“:\“1920\“,\“ScreenWidthPixels\“:\“1080\“},\“username\“:\“*******@protonmail.com\“,\“userPoolId\“:\“eu-west-1_H7LsQnxSb\“,\“timestamp\“:\“1692890821415\“}“,“signature“:“rc6iVizG1GPWB51RZnwSgEjfLE3U8VCnw\/5K1I+AVu0=“,“version“:“ANDROID20171114″}“},“Username“:“*****@protonmail.com“}
[7] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Type: application/binary User-Agent: com.enredats.electromaps/400071 (Linux; U; Android 11; de_DE; SM-G900F; Build/RQ3A.211001.001; Cronet/113.0.5672.24) X-Device-Elapsed-Time: 1105938224918226 X-Google-Maps-Mobile-API: com.enredats.electromaps,400071,11.77.200,11.77.200,android:samsung-klte-SM_G900F Content-Length: 753 Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 00 18 ff ff ff ff ff ff ff ff 00 05 64 65 2d 44 …………de-D 0000000010 45 00 1d 61 6e 64 72 6f 69 64 3a 73 61 6d 73 75 E..android:samsu 0000000020 6e 67 2d 6b 6c 74 65 2d 53 4d 5f 47 39 30 30 46 ng-klte-SM_G900F 0000000030 00 09 31 31 2e 37 37 2e 32 30 30 00 03 64 65 76 ..11.77.200..dev 0000000040 00 3e ff ff fd f4 1f 8b 08 00 00 00 00 00 00 00 .>………….. 0000000050 05 c1 3d 8c 93 50 00 00 e0 7b 50 1b 75 71 75 74 ..=..P…{P.uqut 0000000060 36 69 f3 1e 94 02 83 c3 5d 7f a1 14 5e 79 48 69 6i……]…^yHi 0000000070 97 86 03 fa 4a 0b 47 29 70 bd 63 3a 37 27 87 c6 ….J.G)p.c:7′.. 0000000080 98 f3 12 13 13 93 73 d3 8b a3 a3 b3 a3 83 b9 a9 ……s……… 0000000090 a3 71 50 07 37 17 bf ef 7e 05 41 91 7b 04 1e 3f .qP.7…~.A.{..? 00000000a0 f4 92 b8 1e 9c 6c 02 df cd b3 7a 10 05 5e be 49 …..l….z..^.I 00000000b0 62 77 9d 71 4c bb 23 81 a3 8f 40 40 e8 49 d1 a3 bw.qL.#…@@.I.. 00000000c0 4e c0 a5 ab b0 34 cf 4e 25 6a 27 53 a2 ae 5c 7d N….4.N%j’S..\} 00000000d0 e4 d1 86 36 1c c4 b2 ae 6c 74 69 ad 51 05 f2 c7 …6….lti.Q… 00000000e0 59 36 50 0c 5e c1 da 69 69 c6 93 51 62 f7 d6 6e Y6P.^..ii..Qb..n 00000000f0 34 5f 38 31 51 33 dd 90 61 ba 48 fb b6 10 50 27 4_81Q3..a.H…P‘ 0000000100 c7 b9 e3 86 ce 36 f0 b1 2a d4 8e 3a 35 4a cb 21 …..6..*..:5J.! 0000000110 5d 0e 8d 59 cc c9 ed a5 60 b4 4f 78 01 8e 73 c9 ]..Y….`.Ox..s. 0000000120 d0 45 db 2b 9b 59 c7 1c af 35 de a6 e7 90 98 8d .E.+.Y…5…… 0000000130 85 e0 2f 30 e7 73 e6 34 cb 05 09 a5 35 54 92 9a ../0.s.4….5T.. 0000000140 46 3d 0c 76 a0 4a 26 c4 ea 0c af c0 c1 0d a8 dc F=.v.J&……… 0000000150 02 86 87 3f c0 c1 05 03 9e 33 e0 13 f3 15 1c f6 …?…..3…… 0000000160 61 81 7b fd b9 87 79 c1 9f 34 b5 c1 60 b5 55 0b a.{…y..4..`.U. 0000000170 2a 6d 9e 92 08 19 13 4c 94 30 6e 06 ba 82 fc e6 *m…..L.0n….. 0000000180 bc df 58 27 26 3e b4 12 b5 d6 ea cd b0 c1 79 65 ..X’&>……..ye 0000000190 37 52 47 d6 b6 6c 39 09 24 89 66 4d 93 c3 9e 31 7RG..l9.$.fM…1 00000001a0 c9 a3 a8 9f 86 a3 b8 55 d6 88 bf 3c 8e c7 21 ea …….U…{.2.b..{..}… 0000000220 ec 6e c8 ab ef e4 c3 ce 7a 7d 6d ed 59 f0 87 65 .n……z}m.Y..e 0000000230 77 95 3b 7c 1d d5 e1 65 e5 d7 b7 17 ff c0 db ca w.;|…e…….. 0000000240 5f 76 5f b9 fc fd e6 7d f5 3f b9 c4 a7 de 1c 02 _v_….}.?…… 0000000250 00 00 00 27 00 00 00 99 22 76 68 74 74 70 73 3a …’….“vhttps: 0000000260 2f 2f 77 77 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d //www.google.com 0000000270 2f 6d 61 70 73 2f 76 74 2f 69 63 6f 6e 2f 6e 61 /maps/vt/icon/na 0000000280 6d 65 3d 61 73 73 65 74 73 2f 69 63 6f 6e 73 2f me=assets/icons/ 0000000290 74 72 61 6e 73 69 74 2f 6c 6f 63 61 6c 69 7a 61 transit/localiza 00000002a0 74 69 6f 6e 73 2f 65 73 2f 63 6f 6d 6d 75 74 65 tions/es/commute 00000002b0 72 2d 72 61 69 6c 5f 69 6e 73 69 64 65 2d 30 2d r-rail_inside-0- 00000002c0 74 69 6e 79 2e 70 6e 67 26 73 63 61 6c 65 3d 34 tiny.png&scale=4 00000002d0 4a 1f 64 75 68 23 67 65 74 54 65 78 74 75 72 65 J.duh#getTexture 00000002e0 46 6f 72 4c 61 62 65 6c 45 6c 65 6d 65 6e 74 28 ForLabelElement( 00000002f0 29
[8] Electromaps Server: Von hier werden dann die Ladepunkte für die Karte geladen und auch einige User-Account-Aktionen durchgeführt. Der Server ist bei Amazon gehostet.
GET https://www.electromaps.com/mapi/v2/locations/217878/images?offset=0&limit=10 HTTP/1.1 X-Em-Oidc-Data: eyJraWQiOiJEY2NYRGl6bXR6S0J5UE1YNko0XC9qb2R4aVRQZGpxUkpUMldWeDYrRkc5bz0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJlNTFmMDFkNC1iYWUzLTQ3NjctYmU3NC0zNDJjMGNjYjBlMWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZWxlY3Ryb21hcHNfaWQiOiIxN2ZjNGE1OC04OGNmLTQ2NTQtYjI5OS04YzYxZTE4NzIzNWEiLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9IN0xzUW54U2IiLCJjb2duaXRvOnVzZXJuYW1lIjoiZTUxZjAxZDQtYmFlMy00NzY3LWJlNzQtMzQyYzBjY2IwZTFkIiwib3JpZ2luX2p0aSI6IjAwYWY4OGIxLTFmNDEtNGI0YS1iNjRiLTZlNzY3ZDM1Y2ExMCIsImF1ZCI6ImUyNTgybWtmN2R2a2xuZDNkOTFtcGZycjAiLCJldmVudF9pZCI6IjU0OGRhNzU5LTQzNjEtNDE3Mi04YTcxLWUzYjllZTBmYjFmMCIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjkyODkwOTg3LCJjdXN0b206ZWxlY3Ryb21hcHNfaWQiOiIxN2ZjNGE1OC04OGNmLTQ2NTQtYjI5OS04YzYxZTE4NzIzNWEiLCJleHAiOjE2OTI5NzczODcsImlhdCI6MTY5Mjg5MDk4NywianRpIjoiNWY1NzU1MzYtMWVkYy00NDA0LTk4NmMtYWM3YTdmMGJjOWMwIiwiZW1haWwiOiJncnJ0ZXN0aUBwcm90b25tYWlsLmNvbSJ9.fX_KCeXPR1YCLGZoGY-4BX0dQU4cY9RpTGelOdaC_xekdL0AgkvmPNYX-HoDAvQXN05jKP8AowEEkMvqPl-NEh3urYs_AOdyxoupA9pZ5w0FMbpI5VMxNIRSTUn-RAWRk_m48dLhpfD4_YCEdYjeeOMfsHTHzst5OXOXCEZk83VAFpl7gI5H0N3FEXI0IPTPei-a7gM4TZhgELoEhw4vndWDnUcRpIbBsMNa0bS5eqPm7LSc5wT2VtOq-8uroxOW_GA3sT31_neK7JVoZjVJp4r3NTCdv34ETyy7SVUmtgJBv-rwcnMT8I9RXA9EDWygwOXhGgw2rVFTUyM8Q50N2g X-Em-Oidc-Accesstoken: eyJraWQiOiJjK1lcL2Z3UXpadzYrTlFWZUVURzgwaFZTZlJvNElWaFZnemlFTXp1YVp6VT0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJlNTFmMDFkNC1iYWUzLTQ3NjctYmU3NC0zNDJjMGNjYjBlMWQiLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9IN0xzUW54U2IiLCJjbGllbnRfaWQiOiJlMjU4Mm1rZjdkdmtsbmQzZDkxbXBmcnIwIiwib3JpZ2luX2p0aSI6IjAwYWY4OGIxLTFmNDEtNGI0YS1iNjRiLTZlNzY3ZDM1Y2ExMCIsImV2ZW50X2lkIjoiNTQ4ZGE3NTktNDM2MS00MTcyLThhNzEtZTNiOWVlMGZiMWYwIiwidG9rZW5fdXNlIjoiYWNjZXNzIiwic2NvcGUiOiJhd3MuY29nbml0by5zaWduaW4udXNlci5hZG1pbiIsImF1dGhfdGltZSI6MTY5Mjg5MDk4NywiZXhwIjoxNjkyOTc3Mzg3LCJpYXQiOjE2OTI4OTA5ODcsImp0aSI6IjVjODJkMGZmLTMyMTMtNDJjNy1iYjhhLWEyNWQ0ZTFjNzMwMiIsInVzZXJuYW1lIjoiZTUxZjAxZDQtYmFlMy00NzY3LWJlNzQtMzQyYzBjY2IwZTFkIn0.JzFSVeOgd1MMtoXcwT6ToK3k4__ER8j_g4dJg5TZfvBDJ2QKcJFY29ZA9dEk_wt02JbUyP6EavyOjNqhvAB90bXy4mTCPK69oS6JzEfqzuF47NZto1xEoNWGwBTAMdbcVxcl9LSLa9CAPZAcQ7wMKqvGuk4760AhHB3O5cwHErcQMKVC_8_xMBpMOzmQaMMAW88COmDd_VrFneMknx3xBYSVdoCrsIhMR2ZF2yb8cvs5cf_W5uD0d6AS9RWCcxKiWbo_MosR2uKmB4GbRR91E0-bAUn1J6puNj3czRKAQKjdWbsy9c1X3zy2fvW5Yh0qM9IC05JdA2sPGlU_C6feGw adid: 8fd4863f5ab6f55a1e2aac42eec0b416 Language: de App-version: 400071 App-platform: android Host: www.electromaps.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/5.0.0-alpha.11 Query offset: 0 limit: 10
Fazit: Die App enthält sehr viele Drittanbieter. Mixpanel und Adjust sind keine reinen Analysedienste mehr, die man für die interne Entwicklung nutzt, sondern überschreiten die Grenze zum Marketing. Man muss also damit rechnen, dass man in der App oder auf anderen Plattformen beworben wird, je nachdem wie man die App benutzt. So oder so bräuchten sie aber eine Einwilligung. Die App ist damit ein Fall für Behörden oder Gerichte. Ich empfehle, sie nicht zu nutzen bzw. sie zu deinstallieren.
Elli Charging
Diese Ladeapp ist von Volkswagen, kann aber auch mit anderen Automarken genutzt werden. Neben einem recht hohen kw-Preis gibt es auch Abotarife, die dann einen geringeren kw-Preis haben, insbesondere wenn man nur die günstigen Partner-Netzwerken ansteuert.
Direkt nach dem Start stellt die App folgende Verbindungen her:
[1] Google Firebase
POST https://firebaseinstallations.googleapis.com/v1/projects/frontends-android-elli-emsp/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.elli.android.emsp x-firebase-client: H4sIAAAAAAAAAF2R2W7CMBBFf6XyM17iCBrxKxUPQzwEK14qe4haIf4dEwdL7eMczb13lju7IiQ6I1Bmx687gwkDsSO72IR8jAmlVqIX6qMCl_lMP7IbCts39q4hmBSt4d4Gns0s9aG2QAD3S3asYt0J3QxLQoU1ZY7kbJCdGESn_on_COFG1xfoCjC42BH5OZV8mcHnW5jaLDZkAucwyTF6sVGxYDC2dG0JK5R9swrgUc6O8A18NOgqWSWbK5CNoaz_WebQLfK78EtMXjZCkCak9SZ9z3bMAOHr3kwr3XM1cHVgp8dpxxZMuViWB2j2eALP7hPqnQEAAA X-Android-Cert: 97688F5417FC9C2379DF317F6CD50E3031D91B17 x-goog-api-key: AIzaSyCE8V94mODxgGA_cIHt8tm-TfEwogCbrXk User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:899101476127:android:95888c9a8a03d75bb85c2a“, „authVersion“: „FIS_v2“, „fid“: „d0DX_8hZTCi0_6GLK1US2l“, „sdkVersion“: „a:17.1.2“ }
[2] LaunchDarkly ist ein Analysedienst. Bei der mitgesendeten ID context/key
handelt es sich relativ sicher um eine Installations-ID, so dass alle Aktionen in der App personenbeziehbar aufgezeichnet und verarbeitet werden. Der Key war jedenfalls innerhalb mehrere App-Starts der selbe, nach einer Neuinstallation aber ein anderer. Dafür wäre eine Einwilligung notwendig.
POST https://mobile.launchdarkly.com/mobile/events/bulk HTTP/2.0 authorization: api_key mob-cf14575c-7177-4da3-8a8c-91b7bfd7557b user-agent: AndroidClient/4.2.0 x-launchdarkly-payload-id: 96cd573b-c669-4b69-8c78-2a6dc6a27e95 x-launchdarkly-event-schema: 4 content-type: application/json; charset=utf-8 content-length: 974 accept-encoding: gzip JSON [ { „context“: { „androidAppVersion“: „2.37.0-2567“, „androidAppVersionCode“: 2567, „anonymous“: true, „appVersion“: „2.37.0“, „branding“: „elli“, „key“: „47a8c987-13b7-4b44-a94a-5495088af288“, „kind“: „user“, „os“: „Android“ }, „creationDate“: 1691330391575, „kind“: „identify“ }, { „context“: { „androidAppVersion“: „2.37.0-2567“, „androidAppVersionCode“: 2567, „anonymous“: true, „appVersion“: „2.37.0“, „branding“: „elli“, „key“: „47a8c987-13b7-4b44-a94a-5495088af288“, „kind“: „user“, „os“: „Android“ }, „creationDate“: 1691330391584, „kind“: „identify“ }, { „context“: { „androidAppVersion“: „2.37.0-2567“, „androidAppVersionCode“: 2567, „anonymous“: true, „appVersion“: „2.37.0“, „branding“: „elli“, „key“: „47a8c987-13b7-4b44-a94a-5495088af288“, „kind“: „user“, „os“: „Android“ }, „creationDate“: 1691330393075, „kind“: „identify“ }, { „endDate“: 1691330394317, „features“: { „platform-auth-0-integration“: { „contextKinds“: [ „user“ ], „counters“: [ { „count“: 3, „unknown“: true, „value“: false } ], „default“: false } }, „kind“: „summary“, „startDate“: 1691330391617 } ] POST https://mobile.launchdarkly.com/mobile/events/diagnostic HTTP/2.0 authorization: api_key mob-cf14575c-7177-4da3-8a8c-91b7bfd7557b user-agent: AndroidClient/4.2.0 content-type: application/json; charset=utf-8 content-length: 778 accept-encoding: gzip JSON { „configuration“: { „allAttributesPrivate“: false, „backgroundPollingDisabled“: false, „backgroundPollingIntervalMillis“: 3600000, „connectTimeoutMillis“: 10000, „customBaseURI“: false, „customEventsURI“: false, „customStreamURI“: false, „diagnosticRecordingIntervalMillis“: 900000, „evaluationReasonsRequested“: false, „eventsCapacity“: 100, „eventsFlushIntervalMillis“: 30000, „maxCachedUsers“: 5, „mobileKeyCount“: 1, „reconnectTimeMillis“: 1000, „streamingDisabled“: false, „useReport“: false }, „creationDate“: 1691330391525.0, „id“: { „diagnosticId“: „dec11d35-6bc5-439a-9e10-1e6badc72263“, „sdkKeySuffix“: „d7557b“ }, „kind“: „diagnostic-init“, „platform“: { „androidSDKVersion“: 30, „name“: „Android“, „osArch“: „armv7l“, „osVersion“: „3.4.113-lineageos-g76f2c76e68d“ }, „sdk“: { „name“: „android-client-sdk“, „version“: „4.2.0“ } }
Erst nach diesen Übertragungen erscheint das Einwilligungsfenster, bei dem ich ablehne.
[3] Elli Server: Per API werden Informationen über Ladepunkte von api.elli.eco abgerufen. Hier kann ich keine personenbeziehbaren IDs erkennen. Als Hoster wird Google verwendet.
GET https://api.elli.eco/searchandfind/v4/nearbylocations?long=11.5754485&lat=48.1373932&radius=5000&offset=0&limit=100&min_charging_speed=3&max_charging_speed=100000&connector_type_id=1000&connector_type_id=1100&connector_type_id=1200&connector_type_id=1400&connector_type_id=2000&connector_type_id=2100&connector_type_id=2200 HTTP/1.1 X-apikey: AATR1oqYAZzp6o6ndALfIk6GG1dOcDED Authorization: Bearer null Accept-Language: de-DE Connection: close Accept: application/json Accept-Charset: UTF-8 User-Agent: Ktor client Host: api.elli.eco Accept-Encoding: gzip Query long: 11.5754485 lat: 48.1373932 radius: 5000 offset: 0 limit: 100 min_charging_speed: 3 max_charging_speed: 100000 connector_type_id: 1000 connector_type_id: 1100 connector_type_id: 1200 connector_type_id: 1400 connector_type_id: 2000 connector_type_id: 2100 connector_type_id: 2200
[4] Google Maps wird als Kartendienst verwendet und erhält entsprechend alle Positionsdaten und -abfragen. Soweit ich das nachvollziehen kann, sind sowohl key und Android-Cert and die App gebunden und keine IDs, die das Gerät, die Installation oder die Nutzperson identifizieren.
GET https://maps.googleapis.com/maps/api/place/autocomplete/json?key=AIzaSyCHAvXbMtST0JPpzZwvdNEwlDg50ma_9Gk&language=de-DE&input=marienplatz&locationbias=rectangle%3A48.137162816740930%2C11.575280420589962%7C48.137417182944010%2C11.575661580354248&origin=48.137290000000000%2C11.575471000000000 HTTP/1.1 X-Android-Cert: 97688F5417FC9C2379DF317F6CD50E3031D91B17 X-Places-Android-Sdk: 3.0.0 X-Android-Package: com.elli.android.emsp User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: maps.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Query key: AIzaSyCHAvXbMtST0JPpzZwvdNEwlDg50ma_9Gk language: de-DE input: marienplatz locationbias: rectangle:48.137162816740930,11.575280420589962|48.137417182944010,11.575661580354248 origin: 48.137290000000000,11.575471000000000
Fazit: Wieder so eine App, die auf der Oberfläche brav nach Einwilligungen fragt, aber bereits vorher Analysedaten mit IDs übertragen hat. Die Diagnosedaten sehen auf den ersten Blick sehr technisch aus, aber die Software lässt sich mit der pseudonymen ID auch für langfristige A/B-Tests einsetzen, so dass die Grenze zur Verhaltensanalyse überschritten ist. Ich würde die App nicht nutzen. Wer wirklich unbedingt mit Elli laden möchte, kann aber die App einmalig installieren, ein Konto (idealerweise mit einer nur dafür erstellten E-Mail-Adresse) anlegen, eine Zahlungsmethode zum Beispiel per Lastschrift eintragen und die Ladekarte aus Plastik bestellen. Ob das auch ohne Google Play Services mit dem Aurora Store funktioniert, kann ich nicht sagen.
Elvah
Elvah verfolgt einen etwas anderen Ansatz als die meisten Anbieter: Man bucht dort ein festes Kontingent und muss sich dann nicht mehr um Preise kümmern. Ob das wirklich günstiger ist, hängt am Ende einfach vom eigenen Fahrtenmuster ab. Erst nach meinem Test habe ich bemerkt, dass Elvah insolvent ist und an E.ON Drive übergeben wird, so dass man ohnehin erstmal über die Zukunftspläne schlau machen sollte, bevor man sich dort anmeldet.
In der App von Elvah fand ich folgende Verbindungen:
[1] Google Firebase
POST https://firebaseinstallations.googleapis.com/v1/projects/elvah-app/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: de.elvah x-firebase-client: H4sIAAAAAAAAAFVRQY6EIBD8iuE8oMjByXxlnQNK6xIVDPSaTSbz920F3cyRoqq6uvrFvkEH7EBjZI-vF9MjOGQPNtgAvPcB2rKuRC2qIiFzbEt5F0rUF8An_P0EVwjDoVOXjpwSL7tNHmfrSCbuQlaFdiZ4a_hiHY9mIppKwqFf9oeQQiZAd0iAFGRTGNhsD7wLJG_LqJf448bLy7qIep4htGXvF5FhsYEzlmiHW-ZotN7tmzU0KEfO_LZU1TnI6YX6mGaEE1m8gTlDhyr0R7qrsI8Buak05Iy50ufgA62ZFEjbxNUHPDqVormYqMMImPpR6r_qq1iqm92Y0Qj7MVld1YpXDZeKPd_PG9sgRIpB163Z-w-iTC6V-gEAAA X-Android-Cert: B4C0FC4B606B6DBAAC09664C7DEAAE299099984E x-goog-api-key: AIzaSyD0hWNK5lmFloIJsQQyYYTF1Jd76BxF8i8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 { „appId“: „1:228594893805:android:16c172429ad71e68b11de4“, „authVersion“: „FIS_v2“, „fid“: „ceW0neIdRBC74t_AQmNuyC“, „sdkVersion“: „a:17.1.0“ } Add code
[2] Rudderstack: Die App wird mit einem Baukasten-System des US-amerikanischen Softwareanbieters Rudderstack betrieben. Der operiert zwar als Auftragsverarbeiter, aber behält sich alle Rechte der auf der Plattform anfallenden Nutzungsdaten (nicht aber die in der App verwendeten Daten) vor. Diese sollen dann anonymisiert oder agreggiert sein. Parameter wie „anonymousId“ wirken auf den ersten Blick wie altbekannte Datenschutz-Trickserei aus der Startup-Szene. Diese Verbindungen waren leider auch Tage nach er letzten Nutzung im Hintergrund aktiv.
POST https://elvahwilfte.dataplane.rudderstack.com/v1/batch HTTP/1.1 Content-Type: application/json Authorization: Basic MkJXNkI1RHY0dXZxOWJ0aXpEV2FweFA1ZjU1Og== AnonymousId: ZjhmYzIxYzQ0ZDc0ZjY4Yg== User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: elvahwilfte.dataplane.rudderstack.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 995 { „batch“: [ { „anonymousId“: „f8fc21c44d74f68b“, „channel“: „mobile“, „context“: { „app“: { „build“: „3776“, „name“: „elvah“, „namespace“: „de.elvah“, „version“: „5.4.1“ }, „device“: { „id“: „f8fc21c44d74f68b“, „manufacturer“: „samsung“, „model“: „SM-G900F“, „name“: „klte“, „type“: „Android“ }, „library“: { „name“: „com.rudderstack.android.sdk.core“, „version“: „1.12.0“ }, „locale“: „de-DE“, „network“: { „carrier“: „“, „cellular“: false, „wifi“: true }, „os“: { „name“: „Android“, „version“: „11“ }, „screen“: { „density“: 480, „height“: 1920, „width“: 1080 }, „sessionId“: 1689262052, „timezone“: „Europe/Amsterdam“, „traits“: { „anonymousId“: „f8fc21c44d74f68b“, „profile_utm_medium“: „organic“, „profile_utm_source“: „google-play“ }, „userAgent“: „Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001)“ }, „event“: „Application Backgrounded“, „integrations“: { „All“: true }, „messageId“: „185eb40e-7ea9-437d-9f14-1108962e691a“, „originalTimestamp“: „2023-07-13T15:28:05.689Z“, „sentAt“: „2023-07-13T15:28:05.966Z“, „type“: „track“ } ], „sentAt“: „2023-07-13T15:28:05.966Z“ }
[3] Onesignal. Dieser Dienst imlementiert offenbar die Push-Nachrichten für die App. Hier finden sich keine auffälligen Daten.
POST https://api.onesignal.com/players HTTP/1.1 SDK-Version: onesignal/android/040805 Accept: application/vnd.onesignal.v1+json Content-Type: application/json; charset=UTF-8 Content-Length: 332 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.onesignal.com Connection: Keep-Alive Accept-Encoding: gzip { „android_package“: „de.elvah“, „app_id“: „4bd2ffdc-d444-4119-8685-69a01599e963“, „device_model“: „SM-G900F“, „device_os“: „11“, „device_type“: 1, „external_user_id“: „“, „game_version“: 3776, „language“: „de“, „net_type“: 0, „notification_types“: -9, „rooted“: false, „sdk“: „040805“, „sdk_type“: „native“, „timezone“: 7200, „timezone_id“: „Europe/Amsterdam“ }
[4] Amazon. Hier werden die Nutzeraccounts offenbar verwaltet und soweit die Parameter vermuten lassen, auch für Analysezwecke ausgewertet.
POST https://cognito-idp.eu-central-1.amazonaws.com/ HTTP/1.1 aws-sdk-invocation-id: fa598a88-b525-4f65-bdb2-ba1a4fb7c472 User-Agent: amplify-android/1.37.10 (Android 11; samsung SM-G900F; de_DE) aws-sdk-retry: 0/0 Accept-Encoding: identity X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth Content-Type: application/x-amz-json-1.1 Content-Length: 2316 Host: cognito-idp.eu-central-1.amazonaws.com Connection: Keep-Alive {„AuthFlow“:“USER_SRP_AUTH“,“AuthParameters“:{„SECRET_HASH“:“uM/J6bi4WaC+h7MA56JR+o+NAU/ydN47NaNOmtCXg+U=“,“USERNAME“:“********@protonmail.com“,“SRP_A“:“d4dce013cf28beb141afbf819ea5b11ad56f96de7ca262f277bc6b50fa5ea17bd0bc5b80ee5066947e81292b71098dd1c8dd5e91f2eae4556beecda843de2e071d41263f8b02a218505849c096ea6b638f2c41545b4e0f4fae502acad79f7441ab6547deccf393933140f843a8ca84b4d81cbe112f87f573c3d1ffcdcb8c641db2b8f1fe8983bdb2b6d67555b1f5e0f1c4adb16d63880f6ac02326882aa8f73f2cd11c846a495c162856ccf769bcce8ec75424e4378d7cab0c6888fd1a9d4b949d48a86faf79371fbff6c6429a3d728844f95ef24f3685d83f7e26b4e9bac5e7a4be2297f1c89d0c230c4922f3d805c0ac8886a3ffbcea07236fba6f8a8b3fc403278f70a72a72ac1a74e7292a8a4ed16cfe9b8408c9fa890e108def27b395c81fbfb5709c4312778434a0fc0c26faa3214ceb780e52f3e1b967674ebc88ac2e01d0cd835e09c4c24b1d1f0df9862b9b36489215f3cd67f9dfd9567367716e15954512b08c4ce0913c4b20cde747579b70878da1e128418290ad5092e187c95e“},“ClientMetadata“:{},“ClientId“:“5aojens15772l7t0nitmqjtc95″,“AnalyticsMetadata“:{„AnalyticsEndpointId“:“08007fcc-84a0-4dc3-9877-e98e7f263a7f“},“UserContextData“:{„EncodedData“:“eyJwYXlsb2FkIjoie1wiY29udGV4dERhdGFcIjp7XCJEZXZpY2VGaW5nZXJwcmludFwiOlwic2Ft\\nc3VuZ1xcXC9rbHRleHhcXFwva2x0ZTo2LjAuMVxcXC9NTUIyOU1cXFwvRzkwMEZYWFUxQ1JIMTp1\\nc2VyXFxcL3JlbGVhc2Uta2V5c1wiLFwiQXBwbGljYXRpb25OYW1lXCI6XCJlbHZhaFwiLFwiQXBw\\nbGljYXRpb25WZXJzaW9uXCI6XCI1LjQuMVwiLFwiUGxhdGZvcm1cIjpcIkFORFJPSURcIixcIkFw\\ncGxpY2F0aW9uVGFyZ2V0U2RrXCI6XCIzM1wiLFwiRGV2aWNlSWRcIjpcIjg2YTZlY2E5LWNhMDct\\nNDhiNi1iZDBkLTU4MTlhYTA4N2U1MToxNjg5MjYzNDc4OTk0XCIsXCJEZXZpY2VCcmFuZFwiOlwi\\nc2Ftc3VuZ1wiLFwiUHJvZHVjdFwiOlwia2x0ZVwiLFwiVGhpcmRQYXJ0eURldmljZUlkXCI6XCJh\\nbmRyb2lkX2lkXCIsXCJEZXZpY2VPc1JlbGVhc2VWZXJzaW9uXCI6XCIxMVwiLFwiQ2xpZW50VGlt\\nZXpvbmVcIjpcIjAxOjAwXCIsXCJEZXZpY2VMYW5ndWFnZVwiOlwiZGVfREVcIixcIkRldmljZVNk\\na1ZlcnNpb25cIjpcIjMwXCIsXCJTY3JlZW5XaWR0aFBpeGVsc1wiOlwiMTA4MFwiLFwiQnVpbGRU\\neXBlXCI6XCJ1c2VyZGVidWdcIixcIlNjcmVlbkhlaWdodFBpeGVsc1wiOlwiMTkyMFwiLFwiRGV2\\naWNlSGFyZHdhcmVcIjpcInFjb21cIixcIkRldmljZU5hbWVcIjpcIlNNLUc5MDBGXCJ9LFwidXNl\\ncm5hbWVcIjpcImhhcGlsYXRvQHByb3Rvbm1haWwuY29tXCIsXCJ1c2VyUG9vbElkXCI6XCJldS1j\\nZW50cmFsLTFfTXBvczhtNUJ6XCIsXCJ0aW1lc3RhbXBcIjpcIjE2ODkyNjM0Nzg5OTdcIn0iLCJz\\naWduYXR1cmUiOiJmUnJGa2VKS1BySGNLOXdwWFo3QXNhb3JVZUNKUmU4Q2JDZUoxT3o4SndRPVxu\\nIiwidmVyc2lvbiI6IkFORFJPSUQyMDE3MTExNCJ9\\n“}}
[5] Mapbox. Als Kartendienst kommt das relativ datenschutzfreundliche Mapbox SDK zum Einsatz (dabei wird allerdings auch eine User-ID sku
mitgesendet, die offenbar für die Abrechnung bzw. Traffic-Kappung von Mapbox benötigt wird). Mapbox vermietet in dieser Form gesammelte Bewegungsdaten auch als anonymisierte Bewegungsdaten weiter. Das sieht sauber aus, aber auch hier gibt es keine Sicherheit, dass US-Behörden über solche SDKs auch an präzisere Daten kommen.
GET https://api.mapbox.com/styles/v1/elvah-prod/ckz3x0avs000e14qpu3r2umdc/ar9ks2uib6kwo2dw8hqglggts/sprite@2x.png?access_token=pk.eyJ1IjoiZWx2YWgtcHJvZCIsImEiOiJja3FnbGtmaWoyNTJtMnBxdHhqdGswMWIzIn0.c8v8xAFoe1z-W5hQF7OnGg&sku=100mLCjnT2y8f1c4c5d-3245-45a8-bd03-c2a9c01645c1 HTTP/1.1 user-agent: de.elvah/5.4.1/3776 MapboxCommon/22.1.0 Android (30; klte (SM-G900F)) Host: api.mapbox.com Connection: Keep-Alive Accept-Encoding: gzip access_token: pk.eyJ1IjoiZWx2YWgtcHJvZCIsImEiOiJja3FnbGtmaWoyNTJtMnBxdHhqdGswMWIzIn0.c8v8xAFoe1z-W5hQF7OnGg sku: 100mLCjnT2y8f1c4c5d-3245-45a8-bd03-c2a9c01645c1
[6] Firebase. Dieses Logging von Firebase enthält leider sehr viele personenbezogenen Daten:
POST https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog HTTP/1.1 User-Agent: datatransport/3.1.8 android/ Content-Encoding: gzip Content-Type: application/json Accept-Encoding: gzip X-Goog-Api-Key: AIzaSyCckkiH8i2ZARwOs1LEzFKld15aOG8ozKo Host: firebaselogging-pa.googleapis.com Connection: Keep-Alive Content-Length: 1672 { „logRequest“: [ { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „3776“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1689263641394, „eventUptimeMs“: 18947703, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „Cg4Io63U/5QxEK+m1v+UMRoLCgkIgMAEEICAgAUiCGRlLmVsdmFo“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „GDT_CLIENT_METRICS“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1689263641398, „requestUptimeMs“: 18947707 }, { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „3776“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1689263611273, „eventUptimeMs“: 18917582, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTIvMjE3OS8xNDIxLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1ZjiIseerhYyAA1D19QRqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263611322, „eventUptimeMs“: 18917631, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTIvMjE3OS8xNDIwLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1ZjiY/+erhYyAA1DdogVqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263611338, „eventUptimeMs“: 18917648, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGq8BCl9odHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvOC8xMzYvODgudmVjdG9yLnBiZhABKMgBMhZhcHBsaWNhdGlvbi94LXByb3RvYnVmOKCm6KuFjIADUNOwB2oiCiA1NmJiZGM0ODA2NDY0YjNiODIzNWU3ZTRlNDVhZWJhYw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263611872, „eventUptimeMs“: 18918182, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGoIBCjhodHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucxABKMgBMhBhcHBsaWNhdGlvbi9qc29uOKDk/auFjIADUJCBFGoiCiA1NmJiZGM0ODA2NDY0YjNiODIzNWU3ZTRlNDVhZWJhYw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263612190, „eventUptimeMs“: 18918499, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrABClFodHRwczovL2FwaS5vbmVzaWduYWwuY29tL3BsYXllcnMvZTRiZTk1Y2QtNTQ3OC00MTZlLWFjYzMtOTU5OTdmYWZkYWVhL29uX3Nlc3Npb24QAxgwIDsoyAEyH2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTg44MKdrIWMgANIf1DrxAdqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263613215, „eventUptimeMs“: 18919524, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTMvNDM1OC8yODQyLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1Zjiwj92shYyAA1COxgZqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263613241, „eventUptimeMs“: 18919550, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTMvNDM1OS8yODQyLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1ZjiIw96shYyAA1DFnwZqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263613253, „eventUptimeMs“: 18919562, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTMvNDM1OC8yODQzLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1ZjjY1d2shYyAA1CBlAhqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263613418, „eventUptimeMs“: 18919727, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTMvNDM1OS8yODQzLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1Zji4sN+shYyAA1DB6hBqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263613926, „eventUptimeMs“: 18920236, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGrMBCmNodHRwczovL2FwaS5tYXBib3guY29tL3Y0L21hcGJveC5tYXBib3gtdGVycmFpbi12MixtYXBib3gubWFwYm94LXN0cmVldHMtdjgvMTIvMjE3OS8xNDIwLnZlY3Rvci5wYmYQASjIATIWYXBwbGljYXRpb24veC1wcm90b2J1ZjjwvYythYyAA1CqswJqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263613990, „eventUptimeMs“: 18920299, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGoIBCjhodHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucxABKMgBMhBhcHBsaWNhdGlvbi9qc29uOIi8iq2FjIADUITBCGoiCiA1NmJiZGM0ODA2NDY0YjNiODIzNWU3ZTRlNDVhZWJhYw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263620152, „eventUptimeMs“: 18926462, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGqcBCl1odHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucy9jMmVkMDVmNS0wNGM4LTQwOWMtOGVmMS02ZWNlN2I4NDY3YTEQASjIATIQYXBwbGljYXRpb24vanNvbjiAiYWwhYyAA1CGggZqIgogNTZiYmRjNDgwNjQ2NGIzYjgyMzVlN2U0ZTQ1YWViYWM=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263620980, „eventUptimeMs“: 18927289, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGoIBCjhodHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucxABKMgBMhBhcHBsaWNhdGlvbi9qc29uOODBu7CFjIADUL2KAmoiCiA1NmJiZGM0ODA2NDY0YjNiODIzNWU3ZTRlNDVhZWJhYw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263622640, „eventUptimeMs“: 18928950, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGoEBCjhodHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucxABKMgBMhBhcHBsaWNhdGlvbi9qc29uONjioLGFjIADUM9QaiIKIDU2YmJkYzQ4MDY0NjRiM2I4MjM1ZTdlNGU0NWFlYmFj“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263626645, „eventUptimeMs“: 18932954, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGqYBCl1odHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucy9jMmVkMDVmNS0wNGM4LTQwOWMtOGVmMS02ZWNlN2I4NDY3YTEQASjIATIQYXBwbGljYXRpb24vanNvbjjw5pazhYyAA1CzKWoiCiA1NmJiZGM0ODA2NDY0YjNiODIzNWU3ZTRlNDVhZWJhYw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263627347, „eventUptimeMs“: 18933657, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGoIBCjhodHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucxABKMgBMhBhcHBsaWNhdGlvbi9qc29uOLjOwLOFjIADUNXQAWoiCiA1NmJiZGM0ODA2NDY0YjNiODIzNWU3ZTRlNDVhZWJhYw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1689263628199, „eventUptimeMs“: 18934508, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmQKLTE6MjI4NTk0ODkzODA1OmFuZHJvaWQ6MTZjMTcyNDI5YWQ3MWU2OGIxMWRlNBIWY2VXMG5lSWRSQkM3NHRfQVFtTnV5QxoZCghkZS5lbHZhaBIGMjAuMy4wGgU1LjQuMSgBGoEBCjhodHRwczovL3N0YXRpb24tZmluZGVyLnByb2QuZWNoYXJnZS5zZXJ2aWNlcy92Mi9zdGF0aW9ucxABKMgBMhBhcHBsaWNhdGlvbi9qc29uONjO9LOFjIADUOEtaiIKIDU2YmJkYzQ4MDY0NjRiM2I4MjM1ZTdlNGU0NWFlYmFj“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „FIREPERF“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1689263641399, „requestUptimeMs“: 18947708 } ] }
[7] Stripe ist als Zahlungsdienstleister in die App eingebunden. Die Daten fließen bereits, obwohl noch gar nichts bezahlt werden sollte.
POST https://m.stripe.com/6 HTTP/1.1 Cookie: m= User-Agent: Stripe/v1 AndroidBindings/20.17.0 Accept-Charset: UTF-8 X-Stripe-User-Agent: {„lang“:“kotlin“,“bindings_version“:“20.17.0″,“os_version“:“30″,“type“:“samsung_samsung_SM-G900F“,“model“:“SM-G900F“} Content-Type: application/json; charset=UTF-8 Host: m.stripe.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 268 { „a“: { „c“: { „v“: „de_DE“ }, „d“: { „v“: „Android 11 REL 30“ }, „f“: { „v“: „1080w_1920h_480dpi“ }, „g“: { „v“: „1“ } }, „b“: { „d“: „“, „e“: „“, „k“: „de.elvah“, „l“: „5.4.1“, „o“: „11“, „p“: 30, „q“: „samsung“, „r“: „samsung“, „s“: „SM-G900F“, „t“: „release-keys“ }, „src“: „android-sdk“, „tag“: „20.17.0“, „v2“: 1 }
[8] Der Elvah Server: Hinter der Domain echarge.services steckt schließlich die Elvah GmBH selbst (vermutlich ist dieser Server bei Amazon gehostet).
Fazit: Die App zeigt die üblichen Begleiterscheinungen von kleinen agilen Start-Ups: Diese können nicht alles selbst entwickeln und hosten. Sie sind daher auf die wenigen Dienstleister angewiesen, die ihnen genau die benötigten Komponenten betriebsfertig und zum guten Preis liefern. Der Datenschutz fällt dann hinten runter. Vor allem die umfangreichen Verbindungen zu Google Firebase Analytics sind nicht nachvollziehbar. Die Anzahl an Drittanbietern ist zudem recht hoch.
ODR MobilityMe
EnBW ODR ist eine Tocherfirma von EnBW, aber betreibt eine eigene Ladeapp mit Ladekarte und eigenen Tarifen. Im Unterschied zu EnBW lässt sich hier die Ladekarte auch unabhängig von der App bestellen. Die Preise sind etwas anders strukturiert und für Langsamlader etwas günstiger, aber sonst nicht so viel anders.
Die Verbindungen:
[1] Google Firebase meldet den ersten App-Start und erhält Konfigurationen von Google.
POST https://firebaseinstallations.googleapis.com/v1/projects/hastobe-mobilityme/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.beenergised.chargemobile.odr X-Android-Cert: 3E7818EEE3D67A29C49863EE121318DA33A83299 x-goog-api-key: AIzaSyDdBeeWa6qd0MzuX1IXNxKx4M-5V0lvm4M User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:580384302719:android:4f00d833638712d498c14a“, „authVersion“: „FIS_v2“, „fid“: „dPhmit-GRxO5MfaYoYOXCK“, „sdkVersion“: „a:16.3.4“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:580384302719:android:4f00d833638712d498c14a/settings?instance=c26cf21aa9b91e8e1a3b0fa375de8e960ed2bd42&build_version=321831&display_version=V3.3.16&source=4 HTTP/2.0 cache-control: no-cache x-crashlytics-developer-token: 470fa2b4ae81cd56ecbcda9735803434cec591fa x-crashlytics-device-model: samsung/SM-G900F x-crashlytics-installation-id: e0ee318ba31c4478809d1ca7809f6107 x-crashlytics-os-display-version: 11 accept: application/json x-crashlytics-api-client-version: 17.3.0 user-agent: Crashlytics Android SDK/17.3.0 x-crashlytics-api-client-type: android x-crashlytics-google-app-id: 1:580384302719:android:4f00d833638712d498c14a x-crashlytics-os-build-version: 92502ee78e accept-encoding: gzip Query instance: c26cf21aa9b91e8e1a3b0fa375de8e960ed2bd42 build_version: 321831 display_version: V3.3.16 source: 4
[2] allaboutapps ist die österreichische Firma, die die App offenbar entwickelt hat. Mit dabei ist ein Authentifizierungs-Token, das auch in der Kommunikation mit dem API-Server von ODR genutzt wird, vermutlich damit die API nicht unauthorisiert genutzt wird. Jedenfalls handelt es sich wohl nicht um Installations-IDs innerhalb des von mir hier dekodierten Bearer
-Tokens, diese bleiben auch bei Neuinstallation gleich.
GET https://public.allaboutapps.at/config/hastobe/android.json HTTP/2.0 user-agent: com.beenergised.chargemobile.odr/321831 (Android; 11; 30) Version/V3.3.16 accept-language: de-DE authorization: Bearer eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6IkFOWU0iLCJpYXQiOjE2OTE3ODUwNDcsImV4cCI6MTY5MTc4ODY0NywiYXVkIjpbIjdhNzkwZjAwLTg4NmUtNDdmYS1iOTg0LWJkNWMzM2Y5MDM1OCJdLCJpc3MiOiJvZHIudjIuYXBpLmh0Yi5zZXJ2aWNlcyIsInN1YiI6IjIzZDg1OTRkLTYyOGItNDZiOC1iMGE0LWJjNDZlNjMyYzdjOCJ9.ZLnM4iqGTi0_v2qlWbG7X4aZqhvEFuWVb129HA-SfWOJ5BAvXQZweppGX8ZPTlPFFcKFLf1bA1Sh76N5cXzxVBpHK2x53vTkYQ7TENaYEsYjAz0kQXihU9LmWLTUSg1g4MIFkCh_tbY5mkDZ3raJQTYpMhztsjOeqqRIX71iUkg accept-encoding: gzip { „scope“: „ANYM“, „iat“: 1691785047, „exp“: 1691788647, „aud“: [ „7a790f00-886e-47fa-b984-bd5c33f90358“], „iss“: „odr.v2.api.htb.services“, „sub“: „23d8594d-628b-46b8-b0a4-bc46e632c7c8“ }
[3] ODR Server: Per API werden Daten wir beispielsweise die Ladesäulen abgefragt. Dabei erfährt ODR nicht den Standort, sondern nur den jeweiligen Kartenmittelpunkt, der ja auch manuell verstellt sein kann.
POST https://odr.v2.api.htb.services/graphql/ HTTP/2.0 accept: application/json x-apollo-operation-id: 08de39e749c320f039ea24eb1c0e5e0cf69fcf44e3c4e77773ea0b86c4f925dc x-apollo-operation-name: ChargepointsAndSites x-apollo-cache-key: c130dc588861a5350bcfa00557db646a x-apollo-cache-fetch-strategy: NETWORK_ONLY x-apollo-expire-timeout: 0 x-apollo-expire-after-read: false x-apollo-prefetch: false x-apollo-cache-do-not-store: false user-agent: com.beenergised.chargemobile.odr/321831 (Android; 11; 30) Version/V3.3.16 accept-language: de-DE authorization: Bearer eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6IkFOWU0iLCJpYXQiOjE2OTE3ODUwNDcsImV4cCI6MTY5MTc4ODY0NywiYXVkIjpbIjdhNzkwZjAwLTg4NmUtNDdmYS1iOTg0LWJkNWMzM2Y5MDM1OCJdLCJpc3MiOiJvZHIudjIuYXBpLmh0Yi5zZXJ2aWNlcyIsInN1YiI6IjIzZDg1OTRkLTYyOGItNDZiOC1iMGE0LWJjNDZlNjMyYzdjOCJ9.ZLnM4iqGTi0_v2qlWbG7X4aZqhvEFuWVb129HA-SfWOJ5BAvXQZweppGX8ZPTlPFFcKFLf1bA1Sh76N5cXzxVBpHK2x53vTkYQ7TENaYEsYjAz0kQXihU9LmWLTUSg1g4MIFkCh_tbY5mkDZ3raJQTYpMhztsjOeqqRIX71iUkg content-type: application/json; charset=utf-8 content-length: 1220 accept-encoding: gzip JSON { „operationName“: „ChargepointsAndSites“, „query“: „query ChargepointsAndSites($pagination: PaginationFilter, $location: LocationFilter, $connectors:[ConnectorFilter]) { cpsPagedLocationBased(pagination: $pagination, location: $location, filter: $connectors, ignoreMarketingConfiguration: false) { __typename pagination { __typename isLastPage offset limit totalCount } data { __typename …BaseChargingPoint } } sitesPagedLocationBased(location: $location, filter: $connectors, ignoreMarketingConfiguration: false) { __typename data { __typename …BaseSite cps { __typename …BaseChargingPoint } } } } fragment BaseChargingPoint on Cp { __typename id label publicName latitude longitude address zip city status { __typename simple } connectors { __typename …BaseConnector } siteId isFavoured information { __typename marketingDisplay } } fragment BaseConnector on Connector { __typename id label evseId status { __typename simple } connectorType { __typename id label chargePointType maxPowerRating plugType } sortOrder } fragment BaseSite on Site { __typename id label latitude longitude }“, „variables“: { „connectors“: [], „location“: { „latitude“: 48.962724, „longitude“: 10.130162, „radius“: 28.0 }, „pagination“: { „offset“: 0 } } }
[4] Google Maps liefert die Karten, auch hier sind wieder keine personenbeziehbaren IDs zur erkennen, aber ich konnte nicht den kompletten Verkehr abfrangen und entschlüsseln. Klickt man eine Ladesäule an, gibt Google eine Routingoption, so dass Google die angeklickten Ladesäulen erfährt. Das ist auch nicht optimal, aber auch kein größeres Problem.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 666 X-Google-Maps-Mobile-API: com.beenergised.chargemobile.odr,321831,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17)\x16\x1d\xcbZ\x8d\xb3\xc6\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x016 \x041070 \x01* com.beenergised.chargemobile.odr2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xcc\x01AH0uPGHPwqlPK3M2zlWLX_dz_WfxDpbF7cogBTFYT1ofKderPn3qEHQEGqIPCfJPV5uqICTIEjHQVz7gMuvX1nCmJImpIL4ms6bpZFHlndsnLStxAaXm1p5nAY17jFlFEEiXJdL6DsylkkeFVAqddVv-5yLoVo0RDeLjIboXMOjY6y6a2IuaTUKgjX822G-ZToVukJuT2VvD\xba\x02\x06321831\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03l\x00\x00\x01\x1d J\x08\x80\x02\x10\x00\x10\x0c\x10 \x18\x04\x18\x06 \x01(\x015\x00\x00@@b\x04\x08\xce\xc5Sb\x04\x08\xd1\xc5Sb\x04\x08\xca\xf6Sb\x04\x08\xa9\xa5Tb\x05\x08\xe9\x8e\xb4\x16b\x05\x08\x9d\xff\xb7\x16b\x05\x08\xeb\x88\xb8\x16b\x05\x08\x8f\xaa\xb8\x16J\x1e\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\xc3\xbf\xd1\x03\x80\x02\x00J\x1e\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x99\x95\xd1\x03\x80\x02\x00J\x1e\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x97\x95\xd1\x03\x80\x02\x00J\x1e\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\xcc\xbf\xd1\x03\x80\x02\x00J\x1e\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x98\x95\xd1\x03\x80\x02\x00R/2\x1c\x08\x1a\x12\x18 \x06styles\x12\x0es.t:33|p.v:off2\x0f\x08%\x12\x0b smartmaps GET https://maps.googleapis.com/maps/api/directions/json?origin=48.1390527%2C11.5471105&destination=48.137959%2C11.566801&key=AIzaSyAgq07sxKc52qD9subkgCgeCsS2hPQng1M HTTP/2.0 user-agent: com.beenergised.chargemobile.odr/321831 (Android; 11; 30) Version/V3.3.16 accept-language: de-DE authorization: Bearer eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6IkFOWU0iLCJpYXQiOjE2OTE3ODUwNDcsImV4cCI6MTY5MTc4ODY0NywiYXVkIjpbIjdhNzkwZjAwLTg4NmUtNDdmYS1iOTg0LWJkNWMzM2Y5MDM1OCJdLCJpc3MiOiJvZHIudjIuYXBpLmh0Yi5zZXJ2aWNlcyIsInN1YiI6IjIzZDg1OTRkLTYyOGItNDZiOC1iMGE0LWJjNDZlNjMyYzdjOCJ9.ZLnM4iqGTi0_v2qlWbG7X4aZqhvEFuWVb129HA-SfWOJ5BAvXQZweppGX8ZPTlPFFcKFLf1bA1Sh76N5cXzxVBpHK2x53vTkYQ7TENaYEsYjAz0kQXihU9LmWLTUSg1g4MIFkCh_tbY5mkDZ3raJQTYpMhztsjOeqqRIX71iUkg accept-encoding: gzip Query origin: 48.1390527,11.5471105 destination: 48.137959,11.566801 key: AIzaSyAgq07sxKc52qD9subkgCgeCsS2hPQng1M
Fazit: Die App ist einigermaßen datenschutzfreundlich, wenn man mal von Google Firebase absieht, das zum ersten Start eine Meldung an Google macht. Richtig gut ist aber, dass man Firebase im Menu auch deaktivieren kann. Und wenn man die App das allererste Mal ohne Internet startet und Firebase dann deaktiviert, dann wird die Installation gar nicht mehr an Google gemeldet. Unter diesen Bedingungen kann ich die App auch für Datenschutzfreunde empfehlen, auch wenn Google Maps natürlich immer nicht so gerne gesehen ist. Wichtig für Fans von alternativen Androids: Die App stürzte bei mir ohne Google Play Services ab. Sie kann so oder so keine Ladesäulen-Karte anzeigen, da das Google Maps SDK die Play Services benötigt. Da die RFID-Karte ohne App bestellbar ist, bleibt aber die Nutzung des Festpreis-Anbieters mit Plastikkarte und EV-Map.
Plugshare
Plugshare war früher, als es noch weniger Ladesäulen gab, einer Art Kleinanzeigenportal für Ladesäulen, bei dem man seine private Ladesäule mit anderen teilen konnte. Heute ist es – um es vorwegzunehmen, eine üble Datenabzocke. Diese App bitte sofort deinstallieren.
Hier die Verbindungen:
[1] Google Firebase erfährt die Installations-ID. Außerdem wird Firebase Messaging aktiviert und Firebase Analytics sendet Verhaltensdaten.
GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:983305682471:android:b6c2258837f7ce32/settings?instance=93eebb4e24cdf8c72d56e80a345fb4c7a6ff543a&build_version=20324&display_version=4.7.1&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: be6632882c394388b7f12c9640b20489 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.7 User-Agent: Crashlytics Android SDK/18.3.7 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:983305682471:android:b6c2258837f7ce32 X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 93eebb4e24cdf8c72d56e80a345fb4c7a6ff543a build_version: 20324 display_version: 4.7.1 source: 4 POST https://firebaseinappmessaging.googleapis.com/google.internal.firebase.inappmessaging.v1.sdkserving.InAppMessagingSdkServing/FetchEligibleCampaigns HTTP/2.0 user-agent: grpc-java-okhttp/1.52.1 content-type: application/grpc te: trailers x-goog-api-key: AIzaSyBXMXrAtkm0w8m1ZxJjXj6rYt1SZfMLCf4 x-android-package: com.xatori.Plugshare x-android-cert: 13BA72197F11DEEF7E0A618B4CE91B6145F500B7 grpc-accept-encoding: gzip grpc-timeout: 29445834u gRPC gRPC message 0 (compressed False) [string] 1 983305682471 [message] 2 [string] 2.1 1:983305682471:android:b6c2258837f7ce32 [string] 2.2 c0mXh6UxQr22S8D0xcd7tP [string] 2.3 eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTgzMzA1NjgyNDcxOmFuZHJvaWQ6YjZjMjI1ODgzN2Y3Y2UzMiIsImV4cCI6MTY5MjU0MDIyMSwiZmlkIjoiYzBtWGg2VXhRcjIyUzhEMHhjZDd0UCIsInByb2plY3ROdW1iZXIiOjk4MzMwNTY4MjQ3MX0.AB2LPV8wRQIhAMrbRv85gIhnhq6OdiOisU5L5x9ySv2nHTbGfRol1MqnAiAOkXiOzYktIRQ19WzgVkIaWFj798P8o_wXJx3IayvxKw [message] 4 [string] 4.1 4.7.1 [string] 4.2 30 [string] 4.3 de_DE [string] 4.4 Europe/Amsterdam POST https://firebaseremoteconfig.googleapis.com/v1/projects/983305682471/namespaces/firebase:fetch HTTP/1.1 X-Goog-Api-Key: AIzaSyBXMXrAtkm0w8m1ZxJjXj6rYt1SZfMLCf4 X-Android-Package: com.xatori.Plugshare X-Android-Cert: 13BA72197F11DEEF7E0A618B4CE91B6145F500B7 X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTgzMzA1NjgyNDcxOmFuZHJvaWQ6YjZjMjI1ODgzN2Y3Y2UzMiIsImV4cCI6MTY5MjU0MDIyMSwiZmlkIjoiYzBtWGg2VXhRcjIyUzhEMHhjZDd0UCIsInByb2plY3ROdW1iZXIiOjk4MzMwNTY4MjQ3MX0.AB2LPV8wRQIhAMrbRv85gIhnhq6OdiOisU5L5x9ySv2nHTbGfRol1MqnAiAOkXiOzYktIRQ19WzgVkIaWFj798P8o_wXJx3IayvxKw Content-Type: application/json Accept: application/json X-Firebase-RC-Fetch-Type: BASE/1 Content-Length: 733 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: { „debug“: „false“, „existing_user“: „false“ }, „appBuild“: „20324“, „appId“: „1:983305682471:android:b6c2258837f7ce32“, „appInstanceId“: „c0mXh6UxQr22S8D0xcd7tP“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTgzMzA1NjgyNDcxOmFuZHJvaWQ6YjZjMjI1ODgzN2Y3Y2UzMiIsImV4cCI6MTY5MjU0MDIyMSwiZmlkIjoiYzBtWGg2VXhRcjIyUzhEMHhjZDd0UCIsInByb2plY3ROdW1iZXIiOjk4MzMwNTY4MjQ3MX0.AB2LPV8wRQIhAMrbRv85gIhnhq6OdiOisU5L5x9ySv2nHTbGfRol1MqnAiAOkXiOzYktIRQ19WzgVkIaWFj798P8o_wXJx3IayvxKw“, „appVersion“: „4.7.1“, „countryCode“: „DE“, „firstOpenTime“: „2023-08-13T15:00:00.000Z“, „languageCode“: „de-DE“, „packageName“: „com.xatori.Plugshare“, „platformVersion“: „30“, „sdkVersion“: „21.4.0“, „timeZone“: „Europe/Amsterdam“ }
[2] Amazon Ads wird in die App eingebunden und erhält zahlreiche Gerätedetails, darunter offenbar auch die AAID, Androids Werbe-ID, wenn diese nicht gesperrt ist wie auf meinem Gerät. Der Zweck ist offensichtlich eine Versteigerung von Werbeanzeigen in der App mit einem Targeting auf den User. In einem solchen Real-Time-Bidding werden auch außerhalb der App persönliche Verhaltensdaten zwischen den teilnehmenden Unternehmen der Versteigerung ausgetauscht und ausgewertet. Die hier ausgetauschten IDs machen das möglich.
GET https://mads.amazon-adsystem.com/msdk/getConfig?dinfo=%7B%22os%22%3A%22Android%22%2C%22model%22%3A%22SM-G900F%22%2C%22make%22%3A%22samsung%22%2C%22hwv%22%3A%22klte%22%2C%22osVersion%22%3A%2211%22%2C%22country%22%3A%22DE%22%2C%22language%22%3A%22de%22%2C%22screenSize%22%3A%22360×640%22%2C%22scalingFactor%22%3A%223.0%22%2C%22ppi%22%3A%22423%22%2C%22orientation%22%3A%22portrait%22%2C%22connectionType%22%3A%22Wifi%22%7D&os=android&osVersion=11&mediationName=GOOGLE_AD_MANAGER&appId=b0bba509-0976-4af8-a029-95408602d7bb&testMode=false&segmentId=873&sdkVer=aps-android-9.7.1-admob&fp=false&pkg=%7B%22lbl%22%3A%22PlugShare%22%2C%22pn%22%3A%22com.xatori.Plugshare%22%2C%22v%22%3A%2220324%22%2C%22vn%22%3A%224.7.1%22%7D HTTP/1.1 Accept: application/json User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: mads.amazon-adsystem.com Connection: Keep-Alive Accept-Encoding: gzip Query dinfo: {„os“:“Android“,“model“:“SM-G900F“,“make“:“samsung“,“hwv“:“klte“,“osVersion“:“11″,“country“:“DE“,“language“:“de“,“screenSize“:“360×640″,“scalingFactor“:“3.0″,“ppi“:“423″,“orientation“:“portrait“,“connectionType“:“Wifi“} os: android osVersion: 11 mediationName: GOOGLE_AD_MANAGER appId: b0bba509-0976-4af8-a029-95408602d7bb testMode: false segmentId: 873 sdkVer: aps-android-9.7.1-admob fp: false pkg: {„lbl“:“PlugShare“,“pn“:“com.xatori.Plugshare“,“v“:“20324″,“vn“:“4.7.1″} POST https://aax.amazon-adsystem.com/e/msdk/ads HTTP/1.1 Accept: application/json content-type: application/json; charset=utf-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: aax.amazon-adsystem.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 869 JSON { „adsdk“: „aps-android-9.7.1-admob“, „appId“: „b0bba509-0976-4af8-a029-95408602d7bb“, „dinfo“: { „connectionType“: „Wifi“, „country“: „DE“, „hwv“: „klte“, „language“: „de“, „make“: „samsung“, „model“: „SM-G900F“, „orientation“: „portrait“, „os“: „Android“, „osVersion“: „11“, „ppi“: „423“, „scalingFactor“: „3.0“, „screenSize“: „360×640“ }, „idfa“: „00000000-0000-0000-0000-000000000000“, „isDTBMobile“: „true“, „mraid“: [ „1.0“, „2.0“, „3.0“ ], „oo“: „true“, „pj“: { „autoRefresh“: „false“, „fwk“: „native“, „mediationName“: „GOOGLE_AD_MANAGER“ }, „pkg“: { „lbl“: „PlugShare“, „pn“: „com.xatori.Plugshare“, „v“: „20324“, „vn“: „4.7.1“ }, „slots“: [ { „slot“: „07f2bf31-8cb6-4720-8e0e-65347c4a77c7“, „slotId“: 1, „supportedMediaTypes“: [ „DISPLAY“ ], „sz“: „320×100“ } ], „ua“: „Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36“ }
[2] Stripe wird als Zahlungsdienstleister kontaktiert, obwohl es hier noch gar nicht zu bezahlen gibt. Die gesendeten Daten sind hier aber nicht problematisch.
POST https://m.stripe.com/6 HTTP/1.1 Cookie: m= User-Agent: Stripe/v1 AndroidBindings/20.19.3 Accept-Charset: UTF-8 X-Stripe-User-Agent: {„lang“:“kotlin“,“bindings_version“:“20.19.3″,“os_version“:“30″,“type“:“samsung_samsung_SM-G900F“,“model“:“SM-G900F“} Content-Type: application/json; charset=UTF-8 Host: m.stripe.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 280 JSON { „a“: { „c“: { „v“: „de_DE“ }, „d“: { „v“: „Android 11 REL 30“ }, „f“: { „v“: „1080w_1920h_480dpi“ }, „g“: { „v“: „1“ } }, „b“: { „d“: „“, „e“: „“, „k“: „com.xatori.Plugshare“, „l“: „4.7.1“, „o“: „11“, „p“: 30, „q“: „samsung“, „r“: „samsung“, „s“: „SM-G900F“, „t“: „release-keys“ }, „src“: „android-sdk“, „tag“: „20.19.3“, „v2“: 1 }
[3] Google Admob wird eingebunden. Ich vermute, dass hier einzelne Werbe-Slots für die Versteigerung ausgeschrieben oder vorbereitet werden. Aus der Antwort geht hervor, dass zahlreiche Partner-Unternehmen über Google Mediation per Adapter in die App eingebunden wurden: AdColony, AppLovin, Facebook, Maio, Mintegral, Pangle, Snap, Tapjoy und Vungle. Man muss damit rechnen, dass diese Unternehmen im Rahmen der Werbeversteigerung außerhalb der App Verhaltensdaten und IDs von den Nutzenden der App erhalten. Das ist ohne Einwilligung eine Datenschutzkatastrophe.
GET https://googleads.g.doubleclick.net/getconfig/pubsetting?app_name=com.xatori.Plugshare&vnm=20324&eid=318496669%2C318500618%2C318486317%2C318491267%2C318482077%2C318482447%2C318483611%2C318484496%2C318484802%2C318492497%2C318493867%2C318494215%2C318498027%2C318499445%2C318500151%2C318503837%2C318503166%2C318510113%2C318502753&js=afma-sdk-a-v232400999.223712000.1&client=ca-app-pub-3336981801320656&admob_appcc=6222790393 HTTP/2.0 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 (Mobile; afma-sdk-a-v232400999.223712000.1) accept: */* x-requested-with: com.xatori.Plugshare sec-fetch-site: same-origin sec-fetch-mode: cors sec-fetch-dest: empty referer: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/production/sdk-core-v40-impl.html accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Query app_name: com.xatori.Plugshare vnm: 20324 eid: 318496669,318500618,318486317,318491267,318482077,318482447,318483611,318484496,318484802,318492497,318493867,318494215,318498027,318499445,318500151,318503837,318503166,318510113,318502753 js: afma-sdk-a-v232400999.223712000.1 client: ca-app-pub-3336981801320656 admob_appcc: 6222790393
[4] Pubmatic ist ebenfalls eine Werbeplattform. Hier werden nun sogar die exakten Geokoordinaten an den Werbedienstleister gesendet. Pubmatic tritt datenschutzrechtlich nicht als Dienstleister auf, sondern als eigenständiger Dritter. Das heißt, alle Daten, die hier an Pubmatic gesendet werden, gehören von da an diesem Drittanbieter und der kann sie auch für eigene Zwecke nutzen und zu Geld machen. Das ist ein Datenschutz-GAU und der Tiefpunkt im ganzen Test.
POST https://ow.pubmatic.com/openrtb/2.5 HTTP/1.1 x-openrtb-version: 2.5 Content-Type: application/json User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: ow.pubmatic.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 1133 JSON { „app“: { „bundle“: „com.xatori.Plugshare“, „name“: „PlugShare“, „publisher“: { „id“: „161867“ }, „storeurl“: „https://play.google.com/store/apps/details?id=com.xatori.Plugshare“, „ver“: „4.7.1“ }, „at“: 1, „cur“: [ „USD“ ], „device“: { „connectiontype“: 2, „devicetype“: 4, „geo“: { „accuracy“: 3, „lastfix“: 150287, „lat“: 48.136573, „lon“: 11.575258, „type“: 1, „utcoffset“: 120 }, „h“: 1920, „ifa“: „00000000-0000-0000-0000-000000000000“, „js“: 1, „language“: „de“, „lmt“: 1, „make“: „samsung“, „model“: „SM-G900F“, „os“: „Android“, „osv“: „11“, „pxratio“: 3, „ua“: „Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36“, „w“: 1080 }, „ext“: { „wrapper“: { „clientconfig“: 1, „profileid“: 6976, „sumry_disable“: 1 } }, „id“: „a9172aaf-dd48-4fe0-97b3-bc2640e04274“, „imp“: [ { „banner“: { „api“: [ 5, 6, 7 ], „format“: [ { „h“: 50, „w“: 320 } ], „pos“: 0 }, „clickbrowser“: 1, „displaymanager“: „PubMatic_OpenWrap_SDK“, „displaymanagerver“: „2.7.2“, „id“: „b80ca6fb-e9b6-4807-b38c-22cb02821a85“, „instl“: 0, „secure“: 1, „tagid“: „/8438769/PlugShare_Android/MapView“ } ], „source“: { „ext“: { „omidpn“: „Pubmatic“, „omidpv“: „2.7.2“ } } }
[5] Plugshare Server: Per API werden Details zu den Ladestationen abgefragt. Der Dienst wird von Cloudflare gehostet.
GET https://api.plugshare.com/v3/locations/region?minimal=1&latitude=48.133375560296024&longitude=11.576370690017939&spanLat=0.023419696718065097&spanLng=0.025064907968042505&count=100&access=1&outlets=%5B%7B%22connector%22%3A6%2C%22power%22%3A1%7D%2C%7B%22connector%22%3A13%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A3%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A2%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A6%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A4%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A7%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A8%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A14%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A15%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A10%2C%22power%22%3A0%7D%2C%7B%22connector%22%3A24%2C%22power%22%3A0%7D%5D&include_coming_soon=true HTTP/2.0 user-agent: com.xatori.Plugshare / 4.7.1 (20324); Android 11 accept-language: de app-version-name: 4.7.1 app-version-code: 20324 authorization: Basic YW5kcm9pZDp6dWNrZXJiZXJn accept-encoding: gzip Query minimal: 1 latitude: 48.133375560296024 longitude: 11.576370690017939 spanLat: 0.023419696718065097 spanLng: 0.025064907968042505 count: 100 access: 1 outlets: [{„connector“:6,“power“:1},{„connector“:13,“power“:0},{„connector“:3,“power“:0},{„connector“:2,“power“:0},{„connector“:6,“power“:0},{„connector“:4,“power“:0},{„connector“:7,“power“:0},{„connector“:8,“power“:0},{„connector“:14,“power“:0},{„connector“:15,“power“:0},{„connector“:10,“power“:0},{„connector“:24,“power“:0}] include_coming_soon: true
[6] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 587 X-Google-Maps-Mobile-API: com.xatori.Plugshare,20324,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\x0b\xde\xba\xa3\x94\x13\xacm\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x01\x14 \x041070 \x01*\x14com.xatori.Plugshare2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGFuWDaTwescY8U1tm-SxVge5D-2OV3zeszw-jXTZUcRs7hQSAsdJIPglualu_0IWIoMVstrUNj_WZabZIiCmsazUrYOtG8KkaDjo7OkGpcmb83aqZZwavo6Hn_SMhnM03EIkr5ewTuE4GUwCnuYi85xCeugphyqvEt74adyynFqZq7KeWg\xba\x02\x0520324\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03’\x00\x00\x00\xf0″\xed\x01https://mt0.google.com/vt/icon/name=assets/icons/poi/tactile/pinlet_outline_v4-2-medium.png,assets/icons/poi/tactile/pinlet_v4-2-medium.png,assets/icons/poi/quantum/pinlet/bridge_pinlet-2-medium.png&highlight=607d8b,78909c,ffffff&scale=4
Fazit: Die App ignoriert das europäische Datenschutzrecht wie kein anderer Anbieter im Test und sendet Verhaltensdaten inklusive Standortdaten an zahlreiche Drittanbieter, die daraus Profile erstellen und für eigene Zwecke nutzen können. Ich empfehle dringend, die App zu deinstallieren! Auch die Webkarte nutzt zahlreiche Einbettungen für die Verhaltensanalyse und Werbeversteigerung ohne Einwilligung. Ein klarer Fall für die Datenschutzbehörde oder ein anderes Rechtsverfahren. Wer die App installiert hatte, dem wurde ein ziemlicher Schaden an der Privatsphäre verursacht.
Plugsurfing
Diese App bietet weltweit über 200.000 Ladepunkte an und gehört leider auch nicht mehr zu den günstigsten. Hinzu kommt, dass die Karte nur in Deutschland feste Preise anbietet, so dass man im Ausland eigentlich immer in der App nachprüfen muss, welche Preise an einer bestimmten Ladesäule verlangt werden.
Direkt nach dem Start führt die App folgende Verbindungen aus:
[1] Google Firebase mit den Diensten Crashlytics und Firebaseinstallations
GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:432836593263:android:3bdd6a6e353273d8672f9a/settings?instance=7d4b501f67650f6ea2e6651ae764bd6765c1bb94&build_version=1689059873&display_version=7.27.0&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: daf4d1141a074ddeb4d80b97a45b4d50 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.2 User-Agent: Crashlytics Android SDK/18.3.2 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:432836593263:android:3bdd6a6e353273d8672f9a X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 7d4b501f67650f6ea2e6651ae764bd6765c1bb94 build_version: 1689059873 display_version: 7.27.0 source: 4 POST https://firebaseinstallations.googleapis.com/v1/projects/plugsurfing-4e294/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.xitaso.plugsurfing x-firebase-client: H4sIAAAAAAAAAD1QSW7DMAz8iqFztBptgnylyoG2GFewlkJSDRRB_l45lnLkcDgLH-QbIZUJoWRy_XoQWDAUciUQTIrW0AJpwUKzWTUf5XC3CekcE2quBFNMNMRlzeWFjUwNCWEuNECxG9J9O0GudPnJPup2jcXZUEd2YVIM3cbbcHio8VCEAO6v2LnqKvkyMrjZGemU6o3mGXz-Dcvbnob9ukXoqjbkAs5h0nyOnjWYbRiM7beNU-PGsJc4M9lbNX4t_nYP4GuX1RXsiI8GXYO670-Vu8fkNT-EjHu1qMLkRAwU3H9NlFAjFWc6CnJ73k5kw5RriPp8RZ7_Iry_L5kBAAA X-Android-Cert: 7C86AD3FA1C03DA4253CF6425B5B716741F58DF4 x-goog-api-key: AIzaSyCHR97d-yYvTAs5krVlH5lxSXotBQYtj9M User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 139 [decoded gzip] JSON { „appId“: „1:432836593263:android:3bdd6a6e353273d8672f9a“, „authVersion“: „FIS_v2“, „fid“: „eGJ5TCpoR2ujetyh45tfRm“, „sdkVersion“: „a:17.1.0“ }
[2] Mixpanel, ein App-Analyse-Dienst. Die gesendeten Daten habe ich hier bereits Base-64-decodiert. Wenig verwunderlich, dass hier einwilligungspflichtige Geräte-IDs dabei sind. Noch unangenehmer fällt auf, dass auch Verhaltensdaten wie Verweildauer oder das eingetragene Fahrzeug abgegriffen werden können. Da Mixpanel auch Schnittstellen zu Marketingstools, sogenannten Customer data platforms bietet, werde ich das als Werbetracking zählen, auch wenn es hier vermutlich nur um internes Marketing geht und nicht um die Weitergabe von IDs für die Generierung von Zielgruppen anderer Werbetreibender.
POST https://api.mixpanel.com/track/?ip=1 HTTP/1.1 Content-Length: 1315 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.mixpanel.com Connection: Keep-Alive Accept-Encoding: gzip [{„event“:“Filter View“,“properties“:{„mp_lib“:“react-native“,“$lib_version“:“2.3.1″,“$os“:“Android“,“$os_version“:“11″,“$manufacturer“:“samsung“,“$brand“:“samsung“,“$model“:“SM-G900F“,“$screen_dpi“:480,“$screen_height“:1920,“$screen_width“:1080,“$app_version“:“7.27.0″,“$app_version_string“:“7.27.0″,“$app_release“:“1689059873″,“$app_build_number“:“1689059873″,“$has_nfc“:true,“$has_telephone“:true,“$wifi“:true,“$bluetooth_version“:“ble“,“token“:“1d0f902a375234e553ae38417dbcf1cf“,“App Language“:“German“,“User is logged in“:false,“EV Brand“:““,“EV Model“:““,“time“:1690736548605,“distinct_id“:“$device:eca952c9-738e-48af-82e5-07f7dcf30c61″,“$had_persisted_distinct_id“:false,“$device_id“:“eca952c9-738e-48af-82e5-07f7dcf30c61″,“Fast Chargers Only“:false,“Plug Types“:[],“Available Chargers Only“:false,“Accessible With App“:false},“$mp_metadata“:{„$mp_event_id“:“b710479a8bdd2b5b“,“$mp_session_id“:“2e9ba2da4af24929″,“$mp_session_seq_id“:0,“$mp_session_start_sec“:1690736542}}]
[3] Locize erhält keine personenbeziehbaren Daten und liefert offenbar nur Textinhalte je nach Spracheinstellung aus.
GET https://api.locize.app/6ebecca1-5044-4b85-8ed6-aace636c513e/latest/de/Error HTTP/2.0 accept-encoding: gzip user-agent: okhttp/4.9.2 No content
[4] Plugsurfing: Der eigene Server der App wird über eine API angesprochen und erhält ohne Anmeldung offenbar keine personenbeziehbaren Daten.
GET https://cdc-api.plugsurfing.com/public/v1/app/config?appBuild=1689059873&appId=com.PlugSurfing.PlugSurfing&appVersion=7.27.0&clientOS=android&deviceLanguage=de&userPrefix=ps-plugsurfing HTTP/2.0 content-type: application/json accept: application/json accept-encoding: gzip user-agent: okhttp/4.9.2 Query appBuild: 1689059873 appId: com.PlugSurfing.PlugSurfing appVersion: 7.27.0 clientOS: android deviceLanguage: de userPrefix: ps-plugsurfing
[5] Google Maps ist als Kartendienst eingebunden, die Verbindungen konnte ich nicht einsehen.
Fazit: Mit den Analysediensten von Google Firebase, aber insbesondere von Mixpanel verletzt die App die deutschen Datenschutzgesetze, weil hier ohne Einwilligung eindeutige IDs und Verhaltensdaten gesendet werden.
Enel X Way
Die App des italienischen Energieversorgers Enel gilt als Geheimtipp für Italienreisen, da andere Karten in dem Land meist keine sonderlich gute Abdeckung haben.
Folgende Verbindungen waren zu sehen:
[1] Google Firebase
POST https://firebaseinstallations.googleapis.com/v1/projects/enel-x-recharge/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.enel.mobile.recharge2 x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 27FC6E85455568806F3DD989C481E2084BD2AB1D x-goog-api-key: AIzaSyBDzNtXvWDe0TRFPy1Yj6O1pHaQB_k0WXI User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 135 [decoded gzip] JSON { „appId“: „1:1021466006724:android:118ddd8b4ee064c4“, „authVersion“: „FIS_v2“, „fid“: „cxlYfpyGT0W7NWzYtfgOPB“, „sdkVersion“: „a:17.0.1“ }
[2] Adobe Experience Cloud Identitätsdienst: Das hier ist ein außerordentlich problematischer Aufruf: Mit der verwendeten, geräteübergreifenden d_mid
kann Enel die Person, die die App installiert hat, entweder auf anderen Kanälen für Enel bewerben oder anderen Unternehmen als Zielgruppe überlassen. Wenn man sich in die Enel-App einloggt, kann der Abgleich auch zusätzlich über Mobilnummer oder E-Mail-Adresse erfolgen, die die nutzende Person evtl. auch in anderen Apps und Websites verwendet hat. Zusätzlich scheint Enel auch weitere Nutzungsdetails an Adobe zu senden. Diese Verbindungen waren leider auch Tage nach er letzten Nutzung im Hintergrund aktiv!
[3] Facebook, Google Ads, Adform und Zemanta: Beim Klick auf den Registrierungslink, den man per E-Mail erhalten hat, werden im Hintergrund zahlreiche Marketingunternehmen kontaktiert und erhalten Cookies und IDs. Man kann davon ausgehen, dass diese Cookies auch über Adobe wieder an die E-Mailadresse geknüpft werden können. Spätestens damit weiß die Werbebranche vermutlich, welche Person nun ein Elektroauto besitzt.
GET /tr/?id=359840219424174&ev=PageView&dl=https%3A%2F%2Fwww.store.enelxway.com%2Fit%2Fit%2Fthankyou-page-juicepass-en&rl=&if=false&ts=1691335244757&sw=1920&sh=1080&v=2.9.121&r=stable&ec=0&o=30&fbp=fb.1.1691335244755.1867358570&it=1691335242771&coo=false&exp=a1&rqm=GET HTTP/1.1 Host: www.facebook.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: image/avif,image/webp,*/* Accept-Language: de,en-GB;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://www.store.enelxway.com/ Connection: keep-alive Sec-Fetch-Dest: image Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site Pragma: no-cache Cache-Control: no-cache
[4] Dynatrace: Dieses Unternehmen erhält regelmäßig kurze, eher technische Details über die Stabilität der App. Unklar, ob hier IDs enthalten sind. Diese Verbindungen waren leider auch Tage nach er letzten Nutzung im Hintergrund aktiv.
POST https://dynatrace-saas.enel.com/mbeacon/a0585c7b-16a9-4040-b14e-0e26e2d473fe?type=m&srvid=1&app=795d2426-7a31-49c6-9799-32dfd14c40af&va=8.259.1.1008&tt=maandroid&pt=0&resp=json&cts=1691145183567&si=880333729_1 HTTP/1.1 Accept-Encoding: identity, gzip Content-Type: text/plain; charset=utf-8 Content-Encoding: gzip User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: dynatrace-saas.enel.com Connection: Keep-Alive Content-Length: 330 [decoded gzip] Raw vv=3&va=8.259.1.1008&ap=795d2426-7a31-49c6-9799-32dfd14c40af&an=Enel+X+Way&ai=com.enel.mobile.recharge2&vb=1562&vn=4.3.40&vi=880333729&sn=1&ss=0&rm=1703&cp=ARMv7+rev+1+%28v7l%29&os=Android+11&mf=samsung&md=SM-G900F&rj=g&ul=de_DE&sw=1080&sh=1920&sd=480&pt=0&so=p&bl=100&fm=494&cr=&ct=w&np=802.11x&tt=maandroid&dl=0&cl=1&fv=fl&tv=1691333775703&tx=1691333780663&mp=1&et=6&na=Loading+Enel+X+Way&it=2&ca=1&pa=0&s0=1&t0=84&s1=2&t1=0&mo=0
[5] Enel Server: Die restliche Funktionalität der App, darunter die Login-Verwaltung und die Suche nach Ladesäulen, aber auch die Fahrzeugverwaltung wird über eine API organisiert. Der Server wird vermutlich von dem US-Unternehmen Imperva/Incapsula betrieben.
GET https://emobility.enelx.com/api/vehicles/v1/catalog?make=ALFA+ROMEO&model=&version=&year=®ion=EU&batterySize=&chargingRate= HTTP/1.1 user-agent: dio country: DE accept: application/json,application/*+json x-dynatrace: accept-encoding: gzip authorization: Bearer 4fa66174-2c9a-37ff-afe4-db7510d907fa host: emobility.enelx.com content-type: application/json; charset=utf-8 Query make: ALFA ROMEO model: version: year: region: EU batterySize: chargingRate:
[6] Google Maps ist als Kartenanbieter integriert, die Verbindungen konnten aber nicht eingesehen werden.
Fazit: Die App nutzt überdurchschnittlich viele Analysedienste, die außerdem die Grenze zum Marketing und zur verhaltensbasierten Analyse überschreiten. Dabei werden beim Anmeldeprozess auch IDs mit anderen Drittanbietern ausgetauscht. Das kann auch dazu führen, dass IDs aus E-Mail-Adresse oder Mobilnummer bei Drittanbietern für Marketing verwendet werden. Das ist ein klarer Verstoß gegen die Datenschutzgesetze. Auf jeden Fall deinstallieren!
E.ON Drive
E.ON ist ein börsennotierter Energieriese aus Essen. Die Ladeapp bietet mit 230.000 Ladepunkten eine gute mittlere Größe, wobei man in Frankreich und Spanien gar nichts findet und die Preise sehr hoch sind, so dass ich mich gerade frage, warum ich das überhaupt testen soll. Aber gut, hier die Verbindungen:
[1] Google Firebase mit den Diensten Firebaseinstallations und Crashlytics und den üblichen IDs.
POST https://firebaseinstallations.googleapis.com/v1/projects/eon-energy/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.eon.emobility X-Android-Cert: 78F5F599E0D46F907CCC1FA7AB254E784C87E2B2 x-goog-api-key: AIzaSyDJiBlZPOfCJFMeF-MSQ-nlfj7F9AUZZJo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:329521754971:android:9acc4101bccd0676d3607e“, „authVersion“: „FIS_v2“, „fid“: „d5IS0mrQQAuF5D0WUpflnO“, „sdkVersion“: „a:16.3.5“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:329521754971:android:9acc4101bccd0676d3607e/settings?instance=040eb60bd49843df4a96a82543c0668e4fc8c0d6&build_version=31673&display_version=2.6.10.3&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: fcd9f826f30949c688d97b449d2373e4 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 17.3.1 User-Agent: Crashlytics Android SDK/17.3.1 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:329521754971:android:9acc4101bccd0676d3607e X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 040eb60bd49843df4a96a82543c0668e4fc8c0d6 build_version: 31673 display_version: 2.6.10.3 source: 4
[2] Virta Server: Hier sieht man, dass die App eigentlich eine gebrandete Variante von Virta EV ist, die wir später auch noch testen. Firebase wird sogar gesondert über diesen eigenständigen App-Teil informiert. Der API-Server wird von Amazon gehostet. Was im dritten Request sichtbar ist: Die App sendet eine Device-ID, auch wenn man nicht eingeloggt ist. Auch das scheint mir nicht in Einklang mit den Datenschutzgesetzen zu sein.
POST https://ai.virta-ev.com/api/v1/resource/strings HTTP/2.0 brand: eon-de content-type: application/json; charset=UTF-8 content-length: 38 accept-encoding: gzip user-agent: okhttp/4.9.2 JSON { „Brand“: 17, „DeviceType“: 2, „Locale“: 4 } POST https://firebaseinstallations.googleapis.com/v1/projects/virta-android-app/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.eon.emobility x-firebase-client: fire-core/20.2.0 kotlin/1.7.10 android-min-sdk/24 fire-core-ktx/20.2.0 device-brand/samsung fire-cls/17.3.1 fire-iid/21.0.1 android-installer/com.android.vending fire-android/30 device-name/klte device-model/klte android-platform/ fire-fcm/20.1.7_1p fire-installations/16.3.5 fire-analytics/18.0.2 android-target-sdk/33 x-firebase-client-log-type: 2 X-Android-Cert: 78F5F599E0D46F907CCC1FA7AB254E784C87E2B2 x-goog-api-key: AIzaSyDJiBlZPOfCJFMeF-MSQ-nlfj7F9AUZZJo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:783737908022:android:96d7f670a76950c6“, „authVersion“: „FIS_v2“, „fid“: „eVwA6ohXT6iNymI4_AEgB7“, „sdkVersion“: „a:16.3.5“ } POST https://api.virta.fi/v4/payments/status HTTP/2.0 brand: eon-de content-type: application/json; charset=UTF-8 content-length: 47 accept-encoding: gzip user-agent: okhttp/4.9.2 JSON { „deviceId“: „6e57cbddc2-7d98b7ddd5-2d503fc3ea“ }
[3] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Type: application/binary User-Agent: com.eon.emobility/31673 (Linux; U; Android 11; de_DE; SM-G900F; Build/RQ3A.211001.001; Cronet/113.0.5672.24) X-Device-Elapsed-Time: 344735010568918 X-Google-Maps-Mobile-API: com.eon.emobility,31673,11.77.200,11.77.200,android:samsung-klte-SM_G900F Content-Length: 682 Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 00 18 ff ff ff ff ff ff ff ff 00 05 64 65 2d 44 …………de-D 0000000010 45 00 1d 61 6e 64 72 6f 69 64 3a 73 61 6d 73 75 E..android:samsu 0000000020 6e 67 2d 6b 6c 74 65 2d 53 4d 5f 47 39 30 30 46 ng-klte-SM_G900F 0000000030 00 09 31 31 2e 37 37 2e 32 30 30 00 03 64 65 76 ..11.77.200..dev 0000000040 00 3e ff ff fe 06 1f 8b 08 00 00 00 00 00 00 00 .>………….. 0000000050 0d d0 3d 8f 93 60 00 00 e0 7b 81 bb 78 2e c6 7f ..=..`…{..x… 0000000060 e0 6c 72 84 17 ca 47 07 87 42 81 52 a4 d0 a3 b4 .lr…G..B.R…. 0000000070 85 85 50 3e 2c 07 85 bb f2 d1 d2 e9 c6 5b 74 e8 ..P>,……..[t. 0000000080 60 f4 26 a7 26 2e 7a 31 26 26 8e fe 00 27 13 cd `.&.&.z1&&…‘.. 0000000090 4d 1d 8d 83 71 70 33 31 fa fc 84 e7 2e 06 09 96 M…qp31…….. 00000000a0 78 00 1e de f7 f3 05 1e e6 19 1e 2e f2 59 9c c6 x…………Y.. 00000000b0 65 43 22 5d 91 03 fc 5b 40 43 f8 68 26 07 b0 e5 eC“]…[@C.h&… 00000000c0 f6 43 52 e4 84 a5 ab f3 b3 62 4d 8b 5a 30 9a 16 .CR……bM.Z0.. 00000000d0 b6 11 4e c8 5a 86 d9 38 ca f3 11 ad 5d e4 a7 fc ..N.Z..8….]… 00000000e0 f4 09 3b 98 44 39 6f 7b 7d b2 a7 9f 7a 89 96 50 ..;.D9o{}…z..P 00000000f0 1d 7d e0 b9 f2 2a 1a 74 56 8c 7e de 55 96 c9 62 .}…*.tV.~.U..b 0000000100 12 d1 85 3a 76 e8 68 e5 90 5c a8 a5 92 4e 87 27 …:v.h..\…N.‘ 0000000110 52 43 7a c5 5c 64 da be b0 6a 0d 57 7c b7 ed 48 RCz.\d…j.W|..H 0000000120 35 c5 55 59 ad 0e ea 98 52 f9 9e 26 66 9b a2 19 5.UY….R..&f… 0000000130 2c 37 66 15 18 5c 2c b5 0d 2e d1 54 4a 29 4d 4b ,7f..\,….TJ)MK 0000000140 82 11 67 80 2d 38 32 6d 73 24 6a d7 e0 e0 06 60 ..g.-82ms$j….` 0000000150 b7 00 a1 88 ef e0 e0 12 01 57 08 78 87 7c 00 9d ………W.x.|.. 0000000160 1e 51 19 b2 18 a8 eb fe b8 25 6c f2 ea 44 30 22 .Q…….%l..D0″ 0000000170 35 93 7b 43 a2 3f 19 56 8e 68 58 f6 85 13 78 73 5.{C.?.V.hX…xs 0000000180 b9 56 69 b2 a6 f4 4a 1c 67 eb 4a 2d bb 9e 2c 4d .Vi…J.g.J-..,M 0000000190 fa ba 91 45 d2 b4 d3 63 14 2b 55 94 94 d3 97 21 …E…c.+U….! 00000001a0 ab 26 71 7b 98 06 26 3b 67 19 de 74 ba 6b 28 f8 .&q{..&;g..t.k(. 00000001b0 f1 b9 ff b8 65 05 8b a6 c9 0c c6 2b 6c c2 b2 cb ….e……+l… 00000001c0 78 e6 6a 4c d9 08 a4 b5 64 4b 22 2d fd 34 63 5a x.jL….dK“-.4cZ 00000001d0 a1 e9 29 73 b7 aa 2b 98 ba 1d db 39 4b 38 5b 83 ..)s..+….9K8[. 00000001e0 7a 5c ce f5 3a 49 6a 52 1a fe 7f 2f 13 ff 23 72 z\..:IjR…/..#r 00000001f0 48 41 86 a5 3e 21 c7 10 e2 2c 8b 93 04 71 89 be HA..>!…,…q.. 0000000200 fe fb 34 bf 46 d1 3b 7b f4 16 bd f7 63 67 6e 6f ..4.F.;{….cgno 0000000210 cc e7 df cc 37 db d1 cb dd 68 8f 82 5f 28 ba c5 ….7….h.._(.. 0000000220 0e 29 1c e2 c4 0b ec e7 97 67 7f c0 2b ec 37 ba .)…….g..+.7. 0000000230 c7 be be ff bc 3b fa 07 0a 6e a9 12 ff 01 00 00 …..;…n…… 0000000240 00 27 00 00 00 64 22 62 68 74 74 70 73 3a 2f 2f .’…d“bhttps:// 0000000250 77 77 77 2e 67 73 74 61 74 69 63 2e 63 6f 6d 2f www.gstatic.com/ 0000000260 6d 61 70 73 2f 72 65 73 2f 43 6f 6d 70 61 63 74 maps/res/Compact 0000000270 4c 65 67 65 6e 64 2d 4e 61 76 69 67 61 74 69 6f Legend-Navigatio 0000000280 6e 4c 6f 77 4c 69 67 68 74 2d 30 33 38 33 33 38 nLowLight-038338 0000000290 32 36 30 36 32 36 63 31 31 66 66 61 31 39 65 63 260626c11ffa19ec 00000002a0 65 31 63 66 33 62 37 38 35 36 e1cf3b7856
Fazit: Die App ist beim Datenschutz wie die meisten anderen nicht ganz auf Linie mit den Datenschutzgesetzen. Aber wenn man von Firebase Installations und Crashlytics absieht (die nur beim Start aktiv sind), findet sich kein Analysetracker. Bei den Preisen und der eingeschränkten Abdeckung kann man dem Anbieter aber ohnehin gut aus dem Weg gehen.
EV Map
Diese App ist ein Sonderfall, da sie nicht für die Abrechnung von Ladevorgängen verwendet werden kann, sondern nur Ladestationen auf einer Karte anzeigt. Damit eignet sie sich aber wunderbar für alle Personen, die am liebsten mit einer Plastikkarte an den Ladesäulen zahlen wollen (was fast immer möglich ist). EV Map ist Open Source und sowohl im Google Play Store als auch im F-Droid-Store verfügbar. Die beiden Varianten unterscheiden sich primär durch den eingesetzten Kartendienst: Google Maps oder Mapbox.
Die Verbindungen:
[1] Goingelectric ist eine Community, die Ladesäulen in einer umfangreichen Datenbank sammelt und unabhängig von Netzwerken zur Verfügung stellt. Hier werden die Ladesäulen für eine bestimmte Region abgefragt, dabei sind keine personenbeziehbaren IDs zu erkennen. Wenn man die App mit der Quelle Openchargemap nutzt, ändert sich diese Verbindung natürlich.
POST https://api.goingelectric.de/chargepoints/?key=7ef9a064ec4602a853c9201ac35be94b HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 250 Host: api.goingelectric.de Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.11.0 URLEncoded form sw_lat: 48.123667688549254 sw_lng: 11.559393480420113 ne_lat: 48.154004920838986 ne_lng: 11.589041613042355 zoom: 14.644579 clustering: false freecharging: false freeparking: false min_power: 0 open_twentyfourseven: false barrierfree: false exclude_faults: false
[2] Google Maps (nur Play-Store-Variante): Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Type: application/binary User-Agent: net.vonforst.evmap/194 (Linux; U; Android 11; de_DE; SM-G900F; Build/RQ3A.211001.001; Cronet/113.0.5672.24) X-Device-Elapsed-Time: 93898753669209 X-Google-Maps-Mobile-API: net.vonforst.evmap,194,11.77.200,11.77.200,android:samsung-klte-SM_G900F Content-Length: 721 Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 00 18 ff ff ff ff ff ff ff ff 00 05 64 65 2d 44 …………de-D 0000000010 45 00 1d 61 6e 64 72 6f 69 64 3a 73 61 6d 73 75 E..android:samsu 0000000020 6e 67 2d 6b 6c 74 65 2d 53 4d 5f 47 39 30 30 46 ng-klte-SM_G900F 0000000030 00 09 31 31 2e 37 37 2e 32 30 30 00 03 64 65 76 ..11.77.200..dev 0000000040 00 3e ff ff fe 09 1f 8b 08 00 00 00 00 00 00 00 .>………….. 0000000050 05 c1 3d 8f 93 60 00 00 e0 7b 01 2f a7 8b 89 bf ..=..`…{./…. 0000000060 c0 d9 a4 84 6f da c1 81 a3 f4 28 94 52 78 29 1f ….o…..(.Rx). 0000000070 2e 97 f6 f8 6a 7b 05 4a 69 f9 98 6e 74 50 87 0e ….j{.Ji..ntP.. 0000000080 46 6f 72 6a e2 a2 17 17 13 17 13 7f 83 83 b9 a9 Forj………… 0000000090 a3 71 30 0e c6 c5 c4 f8 3c f7 30 92 e0 3a 0f c1 .q0…..<.0..:.. 00000000a0 a3 07 49 50 e0 db 34 09 d3 7c 5d e0 c1 76 39 c9 ..IP..4..|]..v9. 00000000b0 28 a4 2b b5 c1 e9 7b c0 92 e4 63 5d 5b 15 ba 14 (.+…{…c][… 00000000c0 96 e1 24 f2 9a 5c 26 0d 7f 25 ab 9b d4 e7 ab 92 ..$..\&..%…… 00000000d0 53 29 87 e7 65 b9 1b b7 60 61 77 58 39 17 66 97 S)..e…`awX9.f. 00000000e0 61 3c 17 69 ad 15 b9 16 5c a5 09 31 30 dd d4 d4 a.2.5……uk: 0000000180 6c 79 93 99 53 8d cb 38 e1 36 59 ac 1b a6 2e bb ly..S..8.6Y….. 0000000190 ed e5 2a 20 02 66 bc 21 5a 8c 12 f5 55 ce 76 66 ..* .f.!Z…U.vf 00000001a0 10 f6 57 41 bb d7 36 4d 79 74 26 37 21 c1 4a ae ..WA..6Myt&7!.J. 00000001b0 cd 78 59 d9 d7 45 86 e8 bb 7c c3 b8 0c e7 b4 ba .xY..E…|…… 00000001c0 85 ef 5d 2c 93 6d 27 a1 b7 7e b3 b6 7b 53 bf 98 ..],.m‘..~..{S.. 00000001d0 67 66 3c 2c 23 58 f3 0a e5 d6 ca da a8 d7 41 c4 gf<,#X……..A. 00000001e0 c6 2a 33 85 95 eb a4 99 05 ab ba 69 7f 42 50 b2 .*3……..i.BP. 00000001f0 c3 7c 41 ee 92 24 ce f3 38 45 10 57 e8 db 7f cf .|A..$..8E.W…. 0000000200 d3 6b 14 3d 39 a0 b7 e8 fd 1f 7b b8 bb 81 2f bf .k.=9…..{…/. 0000000210 c1 77 3b eb f5 de 3a a0 e0 17 8a ee b0 3b 34 4e .w;…:……;4N 0000000220 e2 c4 2b ec e7 d7 17 7f c1 1b ec 37 7a c0 fe 3c ..+……..7z..< 0000000230 fb bc 3f fe 0f b7 06 a4 01 fe 01 00 00 00 27 00 ..?………..‘. 0000000240 00 00 8e 22 6b 68 74 74 70 73 3a 2f 2f 77 77 77 …“khttps://www 0000000250 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 2f 6d 61 70 73 .google.com/maps 0000000260 2f 76 74 2f 69 63 6f 6e 2f 6e 61 6d 65 3d 61 73 /vt/icon/name=as 0000000270 73 65 74 73 2f 69 63 6f 6e 73 2f 70 6f 69 2f 71 sets/icons/poi/q 0000000280 75 61 6e 74 75 6d 2f 70 69 6e 6c 65 74 2f 63 61 uantum/pinlet/ca 0000000290 6d 65 72 61 5f 70 69 6e 6c 65 74 2d 32 2d 6d 65 mera_pinlet-2-me 00000002a0 64 69 75 6d 2e 70 6e 67 26 73 63 61 6c 65 3d 34 dium.png&scale=4 00000002b0 4a 1f 64 75 68 23 67 65 74 54 65 78 74 75 72 65 J.duh#getTexture 00000002c0 46 6f 72 4c 61 62 65 6c 45 6c 65 6d 65 6e 74 28 ForLabelElement( 00000002d0 29 )
[2] Mapbox (nur F-Droid-Variante). Dieser Kartendienst ist relativ datenschutzfreundlich. Allerdings wird eine User-ID sku
mitgesendet, die offenbar für die Abrechnung bzw. Traffic-Kappung von Mapbox benötigt wird). Dies habe ich bereits in einem Issue gemeldet, aber offenbar kann das nicht deaktiviert werden. Da Mapbox von EV Map keine genauen Koordinaten erhält, sondern nur die abgefragten Kartenkacheln und auch nur auf manuellen Befehl eine Ortung vornimmt, kann von dieser App kein exaktes Bewegungsprofil an Mapbox übertragen werden.
GET https://api.mapbox.com/v4/mapbox.mapbox-streets-v8,mapbox.mapbox-terrain-v2/14/8719/5686.vector.pbf?access_token=pk.eyJ1IjoiZXZtYXAiLCJhIjoiY2t0aDJmejl0MG8waTJucGV1NG9iY2wyZCJ9.atzEi6Vzfp3F8IZCmoSTTw&sku=100lkznkcv0acbb6a43c2b54a4abdcda8b2b7e14cb8 HTTP/1.1 User-Agent: net.vonforst.evmap/1.6.6 (192) Mapbox/9.2.1 (9d96228) Android/30 (armeabi-v7a) Host: api.mapbox.com Connection: Keep-Alive Accept-Encoding: gzip Query access_token: pk.eyJ1IjoiZXZtYXAiLCJhIjoiY2t0aDJmejl0MG8waTJucGV1NG9iY2wyZCJ9.atzEi6Vzfp3F8IZCmoSTTw sku: 100lkznkcv0acbb6a43c2b54a4abdcda8b2b7e14cb8
Darüber hinaus nutzt die App keinen eigenen Server und keine anderen Dienste oder Einbettungen ein.
Fazit: Auch wenn die Open-Source-App sehr datenschutzfreundlich und extrem datensparsam ist, kann man in beiden Varianten der App nicht ganz sicher ausschließen, dass von den Kartenanbietern pseudonyme Bewegungsdaten verarbeitet werden. Diese wären aber nur sehr grob, da diese Daten ja nur während der ausschließlich manuell ausgelösten Standort-Abfrage (das Zielkreuz rechts unten) übertragen werden. Während bei Google Maps keine IDs sichtbar sind, konnte ich dort nicht den kompletten Datenverkehr unverschlüsselt einsehen. Bei Mapbox waren alle Requests entschlüsselbar, aber dort war eine Installations-ID in den Anfragen sichtbar, die nach eigenen Angaben für die Abrechnung notwendig ist und verhindern soll, dass ein Gerät massenhaft Kartenkacheln von der API zieht.
Wer beim Datenschutz auf der ganz sicheren Seite sein will, kann auch einfach bei der Play-Store-Variante die Ortung über die Zielkreuz-Schaltfläche an häufig genutzen Orten wie Wohnung oder Arbeitsstätte unterlassen. Bei Mapbox liegt der Vorteil neben der Transparent darin, dass der Dienst nie eine genaue Koordinate erhält, sondern lediglich die benötigten Vector-Map-Tiles, deren Nummern von Mapbox offenbar intern im Gerät aus dem Standort berechnet oder nachgeschlagen wurden. Damit kann man der Mapbox-Server einen realen Standort also nur auf vielleicht 50-100m erahnen. Sind die Kartenkacheln bereits im Cache, werden sie auch nicht erneut angefragt und Mapbox erfährt gar nichts von der Ladesäulensuche. Selbst die theoretisch mögliche Ermittlung einer realen Person anhand häufig genutzt Ladesäulen halte ich unter diesen Umständen für unmöglich. Die Problematik betrifft aber natürlich auch alle anderen Ladeapps, ich habe sie hier nur nochmals ausführlicher behandelt.
EWE Go
EWE ist einer der großen deutschen Energieversorger und hat seinen Sitz in Oldenburg. Europaweit kann man 400.000 Ladepunkte ansteuern, was genug ist um keine zweite Karte dabei haben zu müssen. Früher gab es mal eine Ladekarte ohne App, aber das gibt’s nicht mehr. Für die nun nutzlosen alten Plastikkarten hat EWE 500 Bäume gepflanzt (kein Witz). Die Preise sind im Mittelfeld, mit 0,59€ bei Langsamladern, die nicht von EWE sind, aber eher hoch. Günstiger als der Konkurrent EnBW ist die App aber dennoch.
Beim Start der App sieht man tatsächlich nur einen Aufruf. Nun muss man einwilligen, dass z.B. bei Google Maps Daten in unsichere Drittländer übertragen werden. In einem zweiten Schritt wird man vorbildlich aufgefordert, in Analyse durch z.B. Google Firebase einzuwilligen. Hier habe ich abgelehnt. Die App sendet dann sehr brav Daten nur zu diesen zwei Servern:
[1] EWE Server: Per API werden alle benötigten Daten mit dem EWE-Backend bei Amazon ausgetauscht, hier beispielsweise einige Ladesäulen zu einer Koordinate angefordert.
POST https://app-backend.ewe-go.de/api HTTP/2.0 accept: */* x-api-key: VTfRc63eLs5fxRCLarYP1JKjS8DJ9qAaOKhBpNsh language: de appversion: 1.3.1 osversion: Android-11 content-type: application/json content-length: 910 accept-encoding: gzip user-agent: okhttp/4.9.2 GraphQL { „operationName“: „Clustering“, „variables“: { „topLeftLat“: 48.14553202243838, „topLeftLong“: 11.567103372886779, „bottomRightLat“: 48.13024729419835, „bottomRightLong“: 11.580488165840508, „filter“: {} }, „query“: „…“ } — query Clustering($topLeftLat: Float!, $topLeftLong: Float!, $bottomRightLat: Float!, $bottomRightLong: Float!, $filter: Filter) { clustering( topLeftCoordinates: {latitude: $topLeftLat, longitude: $topLeftLong} bottomRightCoordinates: {latitude: $bottomRightLat, longitude: $bottomRightLong} filter: $filter ) { … on Cluster { id count coordinates { latitude longitude __typename } __typename } … on MapLocation { locationId availability markerType coordinates { latitude longitude __typename } __typename } __typename } }
[2] Google Maps: Hier konnte ich wieder nicht alle Anfragen entschlüsseln. Google erhält aber den genauen Standort.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 484 X-Google-Maps-Mobile-API: de.ewe.go.app,1288,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\xba\x0c\x8c\x07\x1a\x87\xda\xbc\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x01\x0c \x041070 \x01* de.ewe.go.app2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGGKDCKhtjfYx_RZ50A2j-zaPLI9T7WP9J2V8wdOPb0-LIWlvRyWzj6DWHXtBz5SDl6huZJFMookk9AjFS2brjYqbmSS9WkU8BNAamzoUWpyjrsGq06NMeKY7GNwsMAdrNrEMaWY8OWPrwCKGukMMRDxLGB13fRObr5rIiiSb3Zr0OxV5EA\xba\x02\x041288\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03l\x00\x00\x00\x91 J\x08\x80\x02\x10\x00\x10\x0c\x10 \x18\x04\x18\x06 \x01(\x015\x00\x00@@b\x04\x08\xce\xc5Sb\x04\x08\xd1\xc5Sb\x04\x08\xca\xf6Sb\x04\x08\xa9\xa5Tb\x05\x08\xe9\x8e\xb4\x16b\x05\x08\x9d\xff\xb7\x16b\x05\x08\xeb\x88\xb8\x16b\x05\x08\x8f\xaa\xb8\x16JC\x08\x0e\x10\x00\x18\x00 \x002%0x479ddf637c64b7e5:0x64dca8539d59b2b58\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\xac\xaf\x80\xa3\x07
Fazit: EWE Go ist eine der wenigen Lade-Apps, die sich an die datenschutzrechtlichen Vorgaben hält und Analysetracking selbst beim Appstart nur nach vorheriger Zustimmung einsetzt. Bleibt noch die Verwendung von Google Maps als Kartenanbieter: Hier kann ich keine sichere Aussage machen, ob die Daten pseudonyme IDs enthalten und sich so aus den Daten ein Bewegungsprofil erstellen lässt. Wer sicher gehen will, erlaubt der App die Lokalisierung nur auf manuelle Nachfrage und nicht an häufig genutzten Orten wie Wohnung oder Arbeitsplatz. Oder man gibt gar keinen Standort frei und sucht sich den Ort zum Laden manuell. Wichtig für Fans von alternativen Androids: Die App funktioniert in ihren Grundfunktionen auch ohne Google Play Services – dann fehlt aber Google Maps mit der Ladesäulenkarte. Auch Ladevorgänge lassen sich dann nicht starten. Man kann sich aber damit bei EWE registrieren, eine RFID-Ladekarte bestellen und in der Profilverwaltung seine vergangenen Ladungen einsehen. Die Ladesäulen findet man auch ebensogut auf einer Onlinekarte, die man sich als Shortcut auf den Startbildschirm des Smartphones legen kann. Allerdings ohne Filter für AC/DC, so dass ich weiterhin zunächst auf EV Map suchen würde. In jedem Fall ist der Anbieter eine datenschutzfreundliche Alternative für die weit verbreitete EnBW-Ladekarte.
Freshmile
Freshmile ist ein Prepaid-Anbieter: Man lädt zum Beispiel über seine Kreditkarte Geld in die App oder die Freshmilekarte, die es auch ohne App gibt. Vor allem in Frankreich bietet Fresmile sehr günstige Preise, teilweise im Bereich von 0,20-0,30€ pro kwh. Das hängt aber vom Ladenetz ab und erfolgt teilweise mit einer komplizierten Mischberechnung aus kw und Minuten. Wer genau recherchiert, kann aber Superschnäppchen machen und sein Auto für unter 10€ vollladen.
Die Verbindungen:
[1] Sentry ist ein technischer Analysedienst, der zum Beispiel die Leistung der App oder Fehlerquellen überwacht. Tatsächlich konnte ich nur diesen einen Request beobachten, so dass ich nicht von einem umfangreichen Profiling ausgehe. Bedauerlich ist, dass die Analyse neben der Sitzungs-ID sid
auch die optionale User-ID did
nutzt. Die App-Nutzung wird also pseudonym überwacht. Klassische Analysedaten wie Nutzungsdauer oder Öffnen und Schließen der App werden allerdings nicht überwacht.
POST https://o332186.ingest.sentry.io/api/5320683/envelope/ HTTP/1.1 User-Agent: sentry.java.android/5.0.1 X-Sentry-Auth: Sentry sentry_version=7,sentry_client=sentry.java.android/5.0.1,sentry_key=711afe7f4c9d48db93b0affbad01256d Content-Encoding: gzip Content-Type: application/x-sentry-envelope Accept: application/json Connection: close Host: o332186.ingest.sentry.io Accept-Encoding: gzip Content-Length: 321 [decoded gzip] Raw {„sdk“:{„name“:“sentry.java.android“,“version“:“5.0.1″,“packages“:[{„name“:“maven:io.sentry:sentry“,“version“:“5.0.1″},{„name“:“maven:io.sentry:sentry-android-core“,“version“:“5.0.1″},{„name“:“maven:io.sentry:sentry-android-ndk“,“version“:“5.0.1″}]}} {„content_type“:“application/json“,“type“:“session“,“length“:249} {„sid“:“51506e98-1103-4da4-9a69-f6fd6b746b03″,“did“:“64fdafc1-ce07-4757-af60-42a05a73f1dc“,“init“:true,“started“:“2023-08-07T16:34:53.205Z“,“status“:“ok“,“timestamp“:“2023-08-07T16:34:53.205Z“,“attrs“:{„release“:“com.freshmile.charge@4.14.0+40051″}}
[2] Freshmile Server: Per API werden Ladesäulen und andere Karten-Features vom Freshmile-Server abgerufen. Dieser wird von dem französischen Anbieter Outscale gehostet. Eine eindeutige User-ID sehe ich auf den ersten Blick nicht.
GET https://move.freshmile.com/api/enduser/map/search?bbox=11.569782544406166,48.13302057829597,11.582130347766679,48.14318343169296&zoom=14.323307955305658&status[]=AVAILABLE&status[]=BLOCKED&status[]=CHARGING&status[]=UNKNOWN&status[]=PLANNED&status[]=INOPERATIVE&status[]=OUTOFORDER&status[]=RESERVED&access[]=PHONE&access[]=RFID&access[]=CREDIT_CARD&access[]=RESERVABLE&powers[]=150&powers[]=0-7&powers[]=7-11&powers[]=11-50&powers[]=50-100&powers[]=100-150&facilities[]=AIRPORT&facilities[]=BUS_STOP&facilities[]=CAFE&facilities[]=CARPOOL_PARKING&facilities[]=FUEL_STATION&facilities[]=HOTEL&facilities[]=MALL&facilities[]=MUSEUM&facilities[]=NATURE&facilities[]=RECREATION_AREA&facilities[]=RESTAURANT&facilities[]=SPORT&facilities[]=SUPERMARKET&facilities[]=TAXI_STAND&facilities[]=TRAIN_STATION&facilities[]=WIFI&connectors[]=DOMESTIC_E&connectors[]=IEC_62196_T2&connectors[]=IEC_62196_T3C&connectors[]=CHADEMO&connectors[]=IEC_62196_T2_COMBO&connectors[]=OTHER HTTP/2.0 accept: application/json, text/plain, */* access-control-allow-origin: * authorization: Bearer QqYOBnJmUQcH6G5ONn1FmDR0xT26Y9 user-agent: Freshmile 4.14.0 (40051), com.freshmile.charge | axios/0.24.0 | Android 11 accept-language: de x-csrf-token: 6u7s3RMUWFvkp53ePdP x-session-id: 13a0ab74-cadb-4534-8d14-3be55ccecc99 accept-encoding: gzip Query bbox: 11.569782544406166,48.13302057829597,11.582130347766679,48.14318343169296 zoom: 14.323307955305658 status[]: AVAILABLE status[]: BLOCKED status[]: CHARGING status[]: UNKNOWN status[]: PLANNED status[]: INOPERATIVE status[]: OUTOFORDER status[]: RESERVED access[]: PHONE access[]: RFID access[]: CREDIT_CARD access[]: RESERVABLE powers[]: 150 powers[]: 0-7 powers[]: 7-11 powers[]: 11-50 powers[]: 50-100 powers[]: 100-150 facilities[]: AIRPORT facilities[]: BUS_STOP facilities[]: CAFE facilities[]: CARPOOL_PARKING facilities[]: FUEL_STATION facilities[]: HOTEL facilities[]: MALL facilities[]: MUSEUM facilities[]: NATURE facilities[]: RECREATION_AREA facilities[]: RESTAURANT facilities[]: SPORT facilities[]: SUPERMARKET facilities[]: TAXI_STAND facilities[]: TRAIN_STATION facilities[]: WIFI connectors[]: DOMESTIC_E connectors[]: IEC_62196_T2 connectors[]: IEC_62196_T3C connectors[]: CHADEMO connectors[]: IEC_62196_T2_COMBO connectors[]: OTHER
[3] Mapbox wird als datenschutzfreundlicher Kartenprovider verwendet. Auch hier wird kein Standort übertragen, sondern nur Kacheln angefordert. Allerdings ist die pseudonyme ID sku
enthalten. Details dazu habe ich im Test bei EV Map beschrieben.
GET https://api.mapbox.com/v4/mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v7/14/8719/5686.vector.pbf?access_token=pk.eyJ1IjoiZnJlc2htaWxlIiwiYSI6ImNpankxbDFieDAwMm13YmtwN2ozNnp2dmQifQ.xK2pYRpRhul1jY_cZomwaQ&sku=100ll13fl3p0dbe0d5da6e4404da89d52fd984e0dfa HTTP/1.1 User-Agent: com.freshmile.charge/4.14.0 (40051) Mapbox/9.7.1 (545884a) Android/30 (armeabi-v7a) Host: api.mapbox.com Connection: Keep-Alive Accept-Encoding: gzip Query access_token: pk.eyJ1IjoiZnJlc2htaWxlIiwiYSI6ImNpankxbDFieDAwMm13YmtwN2ozNnp2dmQifQ.xK2pYRpRhul1jY_cZomwaQ sku: 100ll13fl3p0dbe0d5da6e4404da89d52fd984e0dfa
Fazit: Mit Ausnahme des sehr technischen Analyserequests beim Start der App gibt es hier kaum etwas zu bemängeln. Die App kommt ohne Google aus und sendet keinen genauen Standort an den datenschutzfreundlichen Kartendienst Mapbox.
Charge myHundai
Hyundai ist bekannt dafür, besonders sparsame Elektroautos herzustellen und von daher wäre es auch schön, wenn diese sich dann genauso datensparsam nutzen lassen. Die Preise sind mittelmäßig und erinnern an BMW Charge: Ein etwas komplizierteres Tarifmodell, wobei ein kwh-Preis von 0,79€ bei einem Monatsabo etwas happig erscheint. Die App stammt von der deutschen Firma Digital Charging Solutions und ist vermutlich nur eine gebrandete Version von Chargenow vom gleichen Anbieter.
Die Verbindungen sind entsprechen exakt identisch zu Chargenow:
[1] Mixpanel, ein App-Analyse-Dienst (der Inhalt war base64-decodiert).
POST https://api.mixpanel.com/track/?ip=1 HTTP/1.1 Content-Length: 785 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.mixpanel.com Connection: Keep-Alive Accept-Encoding: gzip URLEncoded form data: [{„event“:“Integration“,“properties“:{„mp_lib“:“Android“,“$lib_version“:“7.3.1″,“$os“:“Android“,“$os_version“:“11″,“$manufacturer“:“samsung“,“$brand“:“samsung“,“$model“:“SM-G900F“,“$screen_dpi“:480,“$screen_height“:1920,“$screen_width“:1080,“$app_version“:“3.42″,“$app_version_string“:“3.42″,“$app_release“:“365″,“$app_build_number“:“365″,“$has_nfc“:true,“$has_telephone“:true,“$wifi“:true,“$bluetooth_version“:“ble“,“token“:“85053bf24bba75239b16a601d9387e17″,“distinct_id“:“45d34ff2107c23df37a32df803d40170″,“Project Token“:“45d34ff2107c23df37a32df803d40170″},“$mp_metadata“:{}}]
[2] Microsoft wird als Cloudserver für die Funktionalität der App genutzt.
POST https://api.prod.digitalchargingsolutions.com/usergateway/public/poi-availability/v2/charge-points/query HTTP/1.1 Accept: application/json Ocp-Apim-Subscription-Key: 1c8fcee1a03c4ee688f0d8dc1d48ffa4 Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiJodHRwczovL2FwaS5wcm9kLmRpZ2l0YWxjaGFyZ2luZ3NvbHV0aW9ucy5jb20vdXNlcmdhdGV3YXkiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9hNjBjZDJkOS04MmEwLTRiZmYtYjllOS04ZDcxNjI2YWJiMGUvIiwiaWF0IjoxNjkxNzc0MjQwLCJuYmYiOjE2OTE3NzQyNDAsImV4cCI6MTY5MTc3ODE0MCwiYWlvIjoiRTJGZ1lIaktIVnl5WERLOXJDenJnZk54OWJmV0FBPT0iLCJhcHBpZCI6IjY5MDE3YzA2LWEwMWItNGQ3Yi1hYmIxLTczODdhYTNlM2M3OCIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E2MGNkMmQ5LTgyYTAtNGJmZi1iOWU5LThkNzE2MjZhYmIwZS8iLCJvaWQiOiIwOTViZTk2Zi00ZWEwLTQ2YzktOGFmMi1iM2VjNmU2MWFkMWYiLCJyaCI6IjAuQVI4QTJkSU1wcUNDXzB1NTZZMXhZbXE3RHJ4Y3h1b3cyQWRDdlNKX3RjLVdQUllmQUFBLiIsInJvbGVzIjpbImRjcy11c2VyZ2F0ZXdheS1jYWxsZXIiLCJPRU1fSFlVTkRBSSJdLCJzdWIiOiIwOTViZTk2Zi00ZWEwLTQ2YzktOGFmMi1iM2VjNmU2MWFkMWYiLCJ0aWQiOiJhNjBjZDJkOS04MmEwLTRiZmYtYjllOS04ZDcxNjI2YWJiMGUiLCJ1dGkiOiJFUWhxanlaT3VrbVJQY0VuWnlOOEFBIiwidmVyIjoiMS4wIn0.r49HHuZH3a6FZVvK7mL_X86Q7g7J_4EqN54gGWTuS08mUdJyRA0ERIBZnhRySRiBSjV4REeUEm2QJBvkwTKcxC5Qmsteyid9GlxyXCyd53FzvkiyzuNPUD5gnIgnSnKt3gUSfSBgJYZ1UHG1vloYIr9kC3niMKgHydW0Gpncwp9p_TTy0PuLKVjemgNx49SneapYFCIxW0nDlrSw6jhZNY6LvPgLLph6Yg6_6QtQdUT_3GgW1zEqLjeOkTv4AP_GBSJDwtwN0qQgvZt5DXEM6OT723oQ6UFizU7iyTFf26kusXCOFzkXavoBkatJsXnUiKp6FCdujbQ6J0YRx_4ngw Content-Type: application/json; charset=utf-8 Content-Length: 356 Host: api.prod.digitalchargingsolutions.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.11.0 JSON { „DCSChargePointDynStatusRequest“: [ { „dcsChargePointId“: „DE:DCS:CHARGE_POINT:af6c80c7-b6f5-3e3f-ace2-b80657ca03ee“ }, { „dcsChargePointId“: „DE:DCS:CHARGE_POINT:f83a7ff5-2a38-3fd8-9a3b-dc0c25fa90ff“ }, { „dcsChargePointId“: „DE:DCS:CHARGE_POINT:22f11fc8-3217-30ae-90bb-2cfd12befa90“ }, { „dcsChargePointId“: „DE:DCS:CHARGE_POINT:a2bc1f0b-2aff-3173-9430-96527845f088“ } ] }
[3] Lokalise organisiert die Spracheinstellung der App und erhält keine personenbezogenen Daten.
GET https://ota.lokalise.co/v2.0/android/ HTTP/1.1 X-Request-Id: 82d8164b-8ac7-4b81-83e6-91d5051d19c1 X-Lokalise-Api-Key: 19d5daf456bca5ae54ddcbab91f5c580497e6707 X-Lokalise-Project-Id: 9094590560508b2ad56dc6.02134273 X-Lokalise-Prerelease: 0 X-Lokalise-Current-Bundle: 0 X-Lokalise-Language: de X-Lokalise-Region: DE X-Lokalise-App-Language: de_DE X-Lokalise-Device-Language: de_DE X-Lokalise-SDK-Build: 223 X-Lokalise-App-Build: 365 X-Lokalise-UID: 91b1e1b9-8975-4676-8ed1-9a8ffbdc2ae6 User-Agent: Lokalise SDK; 223; Android; com.digitalchargingsolutions.hyundai; 365; de; SM-G900F (klte); 11 (30); Host: ota.lokalise.co Connection: Keep-Alive Accept-Encoding: gzip No content
[4] Google Maps stellt den Kartendienst der App.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 626 X-Google-Maps-Mobile-API: com.digitalchargingsolutions.hyundai,365,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\x10\xb9\xdd\x9d&\xa1|\xc0\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x017 \x041070 \x01*$com.digitalchargingsolutions.hyundai2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xcc\x01AH0uPGHXhsEvG-pzxin_EmnijgvLraD1Kryx0if-ipvhZypnKlH5D0qYg_wFkPcTJNVEQd2Dfa7NaVpXZW5sgSfL2MA1LnRKJiVrBqDDZaRIY-eMRmt6C3GFHxmn4PNbiSMf14KTqYDQIU0ZRe11UGxJqly4lVfUb3WFChTaTEtNbAwXz-RLLwuloB-EmbRM1yrw4LXIJImY\xba\x02\x03365\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03’\x00\x00\x00\xf4″\xf1\x01https://mt0.google.com/vt/icon/name=assets/icons/poi/tactile/pinlet_outline_v4-2-medium.png,assets/icons/poi/tactile/pinlet_v4-2-medium.png,assets/icons/poi/quantum/pinlet/medical_pinlet_v3-2-medium.png&highlight=ea4335,ee675c,ffffff&scale=4
Fazit: Einer der wenigen Anbieter, die ohne Googles Firebase arbeiten. Der Kartendienst von Google Maps erhält verschlüsselte Daten, die ich nicht bewerten kann. Der Analysedienst von Mixpanel und das Hosting bei Microsoft mit eindeutigen Geräte-IDs sind sicher kaum geeignet für einen datenschutzkonformen Betrieb.
Ionity
Ionity ist ein gemeinsames Unternehmen von vorwiegend deutschen Autoherstellern und für seine Apothekenpreise bekannt. Wenn Diesel-Dieter mal den Liter-Sprit für fast 3€ angeboten bekommen würde, würde er sofort ohnmächtig in seine Ledersitze sinken Bei Ionity scheint das aber zu funktionieren. Selbst mit monatlichem Abo liegt die App noch über den Preisen anderer Anbieter. Vielleicht ist der Strom ja besonders schonend für den Motor?
Hier sind die Verbindungen:
[1] Google Firebase erfährt die Installation und konfiguriert die App:
POST https://firebaseinstallations.googleapis.com/v1/projects/ionity/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.cleevio.ionity.android.app x-firebase-client: H4sIAAAAAAAAAF2RwW7DIBBEfyXiHLDBqhLlV-ocsFm7yBgi2Fitovx7NzZGaa-P2dmZ5cG-QEfsQGNil88H0yN4ZBc22Ai8DxHaStWiEfVhIy7xCb_bSp4JfhT4F2iv3Q_aPmuVFIoMpoDOelKKk5C7H23Iom2L9iYGa_hsPU9mIt788yx-Kx76-aURUsis63BVyBJ5GN9iyIOBxfbAu0ir2irpOd39WPZan1A7B7Gt-jCLjMUC3liS5SgrbKum3t3mYMC11eQQduT1DJmsU9lZow3-dS86glDbU-xLuj3HjYRDiFSu9Mwt3roidUi3EHE9P921jKOOI-B2waZhR2Y0wuuHmapVw-szr0_s-rwe2QIxUSL6csWev2p3V_UPAgAA X-Android-Cert: FF09D1122CD6B6B77B4BB572E51AE81E93D25058 x-goog-api-key: AIzaSyAo5yL0FQePufbob5WsNOjzqUjlJS1xjFw User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:910376740152:android:453c4c051230a6f0764dcd“, „authVersion“: „FIS_v2“, „fid“: „ca4IOjoeRwKA9B8R4wDP-Y“, „sdkVersion“: „a:17.1.2“ } RequestResponseConnectionTiming POST https://firebaseremoteconfig.googleapis.com/v1/projects/910376740152/namespaces/firebase:fetch HTTP/1.1 X-Goog-Api-Key: AIzaSyAo5yL0FQePufbob5WsNOjzqUjlJS1xjFw X-Android-Package: com.cleevio.ionity.android.app X-Android-Cert: FF09D1122CD6B6B77B4BB572E51AE81E93D25058 X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTEwMzc2NzQwMTUyOmFuZHJvaWQ6NDUzYzRjMDUxMjMwYTZmMDc2NGRjZCIsImV4cCI6MTY5MjAzMzI5MCwiZmlkIjoiY2E0SU9qb2VSd0tBOUI4UjR3RFAtWSIsInByb2plY3ROdW1iZXIiOjkxMDM3Njc0MDE1Mn0.AB2LPV8wRQIgfUGMPP9NpxqGcGkDvnkwRShN1bkRsuqAYZ8YhMMcRPwCIQDLum0zoNXv0V3U6eOXkcGNYlvE_wNQNdq28i2T6Xsttw Content-Type: application/json Accept: application/json Content-Length: 719 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: {}, „appBuild“: „2813“, „appId“: „1:910376740152:android:453c4c051230a6f0764dcd“, „appInstanceId“: „ca4IOjoeRwKA9B8R4wDP-Y“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTEwMzc2NzQwMTUyOmFuZHJvaWQ6NDUzYzRjMDUxMjMwYTZmMDc2NGRjZCIsImV4cCI6MTY5MjAzMzI5MCwiZmlkIjoiY2E0SU9qb2VSd0tBOUI4UjR3RFAtWSIsInByb2plY3ROdW1iZXIiOjkxMDM3Njc0MDE1Mn0.AB2LPV8wRQIgfUGMPP9NpxqGcGkDvnkwRShN1bkRsuqAYZ8YhMMcRPwCIQDLum0zoNXv0V3U6eOXkcGNYlvE_wNQNdq28i2T6Xsttw“, „appVersion“: „v1.14.4“, „countryCode“: „DE“, „firstOpenTime“: „2023-08-07T18:00:00.000Z“, „languageCode“: „de-DE“, „packageName“: „com.cleevio.ionity.android.app“, „platformVersion“: „30“, „sdkVersion“: „21.2.1“, „timeZone“: „Europe/Amsterdam“ }
[2] Crowdin kümmert sich um die Spracheinstellungen und Texte in der App, hier sind keine personenbeziehbaren Daten involviert.
GET https://distributions.crowdin.net/30144c2c256307f40ac9c38k2ku/manifest.json HTTP/2.0 user-agent: crowdin-android-sdk/1.5.7 android/30 accept-encoding: gzip No content
[3] Amazon Cognito: Bei der Pflichtanmeldung wird Amazon AWS Cognito genutzt und die E-Mailadresse ungehasht in die Amazon-Cloud übertragen. Naja, das ginge besser. Außerdem wird ein Device-Fingerprint erstellt (hier teilweise schon base64-entschlüsselt).
POST https://cognito-idp.eu-central-1.amazonaws.com/ HTTP/1.1 aws-sdk-invocation-id: af995051-1bc6-463f-a77b-12282e5c1dda User-Agent: amplify-android/1.35.7 (Android 11; samsung SM-G900F; de_DE) aws-sdk-retry: 0/0 Accept-Encoding: identity X-Amz-Target: AWSCognitoIdentityProviderService.SignUp Content-Type: application/x-amz-json-1.1 Content-Length: 1603 Host: cognito-idp.eu-central-1.amazonaws.com Connection: Keep-Alive Raw {„ClientId“:“16nc3jqjdulljuc5mc7iklottm“,“SecretHash“:“5UaeWxpg3QkzsMb7OmkXaxrG7/CkJXSo1r41Xls9q7M=“,“Username“:“********@protonmail.com“,“Password“:“********“,“UserAttributes“:[{„Name“:“custom:language“,“Value“:“de“}],“ValidationData“:[],“AnalyticsMetadata“:{„AnalyticsEndpointId“:“375d8fb5-e7f0-4fd8-9424-7ff08e303fa7″},“UserContextData“:{„EncodedData“:“{„payload“:“{\“contextData\“:{\“DeviceFingerprint\“:\“samsung\\\/kltexx\\\/klte:6.0.1\\\/MMB29M\\\/G900FXXU1CRH1:user\\\/release-keys\“,\“ApplicationName\“:\“IONITY\“,\“ApplicationVersion\“:\“v1.14.4\“,\“Platform\“:\“ANDROID\“,\“ApplicationTargetSdk\“:\“33\“,\“DeviceId\“:\“0000000-30c7-472d-9013-8ccdf1f5bbf7:1691428841731\“,\“DeviceBrand\“:\“samsung\“,\“Product\“:\“klte\“,\“ThirdPartyDeviceId\“:\“android_id\“,\“DeviceOsReleaseVersion\“:\“11\“,\“ClientTimezone\“:\“01:00\“,\“DeviceLanguage\“:\“de_DE\“,\“DeviceSdkVersion\“:\“30\“,\“ScreenWidthPixels\“:\“1080\“,\“BuildType\“:\“userdebug\“,\“ScreenHeightPixels\“:\“1920\“,\“DeviceHardware\“:\“qcom\“,\“DeviceName\“:\“SM-G900F\“},\“username\“:\“********@protonmail.com\“,\“userPoolId\“:\“eu-central-1_epWSpswuf\“,\“timestamp\“:\“1691428841732\“}“,“signature“:“7\/KSBwpd+kRhZlNlPqqlV98O9U3UFLR\/OH9qPBGGeWo=\n“,“version“:“ANDROID20171114},“ClientMetadata“:{}}
[4] Google Maps wird als Kartendienst genutzt und erhält die exakten Koordinaten meines Standorts. Teile des Datenverkehrs konnte ich dabei nicht abfangen und analysieren.
GET https://maps.googleapis.com/maps/api/directions/json?key=AIzaSyBgZ6KV_xL8fIl_u82ColEfQAXTjSIsE38&mode=driving&origin=48.13711%2C11.57541&destination=48.31084800%2C11.64672900 HTTP/2.0 user-agent: GoogleGeoApiClientJava/2.1.2 x-android-package: com.cleevio.ionity.android.app x-android-cert: FF09D1122CD6B6B77B4BB572E51AE81E93D25058 accept-encoding: gzip Query key: AIzaSyBgZ6KV_xL8fIl_u82ColEfQAXTjSIsE38 mode: driving origin: 48.13711000,11.57541000 destination: 48.31084800,11.64672900
[5] Ionity Server: Per API wird das von Amazon gehostete Ionity-Backend mit meinem Standort kontaktiert, um Ladesäulen abzufragen. Das geschieht bei geöffneter App etwa alle zehn Sekunden, was sehr seltsam scheint. Evtl. liegt es aber an meinem Test-Setup, in dem Google Maps wegen einem Zertifikatfehler nicht antwortet.
GET https://ionity-api.ionity.cloud/api/v2/charging-point?latitude=48.1390802&longitude=11.5470328&radius=50 HTTP/1.1 X-Platform: android Authorization: Bearer eyJraWQiOiJ5czVvUG9MQzJ1ck9QazlDT095dEY0S3YxY3h3TWcydU1HeW9WOTd2Wms4PSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJhMTk0NGYwMy04OTI4LTQ2NjQtOTJkZi04ZDRmYTVlNjA4OTciLCJldmVudF9pZCI6ImQ0MTQwZGY1LTFhYzktNGE1OS1iMTYxLTcyMmI2MTcwMmQwOCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2OTE0MjkwMzQsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbVwvZXUtY2VudHJhbC0xX2VwV1Nwc3d1ZiIsImV4cCI6MTY5MTQzMjYzMywiaWF0IjoxNjkxNDI5MDM0LCJqdGkiOiJmZDUwYTVlYy00ZWQzLTQ2ODEtODYyMi05ZDViZTg5Mzg1YjMiLCJjbGllbnRfaWQiOiIxNm5jM2pxamR1bGxqdWM1bWM3aWtsb3R0bSIsInVzZXJuYW1lIjoiYTE5NDRmMDMtODkyOC00NjY0LTkyZGYtOGQ0ZmE1ZTYwODk3In0.P2qj12CZkO_bESyRcgC8kGrwCddhut40RWuKu6BtXcqgIZPBOdGTytfasTRhYgaebrys9Mv4hH6TmgvD7sR1LYWYN5XNwnln2_TSd1RyX0MSjWVU-wFZ5984sO005H2l-12YLH-ROX410HVksetVvUHYYMHd7isXULDDeYeqiO3xc3hx19GYzXDXsWHSnamZyK2m0H3jIlIbA5GBoqP31YzVKF5ddx1zLk34mJIcimqdP3YiWoO8CdGCBONX8t8j4lpsKw1U-R4qeUrVz1PmpT5vCWfiOKJtuyi8zbEkluxZTwkEB3VU-MyeqyVufnBbPvDuV-WN7et0dXjGRmuGLA Host: ionity-api.ionity.cloud Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.10.0 Query latitude: 48.1371100 longitude: 11.575410 radius: 50
Fazit: Die App ist ganz solide, aber noch kein Datenschutz-Luxusprodukt: Bedingt durch die Wahl der Login-Infrastruktur werden zahlreiche Gerätedaten und die E-Mail im Klartext an einen Amazon-Server übertragen, wo diverse Datenschutzfplichten nicht erfüllt werden können (zum Beispiel unsicherer Drittstaat, keine fristgerechte Löschung von Logfiles). Rechtliche fragwürdig ist wie bei vielen anderen Anbietern der Einsatz von Firebase. Von einem Premiumanbieter würde ich beim Datenschutz etwas mehr erwarten, aber positiv ist in jedem Fall das Fehlen von Analyse- und Werbetracking.
Jucr
Jucr ist genauso wie Elvah ein Flatrate-Anbieter. Nach dem Start sehen wir einige unschöne Verbindungen:
[1] Google Firebase wird über die Installation informiert
POST https://firebaseinstallations.googleapis.com/v1/projects/jucr-app-production/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: io.jucr.apps.charging.production x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 03162DE15E0A4715C2BFA2263C43CB7825E76D44 x-goog-api-key: AIzaSyBQxAK7a5fgPHweRyMAuxi_hS1gfC8DXF0 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:696259276437:android:c05c51c5a983be3d11359c“, „authVersion“: „FIS_v2“, „fid“: „dFn4v7JZRZ2TB8vLm52hNa“, „sdkVersion“: „a:17.1.3“ }
[2] Appfsflyer, ein Unternehmen das Werbe-Zielgruppen aus App-Nutzung generieren kann, erhält binäre Daten. Das ist gar nicht gut.
POST https://ve9s98-conversions.appsflyersdk.com/api/v6.10/androidevent?app_id=io.jucr.apps.charging.production&buildnumber=6.10.1 HTTP/1.1 Content-Type: application/octet-stream Content-Length: 3352 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: ve9s98-conversions.appsflyersdk.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 63 80 1d 7f fd bd 46 d4 78 43 37 aa 82 53 ec 0e c…..F.xC7..S.. 0000000010 a7 9d f7 b6 4b 48 5c 64 75 e5 d1 13 a3 b2 99 f9 ….KH\du……. 0000000020 8c 81 f5 62 57 6f 86 70 71 e4 d8 8f 6e ce 40 bc …bWo.pq…n.@. 0000000030 16 45 d5 43 10 0d 52 2f fe 6c c6 1c 06 11 7d cc .E.C..R/.l….}. 0000000040 d2 7b c6 28 88 62 dc 13 cb 39 68 ba 42 be 26 c4 .{.(.b…9h.B.&. 0000000050 37 e8 54 da 65 15 65 d9 4f 29 16 e9 d1 4a 41 b2 7.T.e.e.O)…JA. 0000000060 f3 6b a6 ab eb 3a 6c 42 95 e8 7d 5f 7c 09 9f 6f .k…:lB..}_|..o 0000000070 fb 4e b5 ec 85 1d 6e cf 89 5e 40 c1 f2 68 4f f9 .N….n..^@..hO. 0000000080 44 94 79 08 88 f1 94 06 75 7f ec 6e 2e cb c1 f1 D.y…..u..n…. 0000000090 dd 6d 4b 10 15 40 4c 78 18 dc 69 c0 12 a3 0c c0 .mK..@Lx..i….. 00000000a0 26 9b 9a 08 2a 92 19 f5 ff b6 90 62 c6 15 5f ed &…*……b.._. 00000000b0 ee 70 2c 6d 45 6c 5b 29 27 5a b0 9c 76 5e 61 30 .p,mEl[)’Z..v^a0 00000000c0 d8 17 74 4f 51 4b e6 a3 f1 21 37 61 5b 13 c8 63 ..tOQK…!7a[..c 00000000d0 34 6e d7 f6 ed 17 38 48 46 ef e9 0c a6 00 a9 71 4n….8HF……q 00000000e0 aa 02 eb 05 58 d1 e4 b2 89 88 05 cc 70 35 d7 9d ….X…….p5.. 00000000f0 25 25 0c 33 21 52 62 96 e9 1d a0 8b 22 17 6c 0c %%.3!Rb…..“.l. 0000000100 52 c3 0d 46 1b 9b 73 1c d4 e6 d4 ba b7 44 26 61 R..F..s……D&a 0000000110 09 d8 a9 89 39 78 35 db ca f4 66 c9 a3 54 8a 30 ….9×5…f..T.0 0000000120 5a 4b 7d 6e d7 73 db 06 b0 fd fb e7 10 81 e7 ba ZK}n.s………. 0000000130 3b d6 24 18 5b de f2 ac 02 c1 cb bd 0c 1a 39 e7 ;.$.[………9. 0000000140 3a a0 fa d1 1e 82 c7 1f 08 c6 57 03 5d ec b9 3f :………W.]..? 0000000150 86 f6 c9 34 98 a2 73 77 d2 19 6a e0 12 1f f1 c0 …4..sw..j….. 0000000160 2a 20 48 a3 eb 0f 16 8d c0 34 ea fa 03 c9 c0 dc * H……4…… 0000000170 87 55 0f b0 31 f5 7a ad 87 d6 6e c3 cf 52 37 21 .U..1.z…n..R7! 0000000180 86 a4 4a 7c 7d b9 fd 5b cf a9 68 b9 27 39 b8 21 ..J|}..[..h.’9.! 0000000190 dd e6 85 02 a7 c1 23 90 b0 27 6f ed 35 2c 98 5d ……#..’o.5,.] 00000001a0 f0 f6 e5 e2 db be 5a 10 0a 19 67 23 b7 b0 0a 50 ……Z…g#…P 00000001b0 a9 92 2c 80 14 2b f1 28 6f e0 83 d8 4f 59 b5 27 ..,..+.(o…OY.‘ 00000001c0 85 e9 60 a6 ee 7e d8 78 b3 4f d5 d9 12 ac 88 fe ..`..~.x.O…… 00000001d0 9d 78 a9 d5 4d 65 6a bd 78 f3 c3 cf 61 72 ec 68 .x..Mej.x…ar.h 00000001e0 f6 b5 92 09 49 77 e5 84 98 0a 3c 5c 73 9e 7b 9c ….Iw….<\s.{. 00000001f0 42 2e 47 60 46 4c 5d 87 df 4d 0a ca de e3 e6 16 B.G`FL]..M…… 0000000200 a9 21 f2 a9 91 f1 a6 60 6a 27 c5 8d e5 90 85 8f .!…..`j’…… 0000000210 53 8b e7 d2 46 f1 75 9d 9b 46 2d 26 e6 0d 88 3a S…F.u..F-&…: 0000000220 50 eb e1 17 c1 58 41 2e 98 b0 91 32 cf c0 f5 44 P….XA….2…D 0000000230 b7 95 20 9f 46 76 79 d9 f8 49 a1 c6 b8 f6 f2 28 .. .Fvy..I…..( 0000000240 70 7e a3 f1 d7 1a 32 c2 1b 21 7b bb a6 3d 02 40 p~….2..!{..=.@ 0000000250 f4 10 fa bd 49 dd 76 ee 61 42 50 63 dc c1 11 b0 ….I.v.aBPc…. 0000000260 c3 31 1c 24 46 e0 b3 0d 2d ab a4 a3 72 10 f9 7b .1.$F…-…r..{ 0000000270 f9 32 67 2c 82 8d 31 a7 96 2d fd ca a5 22 9e 1d .2g,..1..-…“.. 0000000280 6d 44 c8 4b 15 5b 96 f2 f3 57 3d 23 86 59 a2 21 mD.K.[…W=#.Y.! 0000000290 7a 59 00 b3 88 d9 ff 94 a5 f3 d8 fb 00 ea 3f ab zY…………?. 00000002a0 bc 3c b1 02 24 da 4a d4 53 8f 99 17 9c 33 de f6 ……….. 00000004f0 07 a8 44 bb 51 f8 db ad 5d cd 3d 0f 8b 20 55 9b ..D.Q…].=.. U. 0000000500 53 eb 50 79 1b df 63 63 c4 51 7a 34 d8 d0 dc 86 S.Py..cc.Qz4…. 0000000510 ba c3 f6 9b 9b fa 18 f5 d3 29 d0 7a 25 c8 44 1c ………).z%.D. 0000000520 7b 3c 25 95 90 20 1c c9 79 c3 39 cf b2 e9 87 45 {X.. 00000005e0 17 81 52 a4 55 df 91 80 c2 b7 9b 4b 80 76 51 34 ..R.U……K.vQ4 00000005f0 24 90 01 48 aa 56 5d 5d e0 bf 57 c4 58 47 ba c9 $..H.V]]..W.XG.. 0000000600 3b 50 d1 84 97 1c 74 27 5c 1c b6 c9 4a 77 07 bb ;P….t’\…Jw.. 0000000610 c2 92 81 d3 b7 8c 9e 80 3c 0a cb e1 8e 6e fb 46 ……..<….n.F 0000000620 ec 79 ee d1 95 6a 2d b5 17 3c 3e fb 53 ac e7 0b .y…j-…S… 0000000630 8f 30 c2 78 9b 8f 33 4a 36 c9 4b e8 58 7c a9 5f .0.x..3J6.K.X|._ 0000000640 42 29 d9 07 15 d6 de 94 cf ff 89 9a 52 6f 4d 7a B)……….RoMz 0000000650 16 2b 66 c5 2c 82 0a fb 43 6f 85 13 93 84 dd 33 .+f.,…Co…..3 0000000660 01 97 3a 73 9b 1c 6a 78 be ee fd b7 82 9e 76 60 ..:s..jx……v` 0000000670 82 cf ef 85 5a c4 d2 f6 ce 84 60 97 c3 ec b6 4b ….Z…..`….K 0000000680 e0 8a f6 83 00 d3 07 16 c1 56 4e 20 f7 44 16 e0 ………VN .D.. 0000000690 40 e2 74 dc ca 71 27 94 fe 53 81 22 f0 19 cd 73 @.t..q‘..S.“…s 00000006a0 53 a2 3d 83 86 b1 d3 d1 da fa 0d db d0 d0 60 3b S.=………..`; 00000006b0 8f 57 83 f7 45 4c bb c8 f7 7f b2 ea 6c 17 ab de .W..EL……l… 00000006c0 8e 0c 0e b5 00 0b b1 77 ff 44 52 9f 14 28 f2 23 …….w.DR..(.# 00000006d0 78 ea ef 38 6d 31 a1 a1 43 d8 3a 6a bb b2 c1 62 x..8m1..C.:j…b 00000006e0 68 12 59 53 40 94 62 e3 14 49 ec 6d 2f 66 0b 9c h.YS@.b..I.m/f.. 00000006f0 57 c7 55 bd a3 85 5a 1d b4 21 1c 93 07 2e f1 53 W.U…Z..!…..S 0000000700 a3 57 27 1d 55 1c 51 33 95 e8 08 e1 ba bf 3e 68 .W‘.U.Q3……>h 0000000710 03 f5 46 de 78 1d 11 bf 22 62 c5 21 7d cd e7 46 ..F.x…“b.!}..F 0000000720 c1 3d cb 1f 15 1c 2e 87 bf eb 8f 2e 6f 24 c0 bf .=……….o$.. 0000000730 ab 44 3e d3 20 7e b0 e7 e0 f3 f5 06 f3 3f 35 ca .D>. ~…….?5. 0000000740 2b d3 01 ae 3c 25 aa 38 a9 e4 22 b9 42 3f 70 36 +…<%.8..“.B?p6 0000000750 cd cd dd 4e 20 35 c3 6c 72 08 7f fe 7c 42 eb c4 …N 5.lr…|B.. 0000000760 c9 d8 64 f4 c7 9e 01 b5 fa cc e1 1e 8b 2c 51 3b ..d……….,Q; 0000000770 9e 47 81 ba 0e 6e 70 e2 08 9f 62 58 fd 72 db f4 .G…np…bX.r.. 0000000780 65 86 c8 fd 37 cc a4 ee a7 f7 2d 15 c7 69 e0 55 e…7…..-..i.U 0000000790 9c a6 49 aa 8d ca 8e 99 8b f5 13 01 dc d4 20 92 ..I……….. . 00000007a0 59 45 56 9b d2 4d 42 a2 7a e7 b2 d5 fe 99 71 2c YEV..MB.z…..q, 00000007b0 dc a2 c0 a9 21 05 d6 af 49 4a 2d 2b b8 ea a2 ce ….!…IJ-+…. 00000007c0 9c 87 b1 03 98 73 de 89 4e c5 97 c6 69 8a ee 78 …..s..N…i..x 00000007d0 ff 2f 98 f4 bb fa 7a 27 88 8c d9 12 db 72 7f 13 ./….z’…..r.. 00000007e0 b5 3c a3 13 f7 fc 01 23 7d bb 95 d7 1e 5d 2c ab ….. 0000000880 ab 8a a7 a5 1a 79 56 5d 22 d9 ae 9a 2b 31 ae d2 …..yV]“…+1.. 0000000890 1c d3 40 d3 d7 fa 63 6e e0 45 c2 34 81 b0 cd ce ..@…cn.E.4…. 00000008a0 b0 bf 4d 79 c7 43 14 b1 7c f0 63 88 db 8b ba 01 ..My.C..|.c….. 00000008b0 89 8a 15 1e 32 1d 8c 5b f7 10 2c 44 b0 e2 11 5c ….2..[..,D…\ 00000008c0 d0 b4 65 d8 3c d6 36 4f 5a b7 a5 4c 44 be a6 bf ..e.<.6OZ..LD… 00000008d0 2a 7b f6 18 bc 6f d2 8f 5a c5 ef 51 08 ff 2b 55 *{…o..Z..Q..+U 00000008e0 da de 24 e8 2f 74 4a f9 4d f1 4e 64 38 09 fe 67 ..$./tJ.M.Nd8..g 00000008f0 f2 66 0d b5 30 38 0d 03 ef 59 f3 d4 2c 65 9b 8c .f..08…Y..,e.. 0000000900 21 e4 9c c4 fe fc 21 2d 29 db 27 0f f2 c2 03 23 !…..!-).’….# 0000000910 e9 33 31 25 2c 93 6e c9 ba 1b 6b 65 1e 43 3b 6c .31%,.n…ke.C;l 0000000920 71 2b bc 1b 7a b2 35 32 3b 4f 57 2f df 0f c7 4f q+..z.52;OW/…O 0000000930 79 fe 1f 9e 47 10 75 a9 cd 08 2b ab 9f f2 70 85 y…G.u…+…p. 0000000940 ef 57 7d b2 ce 53 e8 1b 9f 24 b0 74 be 2c d6 fe .W}..S…$.t.,.. 0000000950 d4 28 89 73 9a 13 de 00 38 0d ba 5e c0 6f 59 91 .(.s….8..^.oY. 0000000960 9d 5f 2d c6 8b af 59 ed 9a 0a c2 62 4d 1a 4a 61 ._-…Y….bM.Ja 0000000970 3f 88 0c a0 6a a1 f1 2b 35 ec 3f d5 a1 e5 fc 07 ?…j..+5.?….. 0000000980 c0 b6 9c 1f 23 65 a1 36 c4 d6 55 0b 52 07 1f 56 ….#e.6..U.R..V 0000000990 7e b7 be ed cc 87 f9 1d 6a 7e 3c f5 d4 55 eb cc ~…….j~<..U.. 00000009a0 df 86 dc ea 66 c4 36 c3 d0 59 df d8 93 ab 30 85 ….f.6..Y….0. 00000009b0 f6 37 af 9d d0 43 33 d5 05 e7 13 2c 81 6a 65 d6 .7…C3….,.je. 00000009c0 8d 2b 22 d2 aa 0d 0b 9f 29 27 1e b6 b7 6d e6 dd .+“…..)’…m.. 00000009d0 80 a1 7d 50 be 70 6b 94 23 53 6b 98 d7 a3 c3 c9 ..}P.pk.#Sk….. 00000009e0 a1 03 ac 7c bb 68 bf 5c 6f 83 9a a5 fd da 8e 62 …|.h.\o……b 00000009f0 29 4d 65 7a 63 ba 26 36 92 77 df 0e 2f 77 ac e5 )Mezc.&6.w../w.. 0000000a00 28 3c 95 59 25 42 20 2e fe 10 e5 06 23 d0 c7 28 (<.Y%B …..#..( 0000000a10 a1 61 68 40 63 46 06 40 aa 4a cb 8d 9b 71 31 06 .ah@cF.@.J…q1. 0000000a20 32 4e 3f b3 ed 9b 72 31 e2 39 e0 19 6d 73 b0 04 2N?…r1.9..ms.. 0000000a30 b4 18 d5 8c e3 b4 11 45 ed 88 2b a7 5f 2e 9d e2 …….E..+._… 0000000a40 1e 88 bf 35 a2 ec 61 e3 1e 7d 22 de 5d f1 3b 00 …5..a..}“.].;. 0000000a50 a4 09 94 09 4b 64 42 10 eb 65 51 41 92 21 ac 63 ….KdB..eQA.!.c 0000000a60 fa d6 9b a3 32 ec 9c 6b 17 bf 75 94 c3 d6 ea 3a ….2..k..u….: 0000000a70 64 29 61 41 27 37 50 1a 51 b0 be b9 9c 05 23 c7 d)aA’7P.Q…..#. 0000000a80 41 d0 a9 36 e4 14 3f ad 06 f4 22 4b 50 7c f0 ba A..6..?…“KP|.. 0000000a90 d7 e0 07 a6 c2 68 b0 58 d4 62 8b 29 07 d7 2a 6e …..h.X.b.)..*n 0000000aa0 01 27 50 41 a7 aa 20 b2 3c da e5 47 23 3f ed 86 .’PA.. ..3s…..< 0000000ad0 bc 92 38 fc f2 e8 4b b8 71 5b 78 08 65 f8 19 15 ..8…K.q[x.e… 0000000ae0 3d 67 c1 a8 c7 7e 47 37 16 e0 52 b4 f0 47 dc 5a =g…~G7..R..G.Z 0000000af0 a6 3f 42 2d 1e c1 e3 63 8a 53 fc bc 77 e7 ba 49 .?B-…c.S..w..I 0000000b00 d2 a3 24 09 7e 24 8f 95 ec 3a 97 87 e7 60 bf 09 ..$.~$…:…`.. 0000000b10 20 05 4c 2f 64 f7 13 28 d1 c8 33 17 72 80 cd 8a .L/d..(..3.r… 0000000b20 36 00 33 25 a7 84 f6 d6 8d 45 09 fb 5a f9 41 45 6.3%…..E..Z.AE 0000000b30 d7 ff 8d 8e 29 04 18 40 d2 09 5f 67 6b 6f 98 c4 ….)..@.._gko.. 0000000b40 6b 16 af a0 44 9d 69 a0 2b 80 be 43 be e4 fa c7 k…D.i.+..C…. 0000000b50 54 d4 99 62 d0 99 ab 12 aa 70 68 5d c5 61 1f 8a T..b…..ph].a.. 0000000b60 b2 58 a5 90 89 1f 09 86 df ad f5 71 54 60 e1 32 .X………qT`.2 0000000b70 bf a7 f9 6b 5a 5d 2b 19 67 3f cc 21 e9 f4 5d bf …kZ]+.g?.!..]. 0000000b80 5b e6 af 5c 04 75 93 ac fb d8 22 02 d4 a8 78 66 [..\.u….“…xf 0000000b90 65 3c bf 47 71 3e 67 81 f7 83 c0 14 02 3b 69 4f eg……;iO 0000000ba0 64 aa 72 6d 1b 7f c8 9d 5d 59 5c 72 9e 3b 37 87 d.rm….]Y\r.;7. 0000000bb0 0b 58 66 0b c3 9b 21 c8 07 df 37 0c 09 5d f3 23 .Xf…!…7..].# 0000000bc0 12 ae 31 1b a7 c9 86 1e bb 44 56 62 32 00 12 87 ..1……DVb2… 0000000bd0 96 44 0d 7d b9 37 1a 1a ab da dd 63 d2 89 37 cf .D.}.7…..c..7. 0000000be0 e2 9e d2 d6 14 9e a2 a4 2d ba 4e bb a5 94 f5 74 ……..-.N….t 0000000bf0 c5 c4 52 ed f3 e0 70 ba 68 12 a7 8c 2f 9a 8d 70 ..R…p.h…/..p 0000000c00 5a 58 7a 05 78 b0 17 52 6e 99 3e ee dc e8 f4 39 ZXz.x..Rn.>….9 0000000c10 c3 e3 a7 e8 29 d2 20 37 48 4f a0 9b 6e 93 39 77 ….). 7HO..n.9w 0000000c20 3e 58 6b f6 65 71 c0 ac 22 87 66 13 33 b7 85 a9 >Xk.eq..“.f.3… 0000000c30 4c 9d 2d 2a 0f 2e 9d b7 af 66 c3 49 43 9c bd eb L.-*…..f.IC… 0000000c40 9c 0f 84 8a a2 dd 58 d2 8d 2f 2b 29 58 7f 19 81 ……X../+)X… 0000000c50 f0 85 b1 23 8e 83 f7 7e c0 b0 e8 91 0e 46 9c 48 …#…~…..F.H 0000000c60 6f 3e 8c 41 f9 63 39 47 3c 26 e2 56 21 30 cd bc o>.A.c9G 0000000ca0 32 29 e2 ed ac 07 9e bd 87 d5 72 f2 71 a9 72 24 2)……..r.q.r$ 0000000cb0 55 0e 9f db 9b 91 36 dd de 93 3e 41 a7 1e 7e 4d U…..6…>A..~M 0000000cc0 a1 d5 b7 0d 74 da 01 2b 2f 85 cd 95 28 69 84 b3 ….t..+/…(i.. 0000000cd0 7e d2 a6 7a d0 21 55 18 be b7 0a 23 9b 0f 96 c5 ~..z.!U….#…. 0000000ce0 9a 3c 8f a3 dd 06 75 f2 33 0a 89 85 54 2e 75 8b …X.:..lI. 0000000d00 76 39 74 f5 1f 71 7e 89 28 d5 c3 3a 72 b9 c7 f1 v9t..q~.(..:r… 0000000d10 6e 73 84 88 14 10 97 5e ns…..^
[3] Facebook erhält ebenfalls Verhaltensdaten, die für Marketing genutzt werden
POST https://graph.facebook.com/v16.0/1047449672583138/activities HTTP/1.1 User-Agent: FBAndroidSDK.16.0.0 Accept-Language: de_DE Content-Type: application/x-www-form-urlencoded Content-Encoding: gzip Transfer-Encoding: chunked Host: graph.facebook.com Connection: Keep-Alive Accept-Encoding: gzip [decoded gzip] URLEncoded form access_token: 1047449672583138|93159499960d9d72469b52a816f98261 format: json sdk: android event: MOBILE_APP_INSTALL anon_id: XZddfa8ab9-e80f-410f-87cb-2d4e4ad6bba1 application_tracking_enabled: true advertiser_id_collection_enabled:true advertiser_id: 00000000-0000-0000-0000-000000000000 advertiser_tracking_enabled: false installer_package: com.android.vending extinfo: [„a2″,“io.jucr.apps.charging.production“,245,“2.5.3″,“11″,“SM-G900F“,“de_DE“,“MESZ“,““,1080,1920,“3″,4,12,5,“Europe\/Amsterdam“] application_package_name: io.jucr.apps.charging.production
[4] Localise ist hingegen ein harmloses Helferlein für die Anpassung der App an verschiedene Sprachen.
GET https://ota-bundles.lokalise.com/253569/8059453760fa9ef281bfa4.67162855/bundles/6c1b95a1-767d-4b86-bc4e-05c4b651930e?Expires=1691510592&Key-Pair-Id=KKVN81V83VN6B&Signature=MiG7BClxYqQ9P7Gz78wW4XMS0HkzBieycv5KMGgCdbG~NSU7~McS7E4Qt47MbC9lt7IS4TzeMkOCZ~9gpmSOu3LL9oS48H-hps7D9iM2z-5lZpW-BkH~FLuALPBXlbREtbIXWRpovO2UvzXu2G1laa~HQFQsb~8BaB0wcfBvhlZGE6A7yNTJ92kiVxHwn10s2JLqqydVvv78GYlyFkN7JTlxbivhOvHKCI7PyPoHsft5M9eBbMNKA9SF1evq2NvQ9vuQ5xC5sNkfv6uAr0-P6gEAEuKkL8BZgvQMFeltGTQBzQSq9kAG3b8rAG3-3PM8cmwRlOYKrNLav2rta6jUyA__ HTTP/2.0 accept-encoding: gzip user-agent: okhttp/5.0.0-alpha.2 Query Expires: 1691510592 Key-Pair-Id: KKVN81V83VN6B Signature: MiG7BClxYqQ9P7Gz78wW4XMS0HkzBieycv5KMGgCdbG~NSU7~McS7E4Qt47MbC9lt7IS4TzeMkOCZ~9gpmSOu3LL9oS48H-hps7D9iM2z-5lZpW-BkH~FLuALPBXlbREtbIXWRpovO2UvzXu2G1laa~HQFQsb~8BaB0wcfBvhlZGE6A7yNTJ92kiVxHwn10s2JLqqydVvv78GYlyFkN7JTlxbivhOvHKCI7PyPoHsft5M9eBbMNKA9SF1evq2NvQ9vuQ5xC5sNkfv6uAr0-P6gEAEuKkL8BZgvQMFeltGTQBzQSq9kAG3b8rAG3-3PM8cmwRlOYKrNLav2rta6jUyA__
[5] Jucr-Server: Kurz bekam ich auch noch eine API-Abfrage an das Jucr-Backend bei Amazon zu sehen, bevor man mir dann eine Registrierung mit E-Mail verweigerte und auf eine Mobilnummer bestand. Ob das ein Trick ist oder mit meinem Entschlüsselungs-Setup zusammenhängt, kann ich nicht sagen. An der Stelle habe ich den Test abgebrochen.
GET https://id.jucr.io/oidc/r/.well-known/openid-configuration HTTP/1.1 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: id.jucr.io Connection: Keep-Alive Accept-Encoding: gzip No content
Fazit: Auch wenn die App nur bis zur Zwangsregistrierung mit Mobilnummer durchgeführt wurde, reicht das aus, um ein klares Urteil zu fällen: Diese App sammelt Verhaltensdaten, um sie für Marketingzwecke an Dritte zu geben. Sie ist damit ein klarer Fall für die Datenschutzbehörde oder ein Gericht, aber nicht fürs eigene Smartphone. Wer die App schon hat, sollte sie unbedingt deinstallieren.
Zurück zur Übersicht
ladenetz.de
Dieser Verbund wird von Energie Schwaben und einigen lokalen deutschen Energieversorgern betrieben. Hinzukommen viele interne Roaming-Partner sowie externe Netzwerke, so dass man in ganz Europa immerhin 180.000 Ladepunkte hat. Man kann das Netzwerk daher entweder direkt mit einer Ladenetz-Ladekarte nutzen oder mit der Ladekarte des lokalen Anbieters (der oft nur Kunden aus der eigenen Region annimmt). Die Preise lassen sich daher nicht präzise vorhersagen.
Die App dient also generell nur zum Auffinden von Ladesäulen (und damit zum Ersatz der gleichwertigen Browser-Kartenansicht), aber kann nicht zum Bezahlen an der Säule verwendet werden.
Folgende Verbindungen werden aufgebaut:
[1] Ladecloud Server: Das Backend wird per API für die Ladesäulensuche kontaktiert. Hier werden nur die absolut notwendigen Daten zugesendet und es finden sich keinerlei personenbeziehbare IDs in den Anfragen. Entsprechend ist es auch irrelevant, dass der Server von Microsoft gehostet wird und damit keine ordentliche Kontrolle über die staatlichen Zugriffe garantiert ist.
POST https://backend.ladecloud.de/chargepoint-provider/charge-point-map-essentials HTTP/2.0 x-api-key: 271b1db7-33ef-455d-abea-265ca7df4199 content-type: application/json; charset=UTF-8 content-length: 185 accept-encoding: gzip user-agent: okhttp/4.10.0 JSON { „area“: { „centerLocation“: { „latitude“: 48.13713146006088, „longitude“: 11.56293449923396 }, „latitudeDistance“: 0.0060542457677783545, „longitudeDistance“: 0.006571579724550247 }, „zoomLevel“: 17 }
[2] Google Maps: Wie so oft konnte ich die Verbindung nicht komplett abfangen und nicht alles entschlüsseln. Es kann also nicht sichergestellt werden, ob hier an anderer Stelle IDs übertragen wurden.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 509 X-Google-Maps-Mobile-API: de.ladenetz.app,202304043,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\xa3 \x19\x9eI\xba\xf0\xa8\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x01\x13 \x041070 \x01*\x0fde.ladenetz.app2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGE-jzOOpzjXROR2BwT7a0Q1eyItRuernA5gXemBzq8hqhzn5fMQtVsLs1sGHOdkOMsqwP8VuwT_u2UPYkYCYPm-I_L4wov7chZenOt_XW1bH9YLmtA8pW5wd0dNIJaq97tO3KG97B-jqtuN0OsGm2ou47T-nnvFPjYoYZqoNVFqbQjRTaE\xba\x02 202304043\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03l\x00\x00\x00\xa3 J\x08\x80\x02\x10\x00\x10\x0c\x10 \x18\x04\x18\x06 \x01(\x015\x00\x00@@b\x04\x08\xce\xc5Sb\x04\x08\xd1\xc5Sb\x04\x08\xca\xf6Sb\x04\x08\xa9\xa5Tb\x05\x08\xe9\x8e\xb4\x16b\x05\x08\x9d\xff\xb7\x16b\x05\x08\xeb\x88\xb8\x16b\x05\x08\x8f\xaa\xb8\x16J \x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\xea\xea\xde\x80\xc6\x0e\x80\x02\x00J \x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x95\xeb\xde\x80\xc6\x0e\x80\x02\x00R\x112\x0f\x08%\x12\x0b smartmaps
Fazit: Die Ladenetz-App gehört zu den ganz wenigen Apps, die sich an die Datenschutzgesetze halten. Die Einbettung vom Google-Maps-Modul, das von mir hier nicht wirklich getestet werden konnte, hinterlässt dennoch eine Vertrauenslücke. Nachdem die App ohnehin nur die Browser-Kartenansicht repliziert, scheint mir ein Browser-Shortcut auf die Ladenetz-Website datenschutztechnisch die bessere Wahl, wenn der Smartphone-Browser so konfiguriert ist, dass er die Cookie regelmäßig löscht. Möglicherweise übertragene IDs werden so jedenfalls sicher wieder entfernt und auf zahlreiche Daten wie die Bewegungssensoren hat Google über den Browser nur auf Nachfrage Zugriff.
Ladeverbund+
Ladeverbund+ ist auch keine besonders bekannte App, denn dahinter stehen einige Stadtwerke, vor allem aus Nordbayern. Die Preise sind auf den ersten Blick bei allen Ladesäulen außerhalb der teilnehmenden Stadtwerke sehr hoch (auch langsame Säulen im Bereich von 0,60-0,70€. Aber angeblich gibt es einen Rabatt, wenn man bei einem der Energieversorge Kunde ist. Damit ist die App eigentlich nur für diese interessant. Technisch realisiert wurde die App offenbar von Chargecloud, die auch bei Maingau in der Appverbindung sichtbar wurden. Dennoch ist diese App anders aufgebaut. Beim Start überrascht die App mit sehr konsequentem Datenschutz: Auf Wunsch kann man Google Maps deaktivieren und bekommt dann nur eine Liste von Säulen in der Umgebung angezeigt. Das ist natürlich nicht sehr nützlich, aber mit gefällt die volle Kontrolle. Die App ist praktisch technisch identisch mit der Website ladeverbundplus.chargecloud.de.
Folgende Verbindung ist dann die einzige:
[1] Chargecloud Server: Die Abfrage enthält keinerlei IDs, contract
bleibt auch nach einer Neuinstallation identisch und ist vielleicht eine API-Lizenzkey, zum Beispiel vom Ladeverbund bei Chargecloud. Der API-Server ist bei Amazon gehostet.
GET https://api.chargecloud.de/rest:contract/bb3e782ea78190655f44abb85a0f969c/getEmobilityLocationsDataDetails?offset=0&limit=100&latitude=48.051013&longitude=10.881999&radius=14000 HTTP/2.0 accept: application/json, text/plain, */* user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 origin: http://localhost x-requested-with: de.chargecloud.solid sec-fetch-site: cross-site sec-fetch-mode: cors sec-fetch-dest: empty referer: http://localhost/ accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Query offset: 0 limit: 100 latitude: 48.051013 longitude: 10.881999 radius: 14000
[2] Google Maps (Browser): Erst nach aktivieren der Kartenfunktion erscheint die Karte, hierbei handelt es sich um ein Browser-Interface. Offenbar über einen Maps-API-Zugang, der über den langen Key
authorisiert wird. Die anderen Codes ändern sich bei jedem Request, so dass ich hier auf den ersten Blick keine personenbeziehbaren IDs erkennen kann. Die Browservariante ist in jedem Fall für mich transparenter als das Google Maps SDK, so dass ich hier noch weniger Bedenken habe. Da man unterwegs auch meist wechselnde IP-Adressen hat, dürfte man vor Google komplett anonym sein.
GET https://maps.google.com/maps/vt?pb=!1m5!1m4!1i15!2i17435!3i11371!4i256!2m3!1e0!2sm!3i657398253!3m17!2sde-DE!3sDE!5e18!12m4!1e68!2m2!1sset!2sRoadmap!12m3!1e37!2m1!1ssmartmaps!12m4!1e26!2m2!1sstyles!2zcy5lOmd8cC5jOiNmNWY1ZjUscy5lOmwuaXxwLnY6b2ZmLHMuZTpsLnQuZnxwLmM6IzYxNjE2MSxzLmU6bC50LnN8cC5jOiNmNWY1ZjUscy50OjIxfHMuZTpsLnQuZnxwLmM6I2JkYmRiZCxzLnQ6MnxzLmU6Z3xwLmM6I2VlZWVlZSxzLnQ6MnxzLmU6bC50LmZ8cC5jOiM3NTc1NzUscy50OjQwfHMuZTpnfHAuYzojZTVlNWU1LHMudDo0MHxzLmU6bC50LmZ8cC5jOiM5ZTllOWUscy50OjN8cy5lOmd8cC5jOiNmZmZmZmYscy50OjUwfHMuZTpsLnQuZnxwLmM6Izc1NzU3NSxzLnQ6NDl8cy5lOmd8cC5jOiNkYWRhZGEscy50OjQ5fHMuZTpsLnQuZnxwLmM6IzYxNjE2MSxzLnQ6NTF8cy5lOmwudC5mfHAuYzojOWU5ZTllLHMudDo2NXxzLmU6Z3xwLmM6I2U1ZTVlNSxzLnQ6NjZ8cy5lOmd8cC5jOiNlZWVlZWUscy50OjZ8cy5lOmd8cC5jOiNiNGQ0ZTEscy50OjZ8cy5lOmwudC5mfHAuYzojRkZGRkZG!4e0!5m1!5f2&key=AIzaSyDuY1aFR6h5Am_i6KL-iFrYIZhKEB-SEJ8&token=35460 HTTP/2.0 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 x-requested-with: de.chargecloud.solid sec-fetch-site: cross-site sec-fetch-mode: no-cors sec-fetch-dest: image referer: http://localhost/ accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Query pb: !1m5!1m4!1i15!2i17435!3i11371!4i256!2m3!1e0!2sm!3i657398253!3m17!2sde-DE!3sDE!5e18!12m4!1e68!2m2!1sset!2sRoadmap!12m3!1e37!2m1!1ssmartmaps!12m4!1e26!2m2!1sstyles!2zcy5lOmd8cC5jOiNmNWY1ZjUscy5lOmwuaXxwLnY6b2ZmLHMuZTpsLnQuZnxwLmM6IzYxNjE2MSxzLmU6bC50LnN8cC5jOiNmNWY1ZjUscy50OjIxfHMuZTpsLnQuZnxwLmM6I2JkYmRiZCxzLnQ6MnxzLmU6Z3xwLmM6I2VlZWVlZSxzLnQ6MnxzLmU6bC50LmZ8cC5jOiM3NTc1NzUscy50OjQwfHMuZTpnfHAuYzojZTVlNWU1LHMudDo0MHxzLmU6bC50LmZ8cC5jOiM5ZTllOWUscy50OjN8cy5lOmd8cC5jOiNmZmZmZmYscy50OjUwfHMuZTpsLnQuZnxwLmM6Izc1NzU3NSxzLnQ6NDl8cy5lOmd8cC5jOiNkYWRhZGEscy50OjQ5fHMuZTpsLnQuZnxwLmM6IzYxNjE2MSxzLnQ6NTF8cy5lOmwudC5mfHAuYzojOWU5ZTllLHMudDo2NXxzLmU6Z3xwLmM6I2U1ZTVlNSxzLnQ6NjZ8cy5lOmd8cC5jOiNlZWVlZWUscy50OjZ8cy5lOmd8cC5jOiNiNGQ0ZTEscy50OjZ8cy5lOmwudC5mfHAuYzojRkZGRkZG!4e0!5m1!5f2 key: AIzaSyDuY1aFR6h5Am_i6KL-iFrYIZhKEB-SEJ8 token: 35460
Fazit: Die App ist aus Datenschutzperspektive sehr ordentlich umgesetzt. Es gibt kein Analysetracking und kein Google Firebase und selbst ohne Google Maps kann man die App nutzen. Ich kann nicht ganz einschätzen, wer preislich von dieser App einen Nutzen hat – evtl. die Kunden direkt an den Ladesäulen der Energieversorger. Aber wer die App gerne nutzt, muss sich jedenfalls keine Sorgen um Tracking machen, das findet hier nicht statt.
Lichtblick Fahrstrom
Lichtblick ist ein großer Ökostromanbieter aus Hamburg, der hin- und wieder auch für seine etwas lasche Ökostromphilosophie kritisiert wurde. Aber am Ende ist das wohl aus Umweltperspektive immer noch besser als eine Ladeapp von einem Fossilunternehmen. Etwa 200.000 Ladepunkte in Europa sind mit der App nutzbar. Relativ günstig wird es, wenn man zusätzlich auch noch einen Energievertrag mit dem Unternehmen hat, dann gibt es nämlich einen Vorteilstarif. Beim Start ist mir etwas negativ aufgefallen, dass man gleich mit Klimaargumenten in eine Einwilligung getrickst werden soll: „Lichtblick und alle Partner wollen, dass ihr auf der Website ganz einfach alles zu Energie und Klimaschutz findet.“ Hab natürlich trotzdem abgelehnt.
Die App konnte von mir nicht vollständig analysiert werden, nach wenigen Verbindungen gab es Probleme mit meinem selbsterstellten Zertifikat, welches Einblicke in die Übertragungen verschafft. Folgende Verbindungen gab es bis dahin:
[1] Google Firebase meldet die Installation und holt Daten für die Konfiguration ab.
POST https://firebaseinstallations.googleapis.com/v1/projects/lichtblick-flagship-app—live/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: de.lichtblick.android.flagship x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 346E0653B1024B143F52F6A9F38878FBA5686C0B x-goog-api-key: AIzaSyBB8iSSJQc1p3S4yiPl6f1j0CO6Q5HOaVA User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:460570392143:android:363ee76a22354810d75c3a“, „authVersion“: „FIS_v2“, „fid“: „d2akAHKsSC6Q8uX8girxev“, „sdkVersion“: „a:17.1.3“ } POST https://firebaseremoteconfig.googleapis.com/v1/projects/460570392143/namespaces/firebase:fetch HTTP/1.1 X-Goog-Api-Key: AIzaSyBB8iSSJQc1p3S4yiPl6f1j0CO6Q5HOaVA X-Android-Package: de.lichtblick.android.flagship X-Android-Cert: 346E0653B1024B143F52F6A9F38878FBA5686C0B X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6NDYwNTcwMzkyMTQzOmFuZHJvaWQ6MzYzZWU3NmEyMjM1NDgxMGQ3NWMzYSIsImV4cCI6MTY5MjI5MDU4MCwiZmlkIjoiZDJha0FIS3NTQzZROHVYOGdpcnhldiIsInByb2plY3ROdW1iZXIiOjQ2MDU3MDM5MjE0M30.AB2LPV8wRQIgbPXY3tbVZ1yzH0tl0MWbdtqjqkNqk_K0Oz1UeyYXDEICIQC0DnJmGUNgVZiK18CtQW2dYdBYr1FcmRIExGPu7TcXaw Content-Type: application/json Accept: application/json X-Firebase-RC-Fetch-Type: BASE/1 Content-Length: 680 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: {}, „appBuild“: „2023062801“, „appId“: „1:460570392143:android:363ee76a22354810d75c3a“, „appInstanceId“: „d2akAHKsSC6Q8uX8girxev“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6NDYwNTcwMzkyMTQzOmFuZHJvaWQ6MzYzZWU3NmEyMjM1NDgxMGQ3NWMzYSIsImV4cCI6MTY5MjI5MDU4MCwiZmlkIjoiZDJha0FIS3NTQzZROHVYOGdpcnhldiIsInByb2plY3ROdW1iZXIiOjQ2MDU3MDM5MjE0M30.AB2LPV8wRQIgbPXY3tbVZ1yzH0tl0MWbdtqjqkNqk_K0Oz1UeyYXDEICIQC0DnJmGUNgVZiK18CtQW2dYdBYr1FcmRIExGPu7TcXaw“, „appVersion“: „1.6.1“, „countryCode“: „DE“, „languageCode“: „de-DE“, „packageName“: „de.lichtblick.android.flagship“, „platformVersion“: „30“, „sdkVersion“: „21.4.0“, „timeZone“: „Europe/Amsterdam“ }
[2] Usercentrics organisiert die Einwilligungen, auch das ist völlig in Ordnung.
GET https://app.usercentrics.eu/session/1px.png?appId=de.lichtblick.android.flagship&settingsId=AXH-e5k7E HTTP/1.1 User-Agent: Mobile/Android/30/2.1.0/de.lichtblick.android.flagship/predefined/1.6.1/native Accept: application/json; charset=UTF-8 Host: app.usercentrics.eu Connection: Keep-Alive Accept-Encoding: gzip Query appId: de.lichtblick.android.flagship settingsId: AXH-e5k7E
Fazit: Die App konnte leider nicht komplett getestet werden, sie stürzte immer wieder ab, was evtl. an meinem selbsterstelltem Root-Zertifikat für die Entschlüsselung lag. Google Firebase lässt sich zwar in den Einstellungen deaktivieren, aber soweit ich das nachvollziehen konnte, geht das nicht ohne Internetverbindung, so dass die erste Verbindung an Firebase immer rausgeht. Ansonsten waren bis zu diesem Punkt keine besonders problematischen Verbindungen erkennbar. Lichtblick gehört zu den wenigen Anbietern, die ein großes Ladenetzwerk zu einem Festpreis und eine Ladekarte per Bestellung auf der Website anbieten. Damit kann man diesen Anbieter ideal auch ganz ohne App nutzen.
Lidl Plus
Beim Einkaufen Strom laden kann man bei einigen Supermärkten, ich habe hier mal exemplarisch Lidl herausgesucht, weil das bei Mastodon vorgeschlagen wurde. Man kann laut FAQ auch mit einer anderen App oder Ladekarte dort laden, aber dann sind die Preise auch nicht mehr so unschlagbar günstig. Vor allem für sehr kleine Stadtautos ohne eigene Ladesäule, die man während einem Einkauf auch schon halb voll bekommt, ist Lidl mit aktuell 0,29€/kwh eine sehr günstige Option.
Bis zur Zwangsregistrierung mit Mobilnummer waren bereits so viele Trackingeinbettungen zu sehen, dass ich mir nicht die Mühe gemacht habe, die App mit einer Wegwerf-Mobilnummer zu testen. Bei dem Einwilligungsdialog habe ich die optionalen Marketingeinbettungen abgelehnt.
Folgende Verbindungen waren bis zur Registrierung sichtbar:
[1] Google Firebase mit den Diensten Firebaseinstallations, Crashlytics und Firebaselogging. Letzteres ist außerordentlich umfangreich. Alle drei Dienste erhalten pseudonyme IDs.
POST https://firebaseinstallations.googleapis.com/v1/projects/lidl-plus-230408/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.lidl.eci.lidlplus x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: EDF2CC49788026C4C843B6E16FA9F57836D1B2A8 x-goog-api-key: AIzaSyBOMYWwlkfw-HRtxlMS8sjnLRu0RXXigPw User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:994916937221:android:03a18e1c200f1de6“, „authVersion“: „FIS_v2“, „fid“: „fWmHV1WfSf6dcsy9Vtc3-Q“, „sdkVersion“: „a:17.1.3“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:994916937221:android:03a18e1c200f1de6/settings?instance=a0ca8917f2a021085505430e3f153ca37ee4ff74&build_version=1470400437&display_version=15.22.4&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: 55ab066144b246ae85519ae113a758b9 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.4.0 User-Agent: Crashlytics Android SDK/18.4.0 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:994916937221:android:03a18e1c200f1de6 X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: a0ca8917f2a021085505430e3f153ca37ee4ff74 build_version: 1470400437 display_version: 15.22.4 source: 4 POST https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog HTTP/1.1 x-dynatrace: MT_3_4_1155302166_4-0_1b243c57-1e8f-4033-aeb1-3ddc6a7d5e0e_0_2299_96 User-Agent: datatransport/3.1.9 android/ Content-Encoding: gzip Content-Type: application/json Accept-Encoding: gzip X-Goog-Api-Key: AIzaSyCckkiH8i2ZARwOs1LEzFKld15aOG8ozKo Host: firebaselogging-pa.googleapis.com Connection: Keep-Alive Content-Length: 922 [decoded gzip] JSON { „logRequest“: [ { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „1470400437“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1691513658619, „eventUptimeMs“: 269169945, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „Cg4I4/m0sJ0xEPO5yLCdMRoLCgkIgMADEICAgAUiFWNvbS5saWRsLmVjaS5saWRscGx1cw==“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „GDT_CLIENT_METRICS“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1691513658641, „requestUptimeMs“: 269169966 }, { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „1470400437“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1691513628400, „eventUptimeMs“: 269139726, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtensionJsonProto3“: „{\“eventType\“:1,\“sessionData\“:{\“sessionId\“:\“c78664124344453a892f9b90d0d8465f\“,\“firstSessionId\“:\“c78664124344453a892f9b90d0d8465f\“,\“sessionIndex\“:0,\“eventTimestampUs\“:1691513628326000,\“dataCollectionStatus\“:{\“performance\“:2,\“crashlytics\“:2,\“sessionSamplingRate\“:1.0},\“firebaseInstallationId\“:\“f4cPK5pjS5uHJWIt8ip-O5\“},\“applicationInfo\“:{\“appId\“:\“1:994916937221:android:03a18e1c200f1de6\“,\“deviceModel\“:\“SM-G900F\“,\“sessionSdkVersion\“:\“1.0.0\“,\“osVersion\“:\“11\“,\“logEnvironment\“:3,\“androidAppInfo\“:{\“packageName\“:\“com.lidl.eci.lidlplus\“,\“versionName\“:\“15.22.4\“,\“appBuildVersion\“:\“1470400437\“,\“deviceManufacturer\“:\“samsung\“}}}“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „FIREBASE_APPQUALITY_SESSION“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1691513658646, „requestUptimeMs“: 269169971 } ] }
[2] Dynatrace ist ein Cloud-Anbieter, ich vermute, dass hiermit die Leistungsfähigkeit der App überwacht wird oder auch Nutzungsanalyse betrieben wird. Diese Verbindungen waren leider auch Tage nach der letzten Nutzung im Hintergrund aktiv.
GET https://cluster-activegate-lb.dynatrace.schwarz:9999/mbeacon/c469bdbf-d949-4e2c-9a01-42f2c400b5fc?type=m&srvid=-23184&app=1b243c57-1e8f-4033-aeb1-3ddc6a7d5e0e&va=8.269.1.1009&tt=maandroid&pt=0&resp=json&cts=0&ns=1&si=819682307_1 HTTP/1.1 Connection: close Accept-Encoding: identity, gzip User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: cluster-activegate-lb.dynatrace.schwarz:9999 Query type: m srvid: -23184 app: 1b243c57-1e8f-4033-aeb1-3ddc6a7d5e0e va: 8.269.1.1009 tt: maandroid pt: 0 resp: json cts: 0 ns: 1 si: 819682307_1
[3] Lidl Server: Per API werden einige Inhalte von einer Akamai-Cloud angefragt, dabei wird auch eine Geräte-ID übertragen.
GET https://alerts.lidlplus.com/api/v1/DE/features HTTP/1.1 Accept-Language: DE Store-Id: DE5452 Assigned-Group: 80 x-dynatrace: MT_3_4_1155302166_4-0_1b243c57-1e8f-4033-aeb1-3ddc6a7d5e0e_12_2_54 App: com.lidl.eci.lidlplus App-Version: 15.22.4 Operating-System: Android OS-Version: 11 DeviceId: 292a8f6e94e97f76 Model: SM-G900F Brand: samsung Host: alerts.lidlplus.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.11.0 If-Modified-Since: Tue, 08 Aug 2023 16:52:36 GMT No content
[4] Google Maps ist als Kartendienst integriert, vermutlich wird dies dann auch für die Auswahl der Ladesäulen verwendet. Die Verbindung konnte ich nicht abfangen.
[5] Salesforce Marketing Cloud wird beim Schließen der App kontaktiert und sendet eine Geräte-ID. Ich denke man kann davon ausgehen, dass mit diesen Daten Marketing betrieben werden soll. Das ist nicht schön.
POST https://mcf4wh-jdfmxrzzzttwqcrf-d3b4.device.marketingcloudapis.com/device/v1/event/analytic HTTP/1.1 x-dynatrace: MT_3_4_1155302166_4-0_1b243c57-1e8f-4033-aeb1-3ddc6a7d5e0e_0_2404_99 User-Agent: MarketingCloudSdk/8.0.9 (Android 11; de_DE; samsung/SM-G900F) com.lidl.eci.lidlplus/15.22.4 Authorization: Bearer VBdSPfBdL7FgGdqlNcDeV5IA Accept: application/json X-SDK-Version: 8.0.9 Content-Type: application/json Host: mcf4wh-jdfmxrzzzttwqcrf-d3b4.device.marketingcloudapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 188 JSON [ { „analyticTypes“: [ 4 ], „deviceId“: „d2d44eea-dbf3-47cc-befd-ddf62dcb07b5“, „etAppId“: „95178fd7-663a-4bc6-adc6-6597b5a959ed“, „eventDate“: „2023-08-08T16:52:53.180Z“, „objectIds“: [], „value“: 675 } ]
Fazit: Die App enthält angeblich nur optional Marketingeinbettungen, aber sendet IDs an die Salesforce Marketing Cloud. Dieser Anbieter ist bekannt dafür, Marketingdaten auch mit realen Daten wir Telefonnummern oder E-Mailadresse zusammenführen zu können. Auch die umfangreichen Analysediensten von Google und Google Maps sprechen stark dagegen, die App trotz des guten Preises zu nutzen. Wer unbedingt auf den günstigen Preis angewiesen ist und bereits ein Google-Android nutzt, sollte wenigstens eine einmalig und kurzfristig nur dafür registrierte Mobilnummer und E-Mailadresse verwenden. Ansonsten sollte man sich mal beim Konkurrenten Aldi umsehen, dort kann man ähnlich günstig auch ohne App und nur mit Girokarte Strom tanken – und das auch ohne dort einzukaufen.
Maingau Autostrom
Dieser kommunale Stromanbieter ist etwas Besonderes, denn er hat sich bei Elektroautofahrenden als wichtige Alternative zum Platzhirsch EnBW etabliert. In Deutschland ein bisschen günstiger, kein Appzwang und eine fast genauso gute Abdeckung mit 410.000 Ladepunkten in Europa. Nur die Preise im europäischen Ausland sind seit kurzem überteuert. Mal sehen, ob man mit der App von dem wichtigen Underdog etwas anfangen kann.
Die Verbindungen:
[1] Google Firebase meldet die Installation der App, damit ist die Datenschutzkonformität leider schon dahin.
POST https://firebaseinstallations.googleapis.com/v1/projects/maingau-dev/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: de.chargecloud.maingau X-Android-Cert: 8F6652DC7C04BA47ACB294306A34441467824502 x-goog-api-key: AIzaSyBw9DmNRgsIXkSlbZPApPZsOST1nimM1ec User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:759711946104:android:35a86b28ff414a5441a48d“, „authVersion“: „FIS_v2“, „fid“: „fFDSZocUS4qR-2zjnNTuV3“, „sdkVersion“: „a:17.0.0“ }
[2] Einfachstromladen.de ist der API-Endpunkt von Maingau, der bei Amazon gehostet ist. Hier gefällt mir die absolute Datensparsamkeit: Es wird keine ID mitgesendet und die Anfragen sind daher gegenüber Maingau anonym, wenn man in der App nicht angemeldet ist.
GET https://api.prod.einfachstromladen.de/stations?radius=3060.58473997749&lat=48.137644308655126&lng=11.575840222303185&limit=29999.0 HTTP/2.0 user-agent: de.chargecloud.maingau/4.4.3 (2024040031) Mapbox/8.5.2 (8949fc1) Android/30 (armeabi-v7a) authorization: Bearer null accept-language: de user-agent: MAINGAU/4.4.3, Android/30 accept-encoding: gzip Query radius: 3060.58473997749 lat: 48.137644308655126 lng: 11.575840222303185 limit: 29999.0
[3] Mapbox ist der datenschutzfreundliche Kartenanbieter. Wie im Schnelltest unter EV Map ausführlicher besprochen, werden dabei keine genauen Standorte übertragen, sondern nur Kacheln abgefragt, die noch nicht im Cache sind. Dafür gibt es aber eine Installations-ID.
GET https://api.mapbox.com/v4/mapbox.mapbox-streets-v8,mapbox.mapbox-terrain-v2/10/544/355.vector.pbf?access_token=sk.eyJ1IjoibWFpbmdhdSIsImEiOiJjazJvczd0cjgwMDRzM2RxcWg5YTJ6bmowIn0.BTYP4sdHZhZ5WEkduPzuYA&sku=100ll3temraa1f16a807f2e4912b247674f7dbc6735 HTTP/1.1 User-Agent: de.chargecloud.maingau/4.4.3 (2024040031) Mapbox/8.5.2 (8949fc1) Android/30 (armeabi-v7a) Authorization: Bearer null Accept-Language: de User-Agent: MAINGAU/4.4.3, Android/30 Host: api.mapbox.com Connection: Keep-Alive Accept-Encoding: gzip Query access_token: sk.eyJ1IjoibWFpbmdhdSIsImEiOiJjazJvczd0cjgwMDRzM2RxcWg5YTJ6bmowIn0.BTYP4sdHZhZ5WEkduPzuYA sku: 100ll3temraa1f16a807f2e4912b247674f7dbc6735
[4] Goingelectric: In Einzelfällen werden noch Bilder von Ladestationen aus der Goingelectric-Community nachgeladen. Auch hier sieht man keine auffällige Daten. Der verwendete Key gehört offenbar zu Maingau und ist damit nicht personenbeziehbar.
GET https://api.goingelectric.de/chargepoints/photo?key=09181a1fb5a223ec9d2e6cec1629103b&id=8081 HTTP/1.1 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.goingelectric.de Connection: Keep-Alive Accept-Encoding: gzip Query key: 09181a1fb5a223ec9d2e6cec1629103b id: 8081
Fazit: Leider startet auch diese App erstmalig mit einer Meldung an Firebase Installations. Im anschließenden Betrieb ist die App aber außerordentlich datenschutzfreundlich, insbesondere gehört sie zu den wenigen Apps, die auf Mapbox statt Google Maps setzt. Auch nach einem Login in der App konnte ich keine anderen Datenverbindungen zu anderen Drittanbietern feststellen. Bei weiteren Starts habe ich die Meldung an Firebase nicht mehr gesehen, so dass man vielleicht auch als Datenschutzfan damit leben kann bzw. die App erstmalig einfach ohne Internetverbindung öffnet. Leider schützt das dann nicht davor, dass die App Absturzbericht an Google senden kann, die möglicherweise auch personenbeziehbare Daten enthalten. Maingau gehört aber zu den wenigen Anbietern, die ein großes Ladenetzwerk zu einem Festpreis und eine Ladekarte per Bestellung auf der Website anbieten. Damit kann man diesen Anbieter ideal auch ganz ohne App nutzen.
Mercedes Me
Wenn man sein Geld schon für einen teuren Mercedes ausgegeben hat, dann kann man sich über recht gute Preise mit den zwei verschiedenen Monatsgebühren von Mercedes Me Charge freuen. Auch einen Tarif ohne Monatsgebühr gibt es, aber dann muss man immer vor dem Laden die Preise der Säule prüfen. Mal sehen, ob der Datenschuz bei Mercedes auch Premium ist. Da ich keinen Mercedes besitze, konnte ich mich auch nicht einloggen und die App nur beim Start überprüfen.
Die Verbindungen der App:
[1] Google Firebase meldet die Installation der App an Google. Leider ist außerdem das sehr umfangreiche Firebase Logging aktiviert.
POST https://firebaseinstallations.googleapis.com/v1/projects/mercedes-me-2020/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.daimler.ris.mercedesme.ece.android x-firebase-client: H4sIAAAAAAAAAF2S0W7DIAxFfyXiuZBApK7qryx9oMHJUAhU4Fabqv77XELSda_H9uX6mjv7Ah3xDBoTO37emR7BIzuywUbgfYjQ1aoRSjRVJheIQyZSyEp7E4M1fLaeJzMR31dTQGd9V0txEEpVmwyf8PtdSnvtftD2ibAkrP7hMvGnNPRzgSSyyZwxd5FyZeBme-DnSM66Ouk5Xf242bQ-oXYOYlf3YRYFixt4Y6mtvJ5hV7fNqub1TCFMDmElczDgClqNvZuKffYkV-flaY02eNpXfmS7q7ELFYYQSaPk5Z49h1dUSAulS4iYsRT7bRR1HAGX9Nv2daMt7uedVtEFLsJsx4xGeB6dqUa1vDlwKdnpcdqxG8RERukXKPb4BShV7csiAgAA X-Android-Cert: 2DF3E3895FD30004DF4039CE1233B57DF19943CA x-goog-api-key: AIzaSyCphPLJGQydODPoX99RtjFCogQVn1G1FdE User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:177426507108:android:9ae7256c3b450cbe740671“, „authVersion“: „FIS_v2“, „fid“: „cEzzrygjQsma_QBWjrcnTX“, „sdkVersion“: „a:17.0.2“ } POST https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog HTTP/1.1 User-Agent: datatransport/3.1.7 android/ Content-Encoding: gzip Content-Type: application/json Accept-Encoding: gzip X-Goog-Api-Key: AIzaSyCckkiH8i2ZARwOs1LEzFKld15aOG8ozKo Host: firebaselogging-pa.googleapis.com Connection: Keep-Alive Content-Length: 843 [decoded gzip] JSON { „logRequest“: [ { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „1574“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1691776507707, „eventUptimeMs“: 4986651, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „Cg4IqavjrZ4xELm+862eMRoLCgkIgMADEICAgAUiJmNvbS5kYWltbGVyLnJpcy5tZXJjZWRlc21lLmVjZS5hbmRyb2lk“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „GDT_CLIENT_METRICS“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1691776507709, „requestUptimeMs“: 4986653 }, { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „1574“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1691776477623, „eventUptimeMs“: 4956567, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CoMBCi0xOjE3NzQyNjUwNzEwODphbmRyb2lkOjlhZTcyNTZjM2I0NTBjYmU3NDA2NzESFmNFenpyeWdqUXNtYV9RQldqcmNuVFgaOAomY29tLmRhaW1sZXIucmlzLm1lcmNlZGVzbWUuZWNlLmFuZHJvaWQSBjIwLjEuMRoGMS4zNC4wKAEadQomaHR0cHM6Ly9tb2JpbGUubGF1bmNoZGFya2x5LmNvbS9tb2JpbGUQAxjLASAAKMoBMhBhcHBsaWNhdGlvbi9qc29uOOCowb+W1YADUJiaMGoiCiAxZjEzNjQ2MWIxMDI0NjNlYjVkM2JkYjQ4M2JmMjJjZQ==“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „FIREPERF“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1691776507709, „requestUptimeMs“: 4986653 } ] }
[2] Mercedes Server: Hier wird bereits gleich eine eindeutige Tracking-ID mitgesendet. Auch wenn man die App nur mit Login nutzen kann, würde das möglicherweise auch bedeuten, dass eine einfache Ladesäulensuche auch mit personenbeziehbarer ID bei Mercedes eingeht. Aber das ist eher eine Kleinigkeit. Gut ist, dass die Logindaten direkt von Mercedes verwaltet werden. Der Server ist bei Microsoft registriert.
OST https://bff.emea-prod.mobilesdk.mercedes-benz.com/v1/login HTTP/1.1 X-ApplicationName: mycar-store-ece ris-application-version: 1.34.0 ris-os-name: android ris-os-version: 11 ris-sdk-version: 2.99.0 User-Agent: mycar-store-ece v1.34.0, android 11, SDK 2.99.0 X-Locale: de-DE X-SessionId: a9f0fced-94f8-487b-899f-52308cca8ea1 X-TrackingId: c959dfa7-0334-4295-af97-1590ebbdfe67 Content-Type: application/json; charset=UTF-8 Content-Length: 114 Host: bff.emea-prod.mobilesdk.mercedes-benz.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „countryCode“: „DE“, „emailOrPhoneNumber“: „*******@protonmail.com“, „nonce“: „6d754e84-9412-4e3e-b29a-b09defce6c59“ }
[3] LaunchDarkly ist ein Analysedienst. Zu diesem Zeitpunkt wurde offenbar noch keine personenbeziehbare ID mitgesendet.
POST https://mobile.launchdarkly.com/mobile HTTP/2.0 authorization: api_key mob-f7b05351-f503-49b9-b238-68e040d793a4 x-launchdarkly-payload-id: d0b48fb2-8925-4fbc-8f55-39594975be1b user-agent: AndroidClient/3.1.5 x-launchdarkly-event-schema: 3 content-type: application/json; charset=utf-8 content-length: 1497 accept-encoding: gzip JSON [ { „creationDate“: 1691775876792, „key“: „DEFAULT_LOGGED_OUT“, „kind“: „identify“, „user“: { „anonymous“: true, „custom“: { „android_app_version“: „1.34.0“, „appfamily_version“: „2.99.0“, „build_region“: „ece“, „build_type“: „appstore“, „device“: „SM-G900F klte“, „os“: 30, „region“: „ECE“, „stage“: „PROD“ }, „key“: „DEFAULT_LOGGED_OUT“, „privateAttrs“: [ „device country“ ] } }, { „creationDate“: 1691775876993, „key“: „DEFAULT_LOGGED_OUT“, „kind“: „identify“, „user“: { „anonymous“: true, „custom“: { „android_app_version“: „1.34.0“, „appfamily_version“: „2.99.0“, „build_region“: „ece“, „build_type“: „appstore“, „device“: „SM-G900F klte“, „os“: 30, „region“: „ECE“, „stage“: „PROD“ }, „key“: „DEFAULT_LOGGED_OUT“, „privateAttrs“: [ „device country“ ] } }, { „endDate“: 1691776176790, „features“: { „ris-sdk-command-ack-retries-count“: { „counters“: [ { „count“: 1, „unknown“: true, „value“: 0 }, { „count“: 2, „value“: 0, „variation“: 1, „version“: 2 } ], „default“: 0 }, „ris-sdk-command-ack-timeout“: { „counters“: [ { „count“: 1, „unknown“: true, „value“: 0 }, { „count“: 2, „value“: 60, „variation“: 1, „version“: 2 } ], „default“: 0 }, „ris-sdk-command-overall-timeout“: { „counters“: [ { „count“: 1, „unknown“: true, „value“: 0 }, { „count“: 2, „value“: 600, „variation“: 0, „version“: 3 } ], „default“: 0 }, „ris-sdk-command-sending-timeout“: { „counters“: [ { „count“: 1, „unknown“: true, „value“: 0 }, { „count“: 2, „value“: 120, „variation“: 0, „version“: 3 } ], „default“: 0 }, „ris-sdk-sso-mechanisms“: { „counters“: [ { „count“: 1, „unknown“: true }, { „count“: 2, „value“: { „ssoMechanisms“: [ „LEGACY“ ] }, „variation“: 1, „version“: 10 } ] } }, „kind“: „summary“, „startDate“: 1691775876809 } ]
[3] Here Maps: Leider konnte ich ohne Login nicht zur Kartenansicht gelangen, aber im Code der App habe ich Hinweise darauf gefunden, dass wie bei My BMW der Dienst „Here“ verwendet wird.
Fazit: Leider enttäuscht auch der Premium-Anbieter Mercedes beim Datenschutz. Gleich zwei Analysedienste sind integriert, die personenbeziehbare IDs erhalten und teilweise umfangreich die Nutzung der App analysieren. Das Schreiben und Lesen einer solchen ID für Analysezwecke ist nach deutschen Datenschutzgesetzen aber nur mit Einwilligung möglich. Auch wenn keine Werbetracking eingebunden ist: Ich würde die App so nicht nutzen wollen.
Moovility
Moovility ist eine weitere Meta-App, die zunächst nur Preise von anderen Anbietern vergleicht und für die komfortable Suche nach Ladesäulen eingesetzt werden kann. Mal sehen ob das Münchener Unternehmen Cirrantic beim Datenschutz gegen den Open-Source-Konkurrenten EV Map bestehen kann. Zusätzlich bietet die App in Betaphase eine Wallet, in die man offenbar virtuelle Ladekarten oder Kreditkarten speichern (oder verknüpfen?) kann und dann doch direkt bezahlen kann. Das wirkte auf mich alles reichlich verwirrend, aber ich bin auch nicht der Typ der mit Wallets zahlt. Beim Start fällt sofort eine Besonderheit auf: Die App ist eigentlich nur eine ver(k)appte Website und setzt viele HTML-Einbindungen ein. Das hat für meinen Test den Vorteil, dass ich in alle Google-Verbindungen reinschauen konnte: Es wird entsprechend nicht wie in den anderen das Google Maps SDK genutzt, sondern die Google Maps Browservariante. Das dürfte für den Datenschutz durchaus von Vorteil sein.
Die Verbindungen:
[1] Moovility-Server: Per API, aber auch mit HTML-Verbindungen werden einzelne Details der Karte geladen. Auch ohne Anmeldung wird dabei ein ID-Cookie UUID
genutzt, so dass alle Anfragen zusammengeknüpft werden können. Eine echte Überraschung ist der deutsche Server, der bei Hetzner gehostet ist: Das hatte kein anderer Anbieter im Test.
POST https://app.moovility.me/getObjects.php HTTP/1.1 Host: app.moovility.me Connection: keep-alive Content-Length: 533 Accept: */* X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Origin: https://app.moovility.me Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://app.moovility.me/ Accept-Encoding: gzip, deflate Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: PHPSESSID=kfv5c6d8vr53tjqi8a8rf67obu; sphere=MOV; tech_userid=111756; UUID=64d3ae8883eac; viewport=48.147314|11.562517|14 URLEncoded form post: eyJ1c2VySWQiOiIxMTE3NTYiLCJzd0xhdCI6NDQuMjg3OTg3MTI1Mjk4OTEsInN3TG5nIjo3LjM4NzcxMjMxMjUwMDAxNywibmVMYXQiOjUxLjczNjgxNzY1MTgxMTkxLCJuZUxuZyI6MTUuNzM3MzIxNjg3NTAwMDE2LCJ6b29tbGV2ZWwiOjE0LCJzcGhlcmUiOiJNT1YiLCJmYXZvcml0T2JqZWN0c0ZpbHRlciI6ZmFsc2UsImZhdm9yaXRPZmZlcnNGaWx0ZXIiOmZhbHNlLCJmYXZvcml0U3ViamVjdHNGaWx0ZXIiOmZhbHNlLCJmaWx0ZXJzIjoie30iLCJwcm9nbm9zaXNfb2Zmc2V0IjotMSwibWF4T2JqZWN0Q291bnQiOjkwMCwiY2F0ZWdvcmllcyI6WyIxIl0sImNvdW50QXRJbmRleCI6LTEsImNvdW50V2l0aFZhbHVlIjoiIiwiZHJpdmVNb2RlRW5hYmxlZCI6ZmFsc2UsImlkIjpudWxsfQ==
[2] Google Maps (Browser): Verschiedene Anfragen gehen an Google Maps per Browser-Interface raus. Soweit ich das erkennen kann, hat Moovility hier einen Maps-API-Zugang, der über den langen Key
authorisiert wird. Die anderen Codes ändern sich bei jedem Request, so dass ich hier auf den ersten Blick keine personenbeziehbaren IDs erkennen kann.
GET https://maps.googleapis.com/maps/api/js/QuotaService.RecordEvent?1shttps%3A%2F%2Fapp.moovility.me%2F&3sAIzaSyDQci-XgJ1oGAtmE2QWQFty_6oX-ti-qFY&7s3vmbo7&10e1&11b0&callback=_xdc_._5n48hy&key=AIzaSyDQci-XgJ1oGAtmE2QWQFty_6oX-ti-qFY&token=27468 HTTP/2.0 user-agent: Mozilla/5.0 (Linux; Android 11; SM-G900F Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.163 Mobile Safari/537.36 accept: */* x-requested-with: com.cirrantic.moovilityapp sec-fetch-site: cross-site sec-fetch-mode: no-cors sec-fetch-dest: script referer: https://app.moovility.me/ accept-encoding: gzip, deflate accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 Query 1shttps://app.moovility.me/: 3sAIzaSyDQci-XgJ1oGAtmE2QWQFty_6oX-ti-qFY: 7s3vmbo7: 10e1: 11b0: callback: _xdc_._5n48hy key: AIzaSyDQci-XgJ1oGAtmE2QWQFty_6oX-ti-qFY token: 27468
Fazit: Die App ist trotz Google Maps datenschutzrechtlich einwandfrei und auch ohne Bedenken zu nutzen. Die Abfragen an den Kartendienst laufen hier nämlich nicht über das Maps SDK, sondern über eine HTML-Website, die intern vom Browser des Smartphones angezeigt wird. Allerdings muss man sich im Klaren darüber sein, dass Moovility auch ohne Anmeldung eine eindeutige Nutzer-ID vergibt, was ich etwas bedenklich finde. Damit können immerhin interessante Nutzungsmuster ausgewertet werden. Wer das nicht dauerhaft möchte, kann der App aber auch einfach regelmäßig mal alle Daten löschen, dann startet man als neue nutzende Person.
Nextcharge
Keine Datenschutzerklärung auf der Website und laut Stiftung Warentest bereits erhebliche Mängel in der Datenschutzerklärung der App: Von dem italienischen Anbieter Nextcharge ist zunächst nicht viel zu erwarten.
Nach dem Start stelle ich folgende Verbindungen fest:
[1] Google Firebase wird über die Installation und den ersten Start informiert
POST https://firebaseinstallations.googleapis.com/v1/projects/api-project-892586209379/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.goelectricstations.nextcharge x-firebase-client: H4sIAAAAAAAAAD2Qy47DIAxFfyViXQgQqRP1VyZduMHJoPCowI00qvrv42mSbg–h2s_xQ9CoRsCVXH5fgqYMZG4CEiuZO8kQZmRZHXL0HammXxBOeaCQ2u1MspuZBojg05p1TdLpuDT0Bp1VkY3hyj6tFlst2UgQfglP1ZGhlWmcbj6EeWtcGZoK8T6SPNH4FMlCAHL0I45qh2rFZPzPLY735Cr6sOWIHLZJRAeJGaHYUfv1G4G8jlxG_PFe9jPv3d-mHLhBbdp4nr1ngvxZM-9z-IkHBD-309YbTupe6mNuL6uJ7FiqWzlg1rx-gMUSkDLbQEAAA X-Android-Cert: 467735885FC0374DA2CFCE2732148417F0724D97 x-goog-api-key: AIzaSyAyXor_gU6uVTR5lUgm-25vyh3poRHWQb4 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:892586209379:android:63483fbb7c9e401c“, „authVersion“: „FIS_v2“, „fid“: „d3eTJB-dQ22H_wmRrq0v4l“, „sdkVersion“: „a:17.0.2“ }
[2] Nextcharge Server: Nach Bestätigung eines Banners, der keine Ablehnung bietet, kommuniziert die App mit dem Nextcharge-Server über eine API. Hier wird bereits eine eindeutige ID verwendet. Der Server wird bei Aruba/Hewlett Packard gehostet, was eine kleine Überraschung zu den sonstigen gleichförmigen Anbietern darstellt. Was die Rechtssicerheit der Daten gegenüber amerikanischen Behörden darstellt, ist das aber kein Vorteil.
POST https://nextcharge.app.apis.goelectricstations.com/v1_19/userAuth HTTP/1.1 Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: nextcharge.app.apis.goelectricstations.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 147 URLEncoded form appVersion: 5.5.19 osVersion: 11 osType: android deviceModel: SM-G900F publicKey: 5eb5fb45eb66b0ed34f9c5d3242a8c0fe0f94e92 lang: de userId: ITGES2308FHLNT
[3] Google Maps ist der Kartenanbieter, hier sind zwar keine IDs sichtbar, aber ein Teil des Datenverkehrs konnte nicht entschlüsselt werden. Der API-Key authentifiziert das Softwareprojekt, das Kartendaten von Google bezieht, in diesem Fall wohl Nextcharge.
GET https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyAsgs2xV_AzPUXLhT2sZln_4t6qzQx0jcA&latlng=51.2993,9.491 HTTP/1.1 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: maps.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Query key: AIzaSyAsgs2xV_AzPUXLhT2sZln_4t6qzQx0jcA latlng: 51.2993,9.491
[4] Tomtom übernimmt das Routing und dort sind ebenfalls keine auffälligen Daten zu sehen außer dem Betreiber-Key zu sehen.
POST https://api.tomtom.com/routing/1/batch/json?key=g1ZlkYWmZQZThGArJ85DI98gVRjGE8I1 HTTP/1.1 Content-Type: application/json; utf-8 Accept: application/json User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: api.tomtom.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 118 JSON { „batchItems“: [ { „query“: „/calculateRoute/51.2993,9.491:51.311365,9.485380/json?travelMode=car&routeType=fastest“ } ] }
Fazit: Die App macht weniger Verbindungen auf, als befürchtet: Insbesondere ist kein Analysetracking integriert. Nicht so schön ist die Vergabe einer User-ID, bevor man sich eingeloggt hat. Dies verstößt bereits gegen TTDSG §25, aber ist natürlich etwas kleinlich kritisiert, weil man sich ja im Normalfall irgendwann einloggt. Google Maps erhielt nur wenig Daten, war aber in meiner Analyse auch nicht komplett einsehbar. Bleibt noch die Installationsmeldung an Google Firebase, die ebenfalls nicht datenschutzkonform ist. Da die App nicht wirklich einen Nutzen gegenüber der Webversion der Karte bietet, würde ich auf die App verzichten.
My Renault
Diese Ladeapp ist insofern sehr verbreitet, weil der Kleinwagen Zoe immer noch sehr beliebt ist. Es ist immer noch eines der sparsamsten und günstigsten Elektroautos. Beim Start lehne ich den Einwilligungsbanner ab.
Folgende Verbindungen sind zu sehen:
[1] Google Firebase erfährt von der Installation und Firebase Messages wird für Push-Nachrichten konfiguriert und auch Firebase Remoteconfig erhält IDs.
POST https://firebaseinstallations.googleapis.com/v1/projects/myrenault-android-unique/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.renault.myrenault.one.fr x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: B22B0CB2F0043027FE579BD6B6F16557EE47FCED x-goog-api-key: AIzaSyDqDU513JEXB_2NFToYNcKjG6HAqwHicqg User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 140 [decoded gzip] JSON { „appId“: „1:942374850736:android:767d35b121ec2c6910eb75“, „authVersion“: „FIS_v2“, „fid“: „fmB0sM1wQwqqJx36IJQmkB“, „sdkVersion“: „a:17.1.0“ } POST https://firebaseinappmessaging.googleapis.com/google.internal.firebase.inappmessaging.v1.sdkserving.InAppMessagingSdkServing/FetchEligibleCampaigns HTTP/2.0 user-agent: grpc-java-okhttp/1.48.1 content-type: application/grpc te: trailers x-goog-api-key: AIzaSyDqDU513JEXB_2NFToYNcKjG6HAqwHicqg x-android-package: com.renault.myrenault.one.fr x-android-cert: B22B0CB2F0043027FE579BD6B6F16557EE47FCED grpc-accept-encoding: gzip grpc-timeout: 29546388u gRPC gRPC message 0 (compressed False) [string] 1 942374850736 [message] 2 [string] 2.1 1:942374850736:android:767d35b121ec2c6910eb75 [string] 2.2 fmB0sM1wQwqqJx36IJQmkB [string] 2.3 eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTQyMzc0ODUwNzM2OmFuZHJvaWQ6NzY3ZDM1YjEyMWVjMmM2OTEwZWI3NSIsImV4cCI6MTY5MjIwMzM0MCwiZmlkIjoiZm1CMHNNMXdRd3FxSngzNklKUW1rQiIsInByb2plY3ROdW1iZXIiOjk0MjM3NDg1MDczNn0.AB2LPV8wRQIge9aoH7alYnM5IMQ_BG6N7i-5f54B_Mk5CkP1ZdZy9loCIQDmL737fKuyTzdR5STD7Ugk0rpXmo5svz1-O1JfWxy09Q [message] 4 [message] 4.1 [fixed32] 4.1.6 841888814 [string] 4.2 30 [string] 4.3 de_DE [string] 4.4 Europe/Amsterdam POST https://firebaseremoteconfig.googleapis.com/v1/projects/942374850736/namespaces/firebase:fetch HTTP/1.1 x-dynatrace: MT_3_1_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_1_3089_24 X-Goog-Api-Key: AIzaSyDqDU513JEXB_2NFToYNcKjG6HAqwHicqg X-Android-Package: com.renault.myrenault.one.fr X-Android-Cert: B22B0CB2F0043027FE579BD6B6F16557EE47FCED X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTQyMzc0ODUwNzM2OmFuZHJvaWQ6NzY3ZDM1YjEyMWVjMmM2OTEwZWI3NSIsImV4cCI6MTY5MjIwMzM0MCwiZmlkIjoiZm1CMHNNMXdRd3FxSngzNklKUW1rQiIsInByb2plY3ROdW1iZXIiOjk0MjM3NDg1MDczNn0.AB2LPV8wRQIge9aoH7alYnM5IMQ_BG6N7i-5f54B_Mk5CkP1ZdZy9loCIQDmL737fKuyTzdR5STD7Ugk0rpXmo5svz1-O1JfWxy09Q Content-Type: application/json Accept: application/json Content-Length: 674 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: {}, „appBuild“: „504020“, „appId“: „1:942374850736:android:767d35b121ec2c6910eb75“, „appInstanceId“: „fmB0sM1wQwqqJx36IJQmkB“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6OTQyMzc0ODUwNzM2OmFuZHJvaWQ6NzY3ZDM1YjEyMWVjMmM2OTEwZWI3NSIsImV4cCI6MTY5MjIwMzM0MCwiZmlkIjoiZm1CMHNNMXdRd3FxSngzNklKUW1rQiIsInByb2plY3ROdW1iZXIiOjk0MjM3NDg1MDczNn0.AB2LPV8wRQIge9aoH7alYnM5IMQ_BG6N7i-5f54B_Mk5CkP1ZdZy9loCIQDmL737fKuyTzdR5STD7Ugk0rpXmo5svz1-O1JfWxy09Q“, „appVersion“: „5.4.2“, „countryCode“: „DE“, „languageCode“: „de-DE“, „packageName“: „com.renault.myrenault.one.fr“, „platformVersion“: „30“, „sdkVersion“: „21.2.0“, „timeZone“: „Europe/Amsterdam“ }
[2] Contentsquare ist ein Analyseanbieter. Soweit ich das verstehe geht nur der erste Request an den Anbieter, die weiteren Verhaltensdaten werden über einen Amazon-AWS-Server geleitet und enthalten dann die eigentlichen Verhaltensdaten wie angeklickte Buttons. Diese Verbindungen waren leider auch Tage nach er letzten Nutzung im Hintergrund aktiv.
GET https://mobile-production.content-square.net/android/config/v2/com.renault.myrenault.one.fr.json HTTP/1.1 x-dynatrace: MT_3_1_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_1_3126_5 Charset: UTF-8 Content-length: 0 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: mobile-production.content-square.net Connection: Keep-Alive Accept-Encoding: gzip No content POST https://dynmopub.apps.aws.renault.com/mbeacon/82fb2a21-6357-42cc-8dcf-218fc0b1a8d6?type=m&srvid=1&app=b886c62d-dc29-43be-8436-d2c076491d00&va=8.269.1.1009&tt=maandroid&pt=0&resp=json&cts=1689872812790&si=759079219_1 HTTP/1.1 Connection: close Accept-Encoding: identity, gzip Content-Type: text/plain; charset=utf-8 Content-Encoding: gzip User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: dynmopub.apps.aws.renault.com Content-Length: 599 [decoded gzip] Raw vv=3&va=8.269.1.1009&ap=b886c62d-dc29-43be-8436-d2c076491d00&an=My+Renault&ai=com.renault.myrenault.one.fr&vb=504020&vn=5.4.2&vi=759079219&sn=1&ss=0&rm=1703&cp=ARMv7+rev+1+%28v7l%29&os=Android+11&mf=samsung&md=SM-G900F&rj=g&ul=de_DE&sw=1080&sh=1920&sd=480&pt=0&so=p&bl=100&fm=459&cr=&ct=w&np=802.11x&tt=maandroid&dl=2&cl=2&fv=pl&tv=1691598541551&tx=1691598551945&mp=1&et=30&na=https%3A%2F%2Fmobile-production.content-square.net%2Fandroid%2Fconfig%2Fv2%2Fcom.renault.myrenault.one.fr.json&it=3126&pa=1&s0=5&t0=478&s1=7&t1=25&rc=200&et=30&na=https%3A%2F%2Fsocialize.eu1.gigya.com%2Fsocialize.getIDs&it=3126&pa=1&s0=8&t0=2467&s1=14&t1=240&rc=200&bs=319&br=724&et=21&na=SplashScreenActivity&it=2&ca=7&pa=1&s0=11&t0=2501&s1=12&t1=0&s2=15&t2=6323&s3=16&t3=6340&s4=17&t4=6350&et=20&na=SplashScreenActivity&it=2&ca=8&pa=1&s0=2&t0=276&s1=21&t1=8626&et=30&na=https%3A%2F%2Fapi-wired-prod-1-euw1.wrd-aws.com%2Fcommerce%2Fv1%2Fentities%2Fcountries-values&it=3146&pa=1&s0=18&t0=8855&s1=26&t1=482&rc=403&bs=445&br=145&si=0
[3] Gigya ist ein Identitätsprovider, der Trackingprofile über Geräte hinweg verknüpfen kann. Er gehört mittlerweile zu SAP. Diese Einbettung ist aus Datenschutzsicht sehr problematisch, weil die gesammelten Verhaltensdaten offenbar auch mit anderen Aktivitäten auf anderen Plattformen oder in anderen Apps verknüpft werden könnten. Wenn dies für Marketingzwecke geschieht, ist es ohne Einwilligung illegal.
POST https://socialize.eu1.gigya.com/socialize.getIDs HTTP/1.1 x-dynatrace: MT_3_1_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_1_3126_8 Accept-Encoding: gzip connection: close Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: socialize.eu1.gigya.com Content-Length: 173 URLEncoded form apiKey: 3_4LKbCcMMcvjDm3X89LU4z4mNKYKdl_W0oD9w-Jvih21WqgJKtFZAnb9YdUgWT9_a format: json httpStatusCodes: false nonce: 1691598544013_1392362421 sdk: Android_6.1.0 targetEnv: mobile
[4] Onetrust ist ein Anbieter von Einwilligungs-Lösungen, er erhält hier keine problematischen Daten.
POST https://mobile-data.onetrust.io/bannersdk/v2/applicationdata HTTP/1.1 x-dynatrace: MT_3_47_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_0_2_32 location: cdn.cookielaw.org application: 93b7ae0c-f83c-4306-9dee-edf90018ccd2 lang: de-DE sdkVersion: 6.27.0 fetchType: APP_DATA_ONLY Content-Type: application/json Content-Length: 0 Host: mobile-data.onetrust.io Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.14.7 No content
[5] Microsoft Cloud: Eine Grafik wird Microsoft Azure geladen. Unproblematisch, aber irgendwie seltsam, das nicht in die App zu packen. Soll uns hier aber nicht interessieren.
GET https://optanon.blob.core.windows.net/logos/1058e0b9-ee95-4d43-8292-3dae40ce5c3c/ddbceb4e-46df-448a-abc7-eff03985a587/67c338b5-cb1c-4b4b-b016-53a3f08d7d6a/renault.png HTTP/1.1 x-dynatrace: MT_3_47_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_0_3190_35 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: optanon.blob.core.windows.net Connection: Keep-Alive Accept-Encoding: gzip No content
[6] Gigya: Hier wird die ungehashte E-Mailadresse an den Identitätsprovider gesendet, der damit ein Verhaltensprofil anlegt. Würde ich sehr wundern, wenn das nicht für Marketingzwecke verwendet werden würde.
HTTP/1.1 200 OK content-length: 757 content-type: text/javascript; charset=utf-8 date: Wed, 09 Aug 2023 16:36:50 GMT cache-control: private content-encoding: gzip vary: Accept-Encoding p3p: CP=“IDC COR PSA DEV ADM OUR IND ONL“ x-error-code: 0 x-soa: true, Gator x-server: eu1a-nomad-t8 x-callid: f1a38992216f4b7881e9b018e0ce7c2a x-robots-tag: none connection: close [decoded gzip] JavaScript { „callId“: „f1a38992216f4b7881e9b018e0ce7c2a“, „errorCode“: 0, „apiVersion“: 2, „statusCode“: 200, „statusReason“: „OK“, „time“: „2023-08-09T16:36:51.444Z“, „registeredTimestamp“: 1691598900, „UID“: „6352dd36-45e5-4939-82e8-845868178714“, „UIDSignature“: „IqqQISDalbNQYCfbmZdsQR8/5EE=“, „signatureTimestamp“: „1691599011“, „created“: „2023-08-09T16:34:59.925Z“, „createdTimestamp“: 1691598899, „isActive“: true, „isRegistered“: true, „isVerified“: true, „lastLogin“: „2023-08-09T16:36:51.406Z“, „lastLoginTimestamp“: 1691599011, „lastUpdated“: „2023-08-09T16:35:34.467Z“, „lastUpdatedTimestamp“: 1691598934467, „loginProvider“: „site“, „oldestDataUpdated“: „2023-08-09T16:34:59.925Z“, „oldestDataUpdatedTimestamp“: 1691598899925, „profile“: { „email“: „*********@protonmail.com“ } , „registered“: „2023-08-09T16:35:00.004Z“, „socialProviders“: „site“, „verified“: „2023-08-09T16:35:34.467Z“, „verifiedTimestamp“: 1691598934467, „newUser“: false, „sessionInfo“: { „sessionToken“: „st2.s.AcbHK64mKw.UYzcYP5C6LULgUKHj54a_MIencBNt1EhJBeAG1pNX0eBILXMxBM8KrhPbpFsTPxyy4dAgYhWDa_D0yv3S3q5jAn1IJ0ZnTF6PAVbo1HjFCEQMHbUKy26aU09R_1aPwXT.YZ8iGdYvIoYcGVD6qZ_o12CmFcN2oGZGpzLZR51mw2rb-oHK3wMPRBwvIhUcGmI29den8Vbahyhiw1UcaEwh5Q.sc3“, „sessionSecret“: „MYEF01/Fw+9MMFIhlecPk+4zc8c=“, „expires_in“: „0“ } }
[7] Renault Server: Per API wird unter anderem die Userverwaltung organisiert und Ladesäulen abgefragt. Problematisch ist, dass auch diese Requests immer die ID von Gigya tragen, so dass auch diese Daten in die Verhaltensanalyse bei dem SAP-Unternehmen einfließen können.
POST https://apis.renault.com/myr/api/v1/connection?country=DE&locale=fr-FR&product=MYRENAULT&cb=true&zepass=true&displayAccounts=MYRENAULT HTTP/1.1 accept: application/json apiKey: lZeSKPcG18u3SI8AGE52lIQ5DfamawDo x-gigya-id_token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlJFUTBNVVE1TjBOQ1JUSkVNemszTTBVMVJrTkRRMFUwUTBNMVJFRkJSamhETWpkRU5VRkJRZyJ9.eyJpc3MiOiJodHRwczovL2ZpZG0uZ2lneWEuY29tL2p3dC8zX1ZnZGtndElSSDNBZEh2Sm0tY2pWMnVnMkVGRTBseHQwSUp6TUM0TUZxWmpGcG5fR1lGWFZkTloxOUw3d1pYME4vIiwiYXBpS2V5IjoiM19WZ2RrZ3RJUkgzQWRIdkptLWNqVjJ1ZzJFRkUwbHh0MElKek1DNE1GcVpqRnBuX0dZRlhWZE5aMTlMN3daWDBOIiwiaWF0IjoxNjkxNTk5MDEyLCJleHAiOjE2OTE1OTk5MTIsInJpc2tTY29yZSI6MC4wLCJzdWIiOiI2MzUyZGQzNi00NWU1LTQ5MzktODJlOC04NDU4NjgxNzg3MTQiLCJkYXRhLnBlcnNvbklkIjoiY2M0NmE1ZjktNWU3NC00NDU1LTliMGYtNTA5YzJlN2FjOWEwIiwiZGF0YS5naWd5YURhdGFDZW50ZXIiOiJldTEuZ2lneWEuY29tIn0.pYblrvvW4wpD1KY5hVnaYXwZbicZSYlR3Gw4lVMZhrnPAzvhsUt0xmI9MGBu6TEjzSAMiPRFGWiJCYNTGfWULS6LlmLH1JAEU0-OggUzxVFcJNyM7nFeLLBC89qHB_DwOs0MAGSMJM370U-b0Ac5XL3lfvjPQB2sGMzhe_uFVrNbGV8NpUbikN6kBjNM-pk8CP1DM_s2xAKZTKgxjXvUU6IS9DwzmpfOTmHFN0RqZyp-05LcH51751fL1dlDMJYyAfK6H-w8UhbF7L1dWQTy-6Q17UXMjttF9YjxODUYgWh4REYiDUgFWrf-X7QrtaNIGvKGSitwacaCWn8oqEYt_A x-dynatrace: MT_3_47_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_0_3294_159 Content-Length: 0 Host: apis.renault.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.14.7 Query country: DE locale: fr-FR product: MYRENAULT cb: true zepass: true displayAccounts: MYRENAULT
[7] Amazon AWS: Hier werden die Zugangsdaten aus dem Account nochmals auf eine Amazon AWS Cloud geschickt. Bedenklich ist, dass hier als „Purpose“ Marketing angegeben wurde, obwohl ich keinerlei Einwilligungen gegeben habe. Profilbildung für Marketing wäre problematisch und ohne Einwilligung nicht legal.
POST https://api-wired-prod-1-euw1.wrd-aws.com/commerce/v1/accounts/register?country=DE&brand=RENAULT HTTP/1.1 apiKey: lZeSKPcG18u3SI8AGE52lIQ5DfamawDo x-dynatrace: MT_3_47_759079219_1-0_b886c62d-dc29-43be-8436-d2c076491d00_38_3220_113 X-Amzn-Trace-Id: build=myr-android-5.4.2;trId=4140d682-15b3-40dd-b27d-a9d7c887bf65 Content-Type: application/json Content-Length: 347 Host: api-wired-prod-1-euw1.wrd-aws.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.14.7 JSON { „firstName“: „****“, „lastName“: „******“, „locale“: „fr-FR“, „login“: „********@protonmail.com“, „loginType“: „EMAIL“, „password“: „*********“, „purposes“: [ { „consents“: [ { „agreements“: [], „scopeType“: „RENAULTGROUP“ } ], „purposeType“: „MARKETING“ } ], „source“: „https://myr.renault.de/“, „subApiKey“: „4_2W47rDm77n92RYiL_inSTg“, „termsConditionAcceptance“: true }
[8] Google Maps: Hier konnte ich wieder nicht alle Anfragen entschlüsseln. Google erhält aber den genauen Standort.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 562 X-Google-Maps-Mobile-API: com.renault.myrenault.one.fr,504020,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\x12\xba\xab/\xb0\xd7\xcc\xb0\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x012 \x041070 \x01*\x1ccom.renault.myrenault.one.fr2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xcc\x01AH0uPGH3m-zHD1ppOMU_KUH9GqzIr_SDlK0P4eafZLjLvc9qTmvTdjy6xwTk8VtW08NRa0gdks_FlO49c8tqm0zBdsK2I_6_EPULXcQIH2Ua48KWSoApLm2mMGLGgQI2U-KssxDkTcNM_STOsoK3MGqrVrjh_Nx2EHmn1PDKxvyCo4yCo3J5S8msaxnd4nxcdi87n9_TK8D_\xba\x02\x06504020\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03\x07\x02\xde\xa0N\x00\xb0F\x96\x02\xde\xa0N\x00\xb0F\x96\x00\x0f\x00\x00B4\x00\x00E\xc3\x00\x01\x07\x02\xde\xa0N\x00\xb0\x00\xd2\x02\xde\xad\xbf\x00\xb0#8\x00\x0f\x00\x00B4\x00\x00E\xc3\x00\x01l\x00\x00\x00\x7f J\x08\x80\x02\x10\x00\x10\x0c\x10 \x18\x04\x18\x06 \x01(\x015\x00\x00@@b\x04\x08\xce\xc5Sb\x04\x08\xd1\xc5Sb\x04\x08\xca\xf6Sb\x04\x08\xa9\xa5Tb\x05\x08\xe9\x8e\xb4\x16b\x05\x08\x9d\xff\xb7\x16b\x05\x08\xeb\x88\xb8\x16b\x05\x08\x8f\xaa\xb8\x16J\x1e\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\xf8\x82\x98:\x80\x02\x00R\x112\x0f\x08%\x12\x0b smartmaps
Fazit: Diese App ist hochproblematisch: Sie nutzt Verhaltensanalysen und sendet sie mit der Klartext-E-Mail-Adresse an Gigya (SAP), wo man nach eigenen Angaben geräteübergreifende Profile anlegt und für Marketingzwecke auswertet. Ob diese Daten auch Drittfirmen zur Verfügung gestellt werden, konnte ich nicht überprüfen – die Firma bietet diese Dienst aber für Kunden an. Im besten Fall werden damit nur die verschiedenen Logins von Renault und z.B. seinen Autohäusern zusammengeknüpft und für internes Marketing verwendet. Legal ist das aber ohne Einwilligung kaum. Die App stellt auch sonst sehr viele Verbindungen zu Drittfirmen her, so dass ich ganz klar von jeder Nutzung abrate. Wer die App bereits hat: deinstallieren. Sonst wird man weiter von Renault fürs Marketing profiliert.
Shell Recharge
Ob man den Übergang in die Elektromobilität nun wirklich mit dem Unternehmen durchführen muss, das jahrelang gegen Umweltschutz und Klimaarbeit lobbyiert hat, sollte jede Person kritisch für sich entscheiden. Beim Datenschutz kann die Shell Recharge App aber ebensowenig glänzen. Nach dem Start stellten wir ohne Einwilligung folgende Verbindungen fest:
[1] Google Firebase erhält für verschiedene Dienste (Firebase Installations, Firebase Messaging und Firebase Remote config) eindeutige Identifier wie die Installations-ID.
POST https://firebaseinstallations.googleapis.com/v1/projects/fluent-radar-118215/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.thenewmotion.thenewmotion x-firebase-client: H4sIAAAAAAAAAEVRS27DIBC9isU6xoCrJspV6izGMHZRDEQwtVRFuXsnMU63j_dl7uIbIdOIQEWcv-4CZowkzgKiy8m7liDPSG1x16HrdTP5jK1NGYfOKKml2ZDJBgZ6qeSpuSZafBw6LY_S7O8eQlX0zW4dfNx8Tb-xIMLyS94WhjRT9b_YvdUbc6QXR3EBh6u32I6ZfYeuQCg_cX6H-FgIlgXz0NkUZIXlitF5ptXcF8gD1e4WIfDE60K4IyE5XCr0UlVnIJ8iN9ZHblPrZVsXmHePGxOnlPkXmoxgiRPIr89xGUcoHKY_pDZSbQ7Ea8otZZ6pT2z0KQ7CAeHzSMIo07fq2PZKXB6Xg1gxFy7BVzPi8QcqaQO90gEAAA X-Android-Cert: 70BF34F6365173D7D8A9D67016715B519C97A4EA x-goog-api-key: AIzaSyADA8YqlYwRFGzzUMHf6JEx-iKYHTaYO1I User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:844894842268:android:9529764a2fc85151“, „authVersion“: „FIS_v2“, „fid“: „fl9KhOvHSBa9ajInONz7eg“, „sdkVersion“: „a:17.0.3“ } POST https://firebaseinappmessaging.googleapis.com/google.internal.firebase.inappmessaging.v1.sdkserving.InAppMessagingSdkServing/FetchEligibleCampaigns HTTP/2.0 user-agent: grpc-java-okhttp/1.44.1 content-type: application/grpc te: trailers x-goog-api-key: AIzaSyADA8YqlYwRFGzzUMHf6JEx-iKYHTaYO1I x-android-package: com.thenewmotion.thenewmotion x-android-cert: 70BF34F6365173D7D8A9D67016715B519C97A4EA grpc-accept-encoding: gzip grpc-timeout: 29578272u gRPC gRPC message 0 (compressed False) [string] 1 844894842268 [message] 2 [string] 2.1 1:844894842268:android:9529764a2fc85151 [string] 2.2 fl9KhOvHSBa9ajInONz7eg [string] 2.3 eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6ODQ0ODk0ODQyMjY4OmFuZHJvaWQ6OTUyOTc2NGEyZmM4NTE1MSIsImV4cCI6MTY5MTMyNzk3NiwiZmlkIjoiZmw5S2hPdkhTQmE5YWpJbk9OejdlZyIsInByb2plY3ROdW1iZXIiOjg0NDg5NDg0MjI2OH0.AB2LPV8wRgIhAKFj_fLNweoS7NmR0vp5NKnObyFVdlWDtGi-G1B2WLe-AiEA0RMQhCNdLasDQGj9794T8saV-Hf8Xe_McZO94uPjAoU [message] 4 [string] 4.1 10.6.3 [string] 4.2 30 [string] 4.3 de_DE [string] 4.4 Europe/Amsterdam POST https://firebaseremoteconfig.googleapis.com/v1/projects/844894842268/namespaces/firebase:fetch HTTP/1.1 X-Goog-Api-Key: AIzaSyADA8YqlYwRFGzzUMHf6JEx-iKYHTaYO1I X-Android-Package: com.thenewmotion.thenewmotion X-Android-Cert: 70BF34F6365173D7D8A9D67016715B519C97A4EA X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6ODQ0ODk0ODQyMjY4OmFuZHJvaWQ6OTUyOTc2NGEyZmM4NTE1MSIsImV4cCI6MTY5MTMyNzk3NiwiZmlkIjoiZmw5S2hPdkhTQmE5YWpJbk9OejdlZyIsInByb2plY3ROdW1iZXIiOjg0NDg5NDg0MjI2OH0.AB2LPV8wRgIhAKFj_fLNweoS7NmR0vp5NKnObyFVdlWDtGi-G1B2WLe-AiEA0RMQhCNdLasDQGj9794T8saV-Hf8Xe_McZO94uPjAoU Content-Type: application/json Accept: application/json Content-Length: 723 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: { „logged_in“: „false“ }, „appBuild“: „1474“, „appId“: „1:844894842268:android:9529764a2fc85151“, „appInstanceId“: „fl9KhOvHSBa9ajInONz7eg“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6ODQ0ODk0ODQyMjY4OmFuZHJvaWQ6OTUyOTc2NGEyZmM4NTE1MSIsImV4cCI6MTY5MTMyNzk3NiwiZmlkIjoiZmw5S2hPdkhTQmE5YWpJbk9OejdlZyIsInByb2plY3ROdW1iZXIiOjg0NDg5NDg0MjI2OH0.AB2LPV8wRgIhAKFj_fLNweoS7NmR0vp5NKnObyFVdlWDtGi-G1B2WLe-AiEA0RMQhCNdLasDQGj9794T8saV-Hf8Xe_McZO94uPjAoU“, „appVersion“: „10.6.3“, „countryCode“: „DE“, „firstOpenTime“: „2023-07-30T14:00:00.000Z“, „languageCode“: „de-DE“, „packageName“: „com.thenewmotion.thenewmotion“, „platformVersion“: „30“, „sdkVersion“: „21.1.2“, „timeZone“: „Europe/Amsterdam“ }
[2] Microsoft Visual Studio App Center erhält umfangreiche Analysedaten und eine eindeutige Install-ID.
POST https://in.appcenter.ms/logs?api-version=1.0.0 HTTP/1.1 Install-ID: d3bdc31f-c355-46c2-aaf6-f4f19f42344e App-Secret: fa7abc6d-24b7-4742-ad1e-0922bcf3943f Content-Type: application/json Content-Length: 1090 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: in.appcenter.ms Connection: Keep-Alive Accept-Encoding: gzip JSON { „logs“: [ { „device“: { „appBuild“: „1474“, „appNamespace“: „com.thenewmotion.thenewmotion“, „appVersion“: „10.6.3“, „carrierCountry“: „de“, „locale“: „de_DE“, „model“: „SM-G900F“, „oemName“: „samsung“, „osApiLevel“: 30, „osBuild“: „RQ3A.211001.001“, „osName“: „Android“, „osVersion“: „11“, „screenSize“: „1080×1920“, „sdkName“: „appcenter.android“, „sdkVersion“: „4.4.5“, „timeZoneOffset“: 120, „wrapperSdkName“: „appcenter.react-native“, „wrapperSdkVersion“: „4.4.5“ }, „isOneCollectorEnabled“: false, „services“: [ „Analytics“ ], „timestamp“: „2023-07-30T13:19:37.224Z“, „type“: „startService“ }, { „device“: { „appBuild“: „1474“, „appNamespace“: „com.thenewmotion.thenewmotion“, „appVersion“: „10.6.3“, „carrierCountry“: „de“, „locale“: „de_DE“, „model“: „SM-G900F“, „oemName“: „samsung“, „osApiLevel“: 30, „osBuild“: „RQ3A.211001.001“, „osName“: „Android“, „osVersion“: „11“, „screenSize“: „1080×1920“, „sdkName“: „appcenter.android“, „sdkVersion“: „4.4.5“, „timeZoneOffset“: 120, „wrapperSdkName“: „appcenter.react-native“, „wrapperSdkVersion“: „4.4.5“ }, „isOneCollectorEnabled“: false, „services“: [ „Crashes“ ], „timestamp“: „2023-07-30T13:19:37.276Z“, „type“: „startService“ } ] }
[3] Datadog ist ein eher technisch orientierter Analysedienst, mit dem man die Sicherheit und Stabilität der App überwachen kann. Hier kann man darüber streiten, ob die gesendete application id
und Datenpunkte wie die Verweildauer oder detaillierte Aktionen im Rahmen der Datenschutzgesetze ohne Einwilligung zulässig sind. Auch ein Frustrations-Zähler, der vermutlich prüft, wie oft man verärgert auf den Bildschirm presst, ist eine unangenehme Überwachung. Mir erscheint es nicht unbedingt notwendig, diese Sachen auf jedem Gerät abzufragen, es würde bei einer Auswahl freiwilliger Personen sicher auch ausreichen, das Fehleraufkommen in der App zu überwachen.
POST https://browser-intake-datadoghq.eu/api/v2/rum?ddsource=react-native&ddtags=service:com.thenewmotion.thenewmotion,version:10.6.3,sdk_version:1.7.1,env:production HTTP/2.0 dd-api-key: puba643e858afbf2cf70c7aa9633a14bd14 dd-evp-origin: react-native dd-evp-origin-version: 1.7.1 dd-request-id: e404eefe-41e7-40c2-b10e-3b736d6fbba4 user-agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) content-encoding: gzip content-type: text/plain;charset=UTF-8 accept-encoding: gzip [decoded gzip] Raw {„date“:1690723179300,“application“:{„id“:“15dc9b5e-0f98-44e4-91d0-8e3ccc00ec86″},“service“:“com.thenewmotion.thenewmotion“,“version“:“10.6.3″,“session“:{„id“:“851a1116-0a29-4c6d-9b94-eb7c098f1ee8″,“type“:“user“,“has_replay“:false,“is_active“:true},“source“:“react-native“,“view“:{„id“:“06c85bca-8271-4afb-b0f6-a45e4433a8da“,“url“:“WelcomeScreen-wL_k8Iuq83nb0S-Pw6E3p“,“name“:“WelcomeScreen“,“time_spent“:21855144027,“is_active“:false,“is_slow_rendered“:false,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:3},“frozen_frame“:{„count“:0},“resource“:{„count“:1},“frustration“:{„count“:0},“memory_average“:2.4610236363636363E8,“memory_max“:2.54756E8,“cpu_ticks_count“:2178.0,“cpu_ticks_per_second“:99.65617235508873,“refresh_rate_average“:59.59398224510827,“refresh_rate_min“:2.855295334217858,“js_refresh_rate“:{„min“:5.997193049776211,“max“:186.64958947356044,“average“:58.687336460082655}},“connectivity“:{„status“:“connected“,“interfaces“:[„wifi“]},“os“:{„name“:“Android“,“version“:“11″,“version_major“:“11″},“device“:{„type“:“mobile“,“name“:“Samsung SM-G900F“,“model“:“SM-G900F“,“brand“:“Samsung“,“architecture“:“armv7l“},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:3},“context“:{},“type“:“view“,“feature_flags“:{}}
[4] Google Maps wird für die Karteninhalte genutzt, die Details konnte ich auch hier nicht einsehen.
[5] Microsoft Azure ist der Webhoster für das Backend der Shell-App.
GET https://recharge-prod-location.azurewebsites.net/api/v1/totalLocations HTTP/1.1 accept: application/json cache-control: no-cache content-type: application/json authorization: Basic U1JBcHA6RXduc2MzS042WjY2dlBtbndMZ0pjZUZxN0hVVVc5 Host: recharge-prod-location.azurewebsites.net Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.9.2 No content
Eine Anmeldung habe ich in der App nicht mehr ausgetestet.
Fazit: Auch bei der Shell Recharge App sind zahlreiche Analysedienste eingebunden und man man kann überwiegend nicht davon ausgehen, dass die deutschen Datenschutzgesetze eingehalten werden.
TankE Netzwerk
Auch diese App wird von dem deutschen Unternehmen Chargecloud realisiert, die technisch auch bei Ladeverbund+ und Maingau beteiligt waren. Diese App ist exakt die gleiche wie Ladeverbund+ und stellt die gleichen Verbindungen her, so dass ich hier keine Einzelbesprechung der Verbindungen mache. Der Unterschied liegt offenbar in einem anderen Ladenetzwerk: Die TankE-Energieversorger (Browser-Karte) sind eher in einer Banane zwischen Soest, Solingen über den Großraum Köln nach Frankfurt angeordnet, wobei beispielsweise auch in Ingolstadt viele zu finden sind. Außerdem kann man sich auch direkt in der App mit einem TankE-Login registrieren, ohne bei einem der Partner-Energieversorge einen Vertrag zu haben und dann direkt über die App bezahlen. Auch hier fiel positiv auf, dass man mit einer einfachen SEPA-Lastschrift ohne weitere Drittanbieter eine Zahloption angeboten bekommt.
Fazit: Aus Datenschutzperspektive uneingeschränkt empfehlenswert.
Tesla
Die Tesla-App haben natürlich viele, die einen Tesla besitzen. Aber Tesla bietet auch viele seiner Supercharger für Personen an, die eine andere Marke fahren. Die Preise sind relativ gut und man kann sie nochmals verbessern, indem man 12,99$ im Monat bezahlt. Das könnte sich für Vielfahrer lohnen, die viel auf Autobahnen schnellladen.
Hier die Verbindungen:
[1] Google Firebase wird über die Installation informiert, damit Absturzberichte abgefangen werden können. Außerdem wird über Firebase Remote Config eine Konfiguration für die App nachgeladen.
POST https://firebaseinstallations.googleapis.com/v1/projects/tesla-prod/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: com.teslamotors.tesla x-firebase-client: H4sIAAAAAAAAAF2SwW7DIBBEfyXiHGMgVZPmV-ocNmadImOwYBu1ivLvXcfEbntB8mhn5rHmJj4QEp0RKIvj-03ABQOJo4BgU3S2IkgXpCrbvql3etO5hFUb-ejpq6mNklqqWaUEIY8xUVPrA8t688wYXJgDzEsJ8Hn286CRb5s-kneBPyUb1Vryt4Bdi-MhdO3AEzuppJkFOHO5YYPUa1GYmovN4tW1WJ0Z1TZ1hiF_hss8OmLqHn1Kvi7kLmQC7zE1dRsHWWR5xWDd0wgB_De5NhfaUl2sQC6GiXu_UpUYXqj6F_Frq3rFWtQJrVxhiBZ9U_ee8CkFGLAoD2tqyzLMcp-RebqYeG1iKywQTj9dGGV2lTpUei9O99NWXDFlpuZXYMT9B-6tDhMiAgAA X-Android-Cert: 3473A53E393949E25546B3AF8A05F74A58FBDBB6 x-goog-api-key: AIzaSyBtC5_9AAH0DioP2T0MAPhq-METYPaM-qo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:596800703674:android:1b6ff7e2089ef4ae“, „authVersion“: „FIS_v2“, „fid“: „dKN15bH2QOafh2Fd_wqqtp“, „sdkVersion“: „a:17.0.1“ } POST https://firebaseremoteconfig.googleapis.com/v1/projects/596800703674/namespaces/fireperf:fetch HTTP/1.1 X-Goog-Api-Key: AIzaSyBtC5_9AAH0DioP2T0MAPhq-METYPaM-qo X-Android-Package: com.teslamotors.tesla X-Android-Cert: 3473A53E393949E25546B3AF8A05F74A58FBDBB6 X-Google-GFE-Can-Retry: yes X-Goog-Firebase-Installations-Auth: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6NTk2ODAwNzAzNjc0OmFuZHJvaWQ6MWI2ZmY3ZTIwODllZjRhZSIsImV4cCI6MTY5Mjg5NTgwNSwiZmlkIjoiZEtOMTViSDJRT2FmaDJGZF93cXF0cCIsInByb2plY3ROdW1iZXIiOjU5NjgwMDcwMzY3NH0.AB2LPV8wRQIgHwi1yf7ajgoC72gOzp2LCGU-Rwc_uQuMONmoaYxgIsICIQDnox754wBDguhhCj29s39OkB8c7fbfnorzqcF8x1wPag Content-Type: application/json Accept: application/json Content-Length: 657 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseremoteconfig.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip JSON { „analyticsUserProperties“: {}, „appBuild“: „1844“, „appId“: „1:596800703674:android:1b6ff7e2089ef4ae“, „appInstanceId“: „dKN15bH2QOafh2Fd_wqqtp“, „appInstanceIdToken“: „eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6IjE6NTk2ODAwNzAzNjc0OmFuZHJvaWQ6MWI2ZmY3ZTIwODllZjRhZSIsImV4cCI6MTY5Mjg5NTgwNSwiZmlkIjoiZEtOMTViSDJRT2FmaDJGZF93cXF0cCIsInByb2plY3ROdW1iZXIiOjU5NjgwMDcwMzY3NH0.AB2LPV8wRQIgHwi1yf7ajgoC72gOzp2LCGU-Rwc_uQuMONmoaYxgIsICIQDnox754wBDguhhCj29s39OkB8c7fbfnorzqcF8x1wPag“, „appVersion“: „4.23.6-1844“, „countryCode“: „DE“, „languageCode“: „de-DE“, „packageName“: „com.teslamotors.tesla“, „platformVersion“: „30“, „sdkVersion“: „21.0.2“, „timeZone“: „Europe/Amsterdam“ }
Es folgen größtenteils verschiedene Endpunkte, die von Tesla betrieben werden. Weil das sicher viele interessiert, führe ich sie hier genauer als sonst auf:
[2] ownership.tesla.com scheint für die Accountverwaltung zuständig zu sein, evtl. auch nur für die Authentifizierung per Browser innerhalb der App. Hier sehe ich auf den ersten Blick nicht auffälliges. Die Infrastruktur ist wohl bei Akamai gehostet, daher das entsprechende Cookie.
GET https://ownership.tesla.com/mobile-app/account/details?deviceLanguage=de&deviceCountry=DE&ttpLocale=de_DE HTTP/2.0 accept: */* x-tesla-user-agent: TeslaApp/4.23.6-1844/074a3374b7/android/30 charset: utf-8 cache-control: no-cache accept-language: de authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Im5ZdVZJWTJTN3gxVHRYM01KMC1QMDJad3pXQSJ9.eyJpc3MiOiJodHRwczovL2F1dGgudGVzbGEuY29tL29hdXRoMi92MyIsImF1ZCI6WyJodHRwczovL293bmVyLWFwaS50ZXNsYW1vdG9ycy5jb20vIiwiaHR0cHM6Ly9hdXRoLnRlc2xhLmNvbS9vYXV0aDIvdjMvdXNlcmluZm8iXSwiYXpwIjoib3duZXJhcGkiLCJzdWIiOiJlODc2YWY3Ny1lODQzLTQ1Y2MtYjI1Mi1mMGE1MGM2MjhkYzciLCJzY3AiOlsib3BlbmlkIiwiZW1haWwiLCJvZmZsaW5lX2FjY2VzcyIsInBob25lIl0sImFtciI6WyJwd2QiXSwiZXhwIjoxNjkyMzIwMjAwLCJpYXQiOjE2OTIyOTE0MDAsIm91X2NvZGUiOiJOQSIsImxvY2FsZSI6ImVuLVVTIiwiYXV0aF90aW1lIjoxNjkyMjkxMzk0fQ.pGpuBt_Z3kElhyglUiXrX9TJc-tl7fYMQIOKoi5yAULchaLSL8V9eaiPfL3dIJtNXx5FhK8LabZ5abgclCnhmXw9TnD91aLnHiEVkPxoSaxZ6ybwpbsxtlTw79iGLDR3eabrIeTjF4Ax2Ollh5mUvaLpGtg8a1BusoNMSYWyQYCmgZTAwfpyShZhB2FHAQxx6Z3SeWU6PDC_BYqWFLM9ZI_r2qTvphu3izJkASsNHLWCLXvsTW19dCy5fRYGG5gZtLjqCx6vc1Lz7LvzVZ-_YAeDhj4MY0Wqn5agaSRwp0FQWTZdBsQ-bzHGKAEqvIUL95DHZQJfv_7CilHKpAD3tA x-txid: 7886eec5-55f5-4920-b8dd-59ca894edabb x-request-id: 7886eec5-55f5-4920-b8dd-59ca894edabb accept-encoding: gzip cookie: ak_bmsc=697C40406D2529584E4E135E08868911~000000000000000000000000000000~YAAQrcXdWP1y1/KJAQAA0NptBBT7eI1TdvtQGLxggX1NuIQaX55EjeIitMgm9MYpKOjVMkNFXFw2t1JhJfCi5PKGfEHUs/CNMQDUvR0IdTeIkGNPwLogS1v/C6Fhl85I/B8516bgLhruadvSxmgYDLcE4+HeO1kr5ev2L9GTpqFw8dBYf8usIcZF0sKW1mJL/hzNUcjDzkNxE+PuLtuR50gYoju4omNFAgBLLNTtzSViF9m9p5AChw49LUdns/9GeA3GCtS8XXWppHPKAbraLeDXFhFZOEaJTCeXZPfekTAfE5DA7VVlVX6New7H1irYPzTdJevbjhJQTwGwbpCmRPxkLVg7zWNMtaGYlRvCbIq2IC9H84w8mqbgLSIQ9yfay1CrAHOqWCQIsfh/1ogBddrgqbxuBVrhGlhDZ9NFfcej user-agent: okhttp/5.0.0-SNAPSHOT Query deviceLanguage: de deviceCountry: DE ttpLocale: de_DE
[3] digitalassets.tesla.com: Hier werden sportliche Videos von einem Content-Server geladen, nichts Spannendes.
GET https://digitalassets.tesla.com/oxp/video/upload/SplashScreenVideo_a6569eee8d4c6.mp4 HTTP/2.0 icy-metadata: 1 user-agent: ReactNativeVideo/4.23.6-1844 (Linux;Android 11) ExoPlayerLib/2.13.3 accept-encoding: identity No content
[4] analytics-relay.tesla.com ist ein von Tesla betriebener Analysedienst. Möglicherweise ist der nur aktiv, solange man nicht eingeloggt ist, ich habe ihn später nicht mehr gesehen.
POST https://analytics-relay.tesla.com//analytics HTTP/1.1 accept: application/json accept-language: undefined Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Length: 110 Host: analytics-relay.tesla.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/5.0.0-SNAPSHOT URLEncoded form idsite: 2 rec: 1 apiv: 1 send_image: 0 e_c: guest_screen e_a: Clicked e_n: guest_explore_create_account e_v: undefined
[5] signaling.vn.teslamotors.com ist der ungewöhnlichste Request, den ich im ganzen Test abfangen konnte. Websocket ist eine eher seltene Schnittstelle, die hier als Alternative zum HTTP-Protokoll verwendet wird. Sie kommuniziert hier mit einem sogenannten Hermes-Server – das ist offenbar ein Javascript-Server, der für die Kommunikation mit Websocket gebaut wurde. Keine Ahnung, warum man das technisch so macht, evtl. um effektiver nur einzelne Nachrichten ohne Rückmeldung auszutauschen. Oder auch um ohne Webserver direkt per Wifi zwischen Smartphone und Auto kommunizieren zu können (hier geht es direkt an den Tesla-Server). Im Prinzip ist es aber am Ende inhaltlich auch nichts Anderes als eine normale HTTP-API-Kommunikation.
GET https://signaling.vn.teslamotors.com/v1/mobile HTTP/1.1 X-Tesla-User-Agent: TeslaApp/4.23.6-1844/074a3374b7/android/11 X-Tesla-App-Key: b496f15153edbb3289fe670f772225d02667629d X-Jwt: eyJraWQiOiJwcm9kdWN0aW9uLTEiLCJhbGciOiJFUzI1NiJ9.eyJpYXQiOjE2OTIyOTE0MzMsImV4cCI6MTY5MjM3NzgzMywic3ViIjoiV3lKbE9EYzJZV1kzTnkxbE9EUXpMVFExWTJNdFlqSTFNaTFtTUdFMU1HTTJNamhrWXpjaUxDSmlORGsyWmpFMU1UVXpaV1JpWWpNeU9EbG1aVFkzTUdZM056SXlNalZrTURJMk5qYzJNamxrSWwwPSIsImlzcyI6Im93bmVyLWFwaSIsImp0aSI6ImVlZjk4MDJkLTc0MGEtNDFhOC05NDFjLTgzYjIzNDA3NDQyZCIsImF1ZCI6Imhlcm1lcyIsImtleV9pZCI6InByb2R1Y3Rpb24tMSJ9.swqKxa_paz83Zfz8ot9wqOz8dpKRwqDcMAsQybReg6vUlRMOuhqVLu1pjTQdbxuGGm6__4jO6vFpsyGuHVxxEA X-Connection-Id: ab00b069-4f8a-4bb5-bfdb-93855c5a4f12 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dcwmyj2+PNc4dVbpo4CmMQ== Sec-WebSocket-Version: 13 Sec-WebSocket-Extensions: permessage-deflate Host: signaling.vn.teslamotors.com Accept-Encoding: gzip User-Agent: okhttp/5.0.0-SNAPSHOT WebSocket 4 Messages 2023-08-17 17:11:39.122 \xab\x04 $2c797296-34d6-43d9-b819-8da35f7ba50b\x12\x08internal\x1a\x0b\x08\xcb\xa9\xf9\xa6\x06\x10\xc8\x95\xc6(„\x0cHermesServer(\xa0\x08J\x0b\x08\x80\x92\xb8\xc3\x98\xfe\xff\xff\xff\x01R\xcb\x03{„expiration“:1692295899,“connection_timeout“:180000,“ping_frequency“:60000,“autopark“:{„heartbeat_frequency“:100,“autopark_pause_timeout“:2000,“autopark_stop_timeout“:10000},“ice_servers“:[{„urls“:[„stun:46.137.45.143:3478″,“stun:52.18.36.139:3478“]},{„urls“:[„turn:54.228.219.44:3478″,“turn:63.35.119.211:3478″,“turn:turn6.euw1.vn.cloud.tesla.com:3478″],“username“:“1692295899:FQYF33V4LOD2VU5XG5XBCA37XXGSYIAU“,“credential“:“Le8JkLq3qwfDxq1QXgGH8V9BZbU=“}]}Z\x00 2023-08-17 17:11:39.152 [ $ac39ba2c-9227-455c-96dd-24b4911ac83f\x12\x08internal\x1a\x002$2c797296-34d6-43d9-b819-8da35f7ba50b8\x9a\x11 2023-08-17 17:41:39.068 0000000000 0a ac 04 0a 24 34 32 66 32 38 35 33 66 2d 61 36 ….$42f2853f-a6 0000000010 31 63 2d 34 36 35 64 2d 39 61 38 32 2d 33 30 31 1c-465d-9a82-301 0000000020 64 62 61 63 61 62 34 63 36 12 08 69 6e 74 65 72 dbacab4c6..inter 0000000030 6e 61 6c 1a 0b 08 d3 b7 f9 a6 06 10 89 c1 d4 14 nal…………. 0000000040 22 0c 48 65 72 6d 65 73 53 65 72 76 65 72 28 a0 „.HermesServer(. 0000000050 08 4a 0b 08 80 92 b8 c3 98 fe ff ff ff 01 52 cc .J…………R. 0000000060 03 7b 22 65 78 70 69 72 61 74 69 6f 6e 22 3a 31 .{„expiration“:1 0000000070 36 39 32 32 39 37 36 39 39 2c 22 63 6f 6e 6e 65 692297699,“conne 0000000080 63 74 69 6f 6e 5f 74 69 6d 65 6f 75 74 22 3a 31 ction_timeout“:1 0000000090 38 30 30 30 30 2c 22 70 69 6e 67 5f 66 72 65 71 80000,“ping_freq 00000000a0 75 65 6e 63 79 22 3a 36 30 30 30 30 2c 22 61 75 uency“:60000,“au 00000000b0 74 6f 70 61 72 6b 22 3a 7b 22 68 65 61 72 74 62 topark“:{„heartb 00000000c0 65 61 74 5f 66 72 65 71 75 65 6e 63 79 22 3a 31 eat_frequency“:1 00000000d0 30 30 2c 22 61 75 74 6f 70 61 72 6b 5f 70 61 75 00,“autopark_pau 00000000e0 73 65 5f 74 69 6d 65 6f 75 74 22 3a 32 30 30 30 se_timeout“:2000 00000000f0 2c 22 61 75 74 6f 70 61 72 6b 5f 73 74 6f 70 5f ,“autopark_stop_ 0000000100 74 69 6d 65 6f 75 74 22 3a 31 30 30 30 30 7d 2c timeout“:10000}, 0000000110 22 69 63 65 5f 73 65 72 76 65 72 73 22 3a 5b 7b „ice_servers“:[{ 0000000120 22 75 72 6c 73 22 3a 5b 22 73 74 75 6e 3a 35 34 „urls“:[„stun:54 0000000130 2e 32 32 38 2e 32 31 39 2e 34 34 3a 33 34 37 38 .228.219.44:3478 0000000140 22 2c 22 73 74 75 6e 3a 34 36 2e 31 33 37 2e 34 „,“stun:46.137.4 0000000150 35 2e 31 34 33 3a 33 34 37 38 22 5d 7d 2c 7b 22 5.143:3478″]},{“ 0000000160 75 72 6c 73 22 3a 5b 22 74 75 72 6e 3a 35 34 2e urls“:[„turn:54. 0000000170 32 32 38 2e 32 31 39 2e 34 34 3a 33 34 37 38 22 228.219.44:3478″ 0000000180 2c 22 74 75 72 6e 3a 36 33 2e 33 35 2e 31 31 39 ,“turn:63.35.119 0000000190 2e 32 31 31 3a 33 34 37 38 22 2c 22 74 75 72 6e .211:3478″,“turn 00000001a0 3a 74 75 72 6e 36 2e 65 75 77 31 2e 76 6e 2e 63 :turn6.euw1.vn.c 00000001b0 6c 6f 75 64 2e 74 65 73 6c 61 2e 63 6f 6d 3a 33 loud.tesla.com:3 00000001c0 34 37 38 22 5d 2c 22 75 73 65 72 6e 61 6d 65 22 478″],“username“ 00000001d0 3a 22 31 36 39 32 32 39 37 36 39 39 3a 46 51 59 :“1692297699:FQY 00000001e0 46 33 33 56 34 4c 4f 44 32 56 55 35 58 47 35 58 F33V4LOD2VU5XG5X 00000001f0 42 43 41 33 37 58 58 47 53 59 49 41 55 22 2c 22 BCA37XXGSYIAU“,“ 0000000200 63 72 65 64 65 6e 74 69 61 6c 22 3a 22 43 4b 47 credential“:“CKG 0000000210 31 49 36 56 74 4f 4d 69 30 34 54 68 63 53 44 6a 1I6VtOMi04ThcSDj 0000000220 32 38 38 75 61 53 48 67 3d 22 7d 5d 7d 5a 00 288uaSHg=“}]}Z. 2023-08-17 17:41:39.634 [ $07a64fa6-6b59-444a-867c-8f882ac3e725\x12\x08internal\x1a\x002$42f2853f-a61c-465d-9a82-301dbacab4c68\x9a\x11
[6] akamai-apigateway-charging: Hier werden nun offenbar Ladesäuleninformationen abgerufen. Ich sehe keine Anhaltspunkte, dass Tesla hier eine ID oder meinen Login mitsendet, so dass die Suche nach Ladesäulen selbst anonym sein könnte. Allerdings ist der genaue Standort dabei, anstatt nur Quadrate abzufragen wie in anderen Apps. Wenn man unterwegs ist, ist das aber natürlich auch sehr unproblematisch.
POST https://akamai-apigateway-charging-ownership.tesla.com/graphql?deviceLanguage=de&deviceCountry=DE&ttpLocale=de_DE&operationName=GetNearbyChargingSites HTTP/1.1 accept: */* x-tesla-user-agent: TeslaApp/4.23.6-1844/074a3374b7/android/30 charset: utf-8 cache-control: no-cache accept-language: de authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Im5ZdVZJWTJTN3gxVHRYM01KMC1QMDJad3pXQSJ9.eyJpc3MiOiJodHRwczovL2F1dGgudGVzbGEuY29tL29hdXRoMi92MyIsImF1ZCI6WyJodHRwczovL293bmVyLWFwaS50ZXNsYW1vdG9ycy5jb20vIiwiaHR0cHM6Ly9hdXRoLnRlc2xhLmNvbS9vYXV0aDIvdjMvdXNlcmluZm8iXSwiYXpwIjoib3duZXJhcGkiLCJzdWIiOiJlODc2YWY3Ny1lODQzLTQ1Y2MtYjI1Mi1mMGE1MGM2MjhkYzciLCJzY3AiOlsib3BlbmlkIiwiZW1haWwiLCJvZmZsaW5lX2FjY2VzcyIsInBob25lIl0sImFtciI6WyJwd2QiXSwiZXhwIjoxNjkyMzIwMjAwLCJpYXQiOjE2OTIyOTE0MDAsIm91X2NvZGUiOiJOQSIsImxvY2FsZSI6ImVuLVVTIiwiYXV0aF90aW1lIjoxNjkyMjkxMzk0fQ.pGpuBt_Z3kElhyglUiXrX9TJc-tl7fYMQIOKoi5yAULchaLSL8V9eaiPfL3dIJtNXx5FhK8LabZ5abgclCnhmXw9TnD91aLnHiEVkPxoSaxZ6ybwpbsxtlTw79iGLDR3eabrIeTjF4Ax2Ollh5mUvaLpGtg8a1BusoNMSYWyQYCmgZTAwfpyShZhB2FHAQxx6Z3SeWU6PDC_BYqWFLM9ZI_r2qTvphu3izJkASsNHLWCLXvsTW19dCy5fRYGG5gZtLjqCx6vc1Lz7LvzVZ-_YAeDhj4MY0Wqn5agaSRwp0FQWTZdBsQ-bzHGKAEqvIUL95DHZQJfv_7CilHKpAD3tA x-txid: 7558b687-111b-4c1d-90fe-54fa8d96330e x-request-id: 7558b687-111b-4c1d-90fe-54fa8d96330e Content-Type: application/json Content-Length: 1311 Host: akamai-apigateway-charging-ownership.tesla.com Connection: Keep-Alive Accept-Encoding: gzip Cookie: ak_bmsc=697C40406D2529584E4E135E08868911~000000000000000000000000000000~YAAQrcXdWP1y1/KJAQAA0NptBBT7eI1TdvtQGLxggX1NuIQaX55EjeIitMgm9MYpKOjVMkNFXFw2t1JhJfCi5PKGfEHUs/CNMQDUvR0IdTeIkGNPwLogS1v/C6Fhl85I/B8516bgLhruadvSxmgYDLcE4+HeO1kr5ev2L9GTpqFw8dBYf8usIcZF0sKW1mJL/hzNUcjDzkNxE+PuLtuR50gYoju4omNFAgBLLNTtzSViF9m9p5AChw49LUdns/9GeA3GCtS8XXWppHPKAbraLeDXFhFZOEaJTCeXZPfekTAfE5DA7VVlVX6New7H1irYPzTdJevbjhJQTwGwbpCmRPxkLVg7zWNMtaGYlRvCbIq2IC9H84w8mqbgLSIQ9yfay1CrAHOqWCQIsfh/1ogBddrgqbxuBVrhGlhDZ9NFfcej User-Agent: okhttp/5.0.0-SNAPSHOT GraphQL { „query“: „…“, „variables“: { „args“: { „userLocation“: { „latitude“: 48.06****** „longitude“: 11.49****** }, „northwestCorner“: { „latitude“: 48.94227613234345, „longitude“: 10.410025343298912 }, „southeastCorner“: { „latitude“: 47.18289058618875, „longitude“: 12.588988579809666 }, „languageCode“: „de“, „countryCode“: „DE“ } }, „operationName“: „GetNearbyChargingSites“ } — query GetNearbyChargingSites($args: GetNearbyChargingSitesRequestType!) { charging { nearbySites(args: $args) { sitesAndDistances { …ChargingNearbySitesFragment } } } } fragment ChargingNearbySitesFragment on ChargerSiteAndDistanceType { activeOutages { message nonTeslasAffectedOnly { value } } availableStalls { value } centroid { …EnergySvcCoordinateTypeFields } drivingDistanceMiles { value } entryPoint { …EnergySvcCoordinateTypeFields } haversineDistanceMiles { value } id { text } localizedSiteName { value } maxPowerKw { value } trtId { value } totalStalls { value } siteType accessType waitEstimateBucket hasHighCongestion } fragment EnergySvcCoordinateTypeFields on EnergySvcCoordinateType { latitude longitude }
[7] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap/api HTTP/1.1 Content-Length: 1386 X-Google-Maps-Mobile-API: com.teslamotors.tesla,1844,2.34.1,6.18.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\xea9\xe1’y9\x84\xd4\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x062.34.1\x00\x03Web>\x00\x00\x01\x14 \x041071 \x01*\x15com.teslamotors.tesla2\x02DE\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGFUcuM2gp2yyS47mnHge5iEZAiAnbUT0tdbNzlqjexBW14xk9C4eXyzhSMFBUnFM2Jb8J-fhaApG7Ofu5M8tdw7f-o8WzTp5CH_J86wG3lSQnI_5dyBoXIWKBc6ksUMQkDgjSp0eKtQZvD4B-seAr3Z9w0SZy0NPLg5N3bQjgaebyorjqE\xba\x02\x041844\xc2\x02\x066.18.0\xe8\x02\x00\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03\x07\x02\xd9]\xd0\x00\xafw\xf3\x02\xd9]\xd0\x00\xafw\xf3\x00\x08\x00&7(\x00!?\x93\x00\x01\x07\x02\xdc\x1b\xa6\x00\xb0\xcfV\x02\xdc\x1b\xa6\x00\xb0\xcfV\x00 \x00\x0c\xd09\x00\x0b/\xca\x00\x01\x07\x02\xdc\xb4\x92\x00\xb0G\x9e\x02\xdc\xb4\x92\x00\xb0G\x9e\x00 \x00 \xb21\x00\x08x\xb7\x00\x01l\x00\x00\x03\xb8 J\x08\x80\x02\x10\x00\x10\x0c\x10 \x18\x04\x18\x06 \x01(\x015\x00\x00@@b\x04\x08\xce\xc5Sb\x04\x08\xd1\xc5Sb\x04\x08\xca\xf6Sb\x04\x08\xa9\xa5Tb\x05\x08\xe9\x8e\xb4\x16b\x05\x08\x9d\xff\xb7\x16b\x05\x08\xeb\x88\xb8\x16b\x05\x08\x8f\xaa\xb8\x16J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x85\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x90\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x86\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x93\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x84\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x91\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x87\xb0t\x80\x02\x00J\x1d\x08 \x10\x00\x18\x00 \x008\x00@\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\xf0\x01\x92\xb0t\x80\x02\x00R\xf1\x042\xdd\x04\x08\x1a\x12\xd8\x04 \x06styles\x12\xcd\x04s.e:g|p.c:#ff212121,s.e:l.i|p.v:on,s.e:l.t.f|p.c:#ff757575,s.e:l.t.s|p.c:#ff212121,s.t:1|s.e:g|p.c:#ff757575,s.t:17|s.e:l.t.f|p.c:#ff9e9e9e,s.t:21|p.v:off,s.t:19|p.v:on,s.t:19|s.e:l.t.f|p.c:#ffbdbdbd,s.t:2|p.v:off,s.t:2|s.e:l.t.f|p.c:#ff757575,s.t:40|s.e:g|p.c:#ff181818,s.t:40|s.e:l.t.f|p.c:#ff616161,s.t:40|s.e:l.t.s|p.c:#ff1b1b1b,s.t:3|s.e:g.f|p.c:#ff2c2c2c,s.t:3|s.e:l.t.f|p.c:#ff8a8a8a,s.t:50|s.e:g|p.c:#ff373737,s.t:49|s.e:g|p.c:#ff3c3c3c,s.t:785|s.e:g|p.c:#ff4e4e4e,s.t:51|s.e:l.t.f|p.c:#ff616161,s.t:4|s.e:l.t.f|p.c:#ff757575,s.t:6|s.e:g|p.c:#ff000000,s.t:6|s.e:l.t.f|p.c:#ff3d3d3d2\x0f\x08%\x12\x0b smartmaps
[8] static-assets-pay.tesla.com ist der Endpunkt, der offenbar für Bezahlvorgänge verwendet wird. Auch hier nichts Aufseheneregendes.
GET https://static-assets-pay.tesla.com/api/wallets/6f5455e8-556c-4d93-a0c0-bf32aeffb330?countryCode=US¤cyCode=USD&exactMatch=false&mobileAppVersion=4.23.6-1844&paymentChannel=SUPERCHARGE HTTP/2.0 content-type: application/json;charset=UTF-8 accept-encoding: gzip cookie: ak_bmsc=697C40406D2529584E4E135E08868911~000000000000000000000000000000~YAAQrcXdWP1y1/KJAQAA0NptBBT7eI1TdvtQGLxggX1NuIQaX55EjeIitMgm9MYpKOjVMkNFXFw2t1JhJfCi5PKGfEHUs/CNMQDUvR0IdTeIkGNPwLogS1v/C6Fhl85I/B8516bgLhruadvSxmgYDLcE4+HeO1kr5ev2L9GTpqFw8dBYf8usIcZF0sKW1mJL/hzNUcjDzkNxE+PuLtuR50gYoju4omNFAgBLLNTtzSViF9m9p5AChw49LUdns/9GeA3GCtS8XXWppHPKAbraLeDXFhFZOEaJTCeXZPfekTAfE5DA7VVlVX6New7H1irYPzTdJevbjhJQTwGwbpCmRPxkLVg7zWNMtaGYlRvCbIq2IC9H84w8mqbgLSIQ9yfay1CrAHOqWCQIsfh/1ogBddrgqbxuBVrhGlhDZ9NFfcej user-agent: okhttp/5.0.0-SNAPSHOT Query countryCode: US currencyCode: USD exactMatch: false mobileAppVersion: 4.23.6-1844 paymentChannel: SUPERCHARGE
[9] uicrashtracer.tesla.com: Hier haben wir die App wohl überlastet und so wird sichtbar, dass Tesla auch eine eigene Analysesoftware für einen App-Crash betreibt. Die Daten sind sehr technisch, aber es ist durchaus eine User-ID mit dabei sowie einige Gerätedetails, darunter auch die Batterietemperatur. Würde zwar gerne vorher gefragt werden, wenn soetwas abgefragt wird, aber zumindest ist hier kein Missbrauchspotential gegeben.
POST https://uicrashtracer.tesla.com/api/8/envelope/ HTTP/1.1 User-Agent: sentry.java.android/6.16.0 X-Sentry-Auth: Sentry sentry_version=7,sentry_client=sentry.java.android/6.16.0,sentry_key=b137b6b4d8c047ba9e429ac9fb9ddf32 Content-Encoding: gzip Content-Type: application/x-sentry-envelope Accept: application/json Connection: close Host: uicrashtracer.tesla.com Accept-Encoding: gzip Content-Length: 2189 [decoded gzip] Raw {„event_id“:“753c9ebb6eaa4e3bae7e3bc73e364dc5″,“sdk“:{„name“:“sentry.java.android“,“version“:“6.16.0″,“packages“:[{„name“:“maven:io.sentry:sentry“,“version“:“6.16.0″},{„name“:“maven:io.sentry:sentry-android-core“,“version“:“6.16.0″},{„name“:“maven:io.sentry:sentry-android-ndk“,“version“:“6.16.0″}],“integrations“:[„ShutdownHook“,“Ndk“,“Anr“,“AppComponentsBreadcrumbs“,“SystemEventsBreadcrumbs“,“AppLifecycle“]}} {„content_type“:“application/json“,“type“:“event“,“length“:6044} {„timestamp“:“2023-08-17T17:48:06.208Z“,“exception“:{„values“:[{„type“:“Error“,“value“:“Given action \\“SET_NONTESLA_MAP_REGION\\“, reducer \\“nonteslaMapRegion\\“ returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.“,“stacktrace“:{„frames“:[{„filename“:“app:///index.android.bundle“,“function“:“callFunctionReturnFlushedQueue“,“lineno“:1,“colno“:422052,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“__guard“,“lineno“:1,“colno“:423057,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“anonymous“,“lineno“:1,“colno“:422096,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“__callFunction“,“lineno“:1,“colno“:423765,“in_app“:true},{„filename“:“native“,“function“:“apply“,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“callTimers“,“lineno“:1,“colno“:523986,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“_callTimer“,“lineno“:1,“colno“:522165,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“anonymous“,“lineno“:1,“colno“:522898,“in_app“:true},{„filename“:“native“,“function“:“apply“,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“timerExpired“,“lineno“:1,“colno“:1198960,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“trailingEdge“,“lineno“:1,“colno“:1199011,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“invokeFunc“,“lineno“:1,“colno“:1198686,“in_app“:true},{„filename“:“native“,“function“:“apply“,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“anonymous“,“lineno“:1,“colno“:5223607,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“anonymous“,“lineno“:1,“colno“:5028483,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“dispatch“,“lineno“:1,“colno“:5222288,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“combination“,“lineno“:1,“colno“:5223411,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“combination“,“lineno“:1,“colno“:5223411,“in_app“:true},{„filename“:“app:///index.android.bundle“,“function“:“combination“,“lineno“:1,“colno“:5223534,“in_app“:true}]},“mechanism“:{„type“:“onerror“,“handled“:false}}]},“level“:“fatal“,“fingerprint“:[],“modules“:{},“event_id“:“753c9ebb6eaa4e3bae7e3bc73e364dc5″,“contexts“:{„app“:{„app_identifier“:“com.teslamotors.tesla“,“app_start_time“:“2023-08-17T17:45:50.251Z“,“app_name“:“Tesla“,“app_version“:“4.23.6-1844″,“app_build“:“1844″,“permissions“:{„WRITE_SETTINGS“:“not_granted“,“AD_ID“:“granted“,“ACTIVITY_RECOGNITION“:“granted“,“READ_MEDIA_IMAGES“:“not_granted“,“RECORD_AUDIO“:“not_granted“,“NFC“:“granted“,“FOREGROUND_SERVICE“:“granted“,“ACCESS_FINE_LOCATION“:“not_granted“,“RECEIVE“:“granted“,“READ_CALENDAR“:“not_granted“,“DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION“:“granted“,“ACCESS_NETWORK_STATE“:“granted“,“CHANGE_WIFI_STATE“:“granted“,“WAKE_LOCK“:“granted“,“BLUETOOTH_CONNECT“:“not_granted“,“WRITE_EXTERNAL_STORAGE“:“not_granted“,“INTERNET“:“granted“,“READ_EXTERNAL_STORAGE“:“not_granted“,“RECEIVE_BOOT_COMPLETED“:“granted“,“CAMERA“:“not_granted“,“BIND_GET_INSTALL_REFERRER_SERVICE“:“granted“,“BLUETOOTH_ADMIN“:“granted“,“ACCESS_COARSE_LOCATION“:“granted“,“READ_GSERVICES“:“granted“,“READ_MEDIA_VIDEO“:“not_granted“,“READ_CONTACTS“:“not_granted“,“CHANGE_NETWORK_STATE“:“granted“,“BLUETOOTH“:“granted“,“BLUETOOTH_SCAN“:“not_granted“,“CHECK_LICENSE“:“granted“,“CHANGE_WIFI_MULTICAST_STATE“:“granted“,“VIBRATE“:“granted“,“WRITE_CALENDAR“:“not_granted“,“ACCESS_WIFI_STATE“:“granted“,“DOWNLOAD_WITHOUT_NOTIFICATION“:“granted“},“in_foreground“:true},“device“:{„manufacturer“:“samsung“,“brand“:“samsung“,“family“:“SM-G900F“,“model“:“SM-G900F“,“model_id“:“RQ3A.211001.001″,“archs“:[„armeabi-v7a“,“armeabi“],“battery_level“:82.0,“charging“:true,“online“:true,“orientation“:“portrait“,“simulator“:false,“memory_size“:1785765888,“free_memory“:337289216,“low_memory“:false,“storage_size“:12481081344,“free_storage“:4601192448,“screen_width_pixels“:1080,“screen_height_pixels“:1920,“screen_density“:3.0,“screen_dpi“:480,“boot_time“:“2023-08-11T20:18:35.266Z“,“timezone“:“Europe/Amsterdam“,“id“:“cfd758ee-e3b0-49c3-9578-c0a0dbe64f0e“,“language“:“de“,“connection_type“:“wifi“,“battery_temperature“:42.8,“locale“:“de_DE“},“os“:{„name“:“Android“,“version“:“11″,“build“:“lineage_klte-userdebug 11 RQ3A.211001.001 92502ee78e“,“kernel_version“:“3.4.113-lineageos-g76f2c76e68d“,“rooted“:false},“react_native_context“:{„turbo_module“:false,“fabric“:false,“js_engine“:“hermes“}},“sdk“:{„name“:“sentry.javascript.react-native“,“version“:“5.3.0″,“packages“:[{„name“:“npm:@sentry/react-native“,“version“:“5.3.0″}],“integrations“:[„ModulesLoader“,“ReactNativeErrorHandlers“,“Release“,“InboundFilters“,“FunctionToString“,“Breadcrumbs“,“LinkedErrors“,“Dedupe“,“HttpContext“,“EventOrigin“,“SdkInfo“,“ReactNativeInfo“,“RewriteFrames“,“DeviceContext“,“ReactNativeTracing“]},“request“:{„headers“:{}},“tags“:{„event.origin“:“javascript“,“githash“:“074a3374b7″,“installerStore“:“com.android.vending“,“event.environment“:“javascript“,“isSideLoaded“:“false“,“hermes“:“true“},“release“:“com.teslamotors.tesla@4.23.6-1844″,“environment“:“tesla“,“platform“:“javascript“,“user“:{„id“:“d61b3cf2-4aac-42ba-bf4a-44339ae92b3b“},“dist“:“1844″,“breadcrumbs“:[{„timestamp“:“2023-08-17T17:48:06.765Z“,“message“:“Error: Given action \\“SET_NONTESLA_MAP_REGION\\“, reducer \\“nonteslaMapRegion\\“ returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined., js engine: hermes“,“data“:{„logger“:“console“,“arguments“:[„Error: Given action \\“SET_NONTESLA_MAP_REGION\\“, reducer \\“nonteslaMapRegion\\“ returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined., js engine: hermes“]},“category“:“console“,“level“:“error“}]}
Fazit: Die Tesla-App setzt sehr viel eigene Software ein, die bei Amazon und Akamai gehostet ist. Eine sehr einfach Klickanalyse überwacht die Appnutzung profilbezogen. Eine eigene App-Crashüberwachung wird mit dem Standard von Google Firebase kombiniert. Die beim App-Crash gesendeten Daten sind umfangreich, aber durchaus in ihrem Zweck nachvollziehbar und nicht wirklich sensibel. Das ändert nichts daran, dass der Einsatz der Analysesoftware und der Crashtest-Software sowohl von Tesla als auch von Firebase eine Einwilligung benötigt, weil es über eine rein für den Betrieb unbedingt notwendige Maßnahme hinausgeht. Auch Google Maps ist für viele Datenschutzfans sicher nicht die ganz optimale Wahl. Wer aber ohnehin ein normales Android-Handy mit Google benutzt, muss sich mit dieser App keine besonderen Sorgen über seine Verhaltensdaten machen. Nicht unerwähnt bleiben sollte aber, dass die Website von Tesla auch Werbetracking von Google Doubleclick und Twitter einsetzt. Man sollte sich also nicht wundern, wenn nach einer Registrierung in der Tesla-App auch bei Twitter oder auf anderen Seiten Werbung von Tesla auftauchen. Wer das verhindern will, nutzt die Registrierung und andere Funktionen der Website nur in einem Browser mit Werbeblocker.
Vattenfall InCharge
Vattenfall ist ein Energieanbieter, der vor allem in Hamburg viele Ladesäulen betreibt. Mit dem Angebot InCharge kann darüber hinaus aber auch an 100.000 Partner-Ladepunkten geladen werden. Man kann auch ohne App nur mit einer Ladekarte laden. Einen Festpreis gibt es aber nur an den Vattenfall-Ladesäulen, so dass die App in den meisten Fällen benötigt wird.
Die Verbindungen:
[1] Google Firebase meldet die Installation und registriert die App für Absturzberichte bei Crashlytics. Außerdem ist das sehr umfangreiche Firebase Analytics aktiv und sendet zahlreiche Gerätedaten.
POST https://firebaseinstallations.googleapis.com/v1/projects/nuon-20e06/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: nl.nuon.laadpunten x-firebase-client: H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA X-Android-Cert: 92A2848220B6E6481A4025846743B12E5C51A8F5 x-goog-api-key: AIzaSyBjBxuSI1NYUXAZGU_bH8Aj4iQoauAo6Jg User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:407466222751:android:b0ff148ab7223d3d“, „authVersion“: „FIS_v2“, „fid“: „fnoLb-S5T8mxig1Mym175E“, „sdkVersion“: „a:17.1.3“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:407466222751:android:b0ff148ab7223d3d/settings?instance=8e51b9b43d04f62ea1749099766800ad28417218&build_version=40505106&display_version=4.5.17&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: 20fbae84b2f142e5bab3e3c5d09858e7 X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 18.3.7 User-Agent: Crashlytics Android SDK/18.3.7 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:407466222751:android:b0ff148ab7223d3d X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 8e51b9b43d04f62ea1749099766800ad28417218 build_version: 40505106 display_version: 4.5.17 source: 4 POST https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog HTTP/1.1 User-Agent: datatransport/3.1.9 android/ Content-Encoding: gzip Content-Type: application/json Accept-Encoding: gzip X-Goog-Api-Key: AIzaSyCckkiH8i2ZARwOs1LEzFKld15aOG8ozKo Host: firebaselogging-pa.googleapis.com Connection: Keep-Alive Content-Length: 1625 [decoded gzip] JSON { „logRequest“: [ { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „40505106“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1692544937767, „eventUptimeMs“: 759825554, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „Cg4Ij+ymnKExEKHeqJyhMRoLCgkIgIAEEICAgAUiEm5sLm51b24ubGFhZHB1bnRlbg==“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „GDT_CLIENT_METRICS“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1692544937795, „requestUptimeMs“: 759825582 }, { „clientInfo“: { „androidClientInfo“: { „applicationBuild“: „40505106“, „country“: „DE“, „device“: „klte“, „fingerprint“: „samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys“, „hardware“: „qcom“, „locale“: „de“, „manufacturer“: „samsung“, „mccMnc“: „“, „model“: „SM-G900F“, „osBuild“: „RQ3A.211001.001“, „product“: „klte“, „sdkVersion“: 30 }, „clientType“: „ANDROID_FIREBASE“ }, „logEvent“: [ { „eventTimeMs“: 1692544907578, „eventUptimeMs“: 759795365, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAMSegoDX2FzIOGKsI/F64ADKKjuOToVCgZfYXN0dWkg4Yqwj8XrgAMo4KcuOhUKBl9hc3RmZCDYrd6PxeuAAyjT8wQ6FAoFX2FzdGkgwKbjj8XrgAMo9dIGSiIKIDk0Y2RjMWRlOWYyODQxNzNiZTZmYTljZTk0M2JhMjdj“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544907736, „eventUptimeMs“: 759795523, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAEalwEKS2h0dHBzOi8vYnVzaW5lc3NzcGVjaWZpY2FwaW1hbmdsb2JhbC5henVyZS1hcGkubmV0L2Vtb2JpbGl0eS9jaGFyZ2Vfc2Vzc2lvbhABIG8o9AMyEGFwcGxpY2F0aW9uL2pzb244wJTpj8XrgANQ2McNaiIKIDk0Y2RjMWRlOWYyODQxNzNiZTZmYTljZTk0M2JhMjdj“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544907762, „eventUptimeMs“: 759795549, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAEanQEKUGh0dHBzOi8vYnVzaW5lc3NzcGVjaWZpY2FwaW1hbmdsb2JhbC5henVyZS1hcGkubmV0L2Vtb2JpbGl0eS9hcGkvYWN0aXZlLXNlc3Npb25zEAEg6QEokQMyEGFwcGxpY2F0aW9uL2pzb244oPLpj8XrgANQktUNaiIKIDk0Y2RjMWRlOWYyODQxNzNiZTZmYTljZTk0M2JhMjdj“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544909696, „eventUptimeMs“: 759797483, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAMSbQoSX3N0X1NwbGFzaEFjdGl2aXR5INie44/F64ADKIrNiwEyCwoHX2ZyX3NsbxABMgsKB19mcl90b3QQATILCgdfZnJfZnpuEAFKIgogOTRjZGMxZGU5ZjI4NDE3M2JlNmZhOWNlOTQzYmEyN2M=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544910989, „eventUptimeMs“: 759798776, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAESYQoUX3N0X1Byb2dyZXNzQWN0aXZpdHkg+KLpkMXrgAMoq+lUMgsKB19mcl9zbG8QATILCgdfZnJfdG90EAFKIgogOTRjZGMxZGU5ZjI4NDE3M2JlNmZhOWNlOTQzYmEyN2M=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544916221, „eventUptimeMs“: 759804008, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAESZwoZX3N0X0FwcE9uYm9hcmRpbmdBY3Rpdml0eSDg8tGQxeuAAyjkqasDMgsKB19mcl9zbG8QJzILCgdfZnJfdG90EDZKIgogOTRjZGMxZGU5ZjI4NDE3M2JlNmZhOWNlOTQzYmEyN2M=“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544916539, „eventUptimeMs“: 759804326, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAEadAocaHR0cHM6Ly9pbi5hcHBjZW50ZXIubXMvbG9ncxADGOMDIIkBKMgBMhBhcHBsaWNhdGlvbi9qc29uOJiykpPF64ADQMeb9gFIuAFQ8ex8aiIKIDk0Y2RjMWRlOWYyODQxNzNiZTZmYTljZTk0M2JhMjdj“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544916942, „eventUptimeMs“: 759804729, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAEapwEKQ2h0dHBzOi8vYnVzaW5lc3NzcGVjaWZpY2FwaW1hbmdsb2JhbC5henVyZS1hcGkubmV0L2Vtb2JpbGl0eS9kZXZpY2UQAhinASjJATInYXBwbGljYXRpb24vdm5kLmVtb2JpbGl0eW1vYmlsZS52OStqc29uONi0o5TF64ADUNbmBWoiCiA5NGNkYzFkZTlmMjg0MTczYmU2ZmE5Y2U5NDNiYTI3Yw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544917656, „eventUptimeMs“: 759805443, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAESXwoSX3N0X1NwbGFzaEFjdGl2aXR5IOCw3pPF64ADKLe9djILCgdfZnJfc2xvEAEyCwoHX2ZyX3RvdBABSiIKIDk0Y2RjMWRlOWYyODQxNzNiZTZmYTljZTk0M2JhMjdj“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544921922, „eventUptimeMs“: 759809709, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAEadQocaHR0cHM6Ly9pbi5hcHBjZW50ZXIubXMvbG9ncxADGLUEIIABKMgBMhBhcHBsaWNhdGlvbi9qc29uOODK/JTF64ADQJbVoAJIjgFQ2LbbAWoiCiA5NGNkYzFkZTlmMjg0MTczYmU2ZmE5Y2U5NDNiYTI3Yw==“, „timezoneOffsetSeconds“: 7200 }, { „eventTimeMs“: 1692544926055, „eventUptimeMs“: 759813842, „networkConnectionInfo“: { „mobileSubtype“: „UNKNOWN_MOBILE_SUBTYPE“, „networkType“: „WIFI“ }, „sourceExtension“: „CmkKJzE6NDA3NDY2MjIyNzUxOmFuZHJvaWQ6YjBmZjE0OGFiNzIyM2QzZBIWZm5vTGItUzVUOG14aWcxTXltMTc1RRokChJubC5udW9uLmxhYWRwdW50ZW4SBjIwLjMuMxoGNC41LjE3KAEadAocaHR0cHM6Ly9pbi5hcHBjZW50ZXIubXMvbG9ncxADGN4EIIABKMgBMhBhcHBsaWNhdGlvbi9qc29uOMCX05bF64ADQL2bBEjxBFDB/YECaiIKIDk0Y2RjMWRlOWYyODQxNzNiZTZmYTljZTk0M2JhMjdj“, „timezoneOffsetSeconds“: 7200 } ], „logSourceName“: „FIREPERF“, „qosTier“: „DEFAULT“, „requestTimeMs“: 1692544937804, „requestUptimeMs“: 759825591 } ] }
[2] Microsoft Azure: Die App wird komplett auf dem SaaS-Dienst von Azure betrieben und fragt hier zum Beispiel die Ladestationen per API aus einer Datenbank ab.
POST https://businessspecificapimanglobal.azure-api.net/emobility/charging_station/cluster HTTP/1.1 Accept: application/vnd.emobilitymobile.v9+json Ocp-Apim-Subscription-Key: 12c7d772faa84b92a8f13a22d7bd8638 Device-Id: 44e145dd-6b85-4593-9e80-907ea238c929 X-Token: f49e15f4-40e4-4111-b314-458bd6aa97b9 Content-Type: application/json; charset=UTF-8 Content-Length: 354 Host: businessspecificapimanglobal.azure-api.net Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/4.11.0 JSON { „connectorTypes“: [ „TYPE_1“, „TYPE_2_MODE_3“, „CHADEMO“, „CCS“ ], „coordinates“: [ { „latitude“: 61.677093216848604, „longitude“: 2.885645516216755 }, { „latitude“: 46.721397821375824, „longitude“: 18.70595533400774 } ], „internalStationsOnly“: false, „power“: { „powerMax“: 2147483647, „powerMin“: 0 }, „remoteStartWith“: [], „statusesList“: [ „AVAILABLE“, „OCCUPIED“, „UNKNOWN“, „ERROR“ ] }
[3] Microsoft Appcenter ist ein weiterer Analysedienst, der zahlreiche Verhaltensdaten und Gerätedetails erhält. Hier beispielsweise, welcher Menüpunkt in der App aufgerufen wurde.
POST https://in.appcenter.ms/logs?api-version=1.0.0 HTTP/1.1 Install-ID: 1c9df2cd-b24c-4bd1-ac51-c8f186901249 App-Secret: 26dc6c75-0b96-41cd-9483-f7688b45a654 Content-Type: application/json Content-Length: 589 User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: in.appcenter.ms Connection: Keep-Alive Accept-Encoding: gzip JSON { „logs“: [ { „device“: { „appBuild“: „40505106“, „appNamespace“: „nl.nuon.laadpunten“, „appVersion“: „4.5.17“, „carrierCountry“: „de“, „locale“: „de_DE“, „model“: „SM-G900F“, „oemName“: „samsung“, „osApiLevel“: 30, „osBuild“: „RQ3A.211001.001“, „osName“: „Android“, „osVersion“: „11“, „screenSize“: „1080×1920“, „sdkName“: „appcenter.android“, „sdkVersion“: „5.0.0“, „timeZoneOffset“: 120 }, „id“: „70ec970f-abb4-4ed8-b95c-0c1f86200c12“, „name“: „Viewed_More“, „sid“: „e3101f54-cbf9-4c55-a416-e5083e9ea0ad“, „timestamp“: „2023-08-20T15:59:26.159Z“, „type“: „event“, „typedProperties“: [ { „name“: „deviceId“, „type“: „string“, „value“: „“ } ] } ] }
[4] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Length: 732 X-Google-Maps-Mobile-API: nl.nuon.laadpunten,40505106,3.1.0,9.0.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x170\x86\x17\xa2)\xbe\x969\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x053.1.0\x00\x03Web>\x00\x00\x01\xc3 \x041071 \x01*\x12nl.nuon.laadpunten2\x02DEB\xaf\x01511=A0qUhUSspl1ERJR83D05U-hJx5VMXGnvSh4Tlj83gBXLtQw7w1hnO8xwTc4z4-xtQlIakURVgyjKED8VkuV0E1rh6AIqdneMODXkpUOlYU4gp_-4-pwGVFnRF5TXc_tnQXK4zM-oK-wEHqHOWwI2uefBan7_l311GzQzZA_Ekdk\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGEkGWuHDOK5UKCV251FNbtF–2Hz5sSVLg0b96o5yhPlI4yV5fbQE5uuZ7luT-jTVVg0k0LIBx7KXYdNaJkXrkZGrC9SzdMbYmj7DePvcRy8Dm41MLbc7LZNRi5lSOsgQ7ZZYzjpbPcMFfpd0lTQnbcXGRDGLloabkV0YgMU2cd-9dbkeU\xba\x02\x0840505106\xc2\x02\x059.0.0\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03K\x00\x00\x00\xd3 \x0b\x08\x06\x11\x17\x02\xec \x00\x00\x00\x00 \x0b\x08\x0c\x11\xc3\x00\xfc\x03\x00\x00\x00\x00 \x0b\x08%\x11\xcc=\x18[\x00\x00\x00\x00 \x0b\x08-\x112\xe2j\xd7\x00\x00\x00\x00 \x0c\x08\x93\x01\x11F\xa9\xc3\x1f\x00\x00\x00\x00 \x0b\x08\x08\x11\xb7JW@\x00\x00\x00\x00 \x0b\x08\x10\x114 f\x00\x00\x00\x00\x12u\x08\x01\x10\x01\x18\x01″Y\x12\x1dandroid:samsung-klte-SM_G900F“\x03Web*\x02302\x12nl.nuon.laadpuntenM\x00\x00@@X\x00b\x0840505106j\x053.1.0x\x01\xb0\x01\x01B\x12 \x108d46689afba0e47b
Fazit: Die App von Vattenfall enthält zwei sehr umfangreiche Analysetools, die jede Aktivität in der App mit einer pseudonymen ID aufzeichnen. Das entspricht nicht den gesetzlichen Vorgaben und dürfte für viele Menschen störend sein. Ich würde die App daher nicht benutzen. Immerhin kann man seine Ladekarte auch ohne App bestellen, so dass man die Analyse umgehen kann. Die Ladestationen aus dem Netzwerk findet man dann am besten mit EV Map.
Virta
Virta ist eine finnische Ladeplattform und bietet über Partner insgesamt 400.000 Ladepunkte an. Die Roaming-Preise, die man jeweils direkt auf der Karte in der App abfragen muss, fand ich auf den ersten Blicke etwas hoch, einmal sogar über 1€ pro kwh, das kommt dann schon umgerechnet auf die Kilometerleistung an einen Spritpreis von 4,50€ ran. Vielleicht auch nur ein Ausreißer. Aber wir wollen ja hier vor allem die Datenschutzperspektive beleuchten.
Das waren die Verbindungen:
[1] Google Firebase meldet die Installation und registriert die App für Absturzberichte bei Crashlytics.
POST https://firebaseinstallations.googleapis.com/v1/projects/virta-android-app/installations HTTP/1.1 Content-Type: application/json Accept: application/json Content-Encoding: gzip Cache-Control: no-cache X-Android-Package: fi.virta x-firebase-client: fire-core/20.2.0 kotlin/1.7.10 android-min-sdk/24 fire-core-ktx/20.2.0 device-brand/samsung fire-cls/17.3.1 fire-iid/21.0.1 android-installer/com.android.vending fire-android/30 device-name/klte device-model/klte fire-fcm/20.1.7_1p android-platform/ fire-installations/16.3.5 fire-analytics/18.0.2 android-target-sdk/33 x-firebase-client-log-type: 2 X-Android-Cert: 51E1CAB4C62E327C08360B5E24D4805DF00C8F19 x-goog-api-key: AIzaSyDJiBlZPOfCJFMeF-MSQ-nlfj7F9AUZZJo User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: firebaseinstallations.googleapis.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 134 [decoded gzip] JSON { „appId“: „1:783737908022:android:96d7f670a76950c6“, „authVersion“: „FIS_v2“, „fid“: „dRcYr-0xRvCPGojRVTw7dO“, „sdkVersion“: „a:16.3.5“ } GET https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/1:783737908022:android:96d7f670a76950c6/settings?instance=56220e8b0c02c1cb2162f9782df23260cd635e24&build_version=31706&display_version=2.6.11.6&source=4 HTTP/1.1 X-CRASHLYTICS-DEVELOPER-TOKEN: 470fa2b4ae81cd56ecbcda9735803434cec591fa X-CRASHLYTICS-DEVICE-MODEL: samsung/SM-G900F X-CRASHLYTICS-INSTALLATION-ID: c33eb6eb45a54f0a966ed6164a62edfa X-CRASHLYTICS-OS-DISPLAY-VERSION: 11 Accept: application/json X-CRASHLYTICS-API-CLIENT-VERSION: 17.3.1 User-Agent: Crashlytics Android SDK/17.3.1 X-CRASHLYTICS-API-CLIENT-TYPE: android X-CRASHLYTICS-GOOGLE-APP-ID: 1:783737908022:android:96d7f670a76950c6 X-CRASHLYTICS-OS-BUILD-VERSION: 92502ee78e Host: firebase-settings.crashlytics.com Connection: Keep-Alive Accept-Encoding: gzip Query instance: 56220e8b0c02c1cb2162f9782df23260cd635e24 build_version: 31706 display_version: 2.6.11.6 source: 4
[2] Virta Server: Per API werden alle benötigten Details wie die Ladesäulen geladen. Bei manchen Requests, die sich vermutlich auf das Benutzerprofil beziehen, ist eine Installations-ID dabei. Gut finde ich, dass bei den Georequests nach Ladesäulen keine ID mitgesendet wurde.
GET https://api.virta.fi/v4/me/charges/latest?deviceId=bc7b39b7f0-43d667630e-b303be5ce3 HTTP/2.0 brand: virta accept-encoding: gzip user-agent: okhttp/4.9.2 Query deviceId: bc7b39b7f0-43d667630e-b303be5ce3 POST https://ai.virta-ev.com/api/v1/map/blocks HTTP/2.0 brand: virta content-type: application/json; charset=UTF-8 content-length: 9710 accept-encoding: gzip user-agent: okhttp/4.9.2 JSON { „BlockHashesArrayAsJsonGzip“: „H4sIAAAAAAAAANV5t47EWrDcv7yUAuhdSM+hd0MnCQK9d0PPr9cq0aVS3eBJwIZbYJvq6uoz//U/\nCGKT9gpp4OAReDAxk9tV9lFjoo+p69q91noCu+QlniLz33YIQvP/8R//5T/sfDiHBRSsCyeiXk4+\nAW4x+MfENKJiwU+/JX45+l8OAqN/QOLgQrthynu5fJPFOEslk6xEPFed1EKttV224aqZitTfC7Tk\n1k532x3vyJN3tou1Gvlb2VYB4nZNN0KfoW8qZ5GrCf+A0O1qNNGMVdzPuSCrPZexhelD3Z+DN+mE\nUiIRWOIculj7H1Bt/aw7A+/lmQhtJuy1EXv2O6GBIDDofp6rSH2xro0vH/oHFEllap+dpYDP70t6\nRqiwhgmX2U/w9HlAtJ/YQQjDlUeE/QOC8B5QaXergKX67FiOcWm/YPTKFdvkSwYf0oDpimIZTq+S\no6LbCIl/oR6+zqFQ9Vovi3yNyHcABjrZ/kSJJq6vYbWv8ABtA/DJ0akgJ/kSknyk7B+8nqc7sIfg\nU0gJ4HCgE36lV/Vmvwh/xdqYtcTrcZA5Bi33vIw2xc1tsFFNx0NcWz5bif4PiKQy2TwbZ4N4pyoE\n8AS9mgwS4qd12YhTu7O0zfSgHjKu/4BM5IL8pLtPmpzmHUu5+GfLX2EUU4ug42sNe6VMtZQR5u71\npc3znfIkoO4z/2rT7YZysD+XY5y7T2kUC2N8pRJgeKiv8Ig0wxo74erCkdWBx9j8EuLYkL6JSy8M\nQPpMkMSWDArK+Q9Iph58gU07E0nXuZO1sPIzTjkjciqLYeSMHUnOuG5w3F40yon8lAgp/0y/sSOW\nrw675SPaN5O42+F+MVc2+71NIf5L/QMaatB7rtlIwNylWlN2L48auQ2T5D5DMEKTOOMbyLASYi8a\n+RuL9OgGSyfRu1KoCanx6RGdrR8HunIIK5ah4Xy5Sa0XqNybaPe1RzmWeb5ZkGY/Bv/hS5EJKDju\n8GEcvaeE91t7gX5mmpGP27BCEed45U6X2MlQXRy+22usHfdpqeqjcH3GF43oe6v4cbIHQ1fuJmfp\nIYSoGT6tDnsyVXdsvVZ9ul2L8AUCChVtFcFdEzsd2keQqdiOY6kvfvo9Sfy3RWCh5rIgHV40uh8L\nE7ztdzM0X+EffjfGuKVVaj25XHJLWvRC7HtkKMZ//gFhkRTm9EZ07U5MPFYRXui1LGIauIAv/F+W\nCUt5mtqMYPYPSNo10isOu6ypeUs+FKC6glH/qQ9EWlVQLJfXqX+lMUnslRN1HwS2+Dihc26zIWEy\nue73cauPRKHL4rPGE+Ugn5TYZ/oHhPPgBw7dgWzkcTuCq7bxFpEu06N+4mgEaN/RPPRbg4V85eSy\nOIcqjL7bGU189/gmg09c4iP5SDDQa7eJSdeMVykLvZqLJ9mTHwIxjlGGo4EiGljYuliyZtdIy4Kp\nOuHPqpTqT0RfQ+gyUmxhUtADXF4iCCDXJ4Z4TYeVGlRsF7i3RqlKvHW8queweBQMM1K1X4dBBfZM\n7mP+OcMkMM/wgErbJmRDMYLev3ICf9pC5QF7GA2NJWN+M+bPwB0Ogj+zx4n9ij3PKh3sLb/GnatP\nfEs8NTKviBro27dwBqhyktlauLoL3cq/yV5jN1e9hKVhRQTONA3rNx1EKAFNR79DRwtkMt+lrSWW\nFk6Fyg97vMa9/Cph46YGS7dJi3+EC+Voxn9ySvEhlvvr4SE03Ll8rPdSqxOE/4W8EKE5mBNN7sKc\n70gHDm9UvG5Tl5kFYXx3NRJfLPeYSbhYDiWpqq89hoDSpvui27oBnoBHvZQW8Zfao1EqXjSS2r7F\n9nyC2k8yWPKiYmofMSRkXD0fEEP37TJ5QldasV+gWh6ZPR/P5JTXmfntywQB5TLisKmfi887j28J\nCTWjm/fKqWV399CkobBI6zb1Zi5wMFu5T3N0DRo/Dp4GuIPOMZ6++hTuXWheW+AN0gG1QdKEZ8TB\nxGTKwSw1tVeWdqUusGYu2b8E9UX0g5bJ7HtKt4Llz5kEmShmYUCCMPOLOtR39K0w8+z7KoQleeVD\nViiM+RtiQeUOjrCPoXi4MdHF6ia4PTwXTo8qf19qxLrfoohkjHQEGYk9a2XNrwKUOoebji+JmYlH\n3YG1zvLSiMQNeJ++lQDdxJ+kZlEEreUaImW9LlU4sPJxy8R+UA/92u609ze56ETh7p2dab33HgSf\n0cF7mLvV6I3lgSyIVe8Qwouwv7T4U3IBJI/W/PZmrpvJD46oDyl9Y6XbWGGSv9WXoVzzNe7yj7wS\ngeRkwc4LEFETgiot/6qyA96TQ3pQoEj83+L15Wt9Yp+mMepRL/CY1iQ3pHgxykvwW2XWVYsQbh5T\n+NczFpFe4S3psklKvYTK7EY3d03el0DzEFshhp3pVkexh835U8CvV3jK4lWjW8d9DgCfGzippV9s\naUt7q+UmRkjkNBeHedV34qV7ags8mPq/rM61waA4+MPOY/5F5x1ITEQySIS7SrERl2/zkTRx0Ati\nJq0fVuPOBEWGSFfRYMfo+yc7fx0+ZJw/7Y5+0YiDTpwGLLNaklPDv1PSnPAUw+6H0kxk2AnexbZv\nDzdlU71MYk0Jf8JQ9p7PYICg9WcS/+1oAVVteWlq7QeugSnxkRK/uPeloka1BmhT/aJILS6Yrdjr\nkh3wRX7KJwx0chRDMhVFXjnt9DjxA7F2PU9RCPN1DmfyNwD6tKZfcaiZsPZ1il9Up17jnk7gx2h9\nOqxuLW+4AyGpYLCTkkpqjg4ZVW5B3dirSHBf417F/cP0V1esEHsAoAzY6jJwqdJMOdhuuji09bYp\nIDxAr+oBxGdBEOU2XES5hNYHfW8i/EymeaCM4X7uNcE624+hT695mrrPYxzfyM2kFMbYifJyujht\nI+QkHCT7yLFwc/paqHW8wutoDWh0OwMAUZ8fkT3k5saLv78yRyj0HAyZ/e2pyrmA/S/VaEUx3dHS\n3MhU6x5+2plBTRiIY2BJckoc2nRIx9kffzb1tQltrDBwj92lbfGBp8tuTBZrj+fWTQDKrOR2k5LB\nmtwsGPuX4S07nxiGgUBe0FtaqgBMNAEISdTWjI/lpqrFKApJF9v3G0SSk4xheLq0JNNoY9VSyf1H\ndK8kQKj/mZnThXkvoA366pNCVwB+zIbDiDMD+w5CZ7EwbXE4aFa3WyT9G4Edbv1Sfm3Cj416MPnY\nRBJnYCzRzWNv8KAQ0eY/k3zp6xk89YpTv+4FYh8SX6Nc+F3lpdypxyWtRAJCvX4Uyt1I/O+OGDYb\nSvHu5cvZSsEQzSG+rK2K1npgubbmTA7Bf0dyyuGKnH9+VwGV1Fv3wj0XQIAhcOe+yYHVgxqr/0zS\npkD03qRG+mECVaqkuLFehThy7dMBeFsETqRuezVBw0ftMrwLJ+vvKq+aU74NCz7G34t738lqosqz\nVTjZaKM0D/fvVDezo2QgSksWpwb83dU7KXG+/5IR48UNBS3dfqNt0Hm6R2P+xrgGszC7od5dq1N1\nS3C/tPcZLlty2gjWDmcCRjW5IxHLGWUhmPRhAECumSDG5X4CwlDetwZOuuopeWs59hSd0bxqUE7T\nZzmfKOFKz+pFVkAFYw/5b4dwRrVQhzMicS8xImWThT88qV+zfUxgG7LVQcO8B/I65L2a6/zpYWUl\nMPxw1/1UWWTt/GkgAabs7BzalK5jSWbQ8Y1E/zI8FbHHo72E4i6Tez7W1oKhDnlo9s+3xd8RXkHW\n+bv6Gbn8t4WgPst08Py5YtJd1/TOuoebOoYxuqIStQPlTehUZU5j8K+de4FBYG0XhwR7+ozJgze4\nV9Zmme5lkFsf33C+EbWl5V8c/xl+7/9xUEagaPYNQ6GrxVEzQAjbEG3DrpqzsilfuK92giTtCIr5\n2k/q0pd4BSpQzo6ePaNzLnYNR6r7DvR4vvW8NA0R9cDL/NK9wg5rUSU3kl24shizA8/o9SCz0zTd\nRXRGL6DVFD/qWn71SaZOrF8tIz4VILI4+zeuUGMg/hGvvZm58xxnNv3LfgRS/X9T8gtv9TykvlT3\nNJr1g8BlkR7VqxRhyJ9M9nSeEyrmh1j0v/2SoxkV2sPoCOLzT0kiUltv+CcMutuYzSW3IkirRl/y\nw/FyYaxDNwKn/bRPcPZmeEUCbkSZqigU87cy2z6kd4CMGs9KX1puAovionaGZjGKIAFwApdwS91G\niLIMxHYnTUlK4Mpipi9DJc5mZFVYpVcPg3gpLl9IkVPyHrtz2bXbN71FRlsb8Wu9aDS50oim3pAq\nn6mIaDilx+URcbMLAF5nIUikfDBjONi3X2LZR7wo9rSzNxb8QzCrDKzimQ2j/YKcd5+1tMcsqsaj\nb07/GYz42KIjf2GmJw7jN/gtS2yg3nOTA7aP/kl3/RwijGcPV365MLnAfBFhjGxQdeC3BcCg/aSa\n0SZAUXppJsZMJRgPvRHmBXLYGBhyHjpm6BJ2UcAyvORM1r4turYELwcZcVX59BKFV8nFE2IsgOk/\n1p8VFY9jU1G35R9q69DBQCaHHY3L15BI1V6y7IIZRGHJ32beTJHJPJgoc5EosKWrftNjHgVYMVRe\nsvn73Wjy/oTGdGDujAUWtZWEFJ6PQDSMKOPV3cZeo8SJTbAc+NrumrG7aD7Eekx28mFmlhLX8g0V\nXiP3aQT/bv5aVQC3iemVE3IG1C9aBlFyZwna4xgKh9GvhRWGrcD3v0m/w95xmBP73oSjBzYM9lw/\nxZdqb5gV9wtj8mlEesnhT69Kz9d8dApQXjRC9k9xeFWHuTkxFQBEFbTZdR8eVfJLVWPyL2OfUqmt\nLd4XtUKto9g+/X1hX30GnMTcRc8l+Gc1knXXpLjsivERUfFlEhNAbMmAl7xPH0XtfVUJ63ynGqlx\nK+JhpDCzDuGfIWH0l1j2e68rAoCw0aXrl6qExfizivpzH7DqtcrQ4XR4jfNAVq9x57Pi6Qmk//MF\nKnZ7oppJIFUvRYhH+7eI+CCWJ2CVgel+bY2aG0ufgY5BqAJcydPV3Vep9HJSBsMnXlZyg10m7jDq\nHd5R9B9YQb/XV/GoL4c5xygQFU4+smITMgpGCk5vNZVXb+tWTZgS1olI2IhoGTgmjdsJ/ThdcwZJ\nJKTg2SuvQGC5fh8o3E1jZEXONBaFnrrZTS1wzhGMI318CZa9RuMnx8tCqe/XUVaTUPxRYT81MqD9\nYMJlMVokKbOr5qWHSCITkorP66b3UtjBfho+noqLUXfe/HgfBGRaWNwAllFh/Oc6FTJiSk2Q16u5\nVRrPq6rZ/t9/AA7K6HRKnHiFejSk3N1jWB07QzOyy8+LRs4SkqnVEhHJuqeddqLrfNkZC0x2WTv6\nx/sZACVueDDl60vcUqZw2+4Ph0vb4JJqj6rPuomkGV1KX6jkX9c/FZC1x3/KA9r/FUge6elCOY3S\nyxuz5XkxoVNjKKFx4O2PVUny9RJYpPLreTGCorljf2a2SGenhR5+AhXpLFxeACpZULPxDECWpUpp\n9D7/MjyPdIHf+RGtvKlHW1/ywtZAxxnWRZH64/7Gm4R2pK4G5qu5KWktl/eNe4XEkWxljJxoWhXE\nwbmxadRLU5Q4HeB5dvg1T4R0sB8z7obPEu82zo5pvrLm+WHIgsfX48In+mOh9QP1L0YoTySuqUku\nMj4T0voAid2qQyhxqWBUQznrnZn5Rqv1b5O4zhzloQ2v8cJ9+qQNOOa2B3iKt9Qn/mF4wQc/bwrz\nFHyF1+gN3+rdbetmkX77TWT2QxnkkhI5RFNJmuGdJFARs99eC8CjnXVSBj6PpfXy2scp5gWfOUyT\ne56MtJAlfI07a1DnXn2Cl0VjmOA21TXh2npv2t/T9H6cLA3zV4j5DFobODHNez9902gYN1O5T9rq\nENMebmFI7ZBHBALhn+gMPlAL/JUQwN8+gvGfBQVpmvbxzP05xK/Ig8QKwYrqfNVxlMCIOTWbQ5N7\nce+0qM3aJUkaaGrRpnRU/b+bPTgtVF/bYkjcnTlLsiVT4f0btYDWv2JT+T81Nu6uJAWwYa1rK9To\nj+AMDarljG5LurKvQrQtO2UrlC7bmS72F8gadaipb12gwN+iSZzBIzWP7Rb9/3CWKDw6cVbnrdkJ\nAd6wqawL6RjjWr7FV6FrqCXV7sWx4suFFdpewhP/wRrr78j7LjjzmJ66Q7GzuX3ktvSgIvQwhOfw\nKkT2EwjavAXzKJVPmid6nDBGHTefhL0j0vlxAyAp/ciF4vv3pyCJBZzzCaxui47I4whrMazH/8pp\nNHILqjztTqF0B+9CuH/9tOlSk3W8oy1ZPzDmJ84E9Edhyx1gd5L1i7TrD7q+H28Rz7Y36STdUi0y\nAFiYPCarHFlQxoghKvuyni+lYuvbrwUA2KdrmswTbzNLfGbSkY8H8i61VNlmMzUXrBUaspN8lF7j\nPoISQbI2wyJcss8b5pPqz9ptfXRbl/1i7QZ9pisl74t8MeIQtPlQmoe7ygXIr08K/paDNkqBo8eC\nxcpSDIJGNI/P8xp3TLeis5N+Yr0BN5NtInsv0+Q+krZIokbBZXqaOASL9tvvkfFHuwu/yQVAtCNS\nqhDjnn7Mfm4k1TzTgWFzP/+0wS1f1YsX/RIuYBsc32vziaaJlYdFb23btBpFRXfqBQL5Vvo/tnup\nFEBep2h/dR+//Yo/UEl3rK07HMJ2ijPPAwzUmDU34D25MstRJdSLC3n5QGhRjF1oKfddqjoyVEBx\nw2Jixdmerxdh7W3yCleGp6bGVOBTl/pZb8u3Xg3x2dHcMrODw7nIUI6XNxI8p4K1fRglnLGWo+C+\ndYNYlgtxCFZrhw8Dg5OvnxYq3oyYGFEqwj6HQfnLW8NWwgVlwgoInnVxBvjNLqzR6PQVvRjBcFwm\nV6gJ3aqJdMsRFPvo3La16FSf0MGueEMBqRCuie83lqX+3j4NB1mncqbuQbV6qdPc3ctAdM1B/nmy\nztXwBDbeZp4g1fZXI4xEXywcfgTJ5axU7yk9j+BdDa9fFNZUKzLft7B4mkEGjYmPW3/wVzqFfY9y\nxwQm8bqyXzBMLWBq3QuzXqAUO2l45ljzcHiMDBsCadpTTT8IHerp79yz4Oaa+VdD7GtrqB/IB6U4\n2Z50lvzZLpp0qtpHNdCFnCQRxT+n9wueHn+XfBxZCDllDctnLKm2KnJaGt7RydLCLuh+gwYNyfW0\noPH736D//j8BWAIeh6YkAAA=\n“, „Filters“: { „EvseConnectorMaxKwMax“: 999.0, „EvseConnectorMaxKwMin“: 0.0, „EvseConnectorTypes“: [ „CCS“, „Type 3“, „CHAdeMO“, „Mennekes“, „Type 1“ ], „EvseFreeForAll“: false, „EvseProviders“: [ „Virta“, „Hubject“, „OCPI“ ] }, „KeyRanges“: [ { „IndexLatMax“: 1907, „IndexLatMin“: 1904, „IndexLngMax“: 8720, „IndexLngMin“: 8717, „IsForDisplay“: true, „ZoomLevel“: 8.0 }, { „IndexLatMax“: 3812, „IndexLatMin“: 3810, „IndexLngMax“: 17438, „IndexLngMin“: 17436, „IsForDisplay“: false, „ZoomLevel“: 7.0 }, { „IndexLatMax“: 953, „IndexLatMin“: 952, „IndexLngMax“: 4359, „IndexLngMin“: 4359, „IsForDisplay“: false, „ZoomLevel“: 9.0 }, { „IndexLatMax“: 7624, „IndexLatMin“: 7620, „IndexLngMax“: 34876, „IndexLngMin“: 34872, „IsForDisplay“: false, „ZoomLevel“: 6.0 }, { „IndexLatMax“: 476, „IndexLatMin“: 476, „IndexLngMax“: 2179, „IndexLngMin“: 2179, „IsForDisplay“: false, „ZoomLevel“: 10.0 }, { „IndexLatMax“: 15248, „IndexLatMin“: 15240, „IndexLngMax“: 69753, „IndexLngMin“: 69745, „IsForDisplay“: false, „ZoomLevel“: 5.0 }, { „IndexLatMax“: 238, „IndexLatMin“: 238, „IndexLngMax“: 1089, „IndexLngMin“: 1089, „IsForDisplay“: false, „ZoomLevel“: 11.0 }, { „IndexLatMax“: 30497, „IndexLatMin“: 30480, „IndexLngMax“: 139506, „IndexLngMin“: 139491, „IsForDisplay“: false, „ZoomLevel“: 4.0 }, { „IndexLatMax“: 119, „IndexLatMin“: 119, „IndexLngMax“: 544, „IndexLngMin“: 544, „IsForDisplay“: false, „ZoomLevel“: 12.0 }, { „IndexLatMax“: 59, „IndexLatMin“: 59, „IndexLngMax“: 272, „IndexLngMin“: 272, „IsForDisplay“: false, „ZoomLevel“: 13.0 }, { „IndexLatMax“: 29, „IndexLatMin“: 29, „IndexLngMax“: 136, „IndexLngMin“: 136, „IsForDisplay“: false, „ZoomLevel“: 14.0 }, { „IndexLatMax“: 14, „IndexLatMin“: 14, „IndexLngMax“: 68, „IndexLngMin“: 68, „IsForDisplay“: false, „ZoomLevel“: 15.0 }, { „IndexLatMax“: 7, „IndexLatMin“: 7, „IndexLngMax“: 34, „IndexLngMin“: 34, „IsForDisplay“: false, „ZoomLevel“: 16.0 }, { „IndexLatMax“: 3, „IndexLatMin“: 3, „IndexLngMax“: 17, „IndexLngMin“: 17, „IsForDisplay“: false, „ZoomLevel“: 17.0 }, { „IndexLatMax“: 1, „IndexLatMin“: 1, „IndexLngMax“: 8, „IndexLngMin“: 8, „IsForDisplay“: false, „ZoomLevel“: 18.0 }, { „IndexLatMax“: 0, „IndexLatMin“: 0, „IndexLngMax“: 4, „IndexLngMin“: 4, „IsForDisplay“: false, „ZoomLevel“: 19.0 }, { „IndexLatMax“: 0, „IndexLatMin“: 0, „IndexLngMax“: 2, „IndexLngMin“: 2, „IsForDisplay“: false, „ZoomLevel“: 20.0 }, { „IndexLatMax“: 0, „IndexLatMin“: 0, „IndexLngMax“: 1, „IndexLngMin“: 1, „IsForDisplay“: false, „ZoomLevel“: 21.0 }, { „IndexLatMax“: 0, „IndexLatMin“: 0, „IndexLngMax“: 0, „IndexLngMin“: 0, „IsForDisplay“: false, „ZoomLevel“: 22.0 } ] }
[3] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Type: application/binary User-Agent: fi.virta/31706 (Linux; U; Android 11; de_DE; SM-G900F; Build/RQ3A.211001.001; Cronet/113.0.5672.24) X-Device-Elapsed-Time: 159293496225037 X-Google-Maps-Mobile-API: fi.virta,31706,11.77.200,11.77.200,android:samsung-klte-SM_G900F Content-Length: 716 Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Hex 0000000000 00 18 ff ff ff ff ff ff ff ff 00 05 64 65 2d 44 …………de-D 0000000010 45 00 1d 61 6e 64 72 6f 69 64 3a 73 61 6d 73 75 E..android:samsu 0000000020 6e 67 2d 6b 6c 74 65 2d 53 4d 5f 47 39 30 30 46 ng-klte-SM_G900F 0000000030 00 09 31 31 2e 37 37 2e 32 30 30 00 03 64 65 76 ..11.77.200..dev 0000000040 00 3e ff ff fe 0e 1f 8b 08 00 00 00 00 00 00 00 .>………….. 0000000050 05 c1 3d 8f 93 60 00 00 e0 7b 81 bb dc b9 f8 17 ..=..`…{…… 0000000060 9c 4d ae e1 1b 3a 38 00 2d 05 4a 3f 28 94 96 2e .M…:8.-.J?(… 0000000070 0d 85 72 94 83 42 29 1f 85 e9 46 13 a3 43 07 a3 ..r..B)…F..C.. 0000000080 37 39 35 71 d1 8b 8b 89 a3 89 ff c0 c1 dc d4 c1 795q………… 0000000090 c1 38 18 07 37 13 e3 f3 3c 40 30 94 41 1f 81 c7 .8..7…<@0.A… 00000000a0 e7 de aa 51 ac d2 cc c6 a1 56 9b 05 fc 7b 40 61 …Q…..V…{@a 00000000b0 d8 93 be 69 38 35 21 31 b1 b3 99 24 b2 96 ba 94 …i85!1…$…. 00000000c0 9c 59 23 4b 5e d2 01 1f 77 16 42 4c 2a fd 95 1e .Y#K^…w.BL*… 00000000d0 e0 81 9b 6f 6d 77 98 ad 34 b1 bb 18 05 bb 35 66 …omw..4…..5f 00000000e0 a2 15 bd ad a3 85 40 db 54 7b b3 cc 05 c7 9d 11 ……@.T{…… 00000000f0 4a 36 8c 3c 6a b1 33 19 fe aa e4 fb 4e d2 16 12 J6..m… 0000000120 79 2c 4a 8c b3 2e 70 7e e3 d7 11 3e 0f d5 96 51 y,J…p~…>…Q 0000000130 25 de 3a d4 92 26 89 c5 43 b0 07 67 ba a5 1b ed %.:..&..C..g…. 0000000140 de 2d 38 b9 03 c8 3d 80 08 f4 07 38 b9 81 c0 53 .-8…=….8…S 0000000150 08 7c 80 3e 02 4e 42 f3 61 47 2a e8 d2 a4 5a dd .|.>.NB.aG*…Z. 0000000160 65 9d 86 78 e9 a1 64 d8 95 88 48 69 2a d3 cd 75 e..x..d…Hi*..u 0000000170 ba f3 2d 9b eb 50 23 d2 ef a9 f2 ae dd 4c d2 71 ..-..P#……L.q 0000000180 cc 05 dc a8 12 b4 52 2c 70 c2 62 b7 d7 09 c7 ea ……R,p.b….. 0000000190 45 18 b7 54 be 57 62 1d 55 d1 e7 b6 b4 f2 ea 69 E..T.Wb.U……i 00000001a0 1d 39 55 88 77 53 25 1b 10 97 e4 96 66 33 a3 d8 .9U.wS%…..f3.. 00000001b0 2c c5 cb 49 b3 ef e3 66 69 fb b5 22 94 d9 6c 2c ,..I…fi..“..l, 00000001c0 db 09 4b ce d6 9a 31 e3 70 85 0e 19 74 ca 0a 84 ..K…1.p…t… 00000001d0 46 2c af 2a 39 ce dc 8c 76 b1 dc 0a 3d 73 e2 13 F,.*9…v…=s.. 00000001e0 83 a6 b3 cd e5 4f d0 29 81 31 28 fd 19 ba c0 b0 …..O.).1(….. 00000001f0 06 c3 34 70 14 bd 81 df fe 7b 1e df c2 f0 f9 11 ..4p…..{…… 0000000200 be 87 1f fe 3c e8 fb 3b fd e5 37 fd dd de 78 7d ….“_.}?… 0000000230 6c 95 2a 20 f6 01 00 00 00 27 00 00 00 8e 22 6b l.* …..’….“k 0000000240 68 74 74 70 73 3a 2f 2f 77 77 77 2e 67 6f 6f 67 https://www.goog 0000000250 6c 65 2e 63 6f 6d 2f 6d 61 70 73 2f 76 74 2f 69 le.com/maps/vt/i 0000000260 63 6f 6e 2f 6e 61 6d 65 3d 61 73 73 65 74 73 2f con/name=assets/ 0000000270 69 63 6f 6e 73 2f 70 6f 69 2f 71 75 61 6e 74 75 icons/poi/quantu 0000000280 6d 2f 70 69 6e 6c 65 74 2f 62 72 69 64 67 65 5f m/pinlet/bridge_ 0000000290 70 69 6e 6c 65 74 2d 32 2d 6d 65 64 69 75 6d 2e pinlet-2-medium. 00000002a0 70 6e 67 26 73 63 61 6c 65 3d 34 4a 1f 64 75 68 png&scale=4J.duh 00000002b0 23 67 65 74 54 65 78 74 75 72 65 46 6f 72 4c 61 #getTextureForLa 00000002c0 62 65 6c 45 6c 65 6d 65 6e 74 28 29 belElement()
[4] Datadog ist ein eher technisch orientierter Analysedienst, mit dem man die Sicherheit und Stabilität der App überwachen kann. Hier kann man darüber streiten, ob die gesendete application id
und Datenpunkte wie die Verweildauer oder detaillierte Aktionen im Rahmen der Datenschutzgesetze ohne Einwilligung zulässig sind. Mir erscheint es nicht unbedingt notwendig, diese Sachen auf jedem Gerät abzufragen, es würde bei einer Auswahl freiwilliger Personen sicher auch ausreichen, das Fehleraufkommen in der App zu überwachen.
POST https://rum-http-intake.logs.datadoghq.eu/api/v2/rum?ddsource=android&ddtags=service:fi.virta,version:2.6.11.6,sdk_version:1.12.0,env:release,variant:brandVirtaApiProd HTTP/2.0 dd-api-key: pubc4889f6ae81094bcd31b37c1ecf01695 dd-evp-origin: android dd-evp-origin-version: 1.12.0 user-agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) content-type: text/plain;charset=UTF-8 dd-request-id: d208ad6d-c4cb-4397-a517-1ddb7ab071c7 content-encoding: gzip accept-encoding: gzip [decoded gzip] Raw {„date“:1691944233272,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“f3602a70-1f1a-4807-b3f9-6533292ae799″,“url“:“fi/virta/ui/splash/LauncherActivity“,“name“:“fi.virta.ui.splash.LauncherActivity“},“usr“:{},“connectivity“:{„status“:“connected“,“interfaces“:[„other“]},“_dd“:{„format_version“:2,“session“:{„plan“:1}},“context“:{„long_task.target“:“Handler (android.view.Choreographer$FrameHandler) {9dc56a0} android.view.Choreographer$FrameDisplayEventReceiver@4f5d259: 0″},“type“:“long_task“,“long_task“:{„duration“:121179178,“is_frozen_frame“:false}} {„date“:1691944233268,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“f3602a70-1f1a-4807-b3f9-6533292ae799″,“url“:“fi/virta/ui/splash/LauncherActivity“,“name“:“fi.virta.ui.splash.LauncherActivity“,“time_spent“:146805848,“is_active“:true,“is_slow_rendered“:true,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:0},“resource“:{„count“:0},“memory_average“:1.23854E8,“memory_max“:1.252E8,“cpu_ticks_count“:11.0,“cpu_ticks_per_second“:74.92889520313932,“refresh_rate_average“:26.02297031649404,“refresh_rate_min“:8.57778247802134},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:2},“context“:{},“type“:“view“} {„date“:1691944233268,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“f3602a70-1f1a-4807-b3f9-6533292ae799″,“url“:“fi/virta/ui/splash/LauncherActivity“,“name“:“fi.virta.ui.splash.LauncherActivity“,“loading_time“:0,“loading_type“:“activity_redisplay“,“time_spent“:1902968107,“is_active“:true,“is_slow_rendered“:false,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:0},“resource“:{„count“:0},“memory_average“:1.268117894736842E8,“memory_max“:1.28456E8,“cpu_ticks_count“:38.0,“cpu_ticks_per_second“:19.968805499271564,“refresh_rate_average“:58.99374836441029,“refresh_rate_min“:8.57778247802134},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:3},“context“:{},“type“:“view“} {„date“:1691944233268,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“f3602a70-1f1a-4807-b3f9-6533292ae799″,“url“:“fi/virta/ui/splash/LauncherActivity“,“name“:“fi.virta.ui.splash.LauncherActivity“,“loading_time“:0,“loading_type“:“activity_redisplay“,“time_spent“:1903121597,“is_active“:false,“is_slow_rendered“:false,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:0},“resource“:{„count“:0},“memory_average“:1.268117894736842E8,“memory_max“:1.28456E8,“cpu_ticks_count“:38.0,“cpu_ticks_per_second“:19.967194981078237,“refresh_rate_average“:58.99374836441029,“refresh_rate_min“:8.57778247802134},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:4},“context“:{},“type“:“view“} {„date“:1691944235186,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“8a113d52-46b7-464d-a12d-b301b2aa3b0e“,“url“:“fi/virta/ui/main/MainActivity“,“name“:“fi.virta.ui.main.MainActivity“},“usr“:{},“connectivity“:{„status“:“connected“,“interfaces“:[„other“]},“_dd“:{„format_version“:2,“session“:{„plan“:1}},“context“:{„long_task.target“:“Handler (android.app.ActivityThread$H) {93ff536} null: 159″},“type“:“long_task“,“long_task“:{„duration“:1553559477,“is_frozen_frame“:true}} {„date“:1691944236672,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“8a113d52-46b7-464d-a12d-b301b2aa3b0e“,“url“:“fi/virta/ui/main/MainActivity“,“name“:“fi.virta.ui.main.MainActivity“,“time_spent“:77432560,“is_active“:true,“is_slow_rendered“:false,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:1},“resource“:{„count“:0},“memory_average“:1.59996E8,“memory_max“:1.6036E8,“cpu_ticks_count“:34.0,“cpu_ticks_per_second“:439.0917722467138,“refresh_rate_average“:60.25341743826691,“refresh_rate_min“:60.25341743826691},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:2},“context“:{},“type“:“view“} {„date“:1691944236672,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“8a113d52-46b7-464d-a12d-b301b2aa3b0e“,“url“:“fi/virta/ui/main/MainActivity“,“name“:“fi.virta.ui.main.MainActivity“,“loading_time“:1328653987,“loading_type“:“activity_display“,“time_spent“:284826226,“is_active“:true,“is_slow_rendered“:false,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:1},“resource“:{„count“:0},“memory_average“:1.61026E8,“memory_max“:1.6298E8,“cpu_ticks_count“:93.0,“cpu_ticks_per_second“:326.5148764777019,“refresh_rate_average“:60.25341743826691,“refresh_rate_min“:60.25341743826691},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:3},“context“:{},“type“:“view“} {„date“:1691944236672,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“8a113d52-46b7-464d-a12d-b301b2aa3b0e“,“url“:“fi/virta/ui/main/MainActivity“,“name“:“fi.virta.ui.main.MainActivity“,“loading_time“:1328653987,“loading_type“:“activity_display“,“time_spent“:285009716,“is_active“:false,“is_slow_rendered“:false,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:1},“resource“:{„count“:0},“memory_average“:1.61026E8,“memory_max“:1.6298E8,“cpu_ticks_count“:93.0,“cpu_ticks_per_second“:326.3046653469175,“refresh_rate_average“:60.25341743826691,“refresh_rate_min“:60.25341743826691},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:4},“context“:{},“type“:“view“} {„date“:1691944237014,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“4a4b76e8-df40-4dc8-8842-ff58e03ed7eb“,“url“:“fi/virta/refactor/registration/RegistrationActivity“,“name“:“fi.virta.refactor.registration.RegistrationActivity“},“usr“:{},“connectivity“:{„status“:“connected“,“interfaces“:[„other“]},“_dd“:{„format_version“:2,“session“:{„plan“:1}},“context“:{„long_task.target“:“Handler (android.app.ActivityThread$H) {93ff536} null: 159″},“type“:“long_task“,“long_task“:{„duration“:185294446,“is_frozen_frame“:false}} {„date“:1691944237191,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“4a4b76e8-df40-4dc8-8842-ff58e03ed7eb“,“url“:“fi/virta/refactor/registration/RegistrationActivity“,“name“:“fi.virta.refactor.registration.RegistrationActivity“,“time_spent“:15039689,“is_active“:true,“is_slow_rendered“:true,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:1},“frozen_frame“:{„count“:0},“resource“:{„count“:0},“memory_average“:1.6626E8,“memory_max“:1.6626E8,“refresh_rate_average“:4.351969023504795,“refresh_rate_min“:4.3120160125852225},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:2},“context“:{},“type“:“view“} {„date“:1691944237510,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“4a4b76e8-df40-4dc8-8842-ff58e03ed7eb“,“url“:“fi/virta/refactor/registration/RegistrationActivity“,“name“:“fi.virta.refactor.registration.RegistrationActivity“},“usr“:{},“connectivity“:{„status“:“connected“,“interfaces“:[„other“]},“_dd“:{„format_version“:2,“session“:{„plan“:1}},“context“:{„long_task.target“:“Handler (android.view.Choreographer$FrameHandler) {9dc56a0} android.view.Choreographer$FrameDisplayEventReceiver@4f5d259: 0″},“type“:“long_task“,“long_task“:{„duration“:138151836,“is_frozen_frame“:false}} {„date“:1691944237191,“application“:{„id“:“87d66b1f-1df2-420e-9513-274294036837″},“session“:{„id“:“1723ab6c-e5e4-4243-987c-d99dc55ede79″,“type“:“user“},“source“:“android“,“view“:{„id“:“4a4b76e8-df40-4dc8-8842-ff58e03ed7eb“,“url“:“fi/virta/refactor/registration/RegistrationActivity“,“name“:“fi.virta.refactor.registration.RegistrationActivity“,“time_spent“:465628224,“is_active“:true,“is_slow_rendered“:true,“action“:{„count“:0},“error“:{„count“:0},“crash“:{„count“:0},“long_task“:{„count“:2},“frozen_frame“:{„count“:0},“resource“:{„count“:0},“memory_average“:1.7744466666666666E8,“memory_max“:1.95316E8,“cpu_ticks_count“:64.0,“cpu_ticks_per_second“:137.44871273095336,“refresh_rate_average“:6.457698875047623,“refresh_rate_min“:4.3120160125852225},“usr“:{},“_dd“:{„format_version“:2,“session“:{„plan“:1},“document_version“:3},“context“:{},“type“:“view“}
Fazit: Sieht man mal von den Meldungen an Google Firebase ab, scheint mir die App einigermaßen datenschutzkonform zu sein, wobei sich auch über den Einsatz des sehr technischen Analysedienstes Datadog streiten ließe. Was allerdings nicht in Ordnung ist: Wenn man in den Einstellungen die Erstellung „anonymer“ Analyse deaktivert, dann sendet die App trotzdem weiterhin Daten an Datadog und Firebase. Hier funktioniert was nicht. Tendentiell würde ich von der App also aus Datenschutzperspektive eher abraten.
Wirelane
Wirelane ist ein Anbieter für Ladetechnik und Ladesoftware. Nach dem Start der App wird man für die verpflichtende Registrierung auf die Website emobilitycloud.com umgeleitet, die als Whitelabel-Website auch für andere Energieversorge einen Login bereitstellt. Ich vermute, dass es Wirelane selbst ist, das hier die Software auch für viele andere Anbieter bereitstellt, zum Beispiel auch für die Stadtwerke München (SWM).
[1] Gravatar: Bei der Registrierung meldet man sich im Browser an. Wie auch alle anderen Stadtwerke-Anmeldeseiten, die auf Emobilitycloud.com basieren, wird hier die gehashte E-Mail von Nutzenden der Ladekarten-Verwaltungs-Website an Gravatar gesendet. Auch bei jedem Login innerhalb der App wird der Dienst kontaktiert. Gravatar gehört wie die Software WordPress zu Automattic. Die können die gehashten E-Mails zwar nicht in Klartext zurückrechnen, aber wenn sie eine ungehashte Liste von E-Mails haben, könnten sie herausfinden, bei welchen Diensten die dazugehörigen Personen angemeldet sind. Jetzt kann man eigentlich nicht davon ausgehen, dass man das bei WordPress macht, aber andererseits kann man seit Edward Snowden auch nicht mehr zu viel Naivität mit US-Diensten haben.
GET /avatar/8170279db602957c182e260a70860e9e?s=256&r=g&d=https%3A%2F%2Fweb.emobilitycloud.com%2Fimages%2Ff799f193cf123019feb9474854f904dc85cf1100%2Fdefault_profile_logo_dewln.png HTTP/2 Host: www.gravatar.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: image/avif,image/webp,*/* Accept-Language: de,en-GB;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://backoffice.wirelane.com/ Connection: keep-alive Sec-Fetch-Dest: image Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site Pragma: no-cache Cache-Control: no-cache
[2] emobilitycloud.com: Unter der bereits erwähnten zentralen Infrastruktur, die vermutlich zu Wirelane gehört, ruft die App nun einerseits die Ladepunkte für die Karte ab und andererseits werden hier Profilinformationen abgefragt. Dabei wird jeweils ein Bearer
für die Authentifizierung mitgesendet. In diesem Token ist allerdings die E-Mail-Adresse enthalten (im Verbindungsbeispiel habe ich es bereits entschlüsselt und die E-Mail unkenntlich gemacht). Das macht für alle Profil-Aktionen zwar Sinn, aber beim Abrufen von Ladesäulen auf der Karte wäre es nicht notwendig. Hier könnte man zum Beispiel herausfinden, an welchen Orten eine Person sucht, aber dann nicht (oder mit einer anderen App tankt). Das ist eher ein kleines Privatsphäre-Problem, generell wird man ja seinem Ladeanbieter vertrauen müssen, was die Orte und Routen betrifft, die in solchen Daten enthalten sind. Der Server ist in Deutschland bei Hetzner gehostet, das finde ich aus Datenschutzsicht richtig gut.
GET https://api.wirelane.com/apis/emc/points/cluster?south_west_lat=47.93615&south_west_lon=5.214808&north_east_lat=53.33194&north_east_lon=15.790849&zoom=5 HTTP/1.1 Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJFZDkzRGZaZG1EM3Znb3F3ZnhFN2ZScHdhQ2U2SllmNSIsImp0aSI6IjQzMjI5MDk3ODUyMDI1MzU1MzQ3MmU0MzEyMWE3ZGUwZTRjYmJhZjdkZDljMDgwMWZjM2IxMzU1ZDYwNTM5MzEzNzViZDE0OTM1MDk2MWUyIiwiaWF0IjoxNjkyMDI2MTkyLjc4MzE3MywibmJmIjoxNjkyMDI2MTkyLjc4MzE3NSwiZXhwIjoxNjkyMDI5NzkyLjc0NzQyMSwic2NvcGVzIjpbImFjY291bnQiLCJwb2lzX3NlYXJjaCJdLCJpc3MiOiJlbW9iaWxpdHljbG91ZC5jb20iLCJjbGllbnRfYWNjb3VudCI6ImRld2xuIiwic2NvcGUiOiJhY2NvdW50IHBvaXNfc2VhcmNoIiwic3ViIjoiREVXTE4tMDIyMjk1NDUiLCJ0ZW5hbnQiOiJERVdMTiIsInVzZXJpZCI6IkRFV0xOLTAyMjI5NTQ1IiwidXNlcl9pZCI6IkRFV0xOLTAyMjI5NTQ1IiwibG9naW5fdXNlcm5hbWUiOiIqKioqKioqQHByb3Rvbm1haWwuY29tIiwicHJvcGVydGllcyI6eyJjYXJkIjpbXSwibWVtYmVyc2hpcHMiOlt7ImlkIjoxMjEyMDQsIm9yZ2FuaXphdGlvbiI6eyJpZCI6IkRFV0xOIiwibmFtZSI6IldpcmVsYW5lIEdtYkgifSwicm9sZSI6IlJPTEVfTUVNQkVSIiwic3RhdHVzIjoiYWN0aXZlIiwibWVtYmVyX2dyb3VwcyI6W119XSwiaGFzQWN0aXZlUGF5bWVudE1ldGhvZCI6ZmFsc2UsImFjY291bnRfdHlwZSI6InByaXZhdGUifX0.KCPFu8YMBpLpk1Y8wGOojxJ0heQb8KIrccycHY_Km7UaLcni4T0Yf2c4Cq1xDbWCZEipIQm5dh7YsLagGU28rMdo1DJ41W3l1drle1K50H5SnRmjVOhldnn9rjptkDDjv6CWrVzw_9xMVvyzAgglHP8EhmegrspKTCU3m5NPDIaEySfU0vTY8xKgFEM99wnBy6F1Yw6EJUzc27o2GgBwLs3L6LLWRhCerEXZkVxlmDE-ugFV4432m8bJLVkgrHmNCM2SlcrHYdeXXeIgRGVfTh66D00fiLXmI3eyAYbnyTZYoUqNIRSkUUtRUiJNMrdFj5G4zsJGyP687ZgyFeoyNQ User-Agent: wirelane/2.0.4 (com.wirelane.android; build:2000025; type:release) android/11 okhttp/4.11.0 Accept-Language: de X-Android-Build: 2000025 X-Correlation-Id: 1e6200c8-fea3-4588-b1b8-9aec82f141d3 Host: api.wirelane.com Connection: Keep-Alive Accept-Encoding: gzip Query south_west_lat: 47.93615 south_west_lon: 5.214808 north_east_lat: 53.33194 north_east_lon: 15.790849 zoom: 5 Bearer-Token: { „aud“: „Ed93DfZdmD3vgoqwfxE7fRpwaCe6JYf5“, „jti“: „432290978520253553472e43121a7de0e4cbbaf7dd9c0801fc3b1355d6053931375bd149350961e2“, „iat“: 1692026192.783173, „nbf“: 1692026192.783175, „exp“: 1692029792.747421, „scopes“: [ „account“, „pois_search“ ], „iss“: „emobilitycloud.com“, „client_account“: „dewln“, „scope“: „account pois_search“, „sub“: „DEWLN-02229545“, „tenant“: „DEWLN“, „userid“: „DEWLN-02229545“, „user_id“: „DEWLN-02229545“, „login_username“: „*******@protonmail.com“, „properties“: { „card“: [], „memberships“: [ { „id“: 121204, „organization“: { „id“: „DEWLN“, „name“: „Wirelane GmbH“ }, „role“: „ROLE_MEMBER“, „status“: „active“, „member_groups“: [] } ], „hasActivePaymentMethod“: false, „account_type“: „private“ } }
[3] Google Maps liefert die Kartenfunktionalität. Nicht alle Requests waren entschlüsselbar. Typischerweise werden hier einfach Map-Tiles für eine Koordinate ausgeliefert. Es ist schwierige, die Binärdaten zu interpretieren, möglicherweise sind aber keine personenbeziehbaren IDs enthalten.
POST https://clients4.google.com/glm/mmap HTTP/1.1 Content-Length: 708 X-Google-Maps-Mobile-API: com.wirelane.android,2000025,3.1.0,9.0.0,android:samsung-klte-SM_G900F Content-Type: application/binary User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; SM-G900F Build/RQ3A.211001.001) Host: clients4.google.com Connection: Keep-Alive Accept-Encoding: gzip Raw \x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05de-DE\x00\x1dandroid:samsung-klte-SM_G900F\x00\x053.1.0\x00\x03Web>\x00\x00\x01\xc4 \x041071 \x01*\x14com.wirelane.android2\x02DEB\xaf\x01511=SVWdF-xRfEXFKuHb04dIRMsOUx8OJo-d8PrlYVBI1JOnhoTXS2sMM7v64tkiiN7D5dsaqRgu_9wXNZYTchNBsrTK0ZpqXdMoJkImKQ8iSsoZi609LB20cXVePI1DR6rHl9gqIVU_QnemzzP3svnU3AHLb7ewdjNLslZXhbP8vw0\x92\x01\x06SYSTEM\xb0\x01\x03\xda\x01\x0230\xe8\x01\x00\xb2\x02\xb7\x01AH0uPGEe9TwDmdKzjfweXJFP6It00Wwvsf87rbmRR2qa3LJvi3RGH7LdeFek1_eWJvaO2ovB_-DWRLTjyLInGMx9p7cYp1NOJbChywV_NB2lsqSxjXXP0L20-0N9_Iw83ctQ-E0s4MsBooIxdHesPqdGdU-KMLfek79UnmWCswXfO2I2wuY7oiY\xba\x02\x072000025\xc2\x02\x059.0.0\xf8\x02\xb8\xf9\xf7\x05\x80\x03\xa9\xfe\x8do\xf0\x03\x03\x0fK\x00\x00\x00\xb9 \x03\x08\x93\x01 \x0b\x08\x06\x11\x17\x02\xec \x00\x00\x00\x00 \x0b\x08\x08\x11\x9f\x85,\xac\x00\x00\x00\x00 \x0b\x08\x0c\x11\xc3\x00\xfc\x03\x00\x00\x00\x00 \x0b\x08%\x11Z!\x811\x00\x00\x00\x00 \x0b\x08-\x112\xe2j\xd7\x00\x00\x00\x00 \x0b\x08\x10\x11) \xba\xbf\x00\x00\x00\x00\x12d\x08\x01\x10\x01\x18\x01″Z\x12\x1dandroid:samsung-klte-SM_G900F“\x03Web*\x02302\x14com.wirelane.androidM\x00\x00@@X\x00b\x072000025j\x053.1.0x\x01\xb0\x01\x01B\x00
[4] [1] Sentry ist ein technischer Analysedienst, der zum Beispiel die Leistung der App oder Fehlerquellen überwacht. Bedauerlich ist, dass die Analyse neben der Sitzungs-ID sid
auch die optionale User-ID did
nutzt. Die App-Nutzung wird also pseudonym überwacht. Aus dem Request geht zwar hervor, dass die Analyse einen typischen Zertifizierungsfehler gemeldet hat, der mit meinem Test-Setup zusammenhängt. Aber auch wenn ich den Datenverkehr nicht entschlüsselt habe, war der Request zu sehen. Besser wäre es, wenn man auch solche technischen Rückmeldungen nur optional und freiwillig integriert. Klassische Analysedaten wie Nutzungsdauer oder Öffnen und Schließen der App werden allerdings nicht überwacht.
POST https://o970427.ingest.sentry.io/api/5921747/envelope/ HTTP/1.1 User-Agent: sentry.java.android/6.22.0 X-Sentry-Auth: Sentry sentry_version=7,sentry_client=sentry.java.android/6.22.0,sentry_key=27e4da3d7ab54bb5808e6ed5665d76e7 Content-Encoding: gzip Content-Type: application/x-sentry-envelope Accept: application/json Connection: close Host: o970427.ingest.sentry.io Accept-Encoding: gzip Content-Length: 517 [decoded gzip] Raw {„sdk“:{„name“:“sentry.java.android“,“version“:“6.22.0″,“packages“:[{„name“:“maven:io.sentry:sentry“,“version“:“6.22.0″},{„name“:“maven:io.sentry:sentry-android-core“,“version“:“6.22.0″},{„name“:“maven:io.sentry:sentry-android-fragment“,“version“:“6.22.0″},{„name“:“maven:io.sentry:sentry-android-timber“,“version“:“6.22.0″}],“integrations“:[„SQLite“,“DatabaseInstrumentation“,“FileIOInstrumentation“,“OkHttpInstrumentation“,“LogcatInstrumentation“,“UncaughtExceptionHandler“,“ShutdownHook“,“AppLifecycle“,“AnrV2″,“ActivityLifecycle“,“UserInteraction“,“FragmentLifecycle“,“Timber“,“AppComponentsBreadcrumbs“,“SystemEventsBreadcrumbs“,“NetworkBreadcrumbs“]},“sent_at“:“2023-08-14T15:15:35.417Z“} {„content_type“:“application/json“,“type“:“session“,“length“:276} {„sid“:“661ea159-c2d2-45e2-ae32-147fe3d07e9e“,“did“:“7ae96487-8c7d-4679-a097-2d0b067c643b“,“init“:true,“started“:“2023-08-14T15:15:35.381Z“,“status“:“ok“,“errors“:0,“timestamp“:“2023-08-14T15:15:35.381Z“,“attrs“:{„release“:“wirelane-2.0.4-afa435c“,“environment“:“production“}}
Fazit: Obwohl in der App einige Kleinigkeiten datenschutztechnisch nicht gut gemacht sind, kann man jeweils ein Auge zudrücken und in allen drei Kategorien ein Sternchen vergeben. Erfreulich ist, dass Firebase nicht eingesetzt wird – ob Sentry so viel anders ist, kann ich nicht beurteilten, aber das Unternehmen hinter Sentry ist immerhin nicht im Markt für verhaltensbasierte Werbung engagiert wie Google. Ich würde weiterhin Ladekarte und EV Map vorziehen gegenüber Wirelane. Aber es gibt keinen ernsthaften Grund, diese App nicht zu nutzen. Was hingegen eine ziemliche Sauerei ist, dass der Facebook-Tracker auf der Website unter wirelane.com ohne Einwilligung verwendet wird. Das war aber auch nicht Gegenstand dieses Tests.
Bildquellen:
Ev: Freepik from www.flaticon.com is licensed by CC 3.0 BY
Mitmachen: Hilf mit die Spendenziele zu erreichen!