是否可以通过使用 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.
我一直在思考 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.