ARM PAC指针认证的侧信道攻击——PACMAN安全漏洞

news2024/11/27 4:03:52

目录

Q1. PACMAN论文的内容是什么?

Q2. Arm处理器是否存在漏洞?

Q3. 受Arm合作伙伴架构许可设计的处理器实现是否受到影响?

Q4. Cortex-M85受到影响吗?

Q5. Cortex-R82受到影响吗?

Q6. 指针认证如何保护软件?

Q7. PACMAN的详细工作原理是什么?

Q8. PACMAN的局限性是什么?

Q9. 用户是否应对PACMAN感到担忧?

Q10. 是否有可用于缓解PACMAN的方法?


Arm最近得知PACMAN漏洞的存在(详见https://pacmanattack.com/),本文解答了有关该漏洞的问题。本文涉及以下10个问题:

  1. PACMAN论文的主题是什么?

  2. Arm的CPU是否受到影响?

  3. 由Arm的合作伙伴根据架构许可设计的处理器实现是否会受到影响?

  4. Cortex-M85是否受到影响?

  5. Cortex-R82是否受到影响?

  6. 指针认证如何保护软件?

  7. PACMAN的详细工作原理是什么?

  8. PACMAN有哪些局限性?

  9. 用户是否应对PACMAN感到担忧?

  10. 是否有可用于缓解PACMAN的方法?

如果您是Arm被许可方,并有其他问题,请联系您的客户团队以获取更多信息。

Q1. PACMAN论文的内容是什么?

麻省理工学院的研究人员发表了一篇描述PACMAN技术的论文。该方法利用恶意软件对指针认证代码(PAC)进行暴力破解。这种技术使用speculation(推测、投机)来创建一个“oracle”以确定这些代码。这允许攻击者利用这些代码来降低指针认证提供的保护,以对抗面向返回编程(ROP)和面向跳转编程(JOP)攻击。ROP和JOP将现有例程的片段链接在一起形成gadgets“小工具”,然后可以利用这些小工具构建更大的功能序列,用于进一步的攻击。

有关详细信息,请查阅发布在https://pacmanattack.com/上的论文。

Q2. Arm处理器是否存在漏洞?

是的。一些支持指针认证功能(FEAT_PAuth或FEAT_PAuth2)的Cortex-A、Neoverse处理器和其他Arm处理器实现容易受到PACMAN攻击。

指针认证功能是在Arm架构版本Armv8.3-A中引入的。在Arm架构的后续版本中,指针认证功能已经得到增强,引入了一个故障特性(FEAT_FPAC),允许在指针认证尝试失败时引发故障。这个故障特性在本文末尾的Q10中所解释的缓解措施中是必要的。

【注意】对于Cortex-A和Neoverse CPU, ID_AA64ISAR1_EL1寄存器中的API位表示该CPU上是否可用指针身份验证或故障特性(FEAT_FPAC)。相关寄存器功能查询请参考http://hehezhou.cn/

c4448da05c8548a093cce197a270788e.png

下表提供了支持指针认证的已发布处理器是否受到影响的信息:“漏洞状态”为“受影响”表示列出的CPU容易受到PACMAN攻击。

c02519e50a52407a9669cd348174f765.png

Q3. 受Arm合作伙伴架构许可设计的处理器实现是否受到影响?

Arm无法对合作伙伴的实现进行评论。请直接联系这些合作伙伴。

Q4. Cortex-M85受到影响吗?

不受影响。Cortex-M85实现了PAC的M-class版本,但并不容易受到攻击。A类和M类PAC架构之间存在区别,避免了这种攻击。M类认证指令在对错误的PAC进行认证时会生成同步故障,而不是修改寄存器结果(这可能允许通过其他侧信道推测性地检测和泄漏认证状态)

a085e9b6b18f4d6dbd6ab17afdd855ef.png

还请注意,M类的PAC是一个完整的32位值,因为它保存在一个单独的寄存器中(而不是存储在指针的高16位地址位中)。这意味着在M类CPU上,任何可能的PAC空间都会比A类CPU上的空间大得多。此外,指针本身在M类设备上不会被修改,因此在推测地执行无效的认证步骤时,内存访问模式不会发生变化。

最后,这些类型的攻击通常需要一个开放的软件堆栈或用户可以将恶意代码加载到系统上的其他方法。通常,Cortex-M设备的使用模型是使用闭源软件堆栈

Q5. Cortex-R82受到影响吗?

Cortex-R82实现了故障特性(FEAT_FPAC),但并不容易受到攻击。当在执行对PAC进行认证的指令时,Cortex-R82在推测性执行时表现与易受攻击的A类CPU不同,该行为不允许攻击软件创建“oracle”。

Q6. 指针认证如何保护软件?

攻击者可以利用内存破坏漏洞来更改存储在内存中的指针或返回地址,然后劫持程序的控制流。遵循这一模式的攻击包括面向返回编程(ROP)和面向跳转编程(JOP),其中攻击者将指向执行所需任务的代码片段(称为“小工具”)的指针链接在一起。

指针认证通过在地址的未使用高位插入指针验证码(PAC),保护内存中的指针免受恶意篡改。这个代码充当签名,它在对指针进行解引用(在间接分支或内存访问时)之前进行验证。如果指针被篡改,认证很可能会失败,CPU将引发故障,从而抵御攻击。

有关更多信息,请参阅《ARM安全架构——为复杂软件提供保护》文档。

Q7. PACMAN的详细工作原理是什么?

PACMAN是一种技术,允许攻击者通过滥用推测执行来暴力破解PAC。需要强调的是,只有在攻击者已经具备破坏内存中受保护指针的能力的情况下,PACMAN才能发挥作用。由于指针认证的存在,为了修改受保护的指针,攻击者需要找到有效的PAC。

在受影响的CPU上,失败的AUT指令会以一种使得解引用导致翻译故障的方式修改指针。执行路径(通过和认证失败的路径)之间的差异可能会转化为不同的微架构副作用,如果被观察到,就会创建一个“推测性oracle”。

微架构副作用的经典例子包括TLB和缓存分配,可以通过时间测量观察到。具体而言,PACMAN论文依赖于TLBs。错误指令永远不会retire,因为错误预测的分支会刷新pipeline,错误不会发生,攻击者可以重复,直到找到有效的PAC。

ce0646c9f98248dfaadd284168280152.png

PACMAN的主要思想是,攻击者可以通过在推测执行下触发AUT指令的执行(例如,通过错误预测的分支,类似于Spectre攻击),调用这个“oracle”并使用不同的PAC值(每次触发内存破坏时)直到找到有效的PAC为止。在这一点上,攻击者将通过创建具有有效PAC的恶意指针来继续攻击。 

Q8. PACMAN的局限性是什么?

正如上文所述,PACMAN有几个要求和限制:

  1. 能够破坏受害者内存中的指针。
  2. 找到一个合适的"小工具",即能够控制目标AUT指令在推测执行下执行。
  3. 支持PAC的易受攻击CPU在推测执行下执行AUT指令时产生不同的微架构副作用。
  4. 能够观察到这些通常比较杂乱的微架构副作用(例如,TLB分配)。
  5. PAC keys预计会根据执行上下文的变化而变化;在一个上下文中有效的PAC在不同的上下文中可能会失效。
  6. 推测窗口的持续时间设定了可以执行和链式执行的"小工具"数量的上限。此外,每个"小工具"的微架构副作用必须能够被攻击者区分。

需要注意的是,这些要求使得远程攻击变得极不可能,因此攻击者必须能够加载和运行恶意软件或脚本到系统中。然而,在类似JavaScript的JIT环境中,这可能会变得更容易。

Q9. 用户是否应对PACMAN感到担忧?

Arm已经审查了PACMAN论文,虽然它提出了一种新颖且有趣的推测侧信道变体,但Arm认为指针认证仍然在防范ROP和JOP等攻击方面提供了相当大的价值。

用户应该意识到,没有使用指针认证构建的软件已经容易受到ROP/JOP的攻击,因此在该软件上执行这些攻击并不需要PACMAN。

此外,考虑到PACMAN的局限性和推测攻击的历史,我们认为在实际应用中不太可能使用PACMAN来破解指针认证。

Q10. 是否有可用于缓解PACMAN的方法?

对于通用软件,Arm建议继续使用标准的保护机制(在上文Q6中讨论,并在《ARM安全架构——为复杂软件提供保护》文档中有详细介绍),因为它们可以防范ROP和JOP攻击。

可以通过以下代码序列进一步缓解PACMAN。然而,这需要提前了解运行代码序列的CPU的具体实现,并且带有额外的性能影响。

对于实现故障特性(FEAT_FPAC)的CPU,使用XPAC指令(见下图)在每个AUT指令之后显式清除PAC字段将阻止PACMAN攻击创建“oracle”的能力。然而,这意味着不能使用组合认证和分支或认证和加载指令。

3f7c09337bc94b49a5866fdca5e1640a.png

27636d27407348fabcee797e5790712f.png

【注意】

上图的方法依赖于故障的AUT指令不会stalling younger指令,这在Arm实现中是成立的。一个替代且性能更好的序列,可以避免这种限制,但需要牺牲一个额外的寄存器(在下面的示例中为X3),是将上图中的以下代码序列进行转换:

LDR X0, [X1]
AUT X0
XPAC X0
LDR X2, [X0]

into:

LDR X0, [X1]
MOV X3, X0
XPAC X0
AUT X3
LDR X2, [X0]

【警告】

上述缓解方法不应在未实现故障特性(FEAT_FPAC)的CPU实现上使用,因为这实际上会禁用PAC提供的保护。ID_AA64ISAR1_EL1寄存器中的API位指示在给定的Cortex-A或Neoverse CPU上是否可用指针认证或故障特性(FEAT_FPAC)。

在无法实际使用XPAC指令或CPU未实现故障特性(FEAT_FPAC)的情况下,用户可以在AUT指令之后添加推测barriers。然而,Arm认为在所有可能的情况下使用推测barriers将对性能产生严重的影响。

无论CPU是否支持故障特性(FEAT_FPAC),Arm仍然强烈建议在当前Arm CPU中使用指针认证来缓解ROP/JOP风格的攻击。如果没有指针认证来防范ROP/JOP攻击,攻击者可能会迅速且轻松地创建ROP/JOP小工具。

参考

https://developer.arm.com/documentation/ka005109/latest/

http://hehezhou.cn/

ARM安全架构——为复杂软件提供保护

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark Shuffle Service简介与测试

一 Dynamic Resource Allocation(动态资源分配) 了解Shuffle Service之前,我们需要先了解和Shuffle Service有关的另一个特性:动态资源分配。 Spark管理资源有两种方式:静态资源分配和动态资源分配。 静态资源分配:spark提交任…

深度学习在智能交互中的应用:人与机器的和谐共生

深度学习与人类的智能交互是当前人工智能领域研究的热点之一。深度学习作为机器学习的一个重要分支,具有强大的特征学习和模式识别能力,可以模拟人脑的神经网络进行数据分析和预测。而人类的智能交互则是指人类与机器之间的信息交流和操作互动&#xff0…

1.理解AOP,使用AOP

目录 1AOP基础 1.1 AOP概述 1.2AOP快速使用 2.3 AOP核心概念 1AOP基础 首先介绍一下什么是AOP,再通过一个快速入门程序,让大家快速体验AOP程序的开发。最后再介绍AOP当中所涉及到的一些核心的概念。 1.1 AOP概述 什么是AOP? 说白了&am…

【C/C++ 12】C++98特性

目录 一、命名空间 二、缺省参数 三、函数重载 四、引用 五、内联函数 六、异常处理 一、命名空间 在C/C项目中,存在着大量的变量、函数和类,这些变量、函数和类都存在于全局作用域中,可能会导致命名冲突。 使用命名空间的目的就是对…

YOLOv5改进 | 损失函数篇 | 更加聚焦的边界框损失Focaler-IoU | 二次创新Inner-FocalerIoU

一、本文介绍 本文给大家带来的改进机制是更加聚焦的边界框损失Focaler-IoU以及我二次创新的InnerFocalerIoU同时本文的内容支持现阶段的百分之九十以上的IoU,比如Focaler-IoU、Focaler-MpdIoU、Innner-Focaler-MpdIoU、Inner-FocalerIoU包含非常全的损失函数,边界框的损失函…

sqlserver alwayson部署文档手册

1、ALWAYSON概述 详细介绍参照官网详细文档,我就不在这里赘述了: https://learn.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/overview-of-always-on-availability-groups-sql-server?viewsql-server-ver16 下图显示的是一个包含一个…

Docker部署Grafana+Promethus监控Mysql和服务器

一、Grafana部署所需资源 Grafana 需要最少的系统资源: 建议的最小内存:512 MB建议的最低 CPU:1 官方文档:https://grafana.com/docs/grafana/latest/getting-started/build-first-dashboard/ 可以看到,我的这台服务…

探索前端开发框架:React、Angular 和 Vue 的对决(三)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

mysql:事务的特性ACID、并发事务(脏读、不可重复读、幻读、如何解决、隔离级别)、undo log和redo log的区别、相关面试题和答案

事务是一组操作的集合,它会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 事务的特性(ACID) 原子性(Atomicity):事务是不可分割的…

QT中,对于大小端UDP网络发送的demo,帧头帧尾

简单demo: 发送端&#xff1a; #include <QUdpSocket> #include <QtEndian>#pragma pack(1) struct Test {unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;quint8 a 1;quint16 b 2;quint16 c 3;//double b …

Sqli靶场23-->30

不知不觉鸽了几天了&#xff0c;没办法去旅游摸鱼是这样的了&#xff0c;抓紧时间来小更一下 23.过滤注释符号 先手工注入一下&#xff0c;就能发现两个单引号不报错&#xff0c;但是一旦上到注释符号的话就会报错&#xff0c;可以猜测出是对注释符号进行了过滤&#xff0c;我…

华为配置OSPF与BFD联动示例

配置OSPF与BFD联动示例 组网图形 图1 配置OSPF与BFD联动组网图 OSPF与BFD联动简介配置注意事项组网需求配置思路操作步骤配置文件 OSPF与BFD联动简介 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种用于检测转发引擎之间通信故障的检测…

深度学习系列56:使用whisper进行语音转文字

1. openai-whisper 这应该是最快的使用方式了。安装pip install -U openai-whisper&#xff0c;接着安装ffmpeg&#xff0c;随后就可以使用了。模型清单如下&#xff1a; 第一种方式&#xff0c;使用命令行&#xff1a; whisper japanese.wav --language Japanese --model…

目标检测任务的调研与概述

目标检测任务的调研与概述 0 FQA1 目标检测任务基本知识&#xff1a;1.1 什么是目标检测&#xff1f;1.2 目标检测的损失函数都有那些&#xff1f;1.2.1 类别损失&#xff1a;1.2.2 位置损失&#xff1a; 1.3 目标检测的评价指标都有那些&#xff1f;1.4 目标检测有那些常见的数…

移动云ONAIR媒体云全解读!媒体内容数字化融合一站式解决方案

当下&#xff0c;传统媒体面临着诸多挑战&#xff0c;如何利用信息技术提升内容的质量、形式和分发效率&#xff0c;成为媒体行业的迫切需求。移动云作为数字中国建设的“主力军”&#xff0c; 立足于新兴媒体与云计算市场的变化与需求&#xff0c;推出了ONAIR 媒体云解决方案&…

Redis核心技术与实战【学习笔记】 - 20.Redis原子操作及并发访问

概述 使用 Redis 时&#xff0c;不可避免地会遇到并发访问的问题&#xff0c;比如说如果多个用户同时下单&#xff0c;就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作&#xff0c;数据就会被修改&#xff0c;如果我们没有对并发写请求做好控制&#xff0c;就可…

机器学习中的有监督学习和无监督学习

有监督学习 简单来说&#xff0c;就是人教会计算机学会做一件事。 给算法一个数据集&#xff0c;其中数据集中包含了正确答案&#xff0c;根据这个数据集&#xff0c;可以对额外的数据希望得到一个正确判断&#xff08;详见下面的例子&#xff09; 回归问题 例如现在有一个…

套路化编程 C# winform 自适应缩放布局

本例程实现基本的自适应缩放布局。 在本例程中你将会学习到如何通过鼠标改变界面比例&#xff08;SplitContainer&#xff09;、如何使用流布局&#xff08;FlowLayoutPanel&#xff09;排列控件&#xff0c;当然首先需要了解如何设置控件随窗口缩放。 目录 创建项目 ​编辑…

【npm】安装全局包,使用时提示:不是内部或外部命令,也不是可运行的程序或批处理文件

问题 如图&#xff0c;明明安装Vue是全局包&#xff0c;但是使用时却提示&#xff1a; 解决办法 使用以下命令任意一种命令查看全局包的配置路径 npm root -g 然后将此路径&#xff08;不包括node_modules&#xff09;添加到环境变量中去&#xff0c;这里注意&#xff0c;原…

101 C++内存高级话题 内存池概念,代码实现和详细分析

零 为什么要用内存池&#xff1f; 从前面的知识我们知道&#xff0c;当new 或者 malloc 的时候&#xff0c;假设您想要malloc 10个字节&#xff0c; char * pchar new char[10]; char *pchar1 malloc(10); 实际上编译器为了 记录和管理这些数据&#xff0c;做了不少事情&…