Halle-App der Stadtwerke

09.07.2020 Jonas L. App-Kritik

Nicht nur die Stadt Halle hat eine Android-App, die Stadtwerke von Halle haben ganze zwei Stück - “Mein HALLE” und “Mein HALLE Zuhause”. Hier sehe ich mir die erste dieser Apps genauer an.

Die interessante Frage ist: Warum zwei Anwendungen und wo ist der Unterschied? Ich weiß es nicht und die Beschreibungen haben mir nicht weitergeholfen - dort konnte ich nur erfahren, was in der jeweiligen Anwendung enthalten ist.

Die Paketnamen de.brainSCC.app.swh (Mein HALLE) und de.doegel.swh.home (Mein HALLE Zuhause) sagen da schon mehr - es sind jeweils andere “Lieferanten”.

“brain-SCC” (Eigenschreibweise) ist eine GmbH mit Sitz in Merseburg, also nicht weit entfernt. Deren Webseite - brain-scc.de - sieht sauber aus. Keine Drittquellen, nur Tracking-Pixel, aber über eine selbstgehostete Piwik-Instanz. Aber es gibt ein Sitzungs-Cookie von einem CMS und weder ein HSTS-Preloading noch eine Content Security Policy. Insgesamt fällt das dennoch positiv auf. Das einzige auf deren Webseite genannte Produkt ist ein CMS (Content Managment System), das sich an Behörden richtet.

