为什么CPU推测执行不会导致OOB程序崩溃?

2023-12-15

问题源于阅读幽灵攻击纸。如果我理解正确的话,攻击源于 CPU 启发式推测执行(错误)代码分支的可能性。 考虑这个例子(C语言):

int arr[42];
if (i < 42) {
    int j = arr[i];
}

如果我正确理解这篇论文,int j = arr[i]即使在某些情况下也可以推测执行i >= 42。我的问题是 - 当我访问超出其范围的数组时,我的程序经常会崩溃(Linux 上的分段错误,Windows 上的“程序执行了非法操作”错误)。

为什么在数组越界访问的情况下推测执行不会导致程序崩溃?


关键点是在现代 CPU 中动词执行并不意味着你认为的意思。

执行指令是计算其输出和副作用(如果有)的行为。
然而,这没有改变程序状态。
乍一看这似乎很难理解,但实际上并不奇怪。

CPU有一个相当大的内存,由它的所有寄存器组成,大部分内存是not对于程序员可见,这部分被称为建筑状态.
架构状态 (AS) 是 CPU 手册中记录的内容以及由指令序列(例如程序)更改的内容。

由于更改 AS 只能通过 ISA(手册)中给出的语义进行,并且 ISA 指定串行语义(指令按照程序顺序一个接一个地完成),因此不允许并行性。
然而,现代 CPU 拥有大量可以独立完成工作的资源(称为执行单元)。

为了利用所有这些资源,CPU 的前端(负责从内存层次结构读取指令并将其馈送到执行单元的部分)能够在每个周期到达、解码和输出多于一条指令。
前端和后端(执行单元所在的位置)之间的边界不再真正处理指令(而是处理微指令),但这是 x86 CISC 的麻烦。

所以现在 CPU 一次被给予 4/6 uops 来“执行”,但如果 ISA 是串行的,除了对这些 uops 进行排队之外,它还能做什么?
好吧,前端的设计是为了让这些微指令不在AS上运行,而是在a上运行影子状态(SS,我在这里的术语),它们的操作数被重命名,由CPU的大隐形内存的一部分组成。
改变并行或乱序都可以,因为它不是 AS。
这就是执行:改变 SS。

真的值得吗?毕竟,AS 才是最重要的。
嗯,与执行相比,将 SS 转移到 AS 确实很快,所以这是值得的。
这是一个“重命名回来”(反转以前的重命名)的问题,它被称为retiring的说明。

事实上,退休的意义远不止于此。
由于执行不会影响 AS,因此副作用也不会影响它。
这些副作用包括异常,但是推测性地处理异常太麻烦(需要协调很多资源),所以异常处理是delayed直到退休。
这还有一个优点,就是在处理异常时拥有正确的 AS,并且只有在实际必须发生异常时才引发异常。

推测执行的要点是bet,CPU 打赌指令序列不会生成任何异常(包括页面错误),因此在大多数检查关闭的情况下执行它(我不能排除,无论如何,某些检查都不会进行),从而获得很多优势。
当需要废弃这些指令时,将检查赌注,如果任何失败,则 SS 将被丢弃。

这就是为什么推测执行不会使程序崩溃。

