[Tutorial] Alle Daten - auch interne - auf verschlüsselte, externe SD-Karte verschieben

D

Defier

Dauergast
232
Ich übernehme keinerlei Gewährleistung für jegliche Schäden, die durch das Befolgen der nachfolgenden Anleitung entstehen können!


Motivation und Idee
Seit Version 3.0 ("Honeycomb") unterstützt Android theoretisch die Verschlüsselung von Geräten, was die auf dem Gerät befindlichen privaten Daten bei Verlust, Diebstahl oder Defekt eines Geräts schützen soll. Leider hat diese Verschlüsselung einige Probleme:
  • auf sehr vielen Android-Geräten wird nur die interne Daten-Partition verschlüsselt, wodurch die auf der “internen” (emulierten) SD-Karte sowie die auf der externen SD-Karte befindlichen Daten ungeschützt bleiben. Betroffen sind hier beispielsweise Bilder oder private Nachrichten, die mittels diverser Messenger gesendet bzw. empfangen wurden.
  • seit jeher gibt es auf einigen Geräten das Problem, dass die interne Daten-Partition irgendwann zu klein wird.
  • wenn das Gerät einen physikalischen Schaden erleidet (z.B. Wasserschaden, Sturzschaden o.ä.) kommt man (praktisch) gar nicht mehr an seine Daten ran, falls man zuvor kein Backup gemacht hat.
  • will man sein defektes Gerät dennoch verkaufen, bekommt der Käufer zwangsläufig auch die darauf befindlichen Daten, da man keine Möglichkeit mehr hat, sie zu löschen.
  • das sichere Löschen von Daten aus dem internen Speicher kann sehr aufwändig sein, denn ein einfacher “Factory Reset” reicht dazu meist nicht aus (was oft an fehlerhaften Implementierungen des Erase-Befehls liegt). Es gibt auch eine Untersuchung, bei der gebrauchte Geräte gekauft wurden – bei allen konnten nahezu alle Daten wiederhergestellt werden.
  • die von Android angebotene Geräte-Verschlüsselung ist vergleichsweise schwach, wodurch man auch die Sicherheit der verschlüsselten Daten anzweifeln kann.
Die Konsequenz aus all diesen Überlegungen war für mich ganz klar: Ich möchte möglichst keine persönlichen Daten IM Gerät speichern, sondern lieber auf einer herausnehmbaren SD-Karte. Natürlich verschlüsselt versteht sich.
Dieses Tutorial beschreibt einen Mod, mit dem dies erreichen kann. Durch den Mod muss man natürlich auch einige Nachteile in Kauf nehmen:
  • (micro)SD-Karten sind meist deutlich langsamer als interner Flash – auch wenn moderne UHS-I Karten hier ziemlich zulegen konnten. Dadurch kann die Bootzeit des Geräts deutlich länger sein und bei manchen Aktionen kann es zu spürbaren (wenn auch verkraftbaren) Lags kommen.
  • der Mod erfordert Root-Rechte
  • je nach Gerät muss auch das Boot-Image modifiziert werden (so z.B. bei älteren Sony-Geräten)
  • es ist relativ schwierig den Mod durchzuführen.
  • der Mod berücksichtigt nicht die Cache-Partition.
  • der Zugriff auf das Gerät via USB/MTP funktioniert möglicherweise nicht.
  • der Mod kann sich nachteilig auf die Lebensdauer der SD-Karte auswirken.
Obwohl der Mod eher ein “proof-of-concept” ist, habe ich ihn seit fast einem Jahr auf meinem Alltagsgerät in Betrieb und hatte bislang keine Komplikationen, die ich auf den Mod zurückführen würde.
Wie man anhand des nachfolgenden Screenshots sehen kann, hat man nach dem Mod einen “gigantischen” internen Speicher, der in Wahrheit natürlich die SD-Karte ist. Aber genug des Vorgeplänkels, starten wir mit der Anleitung.

attachment-php-png.444650


Achtung: Diese Anleitung ist für fortgeschrittene Nutzer und Entwickler bestimmt. Sie behandelt daher nur die Grundlagen und geht nicht auf alle Details ein!

Durch das Befolgen der Anleitung verliert ihr sämtliche Daten auf eurem Gerät! Ihr solltet daher unbedingt zuvor ein Backup machen!
Kompatibilität
Dieses Tutorial basiert auf OmniROM 4.4 und TWRP. Es sollte sich jedoch mit überschaubarem Aufwand auch auf ältere Android-Versionen übertragen lassen. Bei späteren Android-Versionen (Lollipop aufwärts) ist Vorsicht geboten, da die Verschlüsselungs-Schlüssel teilweise nicht mehr in der Partition selbst, sondern in einem geschützten Bereichs des Geräts gespeichert werden! Erfahrungen hierzu sind sehr willkommen.
Schritt 1: Partitionslayout herausfinden
Zunächst muss man herausfinden, welche Partition des internen Flash-Speichers für die Daten-Partition genutzt wird. Dazu ist der “mount”-Befehl (via Terminal-Emulator bzw. adb shell) nützlich. Man kann sich dazu auch die fstab-Dateien anschauen, die meist unter /fstab.vendor liegen. In manchen Fällen werden die Partionen “by-name” - also nemansweise – gelistet. Die echten Partitionsbezeichnungen sind aber häufig in fstab-Dateien der Custom Recoveries zu finden. Auf einem Xperia V sieht es beispielsweise wie folgt aus:

