Einmal alles bitte…
App-Berechtigungen – Eine Welt, in der Apps gerne alles hätte. An dieser Stelle möchte ich einen kurzen Denkanstoß wagen. Was für Apps haben Sie auf Ihrem Smartphone installiert und was für Berechtigungen wurden im Laufe der Zeit vergeben?
Das Thema Berechtigungsanfragen kann sehr umfangreich sein. Ich möchte auf dieser Seite lediglich die Grundlagen aufzeigen, um diese Thematik in den Kontext der mobilen Forensik einzubetten und das Bewusstsein für die potenziellen Risiken von übermäßigen Berechtigungen zu schärfen.
Manifest & Programmierung
Eine Berechtigungsanfrage, wie in der folgenden Abbildung dargestellt, haben viele Smartphone-Nutzer schon mal bekommen. In diesem Fall möchte die App der Narrenzunft-Baienfurt die Berechtigung, auf den Standort des Nutzers zugreifen zu dürfen. Als Entwickler dieser App weiß ich, dass die Standortberechtigung nur benötigt wird, wenn der Nutzer die Kartenfunktion (also die Map) mit seinem aktuellen Strandort nutzen möchte.

Bei forensischen Untersuchungen im Zusammenhang mit Apps stellt sich also die Frage, wo die benötigten App-Berechtigungen hinterlegt sind, die im Laufe der App-Nutzung angefragt werden. Allgemein müssen unter Android alle benötigten Berechtigungen im Manifest einer App hinterlegt sein. Es gibt mehrere Arten von Berechtigungen, die in drei Kategorien unterteilt werden. Eine ausführliche Beschreibung dieser Kategorien kann hier nachgelesen werden.
Normale Berechtigungen – Schutzstufe: Normal
Normale Berechtigungen gewähren einer App Zugriff auf Daten und Aktionen außerhalb ihrer Sandbox, stellen jedoch nur ein geringes Risiko für die Privatsphäre des Nutzers und den Betrieb anderer Apps dar.
Signaturberechtigungen – Schutzstufe: Signatur
Signaturberechtigungen werden einer App nur erteilt, wenn sie mit demselben Zertifikat signiert ist wie die App oder das Betriebssystem, das die Berechtigung definiert.
Laufzeitberechtigungen – Schutzstufe: Dangerous
Laufzeitberechtigungen ermöglichen einer App zusätzlichen Zugriff auf eingeschränkte Daten oder Aktionen mit erheblichen Auswirkungen auf das System. Bevor eine App auf diese Daten zugreift oder solche Aktionen ausführt, müssen Laufzeitberechtigungen angefordert werden. Das System zeigt dem Nutzer eine Aufforderung zur Berechtigung an (siehe Abbildung oben). Viele Laufzeitberechtigungen greifen auf private Nutzerdaten, wie Standort- und Kontaktdaten zu.
Manifest
Wie sehen nun solche Berechtigungseinträge im Manifest aus? In der folgenden Tabelle wurden beispielhaft mehrere Berechtigungen aufgeführt, die in dieser Form im Manifest hinterlegt werden:
<uses-permission android:name=“android.permission.INTERNET“ /> |
<uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION“ /> |
<uses-permission android:name=“android.permission.SENDTO“ /> |
<uses-permission android:name=“android.permission.WAKE_LOCK“ /> |
<uses-permission android:name=“android.permission.VIBRATE“ /> |
<uses-permission android:name=“android.permission.RECEIVE_BOOT_COMPLETED“ /> |
<uses-permission android:name=“android.permission.FOREGROUND_SERVICE“ /> |
Die Frage nach der Schutzstufe einer Berechtigung kann bei der Entwicklung, aber auch der forensischen Analyse einer App durchaus relevant sein. Die Webseite Android developers bietet eine sehr gute Dokumentation über sämtliche Berechtigungen. Hier ein Beispiel anhand der Berechtigungen „INTERNET“ und „ACCESS_FINE_LOCATION“:


