LineageOS: Weder sicher noch datenschutzfreundlich – Custom-ROMs Teil4

1. Auf dem PrüfstandLineageOS

In der Artikelserie »Custom-ROMs« möchte ich einige alternative Android-Systeme näher beleuchten. Der Schwerpunkt wird in der Analyse des Datensendeverhaltens liegen. Es wird geprüft, wohin die Custom-ROMs Verbindungen aufbauen und welche Daten dabei übermittelt werden. Die Ergebnisse sollen Aufschluss darüber geben, wie datenschutzfreundlich ein Custom-ROM in der Standardkonfiguration ist und Tipps ableiten, wie sich das »Nach-Hause-Telefonieren« einschränken oder sogar vollständig abschalten lässt.

Im vorliegenden Beitrag wird LineageOS einer Analyse unterzogen. Das Custom-ROM wird wie folgt beworben:

Your data, your rules. Along with monthly security updates to every supported device, we enhance existing privacy touchpoints around the OS and keep you informed of how the system shares your data.

Wird LineageOS dem gerecht? Nachfolgend werfen wir einen Blick in das Datensendeverhalten des Systems.

Dieser Beitrag ist Teil einer Artikelserie:

2. LineageOS

LineageOS ist ein kostenloses Betriebssystem für Smartphones und Tablets, das auf dem quelloffenen Android von Google basiert. Es wurde entwickelt, um eine Alternative für das eingestellte CyanogenMod-ROM zu bieten. Die Entwickler haben den Namen »Lineage« (engl. Abstammung/Herkunft) gewählt, um die Verbindung des Betriebssystems mit seinen Wurzeln und der Abstammungslinie von Android zu betonen. Eine Gemeinschaft von Freiwilligen entwickelt LineageOS als Freie Software und bietet es kostenlos zum Download an. Das Betriebssystem ist für eine Vielzahl von Geräten verfügbar, wie das Fairphone (FP3 und FP4), Samsung (S10 etc.) und Google (Pixel 3, Pixel 4, Pixel 6a etc.). Allerdings sollte man bei einigen Geräten keine vollständigen Sicherheitsupdates von proprietären Komponenten wie Bootloader oder Firmware erwarten. So werden bspw. Geräte wie das Google Pixel 3 nicht mehr mit entsprechenden Updates vom Hersteller versorgt. LineageOS richtet sich vermutlich hauptsächlich an Anwender, deren Fokus im Betrieb älterer Geräte liegt, die selbst keine Android-Updates mehr von den Herstellern erhalten.

Im Vergleich zu den analysierten Custom-ROMs CalyxOS und iodéOS erfordert die Installation von LineageOS etwas mehr Aufwand. Es gibt keine einfache Installationsroutine oder ein Installer-Skript, was bedauerlich ist. Stattdessen muss der Nutzer durch eine umfangreiche Dokumentation navigieren, was gerade für Anfänger eine Herausforderung darstellen kann. Daher ist der Einstieg in LineageOS im Vergleich zu Betriebssystemen wie GrapheneOS oder iodéOS etwas anspruchsvoller. Die Hürde, LineageOS zu betreiben, liegt damit ungleich höher.

Interessierte können sich vorab über LineageOS im Wiki informieren und im über diverse Support-Kanäle (IRC, Reddit, Discord) Hilfe erhalten. Leider gibt es keine Übersicht darüber, welche Netzwerkverbindungen das System und die mitgelieferten Apps initiieren. Es ist nirgendwo dokumentiert. Nachfolgend werden wir dies nun ändern.

Tschüß Überwachungswanze

Der Verzicht auf die Google-Play-Dienste geht übrigens mit einer erheblichen Steigerung der Privatsphäre einher. Im Beitrag »Google Play Services: Die Überwachungswanze von Google« ist aufgezeigt, welche Daten Google von einem Gerät erhebt – und das, obwohl praktisch alle Einstellungen möglichst datenschutzfreundlich konfiguriert wurden.

2.1 Verwendetes Setup

Während der erstmaligen Einrichtung von LineageOS kann die Standortermittlung und die Übersendung von Diagnose- und Nutzungsdaten aktiviert/deaktiviert werden. Unabhängig von eurer Entscheidung bei der Einrichtung können die Einstellungen jederzeit während des Betriebs angepasst werden:

Einrichtungsassistent

Während der mehrwöchigen Testphase kamen folgende LineageOS-Versionen zum Einsatz:

  • Google Pixel 6a (bluejay): 20-20230401-NIGHTLY-bluejay (1. April 2023)
  • Google Pixel 6a (bluejay): 20-20230408-NIGHTLY-bluejay (8. April 2023)

2.2 Privates DNS

Standardmäßig ist die Option »Privates DNS« auf Automatisch eingestellt. Über Einstellungen -> Netzwerk & Internet -> Privates DNS wird die Einstellung auf Aus gestellt. DNS-Anfragen sollen meinen (Test-)Router erreichen bzw. für diesen lesbar sein und nicht über DNS over TLS getunnelt werden.

3. Datensendeverhalten: Start – Anmeldung – Updates

Sowohl die Voraussetzungen an die System-Umgebung, als auch die (Netzwerk-)Tools, mit denen die Datenmitschnitte erfolgen, sind im ersten Teil der Artikelserie beschrieben. Nachfolgend werden unterschiedliche (Anwendungs-)Szenarien beleuchtet. Was passiert bspw. beim Geräte-Start? Welche Verbindungen werden bei der Aktivierung der GPS-Schnittstelle initiiert? Und welche Daten übermittelt der Standard-Browser nach dem Aufruf?

3.1 Start/Neustart

Noch während des Boot-Vorgangs bzw. sobald ein Netzwerkinterface (WiFi, Mobile) verfügbar ist, werden folgende (DNS-)Namensauflösungen initiiert:

  • www.google.com
  • time.android.com
  • connectivitycheck.gstatic.com

