Native Client内/外沙箱

时间:2017-02-07 15:41:53

标签: google-chrome security assembly sandbox google-nativeclient

我正在处理Chrome Native Client,并在以下几点遇到一些困难:

  1. 据我所知,到目前为止,256MB Nacl段的第一个64 KB专用于内部沙箱。这个内部沙箱包含蹦床和跳板,它们从可信代码传递到不信任代码,反之亦然。当我在第一个64 KB时,我可以跳到32字节指令的中间吗?例如,如果我在蹦床中有一个32字节的指令,我可以从这个指令跳到蹦床中另一个32字节指令的中间(不是32字节对齐)吗? trampiline和跳板中的所有指令也都是32字节对齐的吗?

  2. 我可以将几条x86指令组合成一个32字节对齐的Nacl指令(例如,将 AND 0xffffffe0%eax JMP EAX 放在一个32字节对齐中Nacl指令)。

  3. 我知道服务运行时正在处理流程创建,内存管理等,并且它是通过trampoline访问的,trampoline指令究竟是如何访问服务运行时的?服务运行时位于内存平台中的位置?当服务运行时完成时,它是否可以在跳板中访问32字节对齐的指令?

  4. 外沙箱的实际职责是什么?它如何监控和过滤系统调用?如果内部沙箱的验证器中有错误,在什么情况下它可以捕获非法/恶意指令?

  5. 谢谢大家

1 个答案:

答案 0 :(得分:0)

  1. 我不是100%肯定我的头脑,但我会从source的目录布局中猜测它们都是可信服务运行时的一部分代码(它们位于src/trusted/service_runtime目录中),因此使用系统编译器构建,不需要验证。

  2. 是的,32字节包中的指令数没有限制。限制只是没有指令(或多指令沙盒序列,例如您提到的间接跳转的序列)可能越过束边界。因此,在您的示例中,这两个指令都需要位于同一个包中。

  3. 我再次对蹦床的工作原理有点模糊,但是当控制从蹦床转移时,它最终会在服务运行时间内完成,这只是根据原生ABI构建的普通机器代码对于操作系统。因此,服务运行时可以使用任何系统调用(至少是外部沙箱允许的任何系统调用),并且可以读取或执行不受信任代码的任何部分。

  4. 严格来说,外部沙箱是深度防御(即内部沙箱在理论上足以包含不受信任的代码)。它在不同的操作系统上以不同的方式过滤系统调用。在Chrome嵌入NaCl中,外部沙箱与用于渲染器和GPU处理的Chrome沙箱的实现方式相同。