Programmierung
Bei der App-Programmierung macht es Sinn, zuerst auf vorhandene Berechtigungen zu prüfen, bevor eine Berechtigungsanfrage auf Laufzeitbasis durchgeführt wird:
if (ContextCompat.checkSelfPermission(requireContext(),
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestLocationPermission();
}
Wenn die erforderliche Berechtigung für die genaue Standortermittlung vom Nutzer noch nicht erteilt wurde, kann die eigentliche Anfrage durchgeführt werden. In diesem Szenario erfolgt die Anfrage an den Nutzer zur Erlaubnis der Standortermittlung wie folgt:
private void requestLocationPermission()
{
ActivityCompat.requestPermissions(requireActivity(),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST_CODE);
}
Die graphische Darstellung der Berechtigungsabfrage unterscheidet sich zwischen den Android-Versionen leicht. Da an dieser Stelle nun die eigentliche Thematik beleuchtet wurde, stellt sich die Frage, wo auf dem forensischen Weg die vom Nutzer gewährten App-Berechtigungen gesichert werden können.
XML-Dateien
Speziell in der mobilen Forensik gibt es mehrere Maßnahmen und Möglichkeiten, wie der Zugang zu den benötigten Dateien etabliert werden kann. In diesem Beispiel wird kein physikalisches oder logisches Image des Smartphones erstellen, sondern lediglich mit den folgenden ADB-Befehlen die beiden benötigten XML-Dateien gesichert:
.\adb.exe shell su -c "cp /data/system/users/0/runtime-permissions.xml /sdcard/runtime-permissions.xml"
.\adb.exe shell su -c "cp /data/system/packages.xml /sdcard/packages.xml"
.\adb.exe pull /sdcard/runtime-permissions.xml
-> /sdcard/runtime-permissions.xml: 1 file pulled, 0 skipped. 3.3 MB/s (33177 bytes in 0.010s)
.\adb.exe pull /sdcard/packages.xml
-> /sdcard/packages.xml: 1 file pulled, 0 skipped. 18.0 MB/s (1081784 bytes in 0.057s)
runtime-permissions.xml
In der runtime-permissions.xml-Datei werden alle Berechtigungen registriert, die eine App zur Laufzeit anfragt. Dabei kann anhand dieser Einträge festgestellt werden, ob die Berechtigung vom Nutzer vergeben wurde, oder nicht. Wie sieht nun aber die Inhalt dieser XML aus? Wie im Folgenden dargestellt, gestaltet sich der Aufbau recht simpel:
<pkg name="com.teamviewer.host.market">
<item name="android.permission.ACCESS_FINE_LOCATION" granted="true" flags="0" />
</pkg>
<pkg name="com.samsung.android.messaging">
<item name="android.permission.READ_SMS" granted="true" flags="20" />
<item name="android.permission.READ_CALL_LOG" granted="true" flags="20" />
<item name="android.permission.RECEIVE_WAP_PUSH" granted="true" flags="20" />
<item name="android.permission.RECEIVE_MMS" granted="true" flags="20" />
<item name="android.permission.RECEIVE_SMS" granted="true" flags="20" />
<item name="android.permission.READ_EXTERNAL_STORAGE" granted="true" flags="20" />
<item name="android.permission.READ_PHONE_STATE" granted="true" flags="20" />
<item name="android.permission.SEND_SMS" granted="true" flags="20" />
<item name="android.permission.CALL_PHONE" granted="true" flags="20" />
<item name="android.permission.WRITE_CONTACTS" granted="true" flags="20" />
<item name="android.permission.CAMERA" granted="true" flags="20" />
<item name="android.permission.WRITE_CALL_LOG" granted="true" flags="20" />
<item name="android.permission.GET_ACCOUNTS" granted="true" flags="20" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" granted="true" flags="20" />
<item name="android.permission.RECORD_AUDIO" granted="true" flags="20" />
<item name="android.permission.READ_CONTACTS" granted="true" flags="20" />
</pkg>
Damit der Umfang an Berechtigungen in Abhängigkeit der App deutlich wird, wurden die Laufzeitberechtigungen zweier Apps aufgeführt. Am Anfang dieser Seite habe ich gezeigt, dass die genaue Standortbestimmung zur Laufzeit abgefragt wird. Diese Berechtigung wurde vom Nutzer gewährt und somit als „true“ in dieser Datei hinterlegt (rot). Im Gegensatz dazu gibt es größere und komplexere Apps, die andere Funktionen bereitstellen. Entsprechend benötigen diese auch andere oder umfangreichere Berechtigungen.
packages.xml
Zuletzt möchte ich noch auf die Datei mit dem Namen „packages.xml“ eingehen. Wie ist der Inhalt grob aufgebaut? Als anschauliches Beispiel werden an dieser Stelle einige Berechtigungen der App TeamViewer Host aufgeführt.
<package name="com.teamviewer.host.market" codePath="/data/app/com.teamviewer.host.market-U0buyb2X0AazA8usB9NkIQ==" nativeLibraryPath="/data/app/com.teamviewer.host.market-U0buyb2X0AazA8usB9NkIQ==/lib" primaryCpuAbi="arm64-v8a" publicFlags="538459716" privateFlags="0" ft="18e60252980" it="18d35d9c12a" ut="18e60252f9c" version="1551424" userId="10208" installer="com.android.vending" categoryHint="7">
<sigs count="1" schemeVersion="3">
<cert index="38" key="3082039a30820282a003020102......." />
</sigs>
<perms>
<item name="android.permission.sec.MDM_REMOTE_CONTROL" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_ROAMING" granted="true" flags="0" />
<item name="com.google.android.c2dm.permission.RECEIVE" granted="true" flags="0" />
<item name="android.permission.sec.ENTERPRISE_DEVICE_ADMIN" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_BROWSER_SETTINGS" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_GLOBALPROXY" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_DATE_TIME" granted="true" flags="0" />
<item name="com.sec.enterprise.permission.MDM_SPDCONTROL" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_DUAL_SIM" granted="true" flags="0" />
<item name="android.permission.sec.MDM_LICENSE_LOG" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_LICENSE_LOG" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_LOCATION" granted="true" flags="0" />
<item name="android.permission.sec.MDM_EMAIL" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_EXCHANGE" granted="true" flags="0" />
<item name="com.teamviewer.host.market.SAMSUNG_SUPPORT_PERMISSION" granted="true" flags="0" />
<item name="android.permission.sec.MDM_LOCKSCREEN" granted="true" flags="0" />
<item name="android.permission.sec.MDM_APP_PERMISSION_MGMT" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_HW_CONTROL" granted="true" flags="0" />
<item name="com.sec.enterprise.mdm.permission.BROWSER_PROXY" granted="true" flags="0" />
<item name="android.permission.sec.MDM_KIOSK_MODE" granted="true" flags="0" />
<item name="android.permission.FOREGROUND_SERVICE" granted="true" flags="0" />
<item name="android.permission.RECEIVE_BOOT_COMPLETED" granted="true" flags="0" />
<item name="android.permission.sec.MDM_FIREWALL" granted="true" flags="0" />
<item name="android.permission.BLUETOOTH" granted="true" flags="0" />
<item name="com.sec.enterprise.knox.permission.KNOX_ATTESTATION" granted="true" flags="0" />
<item name="android.permission.sec.MDM_GEOFENCING" granted="true" flags="0" />
<item name="android.permission.sec.MDM_BLUETOOTH" granted="true" flags="0" />
<item name="android.permission.INTERNET" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_LDAP" granted="true" flags="0" />
<...>
<item name="android.permission.ACCESS_NETWORK_STATE" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_BLUETOOTH" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_SENSITIVE_DATA_PROTECTION" granted="true" flags="0" />
<item name="android.permission.sec.MDM_BLUETOOTH_SECUREMODE" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_ENTERPRISE_DEVICE_ADMIN" granted="true" flags="0" />
<item name="com.sec.enterprise.permission.KNOX_SDP" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_INVENTORY" granted="true" flags="0" />
<item name="android.permission.sec.MDM_HW_CONTROL" granted="true" flags="0" />
<item name="android.permission.sec.MDM_SECURITY" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_SPDCONTROL" granted="true" flags="0" />
<item name="android.permission.KILL_BACKGROUND_PROCESSES" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_LOCKSCREEN" granted="true" flags="0" />
<item name="android.permission.sec.MDM_ROAMING" granted="true" flags="0" />
<item name="android.permission.REQUEST_DELETE_PACKAGES" granted="true" flags="0" />
<item name="android.permission.sec.MDM_APP_MGMT" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_KIOSK_MODE" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_CLIPBOARD" granted="true" flags="0" />
<item name="android.permission.sec.MDM_ENTERPRISE_VPN" granted="true" flags="0" />
<item name="android.permission.sec.MDM_LDAP" granted="true" flags="0" />
<item name="android.permission.sec.MDM_WIFI" granted="true" flags="0" />
<item name="android.permission.sec.MDM_DATE_TIME" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_CERT_PROVISIONING" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_GEOFENCING" granted="true" flags="0" />
<item name="android.permission.sec.MDM_DUAL_SIM" granted="true" flags="0" />
<item name="android.permission.sec.MDM_BROWSER_SETTINGS" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_APN" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_DEX" granted="true" flags="0" />
<item name="com.samsung.android.knox.permission.KNOX_VPN" granted="true" flags="0" />
<...>
</perms>
<proper-signing-keyset identifier="46" />
</package>
Fazit
Die oben aufgeführten Berechtigungen sind nur ein Teil von TeamViewer Host. Insgesamt bilden die Dateien packages.xml und runtime-permissions.xml zentrale Anlaufstellen, wenn es um forensische Untersuchungen im Zusammenhang von Applikationen unter Android geht. Vielleicht ist es hin und wieder sinnvoll, die Berechtigungen der installierten Apps zu prüfen und auch neue Berechtigungen zu hinterfragen.