libmpk: Software Abstraction for Intel Memory Protection Keys (Intel MPK)
- Soyeon Park ,
- Sangho Lee ,
- Wen Xu ,
- Hyungon Moon ,
- Taesoo Kim
2019 USENIX Annual Technical Conference (ATC 2019) |
Organized by USENIX
Intel Memory Protection Keys (MPK) is a new hardware primitive to support thread-local permission control on groups of pages without requiring modification of page tables. Unfortunately, its current hardware implementation and software support suffer from security, scalability, and semantic problems: (1) vulnerable to protection-key-use-after-free; (2) providing the limited number of protection keys; and (3) incompatible with mprotect()’s process-based permission model.
In this paper, we propose libmpk, a software abstraction for MPK. It virtualizes the hardware protection keys to eliminate the protection-key-use-after-free problem while providing accesses to an unlimited number of virtualized keys. To support legacy applications, it also provides a lazy inter-thread key synchronization. To enhance the security of MPK itself, libmpk restricts unauthorized writes to its metadata. We apply libmpk to three real-world applications: OpenSSL, JavaScript JIT compiler, and Memcached for memory protection and isolation. Our evaluation shows that it introduces negligible performance overhead (<1%) compared with the original, unprotected versions and improves performance by 8.1x compared with the secure equivalents using mprotect(). The source code of libmpk is publicly available and maintained as an open source project.