Nach der Auflösung der Domainnamen in die zugehörige IP-Adresse startet das System eine Aktualisierung der (Netzwerk-)Zeit via NTP zum Server time.android.com. Unmittelbar danach erfolgt ein Connectivity- bzw. Captive-Portal-Check, um sicherzustellen, dass ein Gerät vom Access-Point bzw. Internet Service Provider nicht nur eine IP-Adresse erhalten hat, sondern tatsächlich auch Ziele im Internet erreichen kann. Zur Prüfung, ob eine Verbindung besteht, sendet Android eine Anfrage an die Adresse connectivitycheck.gstatic.com. Die Überprüfung der Konnektivität erfolgt durch folgende GET-Anfrage:

GET http://connectivitycheck.gstatic.com/generate_204

User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36
Host: connectivitycheck.gstatic.com
Connection: Close
Accept-Encoding: gzip
Content-Length: 0

Als Antwort erfolgt dann ein 204er-Statuscode:

Response Version: HTTP/1.1
Status Code: 204
Connection: Close
Content-Length: 0

Die dritte Verbindung erfolgt dann zu www.google.com und ist eine Art Fallback, wenn die unverschlüsselte HTTP-Verbindung zu connectivitycheck.gstatic.com fehlschlägt. Während der Tests erfolgte die Verbindung zu www.google.com jedes Mal, sobald der Captive-Portal-Check durchgeführt wurde.

Datenminimierung

Bei LineageOS kann der Captive-Portal-Check über die GUI weder auf einen anderen Server umgeleitet, noch deaktiviert werden. Datenschutzsensible Nutzer können den Server aber bspw. über die adb-Kommandozeile anpassen. Details dazu findet ihr in der Empfehlungsecke.

Der Vollständigkeit wegen: Beim ersten Start/Anmeldung des Geräts tauchte im Datenmitschnitt ebenfalls die Domain remoteprovisioning.googleapis.com auf. Diese Gegenstelle dient der Erneuerung der Zertifikatsketten, die für die hardwarebasierte Beglaubigung als Teil der Hardware-Keystore-API – Remote Provisioning genannt – benötigt werden. Details dazu siehe »CalyxOS: De-Googled geht anders – Custom-ROMs Teil2« Ziffer 3.2 »Nach Anmeldung am System«. Diese Verbindung trat nur einmalig auf und konnte von mir inhaltlich leider nicht erfasst werden, da die Schritte zum Mitschnitt TLS-verschlüsselter Verbindungen zu diesem Zeitpunkt noch nicht erfolgt sind.

3.2 Geräte-Updates

LineageOS prüft regelmäßig (bspw. nach einem Geräte-Neustart), ob neue System-Updates zur Verfügung stehen. Der Update-Check erfolgt über die Adresse download.lineageos.org:

GET https://download.lineageos.org/api/v1/bluejay/nightly/998656efca

User-Agent:       Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)                                                                                                                 
Host:             download.lineageos.org                                                                                                                                                                 
Connection:       Keep-Alive                                                                                                                                                                             
Accept-Encoding:  gzip

Als Antwort erfolgt dann (hier im Beispiel Update auf LineageOS 20-20230408-NIGHTLY-bluejay):

{
   "response": [
       {
           "datetime": 1680912000,
           "filename": "lineage-20.0-20230408-nightly-bluejay-signed.zip",
           "id": "56b5234b8810297ac3f6b822e554096d5abe6f0b32095de9d516c167bd2abb68",
           "romtype": "nightly",
           "size": 1143866634,
           "url": "https://mirrorbits.lineageos.org/full/bluejay/20230408/lineage-20.0-20230408-nightly-bluejay-signed.zip",
           "version": "20.0"
       },
[...]

Darin sind Informationen des neuen Builds bzw. inkrementellen Updates enthalten:

  • Dateiname: lineage-20.0-20230408-nightly-bluejay-signed.zip
  • Bezugsquelle: https://mirrorbits.lineageos.org/full/bluejay/20230408/lineage-20.0-20230408-nightly-bluejay-signed.zip
  • Version: 20.0
  • […]

Sofern ein Update bereitsteht, wird der Download nicht automatisch initiiert, sondern der Nutzer muss dies mit einem Tipp auf HERUNTERLADEN auslösen:

GET https://ftp.fau.de/lineageos/full/bluejay/20230408/lineage-20.0-20230408-nightly-bluejay-signed.zip

User-Agent:       Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)                                                                                                                        
Host:             ftp.fau.de                                                                                                                                                                                    
Connection:       Keep-Alive                                                                                                                                                                                    
Accept-Encoding:  gzip

Fassen wir zusammen: Die Prüfung auf Updates und auch die anschließende Benachrichtigung erfolgt automatisch. Das Herunterladen und auch die Installation der neuen Version muss allerdings vom Nutzer initiiert werden. Bei Systemen wie GrapheneOS oder CalyxOS erfolgt dies alles automatisch, was ich in Bezug auf Sicherheit als vorteilhaft(er) empfinde.

Bevor ein Update heruntergeladen wird, führt LineageOS eine Überprüfung der Geo-Informationen (IP-Adresse) durch, um festzustellen, welcher Server am nächsten oder am besten erreichbar ist. Diese Überprüfung erfolgt über die Adresse »mirrorbits.lineageos.org«, um den Standort zu ermitteln, von dem das Update bezogen wird. In meinem Fall ist das die Friedrich-Alexander-Universität Erlangen-Nürnberg bzw. der Server »ftp.fau.de«.

Update-Informationen werden übrigens bei einem LineageOS-Server geladen, der wiederum das Content Delivery Network Cloudflare einsetzt. Die Adresse bzw. Gegenstelle download.lineageos.org löst direkt zu Cloudflare auf.

3.3 Aktivierung SIM-Karte

Bei der (ersten) Inbetriebnahme der SIM-Karte initiiert die App Carrier Settings eine Verbindung zu Google Firebase – eine Entwicklungsplattform für mobile Anwendungen:

POST https://firebaseinstallations.googleapis.com/v1/projects/paris-75482/installations

Content-Type:       application/json                                                                     
Accept:             application/json                                                                     
Content-Encoding:   gzip                                                                                
Cache-Control:      no-cache                                                                             
X-Android-Package:  com.google.android.carrier                                                          
x-firebase-client:  H4sIAAAAAAAAAKtWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA                 
X-Android-Cert:     1E865463E6DD6A422A7EC053ACC11F4CE4E202F5                                            
x-goog-api-key:     AIzaSyBofHJ4bF9fGUZdB0e_3aPnXnICcxpimZ4                                              
User-Agent:         Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)               
Host:               firebaseinstallations.googleapis.com                                                 
Connection:         Keep-Alive                                                                           
Accept-Encoding:    gzip                                                                                 
Content-Length:     136                                                                                 
[decoded gzip] JSON                                                                             
{                                                                                                        
    "appId": "1:841606297009:android:63f3eef9023344d7",                                                  
    "authVersion": "FIS_v2",                                                                             
    "fid": "d98p2ApeReSRVQSBri0cC5",                                                                    
    "sdkVersion": "a:17.0.2_1p"                                                                         
}

