
Code PoC pour CVE-2017-13253
Code PoC pour CVE-2017-13253.
L'article complet est disponible ici. Notez que les chiffres sont légèrement différents de l'article du blog, car j'ai constaté qu'il y a une plus grande probabilité de plantage avec un tas de 0x2000 (bien sûr, si vous l'exécutez assez de fois, il finira par planter de toute façon).
Pour toute question/problème/commentaire, n'hésitez pas à me contacter sur Twitter (@tamir_zb).
Pour construire ceci :
AOSP/external. cd AOSP
source build/envsetup.sh
make icrypto_overflow
Exécuter ceci sur une version non corrigée d'Android (8.0-8.1 avant mars 2018) devrait entraîner un débordement. Cela peut provoquer un plantage, selon que les données écrasées soient accessibles en écriture ou non.
Le code devrait afficher la sortie de la méthode decrypt, qui peut varier :
decrypt devrait renvoyer BAD_VALUE (-22).decrypt devrait renvoyer la quantité de données copiées.decrypt devrait renvoyer UNKNOWN_ERROR (-32).decrypt devrait renvoyer 0.Voici un extrait du dump de plantage résultant de l'exécution de ce PoC :
Build fingerprint: 'google/walleye/walleye:8.1.0/OPM1.171019.011/4448085:user/release-keys'
Revision: 'MP1'
ABI: 'arm'
pid: 761, tid: 5232, name: HwBinder:761_1 >>> /vendor/bin/hw/[email protected] <<<
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xee20f000
r0 ee20f000 r1 ee20d021 r2 00001eff r3 00000001
r4 00000001 r5 00000000 r6 ed117008 r7 00000000
r8 00000000 r9 fffff82a sl ee20d000 fp ee20efff
ip 08000000 sp ed2893c8 lr ed369e6b pc edda7f0c cpsr 20070010
backtrace:
#00 pc 00018f0c /system/lib/libc.so (__memcpy_base+244)
#01 pc 00004e67 /vendor/lib/mediadrm/libdrmclearkeyplugin.so (clearkeydrm::CryptoPlugin::decrypt(bool, unsigned char const*, unsigned char const*, android::CryptoPlugin::Mode, android::CryptoPlugin::Pattern const&, void const*, android::CryptoPlugin::SubSample const*, unsigned int, void*, android::AString*)+82)
...
memory map (205 entries):
(fault address prefixed with --->)
...
ee20d000-ee20efff rw- 0 2000 /dev/ashmem/MemoryHeapBase (deleted)
--->ee20f000-ee20ffff --- 0 1000 [anon:thread signal stack guard page]
...
Comme vous pouvez le voir, l'adresse de défaut est la mémoire juste après la mémoire partagée. Étant donné que cette mémoire est protégée en écriture, le débordement a entraîné une erreur de segmentation.