在三星Android手机上从Fuzzing漏洞挖掘到RCE漏洞利用
2020-05-21 09:45:00 Author: www.4hou.com(查看原文) 阅读量:534 收藏

我们进行了一些在三星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等等。

1589357380028.png

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

1589360387684.png

作者触发了三星设备上的堆溢出,导致设备被黑客入侵,攻击者获得了反向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如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/NpLK
如有侵权请联系:admin#unsafe.sh