Die Anwendung Carrier Settings führt einige Systemeinstellungen für das Modem und den Netzbetreiber durch, darunter auch APN-Einstellungen. Mir bleibt jedoch unklar, weshalb dazu eine Verbindung zu firebaseinstallations.googleapis.com notwendig ist, um diese Einstellungen vorzunehmen. Offenbar ist dieser ganze Vorgang nicht notwendig, denn Projekte wie DivestOS, CalyxOS und GrapheneOS entfernen die Carrier-Settings-App (und mehr) aus dem System.

4. Datensendeverhalten: Im Betrieb

4.1 24 Stunden Mitschnitt

Das Smartphone wird innerhalb eines 24-Stunden-Zeitraums nicht benutzt. Stattdessen wird geprüft, welche Verbindungen das (Standard-)System innerhalb von 24 Stunden initiiert hat. Neben Updates-Checks (download.lineageos.org) wurde mehrmals versucht, die (Netzwerk-)Zeit via NTP zu aktualisieren. Ansonsten wurden keine weiteren Verbindungen vom System initiiert. Das ändert sich natürlich dann, wenn der Nutzer weitere Apps installiert und diese bspw. mittels Polling/Push Daten abfragen bzw. erhalten.

4.2 24 Stunden Mitschnitt [mit Diagnose- und Nutzungsdaten]

Sofern die Übermittlung von Diagnose- und Nutzungsdaten aktiviert ist, werden diese in regelmäßigen Abständen (stündlich, bei einem Update-Check, Aufbau Netzwerverbindung) an die Gegenstelle stats.lineageos.org übermittelt, die bei Cloudflare gehostet wird:

POST https://stats.lineageos.org/api/v1/stats

Content-Type:     application/json; charset=UTF-8                                                        
User-Agent:       Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)                 
Host:             stats.lineageos.org                                                                    
Connection:       Keep-Alive                                                                             
Accept-Encoding:  gzip                                                                                   
Content-Length:   228                                                                                    
JSON                                                                                            
{                                                                                                        
    "device_carrier": "vodafone.de/UNKNOWN",                                                                         
    "device_carrier_id": "0",                                                                            
    "device_country": "DE",                                                                              
    "device_hash": "F538C9CC8B28599D4B40E0AD9A053D31CE687243E1FF26D97BDFBFB15BC7F69D",                   
    "device_name": "bluejay",                                                                            
    "device_version": "20.0-20230401-NIGHTLY-bluejay"                                                    
}

Datenminimierung

Die Übermittlung von Diagnose- und Nutzungsdaten ist optional. Über Einstellungen -> Datenschutz -> Trust -> LineageOS-Statistiken -> Statistikaufzeichnung lässt sich dies deaktivieren.

4.3 Aktivierung Netzwerkschnittstelle

Bereits während des Boot-Vorgangs wird ein Captive-Portal-Check durchgeführt, sofern ein Netzwerkinterface (WiFi, Mobile) aktiv ist. Wird das Gerät in der Zwischenzeit in den Flugmodus versetzt und danach wieder eine Netzwerkschnittstelle aktiviert, wird erneut ein Captive-Portal-Check initiiert. Das bedeutet erneut ein Verbindungsaufbau zu connectivitycheck.gstatic.com bzw. www.google.com. Was dabei auffällt: Die Verbindungen werden nicht durch das VPN getunnelt, sondern werden einfach daran vorbeigeführt. Das hat mich stutzig gemacht, denn selbst wenn bei der VPN-Verbindung die Option Verbindungen ohne VPN blockieren aktiv ist, werden die Captive-Portal-Checks einfach am VPN vorbeigetunnelt. Android leakt also Traffic, was nicht nur die VPN-Option infrage stellt, sondern ein echtes Problem hinsichtlich der Privatsphäre sein kann. Wenn einfach Daten an einem VPN-Tunnel vorbeigeschleust werden können, dann ist die Implementierung fragwürdig.

Das Problem scheint übrigens nicht neu zu sein. Mullvad VPN hatte darüber bereits im Oktober 2022 berichtet: Android leaks connectivity check traffic. Offenbar wird Google an diesem Verhalten allerdings nichts ändern. Ein dazu eingereichtes Issue hat den Status »Won’t Fix« (Intended Behavior). Begründet wird das wie folgt:

We have looked into the feature request you have reported and would like to inform you that this is working as intended. We do not think such an option would be understandable by most users, so we don’t think there is a strong case for offering this.
As for disabling connectivity checks :

  • the VPN might be actually relying on the result of these connectivity checks (they are available through public APIs).
  • the VPN may be a split tunnel, letting part of the traffic over the underlying network, or only affect a given set of apps. In both these cases, the connectivity checks are still necessary for smooth operation of all the legitimate traffic that doesn’t go over the VPN.
  • the connectivity checks are far from the only thing exempted from the VPN ; privileged apps can also bypass the VPN and this is necessary for their operation in many cases. An example is IWLAN, or tethering traffic.
  • it’s unclear to us what specific privacy impact is meant. The connectivity checks reveal there is an Android device at this address, which is plenty clear from the L2 connection and from the traffic going over the VPN anyway.

