Verschlüsselung fürs Smartphone
25.04.2015

Auf dem Laptop ist die Verschlüsselung der gesamten Festplatte heutzutage Alltag und relativ einfach zu benutzen. Ein Smartphone kann leichter verloren gehen als ein Laptop. Insofern sollte Verschlüsselung beim Smartphone genauso zum Standard werden wie beim Laptop. Leider ist die Verschlüsselung des gesamten Smartphones mit Stand 2014 noch nicht vorgesehen. Auch die teilweise Verschlüsselung der persönlichen Daten ist noch nicht die Default-Einstellung von Android. Immerhin bieten Android und CyanogenMod nachträglich die Möglichkeit, die persönlichen Daten zu verschlüsseln.
Die Partitionen in CyanogenMod
Schauen wir uns zunächst an, welche Speicher und Speicher-Unterteilungen (Partitionen) es im Smartphone gibt. Normalerweise besitzt das Smartphone einen verlöteten internen Speicherchip und einen Steckplatz (Slot) für eine externe Speicherkarte. Micro-SD-Karten sind als externe Speicherchips üblich. Der interne Speicher wird von CyanogenMod in mehrere Partitionen unterteilt:

Partitionen beim Android Smartphone
Die aus Benutzer-Sicht interessanten Partitionen sind /system und /data. In der system-Partition liegen die vorinstallierten Apps und Dateien, die zum Betrieb des Smartphones wichtig sind. Die data-Partition benutzt den größten Teil des internen Speichers. Hier liegen alle nachträglich installierten Apps, Einstellungen und persönliche Daten wie zum Beispiel die Telefon-Kontakte. Nur die data-Partition kann im Augenblick von CyanogenMod verschlüsselt werden (im oberen Bild grün dargestellt). Die externe Speicherkarte wird bei CyanogenMod unter dem Verzeichnis /storage/sdcard1 eingebunden. Für die externe Speicherkarte gibt es von CyanogenMod im Augenblick noch keine Verschlüsselungsoption. Weiter unten auf der Seite steht eine kleine Anleitung, wie die externe Speicherkarte von Hand verschlüsselt werden kann. Die Terminal Emulator App unter CyanogenMod bietet die Möglichkeit, die Partitionen des internen Speichers aufzulisten.
su
# check the partitions of the internal storage
fdisk -l /dev/block/mmcblk0
# example output of a Samsung Galaxy S3 smartphone with 16 GB:
Found valid GPT with protective MBR; using GPT
Disk /dev/block/mmcblk0: 30777344 sectors, 2740M
Logical sector size: 512
Disk identifier (GUID): 52444e41-494f-2044-4d4d-43204449534b
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 30777310
Number Start (sector) End (sector) Size Code Name
1 8192 16383 4096K 0700 BOTA0
2 16384 24575 4096K 0700 BOTA1
3 24576 65535 20.0M 0700 EFS
4 65536 81919 8192K 0700 PARAM
5 81920 98303 8192K 0700 BOOT
6 98304 114687 8192K 0700 RECOVERY
7 114688 180223 32.0M 0700 RADIO
8 180224 2277375 1024M 0700 CACHE
9 2277376 5423103 1536M 0700 SYSTEM
10 5423104 6569983 560M 0700 HIDDEN
11 6569984 6586367 8192K 0700 OTA
12 6586368 30769151 11.5G 0700 USERDATA
Beim Laptop kann die gesamte Festplatte verschlüsselt werden. Generell gibt es das Problem, dass zum Starten eines Computers erst einmal unverschlüsselte Dateien zum Entschlüsseln der Festplatte geladen werden müssen. Die Lösung beim Laptop sieht so aus, dass diese unverschlüsselten Boot-Dateien auf einen externen USB-Stick ausgelagert werden können. Beim Smartphone funktioniert das nicht so einfach. Da außerdem die System-Partition unverschlüsselt ist, besteht die Möglichkeit einer "Evil-Maid-Attack". Falls jemand mit bösen Absichten ein Smartphone entwendet, könnte die unverschlüsselte Partition manipuliert und dadurch später der verschlüsselte Teil ausgelesen werden. Im Augenblick ist die Smartphone-Verschlüsselung also nur für den Anwendungsfall brauchbar, wenn das Smartphone verloren geht. Immerhin besser als nichts.
Persönliche Daten verschlüsseln
Nach dem theoretischen kommt jetzt der praktische Teil. Aber erst noch ein Warnhinweis: Daten von denen keine Datensicherung existiert sind keine wichtigen Daten. Datensicherung ist besonders bei Verschlüsselung wichtig, da einzelne beschädigte Teile des Speichers ausreichen um den gesamten verschlüsselten Container unbrauchbar zu machen. Also regelmäßig die Fotos sichern, falls sie wichtig sind !
Unter Android bzw. CyanogenMod befindet sich in den Einstellungen unter dem Menüpunkt Sicherheit der Unterpunkt Telefon verschlüsseln (ganz unten).

