ERIM: Secure, Efficient In-process Isolation with Protection Keys MPK

本论文是Anjo Vahldiek-Oberwagner, Eslam Elnikety, Nuno O. Duarte, Michael Sammler, Peter Druschel, Deepak Garg发表在28th USENIX Security Symposium (USENIX Security 19) 2019上的工作。

对于这篇论文,我们主要关注其如何防止不可信组件使用 WRPKRU 指令进行提权,进而危害可信组件或者敏感数据。

Entry:Zotero link URL link

Design

其工作要点主要分为两点:

  1. For hijack attacks: 使用页扫描确认 WRPKRU 所在的控制流未被篡改
  2. For spanning the bytes of adjacent instructs or a subsequence in a longer instruction: 使用二进制重写保证不包含上述情况

Binary inspection

为防止控制流被篡改,以供扫描在 WRPKRU 指令后的内容:

  1. 如果跟着的是跳转到可信组件具体实现的函数符号,则说明该过程发生在不可信组件进入可信组件时;
  2. 如果跟着的是验证 PKRU 值是否被篡改的代码段,则说明该过程发生在可信组件进入不可信组件时;

因此要求在系统进行实现时,WRPKRU 后的可信组件代码必须放在与其余 symbol 不冲突的函数中,WRPKRU 后切换到不可信代码前必须进行 12 - 15 行的检查。

ERIM 实现时使用了 On-demand inspection 进行二进制检查,其具体发生在可执行页面发生缺页异常时,对该页面和相邻的页面进行上述检查,这个过程是低开销的,因为每个页面只会被检查一次(应该是三次)。

Rewriting program binaries

重写策略:

  1. 通过在两个指令间插入 nop 来防止两个指令合成 WRPKRU
  2. 通过对可能包含 WRPKRU 的指令进行等价替换防止这种情况出现:

重写发生在 WRPKRU 的检查中:

  1. 当指令被检查到,它会用1字节的陷阱覆盖该页面,使其可执行,并将原始页面保留而不启用执行。
  2. 如果有跳转进入该可执行页面,将触发一个陷阱,陷阱处理程序会发现该页面的入口点。然后,重写器从该入口点开始反汇编保留的页面,重写任何发现的 WRPKRUXRSTOR 指令,并将重写后的指令序列复制回可执行页面。
  3. 为了防止其他线程执行部分重写的指令序列,实际上会用新序列重写可执行页面的一个新副本,然后将这个重写的副本与可执行页面交换。该技术对应用程序是透明的,其开销与有问题页面中的入口点数量成正比(每个入口点仅反汇编一次),并保持只有安全页面可执行的不变量。
  4. 重写的指令序列通常比原始序列长,因此无法就地重写。在这种情况下,二进制重写工具会将重写后的序列放在新页面上,将原始序列中的第一条指令替换为直接跳转到重写序列,并在重写序列之后插入直接跳转回原始序列后续指令的跳转。然后这两个页面都被启用为可执行。

Last modified on 2024-12-30