– “虽然抢不到菜,但是我们可以读论文啊!”
今天在封锁区继续为大家介绍系统安全隔离的最新研究成果。在这篇来自EuroSys 2022的论文PKRU-Safe中,作者仍然基于Intel MPK技术,介绍了如何在混合语言编程(例如同时使用Rust和C语言)的项目中进行自动化隔离,防止那些会产生内存错误的代码影响到内存安全的代码(以及整个程序)的正常执行。
搞研究的筒子们往往充满美好的理想,但现实中工程师需要处理的情况非常复杂,经常会听说大公司里面成吨重的历史代码无法维护,只能小心翼翼地使用。像Rust这类的内存安全语言,虽然开发模型十分美好,但码农们往往会面临尴尬处境——很多功能还需要依赖那些历史遗留代码(legacy code)来完成,而这些代码多半都是用C之类的内存不安全编程语言开发,里面埋了不知道多少雷。如何解决这个问题?本文作者设计了一套自动化代码分析系统,将混合语言编程开发的可执行文件分为trusted compartment
和untrusted compartment
,然后实施隔离,确保untrusted compartment
中的代码无法访问trusted compartment
中的代码和相关数据。
读到这里,大家有没有发现,这思路非常像我们 G.O.S.S.I.P 在2022年IEEE S&P上发表的论文Annotating, Tracking, and Protecting Cryptographic Secrets with CryptoMPK (https://cryptompk.code-analysis.org/),其实进程内隔离(intra-process isolation)的做法都比较类似,我们设计的CryptoMPK
将程序分为了crypto和non-crypto两个domain,专注于隔离密码学操作中的敏感数据(及其衍生数据);本文设计的PKRU-Safe系统也将程序分为可信和不可信两部分,并专注于隔离保护heap data。根据我们的经验,隔离不复杂,复杂的是弄清楚要隔离谁。在实际的代码标记中,肯定需要利用程序分析来给不同的代码定性,这中间有无数的corner case需要去考虑(所以我们说,现实世界这个更复杂的模型,你去搞一刀切它可行吗?)我们来看看作者是怎么进行具体的分析,细化标记代码的可信和不可信属性的。
在本文中,PKRU-Safe系统并没有像CryptoMPK
那样完全依赖静态分析,而是引入了dynamic profiling技术来帮助实现更为精确的数据流分析(引入动态分析可以处理很多问题,例如指针别名分析等),通过动态分析之后的代码就被标记为了可信和不可信部分(上图),然后送入到LLVM中生成相关的可执行文件,利用代码插桩来把程序分割为不同的domain(浦西和浦东)
在这个“划江而治”的过程中,程序分析需要处理两个大问题:第一个是如何决定划江而治的边界,如果单纯把所有的unsafe code全部归为隔离区,看起来好像很合理,但这样往往会造成巨大的误伤;因此PKRU-Safe系统决定让开发者自己来标记unsafe code中哪些函数需要被隔离(精确抗疫)。第二个问题是除了代码,相关的内存也需要进行隔离,在这个问题上PKRU-Safe系统和我们的CryptoMPK
采取的做法类似,就是引入一个自定义的内存分配器,然后用程序分析去寻找哪些内存页面是可信代码操作的,将它们分配到一个单独的区域上,实现安全的访问。
本文的亮点之一是它的实验对象——Servo,这个由Mozilla主导提出、用Rust开发的实验性浏览器引擎(虽然现在已经交给Linux基金会去管理了)。Servo的代码行数超过26.5万行,可能是目前为止最复杂的Rust项目。
在EuroSys这个系统会议上,本文显然更关心的首先是性能而不是人民的生命安全,作者使用了Dromaeo、Kraken、Octane、JetStream2四个benchmark测试套件来评估引入PKRU-Safe系统之后Servo引擎的性能下降程度。由于使用了MPK,在大部分情况下,隔离本身带来的开销并不大,但是内存分配会造成很多额外的开销(这和我们在CryptoMPK
系统中遇到的情况类似)
最后让我们来看看人民的生命安全是怎么保证的。作者只选择了CVE-2019-11707这个影响Servo的JavaScript 引擎(SpiderMonkey)的漏洞来评估PKRU-Safe系统。虽然评估表明PKRU-Safe系统确实可对抗这个漏洞(以及类似的问题),但是我们还是忍不住要代表广大人民群众批评一下作者——你们搞这种精确隔离,评估也太草率了,罔顾了更多可能出问题的点,迟早会出事啊~
Show me the code:
https://github.com/securesystemslab/pkru-safe.git
论文PDF:
https://people.cs.kuleuven.be/~stijn.volckaert/papers/2022_EuroSys_PKRU-Safe.pdf