Ich zitiere mal eine entscheidende Stelle:

We do not think such an option would be understandable by most users, […]

Einverstanden. Aber wenn jemand aktiv die Option Verbindungen ohne VPN blockieren aktiviert, dann erwartet er genau das – mit all seinen Konsequenzen. So sehe ich das jedenfalls. Die Connectivity-Checks am VPN vorbei sind technisch zwar nachvollziehbar, aber dann sollte das verständlicher erklärt werden. Das Setzen der Option Verbindungen ohne VPN blockieren ist in meinen Augen irreführend. Dazu kommt ja auch noch:

the connectivity checks are far from the only thing exempted from the VPN ; privileged apps can also bypass the VPN and this is necessary for their operation in many cases. An example is IWLAN, or tethering traffic.

Merke: Man kann sich nie sicher sein, welche System-Apps bzw. Datenverbindungen am VPN vorbeigeschleust werden.

Datenminimierung

Bei LineageOS kann der Captive-Portal-Check über die GUI weder auf einen anderen Server umgeleitet, noch deaktiviert werden. Datenschutzsensible Nutzer können den Server aber bspw. über die adb-Kommandozeile anpassen. Details dazu findet ihr in der Empfehlungsecke.

Abgesehen vom Captive-Portal-Check werden beim Start des Systems bzw. bei Herstellung einer Netzwerkverbindung häufig – aber nicht immer – die folgenden Verbindungen vom System initiiert:

GET /webref-ondevice/aiai/19071200_pir/2/de-de/superpacks_manifest.zip HTTP/1.1
User-Agent: superpacks
Host: gstatic.com
Connection: close
Accept-Encoding: gzip, deflate

LineageOS versucht hier offenbar Manifest-Datei(en) zu laden, die Informationen darüber enthalten, welche Ressourcen oder Pakete für eine bestimmte Anwendung oder Funktion erforderlich sind. Die meisten Anfragen laufen allerdings ins Leere bzw. werden mit einem HTTP 404-Error quittiert:

  • https://gstatic.com/webref-ondevice/aiai/19071200_pir/2/de-de/superpacks_manifest.zip [404 Error]
  • https://gstatic.com/matchmaker/tclib_models/actions/v104/de-de/superpacks_manifest.zip [404 Error]
  • https://gstatic.com/matchmaker/tclib_models/actions/v104/de/superpacks_manifest.zip [404 Error]
  • https://gstatic.com/matchmaker/tclib_models/actions/v104/default/superpacks_manifest.zip [404 Error]

Daneben werden auch Sprachpakete angefragt:

  • https://gstatic.com/nasa/apps/pack_spelling_checker_08042021/21080420/2/en-us/superpacks_manifest.zip
  • https://dl.google.com/translate/offline/manifest/aiai/p21/manifest.pb
  • https://dl.google.com/translate/offline/package_profile/7/5/1/translate_premium.pb.zlib

Datenminimierung

Weshalb bzw. durch welche (System-)App diese Anfragen initiiert werden oder wie man diese deaktiviert, bleibt unklar.

4.4 Browser: Jelly Browser

Der mitgelieferte Browser nennt sich Jelly, der die in Android mitgelieferte WebView für die Darstellung von Webseiten nutzt. Im Gegensatz zu Chrome soll der Browser leichtgewichtiger sein und wurde offenbar speziell für mobile Endgeräte optimiert. Unmittelbar nach dem ersten/initialen Start werden folgende Verbindungen initiiert:

  • google.com (Startseite)
  • fonts.gstatic.om (Startseite)
  • apis.google.com (Startseite)
  • consent.google.com (Startseite)
  • update.googleapis.com (Update-Check)
  • dl.google.com (Update-Check)
  • edgedl.me.gvt1.com (Update-Check)

Man kann die Anzahl der Google-Aufrufe reduzieren, die beim Start des Jelly-Browsers durchgeführt werden, indem man die voreingestellte Startseite von »google.com« auf eine andere Website ändert. Um dies zu tun, kann man die Einstellungen des Browsers öffnen und dann unter Startseite eine andere Website auswählen, die als Startseite des Browsers angezeigt werden soll.

Die Gegenstelle »update.googleapis.com« fungiert offenbar als Update-Check für den Browser bzw. die im System mitgelieferte WebView-Version:

POST https://update.googleapis.com/service/update2/json?cup2key=12:lp0D-nsRLLeeH1x2KbGEZvYy0rXDrMirNNBXrAWzquA&cup2hreq=2fd223ed5297e20c038e16b73ab4abc5f3322094f9bfc9b88edfcc582c58018f