Telefon verschlüsseln mit CyanogenMod
Diese Einstellung verschlüsselt die oben erwähnte data-Partition. Zur Verschlüsselung sollte eine ausreichend lange Passphrase benutzt werden. Falls die Verschlüsselung nicht startet, dann kann es daran liegen, dass keine Stromversorgung ans Smartphone angeschlossen ist oder noch Programme gestartet sind, die auf zu verschlüsselnde Dateien zugreifen. Nach der Verschlüsselung muss beim Start des Smartphones die Passphrase eingegeben werden. Mit dem Programm ps sollten jetzt die Crypto-Prozesse in der Prozessliste des Smartphones auftauchen:
ps | grep crypt
# example output:
ecryptfs-kthrea
crypto
kcryptd_io
kcryptd
Externe SD-Karte verschlüsseln
Da persönliche Daten ebenfalls auf der externen SD-Karte liegen können, beschreibe ich hier eine Möglichkeit, persönliche Daten in einem Container mit dem Programm cryptsetup zu verschlüsseln. Diese Variante hat keine grafische Bedienoberfläche sondern muss über die Kommandozeile in der App Terminal Emulator oder ConnectBot gesteuert werden. Zunächst muss das Programm cryptsetup heruntergeladen und auf dem Smartphone über die Android Debug Bridge (adb) installiert werden.
wget https://www.torsten-traenkner.de/cyanogenmod/apps/cryptsetup
sha1sum cryptsetup
# should be 3db06da1c4248f8770b9d7a554c4629c0589137e
# install cryptsetup on the smartphone for cyanogenmod
adb root
sleep 1
adb shell "mount -o remount,rw /system"
adb push cryptsetup /system/xbin/
adb shell chmod 755 /system/xbin/cryptsetup
adb shell "mount -o remount,ro /system"
Als nächstes wird ein verschlüsselter Container auf der externen SD-Karte erstellt. Um die Befehle komfortabel einzugeben, empfiehlt es sich von einem Computer mit Tastatur aus über adb (die Android-Debug-Bridge) als root-Benutzer auf das Smartphone einzuloggen.
adb root
adb shell
# create an empty file with 100 MB on the external SD card
dd if=/dev/zero of=/storage/sdcard1/container.txt bs=1000000 count=100
# set up a loop device for the container
losetup /dev/block/loop0 /storage/sdcard1/container.txt
# set a passphrase for the container
cryptsetup luksFormat /dev/block/loop0
# type YES and enter the passphrase twice
# open the container
cryptsetup luksOpen /dev/block/loop0 decrypted
# output:
# key slot 0 unlocked.
# Command successful.
# create an ext4 file system inside the encrypted container
make_ext4fs -L partition_label /dev/mapper/decrypted
# create a mount directory:
mkdir /data/media/0/mnt/
# mount the directory:
mount /dev/mapper/decrypted /data/media/0/mnt/
# create some directories for later use
mkdir /data/media/0/mnt/internal/ /data/media/0/mnt/external/
# close everything:
umount /data/media/0/mnt/
cryptsetup luksClose decrypted
losetup -d /dev/block/loop0
Zur Demonstration und damit es etwas schneller geht wird im oberen Beispiel ein Container mit nur 100 MB Größe erstellt. Mit cryptsetup luksFormat wird die Passphrase zum Entschlüsseln des Containers festgelegt. Anschließend wird mit cryptsetup luksOpen der Container geöffnet und mit dem Programm make_ext4fs das Dateisystem ext4 innerhalb des verschlüsselten Containers angelegt. Danach wird das Dateisystem gemountet und zwei Verzeichnisse im Container erstellt. Schließlich wird der entschlüsselte Container wieder geschlossen und das loop-Gerät "getrennt".
Skript zum Entschlüsseln
Damit das Entschlüsseln des Containers auf dem Smartphone komfortabel funktioniert, sollten die cryptsetup- und mount-Befehle in einem Shell-Skript gekapselt werden (open.sh). Dieses Shell-Skript kann in der Terminal Emulator-App mit root-Rechten aufgerufen werden. In dem folgenden Beispielskript wird die Musik-App Video LAN Client (VLC) mit "am force-stop" gestoppt, damit VLC die entschlüsselten Benutzerdaten und die Medienbibliothek neu einliest.
echo "Please enter pwd:"
stty -echo
read line
stty echo
if [ "$line" == "c" ] || [ "$line" == "" ];then
exit 0
fi
am force-stop org.videolan.vlc
killall -9 org.videolan.vlc
losetup /dev/block/loop0 /storage/sdcard1/container.txt
echo "$line" | cryptsetup luksOpen /dev/block/loop0 decrypted
result=$?
line=
echo "after cryptsetup"
if [ $result -eq 0 ];then
# wait for device mapper
index=0
while [ ! -e /dev/mapper/decrypted ];do
usleep 100000
let index++
if [ $index -gt 20 ];then
echo "mapped device did not appear"
losetup -d /dev/block/loop0
exit 1
fi
done
echo mounting
busybox mount /dev/mapper/decrypted /data/media/0/mnt/
echo "binding for the user data of the app Video LAN Client (VLC)"
busybox mount --bind /data/media/0/mnt/internal/ /data/data/org.videolan.vlc/
busybox mount --bind /data/media/0/mnt/external/ /data/media/0/Android/data/org.videolan.vlc/
else
echo "Open failed."
losetup -d /dev/block/loop0
exit 1
fi
# open vlc
am start -a android.intent.action.VIEW -n org.videolan.vlc/.gui.MainActivity
Skript zum Schließen des Containers
Zum Schließen des Containers empfiehlt sich ebenfalls ein Shell-Skript (close.sh). Hier ein Beispiel, wie es aussehen könnte:
echo "killing vlc"
am force-stop org.videolan.vlc
killall -9 org.videolan.vlc
sleep 1
umount /data/data/org.videolan.vlc/
umount /data/media/0/Android/data/org.videolan.vlc/
umount /data/media/0/mnt/
sleep 1
echo "closing container"
cryptsetup luksClose decrypted
echo "removing loop device"
losetup -d /dev/block/loop0
Ausblick
Auch wenn diese Lösung für technisch versierte Menschen funktioniert, sollte klar sein, dass sie keine dauerhafte Lösung ist. Langfristig sollten Android beziehungsweise CyanogenMod eine Komplettverschlüsselung des Smartphones anbieten. Und zwar nicht erst nachträglich sondern als Default-Einstellung.
Viel Spaß beim Experimentieren ! Falls noch etwas unklar sein sollte, dann kannst du die Kommentar-Funktion benutzen.