经过一周的Oakland特别报道,大家估计都已经审美疲劳了,今天我们回归论文,感谢我们的老朋友,公众号“非尝咸鱼贩”的博主codecolorist给我们推荐的论文——来自ISCA 2022的PACMAN: Attacking ARM Pointer Authentication with Speculative Execution
这篇由宇宙第一CS实验室——MIT CSAIL的研究人员完成的论文又是针对Apple的M1芯片。作为ARM Pointer Authentication这个特性的先行者(或者应该批评其它桌面版本的ARM芯片都没跟上,当然如果大家知道还有哪些芯片支持,请留言指出),M1芯片部署的Pointer Authentication防护固然增加了代码的安全性,但是M1芯片为了性能优化而导致的 micro-architectural side channel attack(参考我们5月13日的论文推荐)也反过来增加了破解Pointer Authentication的可能性。本文即提出了一种名为 PACMAN 的新型攻击,利用所谓的PACMAN gadget
来对Pointer Authentication中最重要的Pointer Authentication Code(PAC)进行猜测,一旦猜测成功就能破坏Pointer Authentication的防护了!
作为本文必要的背景知识,大家首先要了解一下Pointer Authentication技术,这个自从ARM 8.3开始被引入的防护技术目前被许多移动设备ARM芯片使用,同时也逐步推广到桌面芯片。它的基本原理是在指针中加入一个密码学hash值(即PAC),因为当前的设备的物理内存大小限制,其实并不需要指针的所有64 bits都用来表示地址,可以留出一部分来存储PAC:
通过PAC(配合一些特殊的指令如pacia
、autia
),代码可以验证所使用的指针的data integrity,从而对抗各种针对指针的劫持。如果PAC校验失败,则程序会抛出异常而崩溃,这样即使PAC的熵不大(有可能被穷举攻击),攻击者也很难在有限次数的尝试中猜中PAC。
然而,上述的“猜测-崩溃”防护模式,在存在预测执行的现代CPU上会被攻击者绕过。攻击者针对PAC的猜测可以利用预测执行来进行,这样就避免了异常的产生,从而可能悄无声息地穷搜索相关的PAC值。本文作者设计的 PACMAN 攻击利用了下图所示的特定PACMAN gadget
代码片段,具体可分为两类:data PACMAN gadget和instruction PACMAN gadget。这两类gadget都包含了条件分支语句(触发预测执行),同时在分支中需要能够访问攻击者提供的地址(guess_ptr
),这样攻击者可以诱骗CPU去访问和验证一个猜测的指针(其中包含有猜测的PAC值)是否合法,猜中与否会导致 micro-architectural 层面上的一些运行时间差别,攻击者可以利用时间侧信道来验证自己猜测的正确性。
作者在文章中给出了一个实例,展示了如何基于一个memcpy内存破坏漏洞来完成对指针的劫持,同时作者调查了macOS 12.2.1使用的XNU kernel版本(xnu-8019.80.24),发现其中存在55159个可能的PACMAN gadgets,也就是说,攻击者有充足的选择实施PACMAN攻击。
作者在M1芯片上针对macOS 的 XNU Kernel进行了测试,自己也开发了一系列的代码来分析M1芯片上的侧信道如何利用,包括自己开发了一个简单的OS——PacmanOS(不愧是MIT……),上面非常干净,没有什么多余的进程,可以很方便地测试CPU的各种预测执行特性!
这帮投ISCA的家伙精通系统结构,分析微架构头头是道,而小编就很头疼,这里把细节交给读者自己去关注吧。。。作者分析表明,对于16比特的PAC,大约只需要2.94分钟(理想情况)就能猜出来,而准确率大概是90%
作者最后还提出了一个Jump2Win Attack,利用C++的虚表机制来实施攻击:但是感觉作者不熟悉安全社区的思维模式,这一部分写得语焉不详,看了半天没理解到底作者想要表达什么……有兴趣的读者可以去自己看看这段是不是写得很糟糕~
论文PDF:
https://people.csail.mit.edu/weontaek/pubs/PACMAN_ISCA22.pdf (然而你现在并不能访问,不要问小编怎么找到PDF的)
最后插播一则新闻: