Skip to main content
QUICK REVIEW

[论文解读] libmpk: Software Abstraction for Intel Memory Protection Keys

Soyeon Park, Sangho Lee|arXiv (Cornell University)|Nov 18, 2018
Security and Verification in Computing参考文献 31被引用 9
一句话总结

该论文提出 libmpk,一种针对英特尔内存保护键(MPK)的软件抽象,可消除诸如使用后释放(use-after-free)和密钥损坏等安全缺陷,支持超过16个内存页组的可扩展管理,并支持线程间权限同步。评估结果表明,libmpk 的性能开销低于1%,在 OpenSSL、JavaScript JIT 和 Memcached 中相较于基于 mprotect() 的安全方案性能提升达 8.1 倍。

ABSTRACT

Intel memory protection keys (MPK) is a new hardware feature to support thread-local permission control on groups of pages without requiring modification of page tables. Unfortunately, its current hardware implementation and software supports suffer from security, scalability, and semantic-gap problems: (1) MPK is vulnerable to protection-key-use-after-free and protection-key corruption; (2) MPK does not scale due to hardware limitations; and (3) MPK is not perfectly compatible with mprotect() because it does not support permission synchronization across threads. In this paper, we propose libmpk, a software abstraction for MPK. libmpk virtualizes protection keys to eliminate the protection-key-use-after-free and protection-key corruption problems while supporting a tremendous number of memory page groups. libmpk also prevents unauthorized writes to its metadata and supports inter-thread key synchronization. We apply libmpk to three real-world applications: OpenSSL, JavaScript JIT compiler, and Memcached for memory protection and isolation. An evaluation shows that libmpk introduces negligible performance overhead (<1%) compared with insecure versions, and improves their performance by 8.1x over secure equivalents using mprotect(). The source code of libmpk will be publicly available and maintained as an open source project.

研究动机与目标

  • 解决英特尔 MPK 当前实现中固有的关键安全缺陷,包括保护键使用后释放和因未初始化已释放密钥导致的密钥损坏。
  • 通过密钥虚拟化支持可扩展的内存分区,克服 MPK 硬件限制仅支持 16 个保护键的缺陷。
  • 通过线程间密钥同步机制,弥合 MPK 的线程级权限控制与 mprotect() 的进程级语义之间的语义鸿沟。
  • 通过安全高效的软件抽象,在真实应用中实现实用且高性能的内存隔离。

提出的方法

  • 通过软件管理的密钥空间虚拟化保护键,将应用层密钥与硬件限制解耦,支持数千个虚拟密钥。
  • 引入元数据结构以跟踪密钥使用情况,并在访问前验证密钥状态,防止使用后释放。
  • 通过硬件强制的内存保护和访问控制确保元数据完整性,防止未授权修改。
  • 实现线程间同步原语,协调跨线程的权限变更,使 MPK 行为与 mprotect() 语义对齐。
  • 设计系统调用接口,抽象 MPK 复杂性的同时保持高性能,支持与现有应用的无缝集成。
  • 利用现有的 MPK 硬件特性(如 WRPKRU)实现快速权限更新,最大限度减少性能影响。

实验结果

研究问题

  • RQ1软件抽象能否缓解英特尔 MPK 当前实现中固有的安全漏洞,如使用后释放和密钥损坏?
  • RQ2软件层能否克服 16 个保护键的硬件限制,实现在应用中可扩展的内存分区?
  • RQ3线程间权限同步能否被有效建模,以使 MPK 的线程局部行为与 mprotect() 的进程级语义保持一致?
  • RQ4此类抽象在真实世界、生产级应用中的性能开销如何?

主要发现

  • 与使用原始 MPK 的不安全版本相比,libmpk 的性能开销可忽略不计,低于1%。
  • 在真实应用中,当用以替代 mprotect() 实现安全内存保护时,libmpk 相较于基于 mprotect() 的安全实现,性能提升达 8.1 倍。
  • 通过验证密钥状态并使用硬件强制保护机制保护元数据,该抽象成功防止了保护键使用后释放和密钥损坏。
  • 通过密钥虚拟化,libmpk 支持数千个虚拟内存页组,尽管硬件仅支持 16 个物理保护键。
  • 线程间权限同步被有效建模,成功弥合了 MPK 的线程级控制与 mprotect() 的进程级控制之间的语义鸿沟。
  • 在 OpenSSL、JavaScript JIT 编译器和 Memcached 上的评估表明,libmpk 能够以极低的运行时开销实现安全、高性能的内存隔离。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。