Spectre 所依赖的事实是,推测性执行确实在某种意义上改变了 AS:缓存不会失效(再次出于性能原因,当赌注关闭时,SS 不会被复制到 AS 中)并且可能发生定时攻击。
这可以通过多种方式纠正,包括在从 TLB 读取时执行基本权限检查(毕竟仅使用权限 0 和 3,因此逻辑很简单)或向缓存行添加一位以将其标记为推测的(被非推测代码视为无效)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么CPU推测执行不会导致OOB程序崩溃? 的相关文章

  • 什么时候用==,什么时候用is?

    奇怪的是 gt gt gt a 123 gt gt gt b 123 gt gt gt a is b True gt gt gt a 123 gt gt gt b 123 gt gt gt a is b False Seems a is b
  • 根据 AD 组成员身份限制对 WPF 视图的访问

    我们有一个 WPF 应用程序 我们希望根据用户的 AD 组成员身份限制对应用程序的访问 我们可以将其作为每个视图的属性 或者作为用户启动应用程序时的检查吗 任何代码示例将不胜感激 在 NET 3 5 及更高版本上执行此操作的最简单方法是使用
  • 对将英特尔傲腾 DC SSD 用作 IMDT 的额外 RAM 感到困惑吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对英特尔傲腾 DC 有点困惑 我希望我的 Optane DC 能够同时充当 DRAM 和存储 一方面 我了解到只有 英特尔傲腾 DC 持
  • “openssl 编程简介。”文章。过期的证书

    我是 openSSL 库和 PKI 的新手 我有一个简单的问题要问 openSSL 专家 有谁知道如何为本文中的代码示例创建证书 OpenSSL 编程简介 第一部分 第二部分 作者 Eric Rescorla www rtfm com op
  • ASPXAUTH Cookie 的安全标志

    我们有一个面向外部的应用程序 由外部安全公司进行了渗透测试 应用程序在 ASP NET MVC4 上开发并在 IIS8 Windows 2012 Server 上运行 报告的漏洞之一是 ASPXAUTH 不安全 当我检查 cookie 检查
  • https登录的安全性?

    我正在编写一个 Apple iOS 应用程序 用于登录帐户并获取一些余额 它使用纯 html 链接进行登录 用户名和密码在运行时动态加载到登录链接 我使用 Wireshark 嗅探了流量 但在发送的任何包中都找不到用户名或密码 我猜 htt
  • 卸载 SSL 时保护表单身份验证 Cookie

    我正在尝试使用 ASP NET MVC 2 0 和表单身份验证来保护我当前正在开发的网站 为了保护表单身份验证cookie 我想将requiresSSL 属性设置为true 以便浏览器仅在连接处于SSL 下时才发送cookie 并且显然确保
  • 当SESSION_COOKIE_SECURE = True时如何在HTTP中获取一些用户身份信息

    以下是我正在开发的网站的简短描述 公共页面可以通过 HTTP 或 HTTPS 访问 其他一些页面 认证页面 账户详情页面等 需要通过HTTPS访问 Apache2 负责进行相关的 HTTP 到 HTTPS 链接重定向 我使用标准 Djang
  • 如何在 JASPIC 中保存经过身份验证的用户?

    我开发了一个安全认证模块 SAM 并实现了validateRequest方法 我还有一个简单的 Web 应用程序配置为使用此 SAM In my validateRequest方法 我检查 clientSubject 并设置一个Caller
  • 使用公钥时出现 InvalidKeySpecException

    我正在拼命尝试在 Android 上使用非对称公钥 私钥加密技术来加密消息 我在 Windows 上 使用 puttygen 生成了公钥和私钥 我不确定它有什么区别 但我选择了 SSH 2 RSA 这是公钥 AAAAB3NzaC1yc2EA
  • JWT(Json Web 令牌)与自定义令牌

    我仔细查看了问题 但没有找到任何可以解决我的疑问的内容 我找到了有关 JWT 的大量信息 但在比较 JWT 相对于针对 REST 服务生成自定义令牌来对身份验证请求提供的优势时 发现的信息并不多 与生成自定义生成令牌相比 使用 JWT Js
  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • 有关 CredEnumerate 的帮助

    作为后续this https stackoverflow com questions 199518 how to programatically add mapped network passwords winxp我希望有人可以帮助解决这个
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 从钥匙串保存和加载 |斯威夫特[重复]

    这个问题在这里已经有答案了 如何简单地将字符串存储在钥匙串中并在需要时加载 有几种SO解决方案 主要参考Git repo 但我需要最新 Swift 上最小和最简单的解决方案 当然 我不想添加 git 框架来简单地在我的项目中存储密码 有类似
  • 当我使用加盐 CRYPT_MD5 加密我的密码时,正在加密什么?

    对字符串使用 md5 总是会产生字母数字加密结果 即 没有符号 然而 当我使用 php crypt 函数 特别是带有盐的 CRYPT MD5 并且它已打开 我已经检查过 时 它返回的假定 md5 哈希看起来不像 md5 哈希 例如 如果我
  • 算法 HmacPBESHA256 不可用

    因此 我编写了一些代码来获取 PEM 通过 bouncycastle 将其添加到 PKCS 密钥库 然后使用 java crypto 将 PKCS 密钥库值导入到 JKS 密钥库中 我发誓昨天我在执行这些步骤后成功通过了单元测试 但是今天早
  • 哪些对齐问题限制了 malloc 创建的内存块的使用?

    我正在用 C 编写一个用于各种数学计算的库 其中一些需要一些 临时 空间 用于中间计算的内存 所需的空间取决于输入的大小 因此不能静态分配 该库通常用于使用相同大小的输入执行相同类型计算的多次迭代 因此我不希望这样做malloc and f
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何在服务器上保存用户凭据以在后台运行查询

    背景 我们有一个 ASP NET Silveright Web 应用程序 silverlight客户端显示用户 图形形式的特定数据 它从服务器请求数据 问题 由于服务器必须执行底层数据库查询 获取这些数据的成本很高 因此客户端必须等待 优化

