我们进行了一些在三星Android手机上的安全性研究,这些研究证明了通过发送无用户交互的mms,可以从Fuzzing模糊测试到实现远程代码执行利用。
Google的Project Zero致力于挖掘0-day漏洞并破解各种产品,他们已经在三星的Android Skia图像处理库中发现一些堆溢出问题。
此漏洞由团队成员Mateusz Jurczyk发现的。此漏洞使恶意MMS能够触发远程代码执行,该漏洞是在图像处理中发生的,图像处理是在收到短信并且由Android的Skia库处理图像而没有用户交互时发生的。因此,接收到会触发导致图像处理中堆溢出的恶意映像,将导致远程执行代码。
0x01 Fuzzing
该漏洞是使用AFL发现的,该fuzzer已用于在多个大型软件项目中挖掘各种漏洞,例如 Apache,Perl,iOS Kernel,OpenBSD,VLC,clang,putty,firefox等等。
AFL由Michal Zalewski创建,他曾在Google的“Project Zero”团队工作,目前正在为社交网络平台Snapchat的公司服务。
模糊测试是将尽可能多的不同/随机类型的数据输入目标程序来发现漏洞,Google有一个OSS-Fuzz的自动模糊测试引擎,该引擎已在各种不同的软件中发现了16 000个漏洞:
https://bugs.chromium.org/p/oss-fuzz/issues/list?q=-status%3AWontFix%2CDuplicate%20-component%3AInfra&can=1 https://bugs.chromium.org/p/oss-fuzz/issues/list?q=-status%3AWontFix%2CDuplicate%20-component%3AInfra&can=1
想要获得更多有关模糊测试的信息,可以阅读:《Fuzzing for Software Security Testing and Quality Assurance》一书
该漏洞的编号为CVE-2020-8899,CVE链接:https://vulns.firosolutions.com/cve/CVE-2020-8899/
0x02 漏洞分析
作者挖掘的目标是Skia库,这是Android(也供Google Chrome,Chrome OS,Mozilla Firefox和Firefox OS使用)的图形3d 库,用于加载和显示图像。
默认情况下,Skia支持以下图像格式:
· ICO
· BMP
· WBMP
· PNG
· JPEG
· GIF
· WEBP
· HEIF
· RAW
使用二进制分析工具IDA pro,可以看到三星添加了对以下格式的自定义支持。
· QM
· QG
· ASTC
· PIO
此漏洞针对最初由韩国软件供应商(Quramsoft)[ http://www.quramsoft.com ] 创建的QM和QG 这两种自定义添加格式。
使用运行Android 10 的最新Samsung Galaxy Note 10+设备,并截至2020年1月使用最新的安全补丁。通过从内置于apk 应用程序的Samsung中提取QM和QG图像。然后,作者使用qemu-aarch64 运行了一个仿真版本,从而能够在三星设备上本地运行可执行二进制文件的同时运行它们。
编译将要放入afl的文件可能有点棘手,需要Skia的源代码,Android NDK,Capstonem,libbacktrace,lib64和来自三星android系统的linker64。将所有这些文件放好之后,我们就可以为ARM aarch64编译一个elf二进制文件。
对该二进制文件进行Fuzzing处理,发现了5000多个不同的Crashs:
+-------------+-------+------------+ | | Count | Percentage | +-------------+-------+------------+ | write | 174 | 3.33% | | sigabrt | 3 | 0.06% | | read-1 | 3322 | 63.66% | | read-2 | 393 | 7.53% | | read-4 | 703 | 13.47% | | read-8 | 34 | 0.65% | | read-16 | 52 | 1.00% | | read-32 | 3 | 0.06% | | read-vector | 18 | 0.34% | | read-memcpy | 124 | 2.38% | | null-deref | 392 | 7.51% | +-------------+-------+------------+
sigabrt是Unix信号,当出现严重错误时,该信号会告诉进程中止并停止程序执行。如堆溢出导致崩溃,读取超出范围的内存,174表示超出范围(CWE-787),表示程序能够在其专用的已分配内存之外进行写入,能够在分配的内存之外进行写操作将导致基于栈和堆的缓冲区溢出。
这些漏洞非常严重,因为一旦被利用,它们将导致任意代码执行,并且通常有很高的危害性。
0x03 Crashs
可利用的Crashs:
Build fingerprint: 'samsung/d2sxx/d2s:10/QP1A.190711.020/N975FXXS1BSLD:user/release-keys' Revision: '24' ABI: 'arm64' Timestamp: 2020-01-24 09:40:57+0100 pid: 31355, tid: 31386, name: thumbnail_threa >>> com.sec.android.app.myfiles <<< uid: 10088 signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x4a4a4a4a4a4a4a x0 0000006ff55dc408 x1 0000006f968eb324 x2 0000000000000001 x3 0000000000000001 x4 4a4a4a4a4a4a4a4a x5 0000006f968eb31d x6 00000000000000b3 x7 00000000000000b3 x8 0000000000000000 x9 0000000000000001 x10 0000000000000001 x11 0000000000000001 x12 0000007090d96860 x13 0000000000000001 x14 0000000000000004 x15 0000000000000002 x16 0000007091463000 x17 0000007090ea2d94 x18 0000006f95d1a000 x19 0000006ff5709800 x20 00000000ffffffff x21 0000006ff55dc408 x22 00000000000000b0 x23 0000006f968ed020 x24 0000000000000001 x25 0000000000000001 x26 0000006f968ed020 x27 0000000000000be5 x28 0000000000012e9a x29 0000006f968eb370 sp 0000006f968eb310 lr 0000007090f5f7f0 pc 004a4a4a4a4a4a4a backtrace: #00 pc 004a4a4a4a4a4a4a #01 pc 00000000002e97ec /system/lib64/libhwui.so (process_run_dec_check_buffer+92) (BuildId: fcab350692b134df9e8756643e9b06a0) #02 pc 00000000002ddb94 /system/lib64/libhwui.so (QmageRunLengthDecodeCheckBuffer_Rev11454_141008+1320) (BuildId: fcab350692b134df9e8756643e9b06a0) #03 pc 00000000002d45dc /system/lib64/libhwui.so (PVcodecDecoderIndex_Rev11454_141008+1264) (BuildId: fcab350692b134df9e8756643e9b06a0) #04 pc 00000000002d3fb4 /system/lib64/libhwui.so (__QM_WCodec_decode_Rev11454_141008+224) (BuildId: fcab350692b134df9e8756643e9b06a0) #05 pc 00000000002d3d28 /system/lib64/libhwui.so (Qmage_WDecodeFrame_Low_Rev11454_141008+192) (BuildId: fcab350692b134df9e8756643e9b06a0) #06 pc 00000000002d08e4 /system/lib64/libhwui.so (QuramQmageDecodeFrame_Rev11454_141008+144) (BuildId: fcab350692b134df9e8756643e9b06a0) #07 pc 00000000006e1f8c /system/lib64/libhwui.so (SkQmgCodec::onGetPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const&, int*)+1260) (BuildId: fcab350692b134df9e8756643e9b06a0) #08 pc 00000000004daefc /system/lib64/libhwui.so (SkCodec::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*)+852) (BuildId: fcab350692b134df9e8756643e9b06a0) #09 pc 00000000006e2788 /system/lib64/libhwui.so (SkQmgAdapterCodec::onGetAndroidPixels(SkImageInfo const&, void*, unsigned long, SkAndroidCodec::AndroidOptions const&)+168) (BuildId: fcab350692b134df9e8756643e9b06a0) #10 pc 00000000004da494 /system/lib64/libhwui.so (SkAndroidCodec::getAndroidPixels(SkImageInfo const&, void*, unsigned long, SkAndroidCodec::AndroidOptions const*)+684) (BuildId: fcab350692b134df9e8756643e9b06a0) #11 pc 00000000006e0930 /system/lib64/libhwui.so (SkBitmapRegionCodec::decodeRegion(SkBitmap*, SkBRDAllocator*, SkIRect const&, int, SkColorType, bool, sk_sp)+1168) (BuildId: fcab350692b134df9e8756643e9b06a0) #12 pc 00000000001991c8 /system/lib64/libandroid_runtime.so (nativeDecodeRegion(_JNIEnv*, _jobject*, long, int, int, int, int, _jobject*, long, long)+976) (BuildId: 21b5827e07da22480245498fa91e171d) [...]
作者还测试了各种各样的三星手机,均存在此漏洞:
1. Galaxy Note 4(Android 4.4.4,2014年9月)
2. Galaxy Note Edge(Android 4.4.4,2014年11月-2014年12月)
3. Galaxy Note Edge(Android 2015年3月5.0.1-2015年6月)
4. Galaxy Core Prime(Android 5.1.1,2015年8月)
5. Galaxy Note 5(Android 5.1.1,2015年8月)
6. Galaxy Note 4(Android 5.1.1,2015年10月)
7. Galaxy Note 3(Android 5.0,2016年1月)
8. Galaxy S7(Android 6.0.1,2016年2月)
9. Galaxy Note 5(Android 6.0.1,2016年2月)
10. Galaxy S7(Android 7,2017年1月)
11. Galaxy Note 5(Android 7,2017年3月)
12. Galaxy S8(Android 7,2017年4月)
13. Galaxy S8(Android 8,2018年2月)
14. Galaxy S7(Android 8,2018年4月)
15. Galaxy S9(Android 8,2018年4月)
16. Galaxy S8(Android 9,2019年2月)
17. Galaxy S9(Android 9,2019年4月)
18. Galaxy A50(Android 9,2019年10月)
19. Galaxy Note 10+ (Android 9,2019年11月-2019年12月)
20. Galaxy Note 10+(Android 10,2020年1月)
0x04 漏洞利用
https://youtu.be/nke8Z3G4jnc
作者触发了三星设备上的堆溢出,导致设备被黑客入侵,攻击者获得了反向shell。
Mateusz Jurczyk惊人地完成了此漏洞利用,证明了模糊测试的真正威力!从仅启动AFL到使用恶意MMS 实现零交互远程执行代码,作者非常无私的发布了可以下载的crashs的7z压缩文件。
越界Crashs示例:
ASAN:SIGABRT ================================================================= ==284619==ERROR: AddressSanitizer: ABRT on unknown address 0xbc707f000457cb (pc 0x400372d360 sp 0x4000cfe840 bp 0x4000cfe840 T0) #0 0x00083360 in libc.so (abort+0xb0) #1 0x000cec40 in libc.so (__set_errno_internal+0x0) #2 0x006e33a0 in libhwui.so (SkQMCodec::onGetPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const&, int*)+0x4e8) #3 0x004daf00 in libhwui.so (SkCodec::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*)+0x358) ==284619==DISASSEMBLY 0x400372d360: mov x1, sp 0x400372d364: orr w0, wzr, #6 0x400372d368: stp q1, q0, [sp] 0x400372d36c: mov x2, xzr 0x400372d370: bl #0x4003791b20 0x400372d374: sub x1, x29, #0x28 0x400372d378: orr w0, wzr, #2 0x400372d37c: mov x2, xzr 0x400372d380: bl #0x4003791b10 0x400372d384: mov x0, x19 ==284619==CONTEXT x0=0000000000000000 x1=00000000000457cb x2=0000000000000006 x3=0000004000cfe860 x4=0000000000000000 x5=0000000000000000 x6=0000000000000000 x7=0000000000000030 x8=00000000000000f0 x9=00000040036ce5e0 x10=0000000000000000 x11=0000000000000001 x12=0000000000000028 x13=29726f746365746f x14=00000000000007d8 x15=000000000003e820 x16=000000400379c8c0 x17=0000004003779870 x18=0000004000e5e000 x19=00000000000000ac x20=00000000000457cb x21=00000000000000b2 x22=00000000000457cb x23=00000000ffffffff x24=000000400827a020 x25=0000000000000000 x26=0000000000000001 x27=000000408975afc8 x28=000000000000fa08 FP=0000004000cfe910 LR=000000400372d330 SP=0000004000cfe840 ==284619==ABORTING
Google启动了Skia android Fuzzing存储库:https : //github.com/googleprojectzero/SkCodecFuzzer
三星已经确认了此漏洞,并发布了补丁和安全公告,链接如下:
https ://security.samsungmobile.com/securityUpdate.smsb
如果你想开始对AFL进行Fuzzing,可以在这里获取程序:https : //lcamtuf.coredump.cx/afl/
选择感兴趣的软件,编译并运行它,使用AFL来挖掘漏洞。
0x05 参考文献
https://packetstormsecurity.com/files/157620/Samsung-Android-Remote-Code-Execution.html https://en.wikipedia.org/wiki/Fuzzing https://owasp.org/www-community/Fuzzing https://skia.org https://en.wikipedia.org/wiki/Signal_(IPC) https://cwe.mitre.org/data/definitions/787.html https://en.wikipedia.org/wiki/Heap_overflow https://en.wikipedia.org/wiki/Stack_buffer_overflow https://vulns.firosolutions.com/cve/CVE-2020-8899/
本文翻译自:https://medium.com/@social_62682/from-fuzzing-to-remote-code-execution-in-samsung-android-56cbdebcfeca如若转载,请注明原文地址: