是否可以通过使用 JNI 来避免 jvm 安全性?

Is it possible to avoid jvm security by using JNI?

我一直在思考 jvm 安全性的工作方式。原则是 jvm 始终信任并 运行s 任何本机代码。因此,从概念上讲,如果您的代码未显式或隐式调用 checkpermission(permission),则意味着它永远不会使任何安全验证失败。当然,所有这些验证调用通常都在 Java API 类 中完成,因此我们不需要自己调用它们以获得内置权限。

现在,只要您像 FileOutputStream 一样使用内置 类,您的代码就始终需要进行权限检查。但是在思考了一会儿之后,我想知道是否可以通过使用 Java 本地接口到 运行 c++ 代码来避免安全检查。

假设您导入一些 jar,而不是使用 FileOutputStream 写入文件,而是使用一些绑定到文件写入 C++ 程序的手工制作的 JNI(显然不会调用任何 checkpermission()).基于问题“How to bundle a native library and a JNI library inside a JAR?”,我了解到可以将所有内容捆绑在一个不错的恶意 jar 中。因此,使用此 jar 的任何代码都不再安全,因为从 jar 执行代码时不会发生安全验证。这意味着这个 c++ 程序可以有效地覆盖进程 运行ning jvm 具有写入权限的所有文件。

这是正确的思维方式吗?它是有意为之还是我遗漏了什么?

你说得对,本机代码不受 JVM 控制。如果 Java 安全管理器允许加载 JNI 库,则将其视为根本没有安全管理器。

这就是为什么,如果使用 SecurityManager,重要的是 而不是 授予 loadLibrary.* permission.