¿Es posible obtener una copia de seguridad de la clave de cifrado de mi smartphone Android (tengo mi partición /data
encriptada) en caso de que algo salga mal?
Mi teléfono está rooteado. Tengo un Galaxy Note 4 SM-N910C.
¿Es posible obtener una copia de seguridad de la clave de cifrado de mi smartphone Android (tengo mi partición /data
encriptada) en caso de que algo salga mal?
Mi teléfono está rooteado. Tengo un Galaxy Note 4 SM-N910C.
No especificaste en tu pregunta si estás buscando la clave de FDE, Full Disk Encryption, o la clave de FBE, File-Based Encryption. Técnicamente ambas claves pueden ser recuperadas (siempre y cuando la clave de FBE no esté envuelta en hardware), pero hasta ahora solo he necesitado encontrar un método práctico para FDE.
Encriptación de Disco Completo
La forma de obtener la FDE que debería funcionar en todos los dispositivos y versiones de Android es utilizando el método cold-boot, ni siquiera necesitas ser root. Sospecho que esta no es la respuesta que estás buscando ya que considero que no está dentro del alcance práctico para la mayoría de personas incluso las técnicamente avanzadas.
La forma más fácil, que descubrí, para obtener la clave de encriptación de datos de FDE es simplemente pedirla, y podrías tener la suerte de conseguirla. La probé en un dispositivo Android 6 Nexus5, pero otros dispositivos o versiones de Android pueden tener un kernel que lo impida. Necesitarás ser root para que funcione.
La forma de solicitar al sistema la clave para ejecutar el comando: dmsetup table --showkeys
. De la misma forma que lo harías en un escritorio de Linux con un dispositivo dm-crypt cargado. El cuarto campo de la salida será el método de encriptación utilizado, aes-cbc-essiv:sha256
en mi caso, y el quinto campo será la clave codificada en hexadecimal. Si el quinto campo no es una cadena de caracteres hexadecimal aleatoria de 32 o 64 caracteres (es decir, no todos ceros), entonces este método no funcionará. Podría ser que algunos teléfonos Android utilicen el servicio de llavero del kernel, que podría estar configurado para no permitir mostrar la clave.
El problema es que necesitarás el binario dmsetup
, que no está distribuido con Android. Por lo tanto, necesitarás encontrar un binario compilado para tu arquitectura. Idealmente habría un binario compilado estáticamente que se pueda descargar, pero hasta el momento no he encontrado ninguno. O usar Termux sería una buena opción, pero en el momento de escribir esto, Termux no tiene un paquete que instale dmsetup. Para mi prueba, utilicé los paquetes binarios armhf
de Debian en lugar de compilar mi propio binario de dmsetup. No he investigado tu dispositivo, pero si es de 64 bits RM, necesitarás descargar las versiones de arm64
.
Un inconveniente con este enfoque es que también debes instalar el paquete libc6
porque el binario dmsetup no se puede cargar con el enlazador dinámico de Android. También debes establecer el LD_LIBRARY_PATH
adecuado para que dmsetup pueda encontrar las bibliotecas enlazadas dinámicamente que necesita para iniciarse. Además, deberás descargar todos los paquetes en los que el paquete dmsetup
depende y sus dependencias. Son alrededor de 7 paquetes en total. Y como no puedes instalar paquetes Debian deb en Android, si las rutas son correctas, deberás desempaquetarlos manualmente utilizando dpkg-deb -X
. Al final, el comando que necesité usar para ejecutar dmsetup se veía así, asumiendo que mi directorio de trabajo actual es el :
LD_LIBRARY_PATH=$PWD/lib/arm-linux-gnueabihf \
$PWD/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 \
$PWD/sbin/dmsetup table --showkeys
Encriptación Basada en Archivos
También existe un ataque actualizado de cold-boot para recuperar claves de encriptación de FBE, nuevamente fuera del alcance práctico para la mayoría de personas. Sospecho que hay una forma de obtener las claves de FBE a través del espacio de usuario si tienes permisos de root y las claves no están envueltas en hardware (y tal vez lo estén), pero actualmente no sé cómo hacerlo.
La implementación de FBE que usa Android de fábrica es fscrypt
y parece que solo está utilizando protectores crudos. Para desbloquear el FBE en un escritorio de Linux deberás asegurarte de que tu kernel tenga el soporte adecuado. Hay 2 claves fscrypt por usuario, una clave de encriptación de credenciales (CE) y una clave de encriptación de dispositivo (DE). Una vez que tengas la clave cruda para el directorio que deseas desencriptar, deberías ser capaz de desbloquear el directorio encriptado fscrypt utilizando el programa fscrypt
de Google. El truco será obtener la clave cruda para el directorio específico que deseas desbloquear. Los datos utilizados para construir la clave cruda y los parámetros fscrypt están en /data/misc/vold/user_keys
. La documentación de Android da algunas pistas sobre cómo crear esta clave cruda y sugiere que la creación de la clave debe hacerse en el teléfono (necesita una clave maestra especial de TEE). En última instancia, vold
obtendrá esta clave cruda y la usará para configurar la instancia de fscrypt
. Así que creo que la forma más fácil de obtener la(s) clave(s) será hackear vold
para que las saque a un archivo. Aquí parece ser un buen candidato porque vold
acaba de realizar la llamada al kernel para configurar fscrypt, por lo que tenemos la clave cruda y el directorio al que va la clave cruda. Si es una clave envuelta en hardware, entonces los datos de esa ioctl probablemente no nos servirán a menos que sepa cómo "desenvolver" la clave, lo cual, si es posible incluso sin hackear el hardware, probablemente implicaría interactuar con el TEE.
PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.
0 votos
Relacionado: ¿Cómo funciona técnicamente el cifrado de Marshmallow? Según eso, parece ser imposible extraer la clave para su uso posterior. Podría estar equivocado con esa conclusión - por favor avíseme si descubre algo.
0 votos
Esto no especifica la clave FDE o FBE.