随机推荐

  • 正则表达式替换除第一个和最后一个字符之外的内容

    什么是正则表达式 用于将字符串中的双引号 替换为转义反斜杠 后跟双引号 字符串的第一个和最后一个字符除外 示例 1 嵌入字符串中的双引号 Input This is a Test Expected Output This is a Test
  • WELD-001408 类型 [Validator] 的依赖关系不满足

    将项目从 Java EE 6 迁移到 Java EE 7 后 我无法部署该项目 我已经启用了 CDI beans xml 带有 bean discovery mode all 以实现向后兼容性 部署错误似乎与我的代码无关 因为它提到了一个尝
  • C# 将内部 XML 反序列化为字符串

    我有以下 XML
  • Mongodb 按索引字段搜索

    我将字段 search string 添加到我的文档中并为其建立索引 db my collection createIndex search string text Search string 包含以下内容 a ar are are are
  • 如何使用 BeautifulSoup 正确解析 UTF-8 编码的 HTML 为 Unicode 字符串? [复制]

    这个问题在这里已经有答案了 我正在运行一个 Python 程序 该程序获取 UTF 8 编码的网页 并使用 BeautifulSoup 从 HTML 中提取一些文本 但是 当我将此文本写入文件 或在控制台上打印 时 它会以意外的编码写入 示
  • 图形 - 将 3d 点转换为 2d 投影的方程

    我是一名图形新手 但正在使用 HTML5 Canvas javascript 以及一些形状和图像 如果我在点 C x C y C z 处有一个相机 在 P x P y P z 处有一个点 那么将该点转换为 2d 点的最简单方法是什么 以便我
  • 如何访问名称中带有前导数字的财产[重复]

    这个问题在这里已经有答案了 var jsonJSON UrlFetchApp fetch https wowtoken info snapshot json var json Utilities jsonParse jsonJSON get
  • 批量邮件性能发送方式

    我写了一个支持 phpmailer swiftmailer 的邮件脚本 实际上 小型活动效果很好 所有邮件都到达收件人 没有精子或服务器资源问题 我对每个连接的发送性能有疑问 哪种方式更适合发送操作 订阅者具体邮件正文不同 第一个场景 打开
  • 如何创建包含2个表中的数据并将数据保存到一张表的表单

    我有 2 张桌子 Employee ID SalaryPerDay Name unique Schedule ID EmployeeID Date Attending boolean loan discount overTimeHours
  • 获取Android设备/模拟器根目录

    我正在使用 Eclipse Ubuntu 开发 Android 应用程序 像往常一样 我在 AVD 模拟器上进行第一次拍摄 我想建立一个独特的文件夹结构 可以在当前模拟器和最终物理设备 SD 存储卡 上使用 对于虚拟和物理设备类型 通过程序
  • Android Wear OS 表盘 支持不同屏幕尺寸

    我正在玩 Wear OS 的表盘 目前 我已经创建了 背景 320x320 刻度圈 320x320 时针 分针和秒针 320x40 在屏幕尺寸为 320x320 的圆形设备上一切正常 当我使用屏幕尺寸为 360x360 的设备时 事情变得复
  • 根据数据属性的值选择选项

    我想选择 又名 jQuery 预选择 并根据数据变量设置值 该列表有 3 个具有相同值但不同 data d 的项目 假设我有变量selectvar d 那么它应该更改为列表中的 2 项
  • 如何在 Symfony2 路由中定义默认日期值?

    如果我想创建一条路线 其中年月日是变量 如何定义如果这些变量为空 则采用当前日期 例如 像这样 肯定行不通 blog path blog year month day defaults controller AcmeBlogBundle B
  • 我已经安装了 Visual Studio 2015,但没有 C++ 项目。?

    我遇到问题 我想在 Visual Studio 2015 中编写 C 代码 但无法创建 C 项目 因为 新建项目 窗口中没有 C 模板 我正在以这种方式创建新项目文件 gt 新建 gt 项目 gt Visual C 但没有c 模板 请帮忙
  • 当我按下屏幕 ionic 3 时菜单不起作用

    我有一个屏幕登录 主页带有菜单 4 个选项卡 喜欢home about location more 在这种情况下菜单工作正常 当我登录时 我使用下面的代码将屏幕导航到带有所有选项卡 菜单的主页 那个时候工作正常 this navCtrl p
  • 使用 App SDK 2.0 中的新数据更新图表

    我正在使用图表来可视化数据TimeboxScopedApp 我想在范围发生变化时更新数据 使用更暴力的方法remove 然后按照描述重新绘制图表here给我留下了一个覆盖的 正在加载 蒙版 但其他方面都有效 使用 Highchart 原生的
  • mysql存储过程可以有默认参数吗?

    我用谷歌搜索了这个并不断提出 不 这是不可能的 但这些帖子的日期是 2005 2007 年 所以我想知道这是否已经改变 代码示例 CREATE PROCEDURE blah myDefaultParam int 0 This breaks
  • 如何获取特定应用程序的电池和移动数据使用情况?

    背景 从某些 Android 版本 不记得是哪个 开始 Android 能够显示已安装应用程序的电池统计信息和移动数据使用情况 3G 以便用户意识到这一点并将能够思考应用程序是否应该保留 我正在谈论那些 问题 我在 Play 商店上看到过一
  • 导航视图全局操作返回状态

    我一直在搞乱 Jetpack 导航组件 并且创建了一个使用导航抽屉的活动 class MainActivity AppCompatActivity override fun onCreate savedInstanceState Bundl
  • 为什么CPU推测执行不会导致OOB程序崩溃?

    问题源于阅读幽灵攻击纸 如果我理解正确的话 攻击源于 CPU 启发式推测执行 错误 代码分支的可能性 考虑这个例子 C语言 int arr 42 if i lt 42 int j arr i 如果我正确理解这篇论文 int j arr i