Aber da es scheinbar (https://www.brain-scc.de/de/schnittstellen.html) darum geht, Verwaltungsleistungen damit online abzuwickeln, finde ich das wieder etwas schwach. Dabei wurde laut https://www.brain-scc.de/de/sicherheit.html ein Penetrationstest durchgeführt, bei dem auch “Maßnahmen zum sicheren Betrieb der Anwendung” geprüft wurden. Wann der Test durchgeführt wurde und ob ein solcher regelmäßig wiederholt wird, steht dort nicht. Die Marketingseite ist natürlich kein Maß für das damit beworbene Produkt, aber ein Indikator.

Als eine von vielen Referenzen wurde auf der Webseite www.abwasser-wsf.de genannt - auch dort kein HSTS und kein CSP. Auch https://www.ssllabs.com/ssltest/analyze.html?d=www.abwasser-wsf.de&hideResults=on ist nicht unbedeutend. Schlussfolgerungen:

  • es wird auf kostenpflichtige Zertifikate verzichtet/ Nutzung von Let’s Encrypt
  • wenn man sich ohne SNI (Server Name Indication) mit dem Server verbindet, dann bekommt man ein Zertifikat, das auf *.brain-scc.de ausgestellt ist (also wird das zumindest in diesem Fall von Brain-SCC gehostet)
  • TLS 1.3 wird nicht unterstützt, aber TLS 1.0 und TLS 1.1 schon; TLS 1.2 wurde laut Wikipedia im August 2008 spezifiziert, wenn ein System es heute noch nicht unterstützt, dann kann man dort keine aktuellen Systemupdates/ keinen hohen Sicherheitsstandard erwarten und dann sollte man darüber nachdenken, bei “E-Goverment” solche Nutzer zu deren Schutz auszusperren
  • auf einen DNS-CAA-Eintrag (zur Einschränkung der Zertifizierungsstellen, die ein Zertifikat erteilen dürfen) wurde verzichtet, aber das nenne ich jetzt mal ein Luxusproblem

Bei den App-Referenzen wird “Mein HALLE” nicht aufgeführt, aber es gibt einen Link zum App-Baukasten auf der Basis von deren CMS - es sind vier App-Typen möglich, einer davon ist “Stadt-App”. Die Screenshots unter https://www.brain-scc.de/de/stadt-app.html sind auf einer Android-Version vor Version 5 entstanden. Ich hoffe an dieser Stelle, dass die App nicht mehr so aussieht wie auf diesen Screenshots. Alle 3 Links zum Play Store auf dieser Seite geben ein 404 - und das auch, wenn ich einen Exit Node aus Deutschland verwende. Ich muss nicht sagen, was ich da für eine Erwartung bei “Mein HALLE” habe.

Um noch mehr Vorurteile zu bekommen https://reports.exodus-privacy.eu.org/en/reports/139491/ - Google AdMob, Google CrashLytics und Google Firebase Analytics sind in der App enthalten. Ich kann zwar nachvollziehen, dass es Menschen gibt, die glauben, Analytics-Lösungen zu brauchen, aber was hat Google AdMob hier zu suchen? Das ist ein Dienst für Werbeeinblendungen.

Dann hole ich mir die App. Ich betrachte die Version 1.107 vom 25. November 2019. Wenn ein Nummernblock zu groß wird mache ich es so, das ich diesen Zurücksetze und dann den vorherigen Block erhöhe - also nach 1.9.0 kommt bei mir anstelle von 1.10.0 eben 2.0.0, auch wenn es keine große Innovation gibt. Einerseits kann man mit kleineren Zahlen besser arbeiten, andererseits musste ich die Erfahrung machen, dass einige Nutzer nicht erwarten, das eine Version 1.13.0 neuer ist als eine Version 1.7.0. Das letzte Update ist über ein halbes Jahr her, aber für Apps dieser Art sieht das gepflegt aus. Die Dateigröße von 6,5 MB ist auffälig groß.

Zum Glück benötigt die App nur Android 5, sodass ich wahrscheinlich ohne größeren Aufwand den Traffic analysieren kann.

Direkt nach dem Aufrufen der App gibt es schon eine Registrierung bei Google - warum denn nicht?

Registrierung der SWH-Halle-App für Google Cloud Messaging

In der App selbst gibt es eine Einleitung, bei der ich erwarte, das ich gleich den Standortzugriff aktivieren soll:

Einleitung in der App mit Informationen zu "Ortungsdienste"

Aber so kam es nicht, stattdessen wurde ich gefragt, ob ich mich für das kostenlose WLAN in Halle registrieren möchte, aber da kann ich auch “Später” auswählen und genau das mache ich.

Erst dann gibt es die ersten Verbindungen, die irgendeinen Nutzen haben. Das sind sogar so viele Anfragen, das ich selbst mit einer guten Internetverbindung, die nicht über ein Mobilfunknetz läuft, einen Moment warten muss.

Übersicht über die Anfragen beim Laden des Hauptbildschirms

Da sind Anfragen an netzmap.com, cloudflare.com, openweathermap.com, itc-halle.de und mdr.de dabei.

Und was bekomme ich dafür?

Startbildschirm der Anwendung

Werbung für Fairtiq (zu diesem Dienst habe ich meine Meinung schon geäußert), das Wetter, Inhalte vom MDR und Inhalten von den Stadtwerken.

Wenn ich eine Schlagzeile wähle wird z.T. ein Bild nachgeladen.

Der Fairtiq-Link öffnet den Fairtiq-Play-Store-Eintrag im Browser, wahrscheinlich weil auf der VM kein Play Store vorhanden ist.

Nun kann man oben das WLAN-Symbol wählen und dann kann man sich anmelden oder “Passwort vergessen” wählen. Beim Wählen von “Passwort vergessen” gibt es nur ein Toast mit dem Text “Es wurde keine E-Mail gefunden!”. Wie soll das auch eine E-Mail finden, die App kann ja selbst wenn ich einen E-Mail-Client einrichte nicht auf die E-Mails zugreifen. Dann wähle ich “Anmelden” und gebe Unsinn ein. Dann geht eine Anfrage an https://meinhalle-accdb.swh.de/user/login, die “meine” E-Mail-Adresse und das Passwort enthält.Zusätzlich gibt es das Feld “mac”, wahrscheinlich für die Mac-Adresse, aber dieses ist leer. Wenn ich dann zurück gehe und dort “Passwort vergessen” auswähle, dann funktioniert es sogar/ dann werde ich mit der Angabe der vorhin eingegbenen E-Mail-Adresse auf eine entsprechende Webseite weitergeleitet. Was mich da aber verwundert ist der Nutzen der Mac-Adresse. Wird die übertragen, wenn ich die App auf einem echten Gerät verwende? Warum? Authentifiziere ich mich beim WLAN damit? Ist das im entferntesten sicher/ kann ich da nicht einfach mir per Sniffer/ Laptop in Netzwerkreichweite MAC-Adressen von Nutzern holen und diese dann selbst verwenden, um illegale Downloads/ was auch immer auf fremden Namen durchzuführen? Dagegen spricht, das Apps seit Android 6 nicht auf die MAC-Adressen zugreifen können sollen. Das ist aber alles eine theoretische Betrachtung, möglicherweise sollte man das mal testen.

Es gibt in der App auch eine Datenschutzerklärung, und die scheint meine These zu bestätigen:

Auszug aus der Datenschutzerklärung der App

In der Datenschutzerklärung ist man hierzu transparent, das muss ich loben.

ein weitererr Auszug aus der Datenschutzerklärung der App

Das WLAN muss ich mir wirklich mal ansehen - ob das wirklich verschlüsselt ist? Die Nutzungsbedingungen sagen da genau das Gegenteil:

ein Auszug aus den Nutzungsbedingungen

Dann registriere ich mich doch mal für das WLAN. Ist ja nur eine VM, die kann von mir aus “gesperrt” werden. Dann werden 3 Anfragen gesendet, an https://meinhalle-accdb.swh.de/user/register, https://meinhalle-accdb.swh.de/user/login und https://meinhalle-accdb.swh.de/user/isActivated/test@test.test. Was mir dabei auffällt: Die Anfrage an register und login sieht genau gleich aus. Speichert die App meine Zugangsdaten im Klartext auf dem Gerät? Und was auch noch auffällt: In den Antworten gibt es keine individuelle ID und auch keinen Zugangstoken o.ä. - das spricht für meine Theorie mit der “Authentifizierung” per MAC-Adresse.

Was gibt es sonst noch in der App? Ein Schalter für das Tracking und einen Schalter für Benachrichtigungen (beides in den Einstellungen) und die Tabs vom Startbildschirm.

Bei den Nachrichten werden RSS-Feeds vom MDR und https://itcgeocms-p01.itc-halle.de/ws/gcarticle/v1.0/?apikey=743-6405-500-7306-8444-8733 geladen. Bei der zweiten URL kann ich den API-Key, den ich quasi geschenkt bekommen habe (weil ich keinen Extraaufwand hatte, um ihn zu bekommen) nicht entfernen, weil es dann eine Fehlermeldung gibt. Als Sicherheitsmechanismus eignet der sich aber überhaupt nicht, weil ich ihn ja direkt serviert bekommen habe - da verstehe ich den Nutzen nicht. Das {"source":"brain-GeoCMS 5.23.23","copyright":"(c) Brain-SCC GmbH, 2020","modul":"gcarticle","status":0, am Anfang bei den Inhalten von der zweiten URL kommentiere ich nicht - das sollte man verstehen können.

Bei den Terminen gibt es etwas ähnliches - https://itcgeocms-p01.itc-halle.de/ws/gcevent/v1.0/?apikey=3274-1699-3218-8846-8274-7044Y. In der Antwort selbst steht Nichts von GeoCMS, aber das gesetzte Cookie und die ähnliche URL machen es sehr sicher, das auch das von diesem System kommt. Und auch hier gibt es ohne API-Key keine Inhalte - wieder eine komische Sicherheitsmaßnahme. Hier sind die Bild-URLs lustig, wie z.B. http://itcgeocms-p01.itc-halle.de/de/datei/zuschneiden/100x100/id/666923,1181/cef1b96188072467. Da frage ich mich, ob das “Zuschneiden” in der URL vom Geo-CMS oder vom Benutzer kommt.

Dann gibt es noch die “Mobile M.app”. Was ich sehe:

M.app in der App - funktioniert nicht

Aber wenn ich die entsprechende URL - https://www.netzmap.com/app/swh-app?os=android&version=6.0&user_token=kjeuge883gjs02jks02kszrine207jaap&test_feature=locate_me&user_tracking=allow - im Brwoser öffne, dann sehe ich wahrscheinlich das, was dort hätte erscheinen sollen:

M.app im Tor-Browser; da funktioniert es

netzmap.com scheint irgendetwas mit Halle zu tun zu haben; Beim Aufruf von netzmap.com gibt es direkt den Plan von Halle (und das bei der Nutzung im Tor-Browser, da wird keine Geolocation mitgeholfen haben).

Das zähle ich aber nicht als Bestandteil der App, weil es nur ein WebView ist.

Dann zum letzten Tab - “Service”:

Service-Tab in der Mein-Halle-App

Beim Entsorgungskalender habe ich ein WebView erwartet, aber es kam nicht so. Das ist nativ integriert und sendet Anfragen wie z.B. https://data.swh.de/connector-1/hws/entsorgungskalender.json?street=Universit%C3%A4tsplatz&no=1. Bei unvollständigen Anfragen (im Sinne von ungenauen Ortsangaben) gibt es sogar Vorschläge, wie z.B. unter https://data.swh.de/connector-1/hws/entsorgungskalender.json?street=Univer&no=0.

Anmerkung dazu: Auch hier braucht man “Zugangsdaten”, die mir mitmproxy liefert (es war zwar noch Base64 kodiert, aber das lässt sich leicht dekodieren). Mit echo c3doYXBwOi9WTXs/JkNAWWdac30hN0A= | base64 --decode bekommt man die Zugangsdaten, wobei der Doppelpunkt den Nutzernamen vom Passwort trennt.

Bei den WLAN-Standorten gibt es eine Google-Maps-Integration … mit den WLAN-Standorten. Warum in der in der App enthaltenen WLAN-Anleitung bei “einigen Standorten” ein Link ist zu einer Webseite/ warum diese Google-Maps-Integration dort nicht verwendet wird, erschließt sich mir nicht.

Bei den Wohnungsangeboten wird jetzt anstelle von JSON auf einmal XML verwendet. Hier sehe ich nur Anfragen, ob die Sitzung noch gültig ist und Anfragen nach den Bildern, die man dort in der App sieht. Warum man Bilder Base64-kodiert und dann in eine XML-Hülle packt, die Nichts hinzufügt, was nicht auch die Metadaten des Bildes oder die Header bieten könnten, verstehe ich nicht:

Ja, man kann Bilder per XML übertragen ...

Ja, und das kam wieder vom Geo-CMS. Die Liste wird aber schon beim Starten der App geladen. Aber weil auch hier “Sicherheitsmaßnahmen” sind muss sich die App erst einmal (mit vermutlich hardkodierten Zugangsdaten) anmelden, um sich eine Sitzungs-ID zu holen.

Anmeldung beim Backend Erhalt einer Sitzungs-ID

Die Sitzungs-ID geht dann in eine andere Anfrage und deren Antwort ist die Liste der Wohnungsangebote:

Liste von Wohnungsangeboten - als XML kodiert

Besonders interessant: Vor jeder Anfrage in diesem Bereich (also auch, wenn beim Scrollen ein Bild geladen wird), passiert Folgendes:

  1. Es wird eine Anfrage gesendet, mit der danach gefragt wird, ob die Sitzungs-ID noch gültig ist
  2. Falls die Antwort nein war, wird wie am Anfang eine neue Sitzungs-ID erstellt
  3. Die eigentliche Anfrage wird gesendet

Solange ich mich nicht anmelde sehe ich keinen Nutzen der “Authentifizierung”. Man hätte ja auch einen API-Key nutzen können wie beim Rest, auch wenn ich selbst das nicht machen würde. Das Nachfragen, ob eine Sitzung noch gültig ist, ist wie das Konzept “Erst Testen, ob eine Datei existiert, dann öffnen”. Man sollte einfach eine Datei öffnen und wenn das fehlschlägt kann man immer noch prüfen, ob das System das damit begründet, dass die Datei nicht existiert. Genauso hätte man also einfach 3. machen können und bei einem Fehler erst 2. und danach nochmal 3. ausführen können.

Wenn man einen Eintrag auswählt gibt es keine weiteren Anfragen - es werden die gleichen Bilder wie in der Liste verwendet (die hier aber die volle Bildschirmbreite einnehmen) und die Texte sind schon alle in der XML-Liste enthalten gewesen

Unter “Einführung” gibt es das selbe wie beim Starten der App, das ist langweilig.

Hinter “Facebook” und “YouTube” verbergen sich einfach nur Links zur Facebook-Seite und dem YouTube-Kanal der Stadtwerke, die jeweils im Browser geöffnet werden. Möglicherweise werden die in der nativen App geöffnet, wenn man die hat.


Natürlich muss man auch bedenken, das die Technologie von Brain-SCC wahrscheinlich schon etwas älter ist. Aber das umständliche Abrufen der Wohnungsangebote in dem Moduls, was höchstwahrscheinlich von Brain-SCC stammt kann ich mir damit nicht erklären. Auch die ganzen Zugangsdaten, die wahrscheinlich hardkodiert sind, kann ich mir mit dem Alter des Systems nicht erklären. Aber diese Zugangsdatenproblematik findet man ja auch bei dem Entsorgungskalendermodul, das wahrscheinlich bei ITC Halle entstanden ist.

Weder seitens ITC Halle noch von Brain-SCC habe ich hier etwas gesehen, das mich vollständig überzeugt hat. Leider kann man bein Brain-SCC nicht sehen, wie viel so etwas kostet, sondern nur ein “Individuelles Angebot anfordern”. Dabei wäre es ganz interessant gewesen, wie viel dafür ausgegeben wurde.