Project Zero: 突破WebP限制
BLASTPASS iMessage漏洞分析
2023年9月7日,苹果为iOS发布了带外安全更新。与此同时,Citizen Lab发布博客文章,将iOS 16.6.1中修复的两个CVE与"野外捕获的NSO Group零点击零日漏洞"联系起来。
该漏洞链能够在不与受害者交互的情况下,入侵运行最新版iOS(16.6)的iPhone。漏洞涉及从攻击者iMessage账户发送给受害者的包含恶意图像的PassKit附件。
WebP漏洞分析
WebP是一个相对现代的图像文件格式,首次发布于2010年。实际上WebP是两种完全不同的图像格式:基于VP8视频编解码器的有损格式和单独的无损格式。
漏洞存在于无损格式中,RIFF块名称为VP8L。无损WebP广泛使用霍夫曼编码,BLASTPASS样本中至少存在10个霍夫曼树。
根本问题是WebP代码仅在构建解码表后检查树的有效性,但解码表的预计算大小仅对有效树正确。如Isosceles博客文章指出的,这意味着触发漏洞会被检测到,但在内存损坏后,图像解析会在几行代码后停止。
漏洞利用原语
漏洞将在霍夫曼表缓冲区末尾的已知偏移处写入HuffmanCode结构:
|
|
如DarkNavy指出的,虽然bits和value字段名义上受攻击者控制,但实际上灵活性有限。第五个霍夫曼表只有40个符号,将value限制为最大值39(0x27),bits将在1到7之间。
总结:32位值0x270007将被写入0x3000字节霍夫曼表分配末尾的0x58字节处,然后WebP解析将失败,解码器将退出。
PKPass文件分析
虽然BLASTPASS通常被称为"WebP漏洞"的漏洞利用,但攻击者实际上并不只是发送WebP文件。他们发送包含WebP的PassKit PKPass文件。
PKPass zip存档内有五个文件:
- background.png(实际上是TIFF文件)
- logo.png(实际上是WebP图像)
- manifest.json
- pass.json
- signature
这种文件扩展名欺骗技术与FORCEDENTRY类似,都是通过重命名文件扩展名来访问意外上下文中的解析器。
堆布局操纵
通过分析二进制属性列表(bplist)格式的MakerNote标签,攻击者执行复杂的堆布局操纵。该bplist大小为5.5MB,包含大量重复字典键,用于精确的堆塑造。
漏洞利用libmalloc小区域分配器的特性,通过溢出修改分配元数据,创建重叠的内存分配。具体来说,它将一个3块(1536字节)的使用中分配的大小改为39块(19968字节),超出了31块的最大限制。
ASLR和PAC绕过
攻击使用回调导向编程(Callback-Oriented Programming)技术来绕过指针认证码(PAC)保护。通过交换指向回调结构的未签名指针,攻击者能够链式调用预签名的函数指针,构建JOP链。
ASLR通过单独的HomeKit漏洞进行绕过,攻击者在构建PKPass时已经知道目标设备类型、构建版本和MessagesBlastDoorService的运行时ASLR偏移。
NSExpression载荷
最终的利用阶段涉及NSExpression载荷的执行,该载荷从堆栈中提取通信端口,劫持与imagent的通信,然后等待包含AES密钥的特定格式iMessage,用于解密和执行下一阶段的NSExpression。
结论
与FORCEDENTRY相比,BLASTPASS将ASLR泄露和RCE阶段分离,减少了对新型怪异机器的需求。虽然堆布局操纵复杂精确,但漏洞利用仍依赖于众所周知的技术。
对MakerNote内bplist格式实施更严格的要求(例如大小限制或拒绝重复键的严格解析模式)似乎是明智的。确保BlastDoor具有唯一的ASLR偏移可能是缓解ASLR泄露的一种方法。
当前基于进程隔离的沙箱方法只能提供有限保护,准确映射并真正减少初始远程攻击面范围应该是首要任务。