带有设备内存的幽灵
spectre with device memory
关于 spectre
安全问题和边信道攻击。
在两个 x86 and ARM 中都存在一种方法来禁用 caches/speculative 对特定内存页面的访问。因此,对这些内存区域的任何侧信道攻击(spectre
、meltdown
)应该是不可能的。那么,为什么我们不使用它来通过将所有安全信息(密码、密钥等)存储到缓慢但安全(?)的内存区域,同时将不安全的数据放入快速但不安全的正常内存来防止旁路攻击?这些页面上的访问时间将大大减少(~100),但内核修复也不便宜。因此,也许仅降低几个内存页面的性能比整体略有降低更快?
它将解决问题的责任从 OS 转移到应用程序开发人员,这将是一个巨大的变化。但希望内核能以某种方式修复所有错误似乎也不是一个好方法。
所以我的问题是
- 使用 "device" 内存页真的能防止此类攻击吗?
- 它有什么缺点? (除了明显的性能问题)
- 实际使用情况如何?
因为我们的编译器/工具链/操作系统不支持对某些变量使用不可缓存的内存,也不支持将它们的副本溢出到堆栈。 (或根据它们计算出的临时值。)
此外 AFAIK,即使您愿意,您甚至无法在 Linux 上的用户 space 进程中分配一页 UC 内存。这当然可以用 mmap
and/or mprotect
的新标志来改变。希望它可以设计成 运行 旧系统上的新二进制文件将获得常规的回写内存(因此仍然可以工作,但没有安全优势)。
我认为让非特权用户 space 映射 WC 或 UC 内存不会有任何拒绝服务影响;您已经可以使用 NT 存储和/或 clflush
强制内存访问并争夺更大份额的系统内存控制器时间/资源。
关于 spectre
安全问题和边信道攻击。
在两个 x86 and ARM 中都存在一种方法来禁用 caches/speculative 对特定内存页面的访问。因此,对这些内存区域的任何侧信道攻击(spectre
、meltdown
)应该是不可能的。那么,为什么我们不使用它来通过将所有安全信息(密码、密钥等)存储到缓慢但安全(?)的内存区域,同时将不安全的数据放入快速但不安全的正常内存来防止旁路攻击?这些页面上的访问时间将大大减少(~100),但内核修复也不便宜。因此,也许仅降低几个内存页面的性能比整体略有降低更快?
它将解决问题的责任从 OS 转移到应用程序开发人员,这将是一个巨大的变化。但希望内核能以某种方式修复所有错误似乎也不是一个好方法。
所以我的问题是
- 使用 "device" 内存页真的能防止此类攻击吗?
- 它有什么缺点? (除了明显的性能问题)
- 实际使用情况如何?
因为我们的编译器/工具链/操作系统不支持对某些变量使用不可缓存的内存,也不支持将它们的副本溢出到堆栈。 (或根据它们计算出的临时值。)
此外 AFAIK,即使您愿意,您甚至无法在 Linux 上的用户 space 进程中分配一页 UC 内存。这当然可以用 mmap
and/or mprotect
的新标志来改变。希望它可以设计成 运行 旧系统上的新二进制文件将获得常规的回写内存(因此仍然可以工作,但没有安全优势)。
我认为让非特权用户 space 映射 WC 或 UC 内存不会有任何拒绝服务影响;您已经可以使用 NT 存储和/或 clflush
强制内存访问并争夺更大份额的系统内存控制器时间/资源。