中华崛起的钥匙是什么?也许科学是唯一的答案。守护内存安全的答案则有很多,Intel MPK 技术是其中的一个,今天介绍的 IEEE S&P 杂志文章 Memory Protection Keys: Facts, Key Extension Perspectives, and Discussions 对这项技术进行了全面的总结,从更高的视角来探讨 MPK 在不同领域的应用。
Intel 在2016年为服务器 CPU 引入了 MPK 特性,而本文的作者很早就开始关注这项技术,对于 MPK 的优点和局限性都非常熟悉,并发表了本领域非常有名的研究工作——libmpk
(USENIX ATC 2019)。libmpk
扩展了标准的 MPK 保护模型,改进了一些不足(例如标准的 MPK 模型只支持16个不同的 domain)。
作者首先简单回顾了一下 MPK 的基本概念,不过要吐槽一下,libmpk
原论文里面那个关于 MPK 的图画得十分不友好(下图),编辑部更推荐另一篇论文 Intra-Unikernel Isolation with Intel Memory Protection Keys 里面的概念图(下下图,没有对比就没有伤害)。
接下来是安全研究人员的面试时间,先不要看下面的内容,说出针对 MPK 的主要威胁(给你60秒)。怎么样,你是否熟悉下面的内容?
executing specific instructions or system calls to change the value of the PKRU register
bypassing the protection keys when accessing the corresponding pages with system calls that ignore MPK permissions
exploiting unintentionally exposed memory interfaces that MPK does not affect.
首先,由于 MPK 权限切换指令(WRPKRU
)并不是一条特权指令,用户态的代码也可以执行,因此只要攻击者能够触发权限切换,同时控制了 EAX
寄存器的内容,就可以更新 PKRU
寄存器,来给自己赋予特定的 domain 的访问权限。其次,有一些 syscall 可以完全无视 MPK 的权限,因此也可能被攻击者滥用。最后,在虚拟内存中的数据页并不会被 MPK 权限限制,攻击者可以通过访问 /etc/proc/
这个“side channel内存数据系统”来绕过防护。
针对 MPK 的优点和缺点,研究人员做了大量的扩展工作,让更多的应用场景能够受益,下表是一个非常不完整的总结,因为它没有列出我们的非著名研究成果 CryptoMPK(),大家还是要警惕西方资本主义国家无视我国研究成果的这种趋势,主动去阅读一下我们的大作()——【保护内存核心机密数据的魔法,名字叫做……】。
当然,如果 MPK 只是一个学术界的玩具,那么可能难逃最后被扔进历史的故纸堆的命运。实际上,在2021年的时候,Chromium 项目已经引入了 MPK,具体用来做什么,大家可以猜猜看?
答案就是,对于浏览器而言,经常会遇到需要引入运行时编译(Just-in-time Compilation)来提高动态语言(对就是你,JavaScript)的执行性能。特别地,Chromium 项目为了提升 WebAssembly-generated code 的编译性能(首先需要给内存页面设置写权限,然后把动态生成的代码存储以后,关掉写权限,设置执行权限),用 MPK 权限切换来替换原来巨慢无比的 mprotect
,从而大大改善了这方面的负载。
最后,作者还不忘提一下,MPK 这个曾经是只在服务器 CPU 上提供的特性(我们当年做实验还专门弄了两颗 XEON CPU),已经是“昔日王谢堂前燕,飞入寻常百姓家”了:Intel 在2020年之后的消费级 CPU 和苏妈家的 Zen 3之后的 CPU 都已经提供了 MPK 支持,大家可以放心大胆使用(做实验)了~
文章:https://taesoo.kim/pubs/2023/park:mpkfacts.pdf