Java 使用JNI可以避免jvm安全性吗?

Java 使用JNI可以避免jvm安全性吗?,java,jar,jvm,java-native-interface,java-security,Java,Jar,Jvm,Java Native Interface,Java Security,我一直在思考jvm安全性的工作方式。原则是jvm总是信任并运行任何本机代码。因此,从概念上讲,如果您的代码不显式或隐式调用checkpermission(permission),这意味着它永远不会失败任何安全验证。当然,所有这些验证调用通常都是在JavaAPI类中完成的,因此我们不需要自己调用它们来获得内置权限 现在,只要您使用像FileOutputStream这样的内置类,您的代码总是要接受权限检查。但经过思考,我想知道是否可以避免使用java本地接口来运行C++代码的安全检查。 想象一下,导

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

现在,只要您使用像
FileOutputStream
这样的内置类,您的代码总是要接受权限检查。但经过思考,我想知道是否可以避免使用java本地接口来运行C++代码的安全检查。

想象一下,导入一些jar,而不是使用<代码> FielOutPoStuts来编写文件,使用一些手工编写的JNI,它绑定到文件编写C++程序(显然不调用任何<代码>检查权限())/>代码>。基于这个问题,我知道可以将所有东西捆绑在一个漂亮的恶意罐子中。因此,任何使用这个jar的代码都不再安全,因为从jar执行代码时不会发生安全验证。这意味着C++程序可以有效地覆盖运行进程的所有文件,JVM具有写权限。


这是一种正确的思维方式,而且是有意为之,还是我遗漏了什么?

您是对的,本机代码超出了JVM的控制范围。如果Java安全管理器允许加载JNI库,则将其视为根本没有安全管理器


这就是为什么,如果使用SecurityManager,授予
loadLibrary.

权限是重要的而不是

那么我应该如何通过internet加载类呢?我知道我们可以使用UrlClassLoader,但是当我需要从远程jar文件加载一个类时,不确定它是否适合一般情况。@TurkhanBadalov我不确定问题出在哪里。从jar加载类与加载本机库不同。您可以允许加载类,但拒绝加载JNI库-这些库由不同的权限管理。哦,好吧,我的错。所以
loadLibrary.*
是专门为本地库设计的,明白了吗。谢谢大家!@TurkhanBadalov注意到本机代码不需要实现自己的I/O来破坏安全性。在许多JRE实现中,只要将字段
System.security
设置为
null
就可以禁用所有安全检查,这是一个操作,甚至Java代码在错误地授予它使用访问覆盖进行反射的权限时也可以这样做。因此,一般来说,代码应该获得完成其工作所需的最低权限,因为权限可能容易被忽略。这与小程序相同,通过对小程序进行签名来确保它们的安全。