Internal Data partition: /dev/block/platform/msm_sdcc.1/by-name/Userdata
Internal, emulated SD card: /dev/block/mmcblk0p15
First partition of external SD card: /dev/block/mmcblk1p1

Schritt 2: Daten verschlüsseln
Nachdem man ein komplettes Backup gemacht hat, sollte man die normale Geräteverschlüsselung aktivieren. Dadurch wird die interne Daten-Partition (in diesem Fall: /dev/block/platform/msm_sdcc.1/by-name/Userdata ) mit einer 128bit AES-Verschlüsselung verschlüsselt.
Schritt 3: Cryptofooter extrahieren
Der Cryptofooter, in dem Informationen über die verschlüsselte Partition sowie der Verschlüsselungsschlüssel hinterlegt sind befindet sich bei Android 4.4 meist in den letzten 16384 bytes der verschlüsselten Partition.

Als ersten booten wir daher ins TWRP-Recovery (entschlüsseln die Datenpartition jedoch nicht, falls uns TWRP danach fragt). Wir verbinden uns via adb als root mit dem Gerät und wollen erstmal rausfinden, wie groß die interne (verschlüsselte) Partition ist:

fdisk -l /dev/block/platform/msm_sdcc.1/by-name/Userdata

Ausgabe in meinem Fall:

Disk Userdata: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
...


Die Größe beträgt hier also 2147483648 Bytes. Zieht man davon 16384 Bytes ab, erhält man den Offset, ab dem man Lesen muss, um den Cryptofooter zu extrahieren. Dies kann man nun mittels dd machen:

dd if=/dev/block/platform/msm_sdcc.1/by-name/Userdata of=/cryptofooter bs=1 seek=2147467264 count=16384

Leider gibt es in Androids Implementierung von dd eine Limitierung, wodurch man via dd nur maximal bis 2GB in einer Datei lesen kann. Als Abhilfe kann man eine neuere busybox-Version verwenden oder sich einfach die komplette Partition auf einen Unix-Rechner runterladen und dd dort lokal verwenden.
Schritt 4: Externe SD-Karte vorbereiten
Es macht für den angestrebten Zweck keinen Sinn, die SD-Karte zu partitionieren, deshalb wollen wir auch keine Partitionstabelle darauf haben (TODO: Leider nicht einheitlich in diesem Tutorial!). Zunächst bestimmen wir die exakte Größe der SD-Karte mittels

fdisk -l /dev/block/mmcblk1p1

Ausgabe in meinem Fall:

Disk mmcblk1: 31.9 GB, 31914983424 bytes
255 heads, 63 sectors/track, 3880 cylinders, total 62333952 sectors
Units = sectors of 1 * 512 = 512 bytes
...


Jetzt ziehen wir von den 31914983424 Bytes wieder 16384 Bytes ab und verwenden dd, um ans Ende der SD-Karte den cryptofooter zu schreiben:

dd if=/cryptofooter of=/dev/block/mmcblk1p1 bs=1 skip=31914967040 count=16384

(das kann je nach dd-Version problematisch sein!)

Zu Testzwecken können wir auch die komplette, verschlüsselte Datenpartition auf die SD-Karte schreiben:

dd if=/dev/block/platform/msm_sdcc.1/by-name/Userdata of=/dev/block/mmcblk1p1


Zu guter letzt machen wir die interne Datenpartition im Gerät mit Nullen “platt”:

dd if=/dev/zero of=/dev/block/platform/msm_sdcc.1/by-name/Userdata
Schritt 5: fstab und init modifizieren
Jetzt müssen wir die fstab und init so modifizieren, damit das Gerät unser neues Layout akzeptiert. Je nach Gerät muss dazu das rootfs modifiziert werden oder (bei älteren Sony-Geräten) die Boot-Partition samt Kernel neu erstellt werden. Danach muss das modifizierte Image via fastboot ins Gerät geflasht werden.

Via fstab sagen wir Android, dass es die interne Datenpartition komplett ignorieren soll, dass es die interne SD-Karte wie gehabt einhängen soll und dass es die externe SD-Karte für /data als verschlüsseltes ext4-Dateisystem verwenden muss. In meinem Fall sah der Teil der fstab.qcom anschließend wie folgt aus:

/dev/block/mmcblk1 /data ext4 noatime,nosuid,nodev,barrier=1,data=ordered,noauto_da_alloc wait,check,encryptable=footer,length=-16384
/devices/platform/msm_sdcc.1/mmc_host/mmc0 auto ext4 defaults voldmanaged=sdcard0:15,nonremovable,noemulatedsd
#/devices/platform/msm_sdcc.3/mmc_host/mmc1 auto auto defaults voldmanaged=sdcard1:auto
/devices/platform/msm_hsusb_host


