【问题标题】:How to implement a native code sandbox?如何实现原生代码沙箱?
【发布时间】:2012-07-05 23:27:24
【问题描述】:

我正在编写一个需要调用不安全本机代码的 Windows Java 应用程序,并且我需要阻止此代码访问 Java 对象和 JVM 数据结构,否则它可能会使 JVM 崩溃或侵入敏感数据。在你问之前,这个本机代码已经过验证——它只能调用几个 API,不能有某些指令,所以我们知道它不会 VirtualProtect 自身或其他内存区域来获得更多访问权限和乱七八糟的东西。

无论如何,我的第一次尝试是将此代码包装到一个单独的进程(沙箱)中,并使用 IPC 与 Java 对话。有一个 JNI DLL 在 Java 端执行 IPC 工作。基本上,每次我们需要运行不安全的本机代码时,我们的 Java 应用程序都会调用一个 JNI 函数,该函数使用自动重置 Windows 事件唤醒沙箱,然后等待完成。沙盒运行不安全的本机代码并使用另一个自动重置 Windows 事件唤醒 JVM,然后生活继续。如果不是那么慢就完美了。

问题是不安全的本机代码可能包含一些执行非常快速的计算的函数,并且可以从 Java 中调用数百万次,因此调用开销应该是最小的。但是这种开销是巨大的,因为 JVM 通过 Windows 事件唤醒沙箱,当沙箱返回时反之亦然。这个过程是进程内(非 IPC)解决方案的 8 倍,其中不安全的本机代码被包装在 JNI DLL 中(因此调用发生在同一个线程中,在同一个时间片中)。

我的第一个猜测是,当 JVM 唤醒沙箱时,Windows 只会将沙箱线程置于就绪集,因此它只会在几毫秒后运行。当沙盒返回时也会发生同样的情况。不算两个(可能很昂贵的)上下文切换。

Microsoft 文档 here 说明如下:

如果一个较高优先级的线程可以运行,系统将停止执行较低优先级的线程(不允许它完成使用它的时间片),并将一个完整的时间片分配给较高优先级的线程。

为了测试这个理论,我将 THREAD_PRIORITY_TIME_CRITICAL 分配给沙盒线程。有一些收获。性能从进程中(非 IPC)解决方案的 8 倍提高到 5 倍。但我需要更多,否则这个 Java 应用程序可能无法投入生产!

您可以通过两种方式帮助我:

  • 告诉我是否有更快的方法来唤醒另一个进程,例如强制上下文切换或执行进程间过程调用。

  • 告诉我如何在进程内运行不安全的本机代码时保护 JVM。听说 Google Native Client 是这样做的,但是我只找到了this documentation。如果您了解更多,请提供有关如何实施的更详细信息的链接。

【问题讨论】:

  • 您是否追查过性能问题是 Windows 事件还是您的 IPC?通常,我希望 IPC 成为限制因素。
  • 是的,我已经隔离了。 IPC 使用共享内存告诉沙箱要执行哪个本机函数及其参数。 JNA DLL 写入此内存,而沙盒只是读取、调用不安全代码并写入结果。除非参数是大缓冲区,否则这些内存读/写操作在进程内解决方案中导致的开销不到 10%。所以它不是IPC。缓慢肯定与 Windows 事件或上下文切换有关。
  • 我也很好奇您要防范哪些威胁?显然,在第二个进程中运行是最好的保护,但它可能有助于了解您是否想要定位特定的东西。例如,您是否担心它会写入其他内存区域、捕获异常,或者只是对任何不可预见的事物进行一般保护?
  • 本机代码不得访问 JVM 内存(用于读取或写入)。理想情况下,它不应执行无限循环或无限等待。使用另一个进程,我们可以根据应答超时杀死它,但这不是一个强要求。但是必须禁止访问JVM内存。
  • 另外,本机代码不能调用危险的API,如CreateThread、CreateProcess、LoadLibrary、VirtualProtect、GetProcAddress等。但是我们可以通过代码验证来轻松防止它。

标签: windows performance memory process ipc


【解决方案1】:

我通过使用spinlock 对通过file mapping 从JVM 访问的shared memory 变量执行JVM 沙盒交互解决了这个问题。 This question 解释了如何在 C++ 环境中实现。使用 MappedByteBuffer 可以轻松移植到 Java。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-17
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多