lundi 8 juillet 2013

Dump mémoire sous Android

Une application mobile est sécurisée à un premier niveau par la compartementalisation du contexte d'exécution. Ensuite, si le développeur a fait son travail sérieusement, le code est robuste aux exploitations diverses et les échanges réseau sont chiffrés. On peut rajouter une couche de protection en chiffrant les fichiers sauvegardés (se pause alors le problème du stockage de la clé). En admettant que la sécurité des éventuels serveurs distants est garantie, il existe encore un espace ou toutes les informations que l'application cherche à protéger peuvent se retrouver en clair. Dans la mémoire vive de votre mobile. Dumper la mémoire de linux dans un fichier a toujours été possible par des moyens divers et de moins en moins simple pour des raisons de sécurité. Android cependant, est un peu différent et c'est pour cela qu'un certain Joe Sylve a développé Lime (Linux Memory Extractor, un outil spécifique à cet OS.

La documentation de Lime est assez claire mais elle date un peu et j'ai personnellement eu quelques problèmes à le faire fonctionner. Premièrement il faut le compiler spécifiquement pour votre noyau. Pour cela vous aurez besoin des sources du noyau tel que compilé par le constructeur. Par exemple ici pour Samsung. Théoriquement vous avez besoin uniquement de la config du noyau mais j'ai eu besoin de le compiler (sans pour autant l'installer) afin d'avoir un environnement permettant de compiler le module. Pour récupérer la configuration du noyau plusieurs méthodes.

Si vous avez de la chance la configuration est directement disponible sur votre mobile. adb push /proc/config.gz . Sinon vous pouvez tenter de l'extraire de l'image du noyau split_bootimg.pl boot.img
extract-ikconfig boot.img-kernel
Ou alors trouver la configuration dans le package de source du noyau en fonction du nom de code de votre téléphone. Les configurations se trouvent dans: /arch/arm/configs/XXXX_defconfig
J'ai utilisé la troisième solution et préparé les sources en compilant le noyau avec: make XXXX_defconfig
make
Lime se présente sous la forme d'un module noyau (.ko). Le plus pénible a été de trouver les bonnes commandes pour le compiler. J'ai retravaillé le makefile fournit avec les sources de Lime. La partie importante est la suivante: PWD := $(shell pwd)
KERNEL_PATH := /home/root/mydevice_kernel_src
GCC_PATH := /ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/

$(MAKE) -C $(KERNEL_PATH) M=$(PWD) EXTRA_CFLAGS=-fno-pic CROSS_COMPILE=$(GCC_PATH)/arm-linux-androideabi- modules
Le paramètre important qui n'était pas dans la doc est l'argument -fno-pic sans lequel j'avais un "lime: Unknown symbol _GLOBAL_OFFSET_TABLE_ (err 0)" en chargeant le module. J'ai aussi eu un "File not found" alors que le lime.ko était bien présent mais c'est parce que j'avais utilisé le mauvais compilateur et insmod n'était pas très explicite sur la raison du problème.

Aucun commentaire:

Enregistrer un commentaire