Ggf. Sollte man auch die twrp.fstab modifizieren, wenn man auch von der Recovery aus darauf zugreifen möchte.

Da wir beim Booten auch nicht möchten, dass die SD-Karte als externe SD-Karte verwendet wird, müssen wir einige Zeilen in der init-Datei (in meinem Fall sony.init.rc) ändern:

chmod 0701 /mnt/media_rw
mkdir /storage 0775 system system
mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw
# mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw
mkdir /mnt/media_rw/usbdisk 0700 media_rw media_rw
mkdir /storage/sdcard0 0775 system system
# mkdir /storage/sdcard1 0775 system system
mkdir /storage/usbdisk 0775 system system

export EXTERNAL_STORAGE /storage/sdcard0
# export SECONDARY_STORAGE /storage/sdcard1

# for backwards compatibility
symlink /storage/sdcard0 /sdcard
symlink /storage/sdcard0 /mnt/sdcard
# symlink /storage/sdcard1 /ext_card
# symlink /storage/sdcard1 /mnt/ext_card
symlink /storage/usbdisk /usbdisk
symlink /storage/usbdisk /mnt/usbdisk

Schritt 6: Erster Boot-Test
Nachdem wir alles aufgesetzt haben, können wir ins neue System booten. Das System sollte auf jeden Fall nach dem Verschlüsselungs-Passwort fragen (ist das gleiche, das wir in Schritt 2 aufgesetzt haben). Es sollte sich etwas langsamer anfühlen, aber sonst merken wir noch nicht viel von der Änderung, da wir nur die ersten 2 GB der SD-Karte nutzen.
Schritt 7: Cryptofooter anpassen und SD-Karte neu formatieren
Jetzt nähern wir uns dem interessanten Teil. Android holt sich die Größe verschlüsselter Partition nicht aus dem Dateisystem, sondern aus dem Cryptofooter. Und genau diese Information müssen wir anpassen, was eine ziemliche Arbeit sein kann, in der wir mit einem Hex-Editor hantieren müssen. Es gibt aber eine sehr gute Anleitung dazu:


Android Explorations: Revisiting Android disk encryption

Konkret werden wir den Offset 0000:0018 bis 0000:001B bearbeiten müssen, um dort die Größe unserer Partition einzutragen. Wichtig dabei ist, dass wir mindestens 16KB am Ende für den Cryptofooter leer lassen!

Den modifizierten Crpyotfooter schreiben wir mittels TWRP wie in Schritt 4 beschrieben wieder auf die SD-Karte zurück. Jetzt starten wir erneut in TWRP und geben diesmal das Entschlüsselungspasswort ein. Danach können wir uns die Größe der Partition ansehen:

fdisk -l /dev/block/dm-0

Sie sollte der Größe entsprechen, die wir im Cryptofooter angegeben haben. Nun können wir diese Partition mit einem ext4-Dateisystem formatieren:

make_ext4fs /dev/block/dm-0

Schritt 8: SD-Karte anpassen
Jetzt können wir ins fast fertige System booten und sollten sehen, dass der interne Speicher deutlich größer ist! Allerdings gibt es noch ein Problem: Die interne (emulierte) SD-Karte läuft noch vom internen Speicher. Da ich es auch nach Stunden nicht geschafft habe, die interne Partition gleich beim Start richtig umzuhängen, führe ich immer folgende Befehle nach dem Booten – also nach jedem Booten! - aus:

# busybox mount -bind /data/sdcard0 /mnt/media_rw/sdcard0
# am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///storage/sdcard0


Dadurch landet alles, was zuvor auf der internen SD-Karte gelandet wäre, ebenfalls auf der externen SD-Karte. Der zweite Befehl sorgt dafür, dass der Mediendienst die Inhalte neu indiziert.
Schlussbemerkungen
- dieser Artikel ist eine Übersetzung (mit leichter Aktualisierung) eines Artikels, den ich Anfang 2015 bei xda gepostet habe: [MOD] Move all your internal and external data to encrypted, external SD
- ich wäre für Tipps dankbar, wie man die interne Partition besser eingehängt bekommt
- einige Stock-ROMs bieten auch eine Verschlüsselungsmöglichkeit für beide SD-Karten, dies ist aber nicht Android-Standard und meist proprietär.
 

Anhänge

  • attachment.php.png
    attachment.php.png
    20,5 KB · Aufrufe: 859
Zuletzt bearbeitet:
  • Danke
Reaktionen: mratix und Gunnar der Alte

Ähnliche Themen

E
Antworten
4
Aufrufe
2.118
Kardroid
Kardroid
S
Antworten
2
Aufrufe
4.940
gueschmid
G
Kiwi++Soft
Antworten
197
Aufrufe
60.428
Gelöschtes Mitglied 410096
G
Zurück
Oben Unten