Du bist hier:Start»CyanogenMod»Hacks»Verschlüsselung

Verschlüsselung fürs Smartphone

25.04.2015

Android Verschlüsselung

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

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.

# become root
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).

CyanogenMod Telefon verschlüsseln

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:

# check that crypto processes are running:
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.

# download cryptsetup for cyanogenmod 10 and higher
wget http://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.

# log in to cyanogenmod
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:
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.

#!/system/bin/sh

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:

#!/system/bin/sh

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.

Kommentar schreiben