Content-Type:                 application/json                                                                                                                                                                  
X-Goog-Update-AppId:          llkgjffcdpffmhiakmfcdcblohccpfmo,kiabhabjdbkjdpjbpigfodbdjmbglcoo,imefjhfbkmcmebodilednhmaccmincoa,aemllinfpjdgcldgaelcgakpjmaekbai                                               
X-Goog-Update-Interactivity:  bg                                                                                                                                                                                
X-Goog-Update-Updater:        androidwebview-111.0.5563.116                                                                                                                                                     
Content-Length:               1029                                                                                                                                                                              
User-Agent:                   Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)                                                                                                            
Host:                         update.googleapis.com                                                                                                                                                             
Connection:                   Keep-Alive                                                                                                                                                                        
Accept-Encoding:              gzip                                                                                                                                                                                            
{
    "request": {
        "@os": "android",
        "@updater": "androidwebview",
        "acceptformat": "crx3",
        "app": [
            {
                "appid": "llkgjffcdpffmhiakmfcdcblohccpfmo",
                "enabled": true,
                "ping": {
                    "r": -2
                },
                "updatecheck": {},
                "version": "0.0.0.0"
            },
            {
                "appid": "kiabhabjdbkjdpjbpigfodbdjmbglcoo",
                "enabled": true,
                "ping": {
                    "r": -2
                },
                "updatecheck": {},
                "version": "0.0.0.0"
            },
[...]

Über die Gegenstellen »edgedl.me.gvt1.com« und »dl.google.com« werden nach einer Prüfung die Updates der Komponenten bezogen:

GET https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/a44ttxi7dbeuuxrvvnv2wl4poy_2023.4.11.2/kiabhabjdbkjdpjbpigfodbdjmbglcoo_2023.04.11.02_all_npzfphtj5okzvw3fm5ym2ntvjy.crx3

User-Agent:       Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)                                                                                                                        
Host:             edgedl.me.gvt1.com                                                                                                                                                                            
Connection:       Keep-Alive                                                                                                                                                                                    
Accept-Encoding:  gzip

Das Datensendeverhalten des Jelly-Browsers ist insgesamt stark von Google geprägt, insbesondere vor dem Hintergrund, dass die Update-Funktion auf Google-Infrastruktur angewiesen ist.

Datenminimierung

Abgesehen von der Änderung der Startseite und Suchmaschine (beides Google), lässt sich am Datensendeverhalten wenig beeinflussen.

4.5 (GPS-)Standort

Der Standort eines Smartphones kann auf verschiedene Arten ermittelt werden. Die wohl wichtigsten Hilfsmittel dafür sind GPS/GLONASS, WiFi und das Mobilfunk-Netzwerk. Im Falle von GPS ermittelt das Gerät selbst seine Position durch Kommunikation mit Satelliten. Da die Bestimmung des Standorts via GPS vergleichsweise lang dauert, wird zusätzlich Assisted GPS (abgekürzt als A-GPS) eingesetzt. A-GPS ist ein System, das die Zeit bis zum ersten Fixieren eines satellitengestützten Positionierungssystems (GPS) meist deutlich verbessert – die GPS-Positionsbestimmung wird also beschleunigt. Wie funktioniert das? Bei Mobiltelefonen ist anhand der Funkzelle, in der euer Gerät eingebucht ist, der ungefähre Aufenthaltsort bereits bekannt. Via Secure-User-Plane-Location-Protokoll (SUPL) wird nun dieser ungefähre Standort an einen SUPL-Server gesendet, der anhand dieser Informationen den Suchbereich für die Satellitensignale einschränkt und somit eine schnelle GPS-Positionsbestimmung ermöglicht. Die Kommunikation mit dem SUPL-Server erfolgt via TCP/IP über das UserPlane Location Protocol.

Solch einen SUPL-Server nutzen Android-Systeme, um die Ortungszeit für GNSS (GPS, GLONASS usw.) erheblich zu beschleunigen. Bei LineageOS wird hierbei die Gegenstelle supl.google.com über Port 7275 kontaktiert. Anbei der gekürzte Datenmitschnitt:

Internet Protocol Version 4, Src: 10.215.173.1, Dst: 74.125.133.192
Transmission Control Protocol, Src Port: 51116, Dst Port: 7275, Seq: 1, Ack: 1, Len: 83

[...]

OMA UserPlane Location Protocol
    ULP-PDU
        length: 91
        version
            maj: 2
            min: 0
            servind: 0
        sessionID
            setSessionID
                sessionId: 4
                setId: nai (4)
                    nai: suplsetid@broadcom.com                       
        message: msSUPLSTART (1)
            msSUPLSTART
                sETCapabilities
                    posTechnology
                        ..0. .... agpsSETassisted: False
                        ...1 .... agpsSETBased: True
                        .... 1... autonomousGPS: True
                        .... .0.. aflt: False
                        .... ..1. ecid: True
                        .... ...0 eotd: False
                        0... .... otdoa: False
                        ver2-PosTechnology-extension
                            gANSSPositionMethods: 5 items
                                Item 0
                                    GANSSPositionMethod
                                        ganssId: Galileo (0)
                                        gANSSPositioningMethodTypes
                                            .... ..0. setAssisted: False
                                            .... ...1 setBased: True
                                            1... .... autonomous: True
                                        gANSSSignals: 80 [bit length 1, 7 LSB pad bits, 1... .... decimal value 1]
                                            1... .... = signal1: True
                                            .0.. .... = signal2: False
                                            ..0. .... = signal3: False
                                            ...0 .... = signal4: False
                                            .... 0... = signal5: False
                                            .... .0.. = signal6: False
                                            .... ..0. = signal7: False
                                            .... ...0 = signal8: False

[...]                    
                   
                locationId
                    cellInfo: ver2-CellInfo-extension (3)
                        ver2-CellInfo-extension: lteCell (2)
                            lteCell
                                cellGlobalIdEUTRA
                                    plmn-Identity
                                        mcc: 3 items
                                            Item 0
                                                MCC-MNC-Digit: 2
                                            Item 1
                                                MCC-MNC-Digit: 6
                                            Item 2
                                                MCC-MNC-Digit: 2
                                        mnc: 2 items
                                            Item 0
                                                MCC-MNC-Digit: 0
                                            Item 1
                                                MCC-MNC-Digit: 2
                                    cellIdentity: 1190420 [bit length 28, 4 LSB pad bits, 0001 0001  1001 0000  0100 0001  0100 .... decimal value 18416660]
                                physCellId: 280
                                trackingAreaCode: b876 [bit length 16, 1011 1000  0111 0110 decimal value 47222]
                                rsrpResult: -53dBm <= RSRP < -52dBm (88)
                                rsrqResult: -16,0dB <= RSRQ < -15,5dB (8)
                                ta: 5
                                earfcn: 6300
                    status: current (1)
                qoP
                    horacc: 51,159090m (19)
                    maxLocAge: 1s

Anders als bei CalyxOS festgestellt, übermittelt LineageOS nicht die personenbeziehbare IMSI-Nummer an den SUPL-Server – ein entsprechender Patch (SUPL: Don’t send IMSI / Phone number to SUPL server) verhindert das. Dennoch wird Google mit ungefähren Standortdaten beliefert, die unter anderem mit der IP-Adresse verknüpft werden können. Um dies zu verhindern, hat bspw. das Custom-ROM GrapheneOS einen SUPL-Proxy-Server aufgesetzt (supl.grapheneos.org), der alle SUPL-Anfragen stellvertretend entgegennimmt bzw. weiterleitet. Das Resultat: Google kann die Anfrage zur Standortermittlung keinem Nutzer/Gerät zuordnen. Fairerweise muss ich allerdings erwähnen, dass GrapheneOS diesen SUPL-Proxy-Server als Reaktion auf meine Analyse zu CalyxOS betreibt. Das Team unter der Leitung von Daniel Micay hat umgehend auf meine kritischen Ergebnisse zu CalyxOS reagiert und eine Lösung für das Google-SUPL-Problem gefunden.

Hinweis: Die Verbindung zum SUPL-Server ist eigentlich TLS-verschlüsselt. Nach einer Anpassung der Datei /system/vendor/gnss/gps.xml erfolgt der Verbindungsaufbau dann unverschlüsselt und konnte mitgelesen werden:

tlsEnable="false"

Datenminimierung

Über »Einstellungen -> Netzwerk & Internet -> SIM-Karten -> Zugangspunkte (APNs) -> [aktuell verwendeter APN] -> APN-Typ« lässt sich das Verhalten beeinflussen. Zumindest theoretisch – denn unter LinageOS ist es mir nicht gelungen, die APN-Einstellungen anzupassen. Entfernt man unter APN-Typ den Wert supl, wird kein SUPL-Server zur schnelleren Standortbestimmung kontaktiert. Die Standortbestimmung erfolgt dann ausschließlich über die GNSS-Schnittstelle, was die Ortungszeit allerdings erheblich verlängert.

Zur Beschleunigung der Standortbestimmung nutzt LineageOS neben SUPL zusätzlich PSDS-Hilfsdaten. PSDS steht für Predicted Satellite Data Service, der Informationen über die Umlaufbahnen, den Status der Satelliten, Daten über die Umweltbedingungen auf der Erde und Informationen zur Zeitanpassung liefert. Die statischen PSDS-Daten bezieht LineageOS von der Gegenstelle »agnss.goog« (Google):

  • https://agnss.goog/rto.dat
  • https://agnss.goog/lto2.dat
  • https://agnss.goog/rtistatus.dat

Außer der IP-Adresse werden bei der Abfrage der sogenannten Almanache keine Informationen übermittelt. Es handelt sich um einfache GET-Anfrage, ohne Parameter. Nachfolgend eine dieser Abfragen:

GET https://agnss.goog/rto.dat

Accept:           */*, application/vnd.wap.mms-message, application/vnd.wap.sic                                                                                                                                 
x-wap-profile:    http://www.openmobilealliance.org/tech/profiles/UAPROF/ccppschema-20021212#                                                                                                                   
User-Agent:       Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6a Build/TQ2A.230305.008.C1)                                                                                                                        
Host:             agnss.goog                                                                                                                                                                                    
Connection:       Keep-Alive                                                                                                                                                                                    
Accept-Encoding:  gzip 

Im Gegensatz zu LineageOS, das die Standardserver von Google verwendet, betreibt GrapheneOS seine eigenen Server, auf denen es die Almanache bereitstellt. Dies verringert die Abhängigkeit von Google:

  • https://broadcom.psds.grapheneos.org/rto.dat
  • https://broadcom.psds.grapheneos.org/lto2.dat
  • https://broadcom.psds.grapheneos.org/rtistatus.dat

5. Tabelle mit Datenverbindungen

LineageOS hat Verbindungen, die vom System initiiert werden, an keiner Stelle dokumentiert. Die nachfolgende Tabelle fasst alle identifizierten Netzwerkverbindungen in einer Übersicht zusammen:

Domain Zweck Einschätzung
connectivitycheck.
gstatic.com
www.google.com
[System]
LineageOS stellt eine Verbindung zu diesem Google-Dienst her, um festzustellen, ob das Gerät eine Verbindung zum Internet herstellen kann. Diese Verbindung ist aus unterschiedlichen Gründen problematisch. Zunächst einmal wird sie am VPN vorbeigeschleust. Wie bereits dargestellt, kann man sich trefflich darüber streiten, ob dies nun ein VPN-Leak darstellt oder eine bewusste Design-Entscheidung.

In der Empfehlungsecke wird erläutert, wie sich der Captive-Portal-Check auf einen anderen Server umleiten oder auch vollständig deaktivieren lässt.

time.android.com
[System]
LineageOS verbindet sich mit diesem Google-Dienst, um die interne Uhr des Geräts zu synchronisieren. Auch hier sitzt wiederum Google am anderen Ende der Leitung. Alternativ könnte LineageOS selbst einen NTP/SNTP-Dienst hosten, um den »Ping« an Google zu vermeiden.
remoteprovisioning.
googleapis.com
[System]
Anforderung von Zertifikatsketten bzw. Beglaubigung, die dann im Schlüsselspeicher des Geräts abgelegt und dort für Apps bereitgehalten werden. Unter anderem Voraussetzung für Dienste wie SafetyNet. Um die Privatsphäre zu verbessern/wahren, nutzt GrapheneOS einen Reverse-Proxy (https://remoteprovisioning.grapheneos.org). LineageOS hingegen bietet eine solche Möglichkeit nicht. Hier erfolgt eine direkte Verbindung mit dem Key-Provisioning-Server von Google. [Anmerkung: Verbindung trat nur einmalig auf]
download.lineageos.org
[System]
Wird verwendet, um nach System-Updates zu suchen bzw. diese zu beziehen. LineageOS nutzt Cloudflare als CDN – das ist nicht ideal, aber soll an dieser Stelle nicht zur Abwertung führen.
firebaseinstallations.
googleapis.com
[Carrier Settings]
Wird einmalig durchgeführt. Projekte wie DivestOS und GrapheneOS zeigen: Das ist nicht notwendig.
stats.lineageos.org
[System]
Übermittlung von Diagnose- und Nutzungsdaten. Standardmäßig ist die Übermittlung der Diagnose- und Nutzungsdaten vorausgewählt. Das führt zur Abwertung.
gstatic.com
dl.google.com
[System]
LineageOS versucht Manifest-Datei(en) und Sprachpakete zu laden. Weshalb bzw. durch welche (System-)App diese Anfragen initiiert werden oder wie man diese deaktiviert, bleibt unklar.
update.googleapis.com
dl.google.com
edgedl.me.gvt1.com
[Jelly Browser]
Sowohl Prüfung als Aktualisierung der Browser-Komponenten (WebView) erfolgt über Google. Das Verhalten lässt sich nicht beeinflussen. Einerseits ist die Prüfung auf (Browser-)Aktualisierungen sinnvoll, anderseits erfolgt diese direkt über Google.
supl.google.com
[System]
Wird für die (Beschleunigung der) Positionsbestimmung verwendet. Die Verwendung eines Google SUPL-Servers ist aus meiner Sicht nicht gerade datenschutzfreundlich. Leider hat der Nutzer keinerlei Einfluss auf das Verhalten – eine Deaktivierung ist nicht vorgesehen.
agnss.goog
[System]
Wird für die (Beschleunigung der) Positionsbestimmung verwendet. Die PSDS-Hilfsdaten werden direkt von Google bezogen. Dabei werden (außer der IP-Adresse) keine sensiblen Daten übermittelt.

6. Zusätzliche Informationen zu/über das Custom-ROM

6.1 Entwickler | Institution

LineageOS selbst beschreibt sich wie folgt:

LineageOS, an open-source Android distribution, is available for several devices, with more being continuously added thanks to the biggest, yet ever growing, Android open-source community. Join us and breathe new life in your device, be it old or new.

Mit ca. 4 Millionen weltweiten Installationen zählt LineageOS zum meistverbreiteten Custom-ROM. Allerdings sollte man sich von der Liste der offiziell unterstützten Geräte nicht »blenden« lassen – von den ca. 400 gelisteten Geräten werden aktuell nur die etwa 200 standardmäßig angezeigten Geräte offiziell unterstützt. Ob euer Gerät nicht nur von LineageOS unterstützt, sondern auch aktiv von einem sog. Maintainer gepflegt wird, könnt ihr auf dem LineageOS-Wiki mit einem Klick auf das entsprechende Gerät herausfinden. Wenn ihr dort auf folgende Warnung in einem roten Kästchen trefft:

The <Device> is no longer maintained. A build guide is available for developers that would like to make private builds, or even restart official support.

ist die Installation nicht (unbedingt) empfehlenswert, da auch hier keine aktuellen Android-Sicherheitsupdates verfügbar sind.

LineageOS wird von einer großen Community getragen und nicht von einem einzelnen Entwickler oder Team entwickelt. Die Qualität und Unterstützung für jedes unterstützte Gerät hängt dabei maßgeblich von den Maintainern ab. Einige Maintainer beseitigen störende Fehler wie fehlenden Ton über Bluetooth über einen längeren Zeitraum nicht, während andere Maintainer möglicherweise schneller reagieren und (Geräte-)Probleme schnell lösen. Es ist auch wichtig zu beachten, dass nicht für jedes unterstützte Gerät einheitliche (Sicherheits-)Updates zur Verfügung stehen. Die Verfügbarkeit von Updates variiert von Gerät zu Gerät und hängt ebenfalls vom Maintainer ab.

6.2 Installationsvorgang

Die Installation von LineageOS ist nicht unkompliziert und birgt gewisse Risiken. Allerdings verläuft die Installation in der Regel reibungslos, solange man sich an die jeweilige Schritt-für-Schritt-Anleitung hält, die im LineageOS-Wiki verfügbar ist. Im Gegensatz zu den bisher untersuchten Custom-ROMs CalyxOS und iodéOS erfordert die Installation von LineageOS etwas mehr Aufwand. Es gibt keine einfache Installationsroutine oder ein Installer-Skript, was bedauerlich ist. Stattdessen muss sich der Nutzer durch eine umfangreiche Dokumentation arbeiten, was besonders für Anfänger oder Einsteiger eine Herausforderung darstellen kann. Daher ist der Einstieg in LineageOS anspruchsvoller und die Hürde, LineageOS zu betreiben, liegt damit höher.

6.3 Verfügbarkeit (Sicherheits-)Updates

Der wirkungsvollste Schutz gegen bekanntgewordene bzw. geschlossene Schwachstellen ist das Einspielen von (Sicherheits-)Updates. Google stellt mittlerweile monatlich Sicherheitsupdates bereit, die traditionell um den 5. eines Monats veröffentlicht werden. Leider stecken viele Anwender in einem Dilemma: Einige Smartphone-Hersteller schaffen es oftmals nicht, zeitnah Updates für ihre herstellerspezifischen Android-Versionen bereitzustellen oder unterstützen ältere ihrer Geräte einfach aus Kostengründen nicht mehr. Damit entsteht zwangsläufig ein »Vakuum« in der Android-Welt, das viele Geräte anfällig für kritische Sicherheitslücken macht.

LineageOS wirbt wie folgt mit dem Thema »Security«:

Your data, your rules. Along with monthly security updates to every supported device, we enhance existing privacy touchpoints around the OS and keep you informed of how the system shares your data.

Laut dieser Aussage erscheinen (Sicherheits-)Updates monatlich. Monatlich bedeutet zwar regelmäßig, aber nicht automatisch auch zeitnah. Die auf dem Testgerät installierte Version 20-20230401-NIGHTLY-bluejay (1. April) erhielt zwar am 8. April ein Update, allerdings wurde das Patch-Level nicht auf den Stand vom 5. April angehoben. Erst am 22. April erschien ein Update auf Version 20-20230422-NIGHTLY-bluejay und damit dann auch die Sicherheitsaktualisierungen vom 5. April – knapp drei Wochen später. Das bedeutet: (Sicherheits-)Updates erscheinen nicht so zeitnah, wie man es von Systemen wie GrapheneOS kennt. Zwei der Schwachstellen vom April-Update (CVE-2023-21085, CVE-2023-21096) wurden als kritisch eingestuft, da sie Angreifern ermöglichen, Schadcode auszuführen. Diese zwei Lücken wurden für LineageOS-Nutzer mit einem Google Pixel 6a erst knapp drei Wochen später geschlossen. Je nach Schweregrad einer Sicherheitslücke ist dies ziemlich träge und setzt Anwender einem unnötigen Risiko aus.

6.4 Alternative zu Google-Play-Diensten

In der Privacy-Szene haben die Google-Play-Dienste nicht umsonst den Ruf einer Überwachungswanze. Im Beitrag »Google Play Services: Die Überwachungswanze von Google« ist aufgezeigt, welche Daten Google von einem Gerät erhebt – und das, obwohl praktisch alle Einstellungen möglichst datenschutzfreundlich konfiguriert wurden.

LineageOS verzichtet auf die Integration der Google Play Services aus folgendem Grund:

Due to licensing restrictions, these apps cannot come pre-installed with LineageOS and must be installed separately.

Wenn Anwender aus Datenschutzgründen auf das Google-Ökosystem verzichten möchten, ist das Fehlen der Play-Dienste natürlich verschmerzbar, ja sogar ideal. Es besteht jedoch die Möglichkeit, die Google Play-Dienste optional nachzurüsten. Hierfür kann entweder MindTheGapps (empfohlen) oder Open GApps verwendet werden, das in verschiedenen Varianten angeboten wird, wie z.B. pico, nano, micro bis hin zu super. Diese Pakete bieten unterschiedliche Funktionsumfänge, die in einer Tabelle verglichen werden. Wenn man nur die Basisfunktionalität benötigt und keine weiteren Google-Apps installieren möchte, ist die Installation der pico-Variante (Open GApps) ausreichend.

Hilf mit die Spendenziele zu erreichen!

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

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

Mitmachen ➡

6.5 Sicherheit/Datenschutz

Für manche der Geräte mag es Ausnahmen geben, aber derzeit unterstützt LineageOS kein Verified Boot. Bei der Installationsanleitung für das Google Pixel 6a wird nicht einmal erläutert, wie man den Bootloader nach der Installation wieder sperrt (engl. locked). Im LineageOS-Wiki steht dazu sogar:

Can/should I relock my bootloader?

Few devices allow for it and even less work properly after that. Relocking can result in actual unusable devices, so be warned!

Bei einem Gerät, das bspw. einen offenen Bootloader (unlocked) hat und/oder bei dem zusätzlich ein Recovery-Image aufgespielt wurde, ist es für einen versierten Angreifer möglich Veränderungen vorzunehmen, die man als Nutzer im Nachhinein nicht erkennt. Ohne die Unterstützung von Verified Boot bewegt sich die Sicherheit von LineageOS auf einem niedrigeren Niveau als die von Standard-Android-Geräten.

Neben den Standard-Sicherheitsfunktionen von Android enthält LineageOS auch Trust, eine Erweiterung, die wichtige Sicherheits- und Datenschutzinformationen an einem zentralen Ort bündelt. Während meiner Überprüfung von Trust stellte ich jedoch fest, dass die installierte Version 20-20230408-NIGHTLY-bluejay nicht auf dem neuesten Stand war. Obwohl der Stand der Android-Sicherheitspatches als aktuell angezeigt wurde. Insgesamt eher ernüchternd. Interessierte Anwender können Trust unter Einstellungen -> Datenschutz -> Trust finden:

Tust

7. Fazit

Wir erinnern uns an das Eingangszitat:

Your data, your rules. Along with monthly security updates to every supported device, we enhance existing privacy touchpoints around the OS and keep you informed of how the system shares your data.

Dem kann ich mich nicht anschließen. Ja, LineageOS unterstützt viele Geräte. Ja, mit LineageOS kann man insbesondere auch ältere Geräte weiter betreiben. Aber: Wer tatsächlich auf Google verzichten möchte bzw. zeitnah Sicherheitsupdates für sein Gerät erhalten möchte, der sollte sich nach einem anderen Custom-ROM umschauen. LineageOS selbst unternimmt keine besonderen Anstrengungen, um sich von Google abzunabeln. Fairerweise muss man aber auch erwähnen: Das haben sie nie behauptet. Der Verzicht auf die Google Apps bzw. Google-Play-Dienste bedeutet nicht automatisch, dass ein Custom-ROM googlefrei ist. Dafür sind weitere Schritte notwendig, die LineageOS allerdings nicht geht.

Insgesamt hinterlässt LineageOS weder einen datenschutzfreundlichen, noch wirklich sicheren Eindruck. Das liegt hauptsächlich an den folgenden Punkten:

  • Trotz Verzicht auf Google Play Services ist LineageOS eng mit Google-Diensten verbandelt
  • Verzögerte Auslieferung von (Sicherheits-)Updates
  • Ältere Geräte erhalten keine vollständigen Sicherheitsupdates von proprietären Komponenten wie Bootloader oder Firmware
  • Keine Unterstützung von Verified Boot
  • Die Qualität von LineageOS auf einem bestimmten Gerät wird maßgeblich durch die Fähigkeiten und den Einsatz des Maintainers beeinflusst

Letztlich richtet sich LineageOS in erster Linie an Nutzer, die ihre älteren Geräte weiterhin nutzen möchten, da sie möglicherweise nicht mehr vom Hersteller mit den neuesten Android-Versionen und Sicherheitsupdates versorgt werden. Aus ökologischer Sicht ist dies auch sinnvoll, da die meisten Geräte hardwareseitig noch einwandfrei funktionieren, aber aufgrund der Konsumorientierung durch den Kapitalismus oft den Platz räumen müssen. Am Ende bedeutet das: Noch mehr Elektroschrott – und darauf können wir alle gut und gerne verzichten.

Über den Autor | Kuketz

Mike Kuketz

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

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

Mehr Erfahren ➡

SpendeUnterstützen

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

Folge dem Blog

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

Bleib aktuell ➡


Diskussion

Ich freue mich auf Deine Beteiligung zum Artikel

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

Abschließender Hinweis

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

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