【问题标题】:Is it possible to avoid jvm security by using JNI?是否可以通过使用 JNI 来避免 jvm 安全性?
【发布时间】:2020-07-25 10:03:22
【问题描述】:

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

现在,只要您使用像 FileOutputStream 这样的内置类,您的代码始终需要接受权限检查。但是想了想,是否可以通过使用 Java Native Interface 运行 c++ 代码来避免安全检查。

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

这是正确的思维方式,是有意为之还是我错过了什么?

【问题讨论】:

    标签: java jar jvm java-native-interface java-security


    【解决方案1】:

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

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

    【讨论】:

    • 那么我应该如何通过互联网加载一个类?我看到我们可以使用 UrlClassLoader,但不确定当我需要从远程 jar 文件加载类时它如何适合一般情况。
    • @TurkhanBadalov 我不确定问题出在哪里。从 jar 加载类与加载本机库不同。您可以允许加载类,但拒绝加载 JNI 库 - 这些由不同的权限管理。
    • 哦,好吧,我的错。所以loadLibrary.* 专门用于本地库,明白了。谢谢!
    • @TurkhanBadalov 请注意,本机代码不需要实现自己的 I/O 来破坏安全性。在许多 JRE 实现中,只需将字段 System.security 设置为 null 就会禁用所有安全检查,这是一个操作,即使是 Java 代码在错误地授予其使用访问覆盖进行反射的权限时也会这样做。所以一般来说,代码应该获得完成其工作所需的最低权限,因为权限可能具有容易被忽视的含义。
    • 这和小程序一样,通过对小程序进行签名以确保它们的安全性来解决。
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2018-06-07
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多