Blog

Eliminación segura de datos en Android

Eliminación segura de datos en Android

Hace un tiempo me encontré con este artículo: Security Analysis of Android Factory Resets (y esta presentación). Se probaba el borrado de datos al restaurar a valores de fábrica varios móviles con Android. Tenía en un cajón un móvil de esa época y quería realizar un experimento similar.

El aparato es el siguiente:

  • Motorola XT1039, ES, RETAIL, Model SM3781AD1L1
  • Android 4.4.4, build KXB21.14-L1.56

Veamos el particionamiento:

 j  ~  1  adb shell
shell@peregrine:/ $ 
shell@peregrine:/ $ 
shell@peregrine:/ $ 
shell@peregrine:/ $ mount 
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,size=428096k,nr_inodes=107024,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,size=428096k,nr_inodes=107024,mode=750,gid=1000 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,size=428096k,nr_inodes=107024,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,size=428096k,nr_inodes=107024,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdata /data f2fs rw,seclabel,nosuid,nodev,noatime,nodiratime,background_gc=on,discard,user_xattr,inline_xattr,acl,errors=recover,active_logs=6 0 0
/dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,nodiratime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,defcontext=u:object_r:persist_file:s0,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/modem /firmware ext4 ro,defcontext=u:object_r:modem_file:s0,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/pds /pds ext3 rw,defcontext=u:object_r:pds_file:s0,seclabel,nosuid,noexec,relatime,barrier=1,data=writeback 0 0
/dev/block/platform/msm_sdcc.1/by-name/fsg /fsg ext4 ro,defcontext=u:object_r:modem_file:s0,seclabel,nosuid,nodev,relatime 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /storage/emulated/legacy fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

La partición /data está formateada en f2fs. Esto es por tanto eMMC, no raw flash, que utiliza otros sistemas de ficheros como yaffs2. Para borrado seguro en eMMC se utiliza el comando de ioctl BLKSECDISCARD, mientras que en yaffs2 es MEMERASE.

En el artículo mencionado arriba se hace una escritura completa con dd y una secuencia de bytes generados aleatoriamente. Es lo mejor porque se escribe completamente la memoria y se evita una posible compresión que deje zonas sin escribir. Yo he hecho algo más sencillo:

  • Loguearme en mi cuenta de Google
  • Escribir una serie de ficheros de vídeo (MKV) que llene el «Internal Storage» que se me presenta por MTP al conectar el móvil al ordenador.

Los ficheros de vídeo (4,6 GB)

 j  …  mtp:host=motorola_XT1039_TA98600IR9  Internal storage  Movies  ls -lh
total 4.6G
-rw-------. 1 j j  50M Jul 25 23:04 '[Animeout] Azumanga Daioh - 02 [480p][ACX][kuru].mkv'
-rw-------. 1 j j 851M Jul 25 22:54 'Card Captor Sakura - 01 [BDRip][dub-sub_CA-ES-EU-JA5.1][HE-AAC][x264-1080p][SakuraTeam].mkv'
-rw-------. 1 j j 851M Jul 25 22:55 'Card Captor Sakura - 02 [BDRip][dub-sub_CA-ES-EU-JA5.1][HE-AAC][x264-1080p][SakuraTeam].mkv'
-rw-------. 1 j j 851M Jul 25 22:56 'Card Captor Sakura - 03 [BDRip][dub-sub_CA-ES-EU-JA5.1][HE-AAC][x264-1080p][SakuraTeam].mkv'
-rw-------. 1 j j 851M Jul 25 22:59 'Card Captor Sakura - 04 [BDRip][dub-sub_CA-ES-EU-JA5.1][HE-AAC][x264-1080p][SakuraTeam].mkv'
-rw-------. 1 j j 851M Jul 25 23:00 'Card Captor Sakura - 05 [BDRip][dub-sub_CA-ES-EU-JA5.1][HE-AAC][x264-1080p][SakuraTeam].mkv'
-rw-------. 1 j j 344M Jul 25 23:03 '[project-gxs] Otorimonogatari - 01 [10bit BD 1080p] [0DC46AD5].mkv'

A continuación he dumpeado la partición de /data antes (data_antes.img) y después (data_despues.img) de restaurar a fabrica. He utilizado adb pull:

sudo adb pull /dev/block/platform/msm_sdcc.1/by-name/userdata <fichero>.img

… y he buscado con un editor de hexadecimal mi correo y el magic byte del «segmento» MKV (15 49 A9 66).

NOTA: para restaurar a fábrica tenemos que tener la partición /recovery de fábrica, no vale tener otra como TWRP, porque no borrará los datos.

  • Sobre mi correo, se encontró 66033 veces en data_antes.img, y ninguna en data_despues.img
  • Encontré todos los mkv en data_antes.img, y ninguno en data_despues.img
Antes de restaurar a fábrica
Después de restaurar a fábrica

Efectivamente, se ha borrado correctamente y las zonas que aún no han sido escritas de nuevo están a 0.