【问题标题】:What is the need of Privileged Block in Reflection反射中的特权块需要什么
【发布时间】:2014-09-13 12:43:09
【问题描述】:

我看到了通过在 Privilege 块中执行的反射获取字段值的代码。以下代码取自ReflectionUtil

public static <T> T accessDeclaredField(final Field f, final Object o, final Class<T> responseClass) {
    return AccessController.doPrivileged(new PrivilegedAction<T>() {
        public T run() {
            boolean b = f.isAccessible();
            try {
                f.setAccessible(true);
                return responseClass.cast(f.get(o));
            } catch (SecurityException e) {
                return null;
            } catch (IllegalAccessException e) {
                return null;
            } finally {
                f.setAccessible(b);
            }
        }
    });
}

我不明白在特权块中获取字段值的原因;我们可以在没有它的情况下做到这一点。

这是更好的编码实践还是我们获得了额外的东西?

参考:API for Privileged Blocks

【问题讨论】:

  • 作为不相关的旁注:如果任何人的安全设置将 CXF 加载为受信任代码和一些不受信任的代码,则不受信任的代码可以(通过使用正确的参数调用此 public static 方法)逃脱Java 沙箱。哪些参数留给读者练习。经验教训:永远不要在调用者可以控制所有相关参数的 public 方法中使用 doPrivileged...
  • @mihi 如果你的评论没有遗漏关键部分作为读者的练习,它将教会更多人。对于大多数人来说,“没有经验教训”。
  • @MarkoTopolnik 对于大多数人来说,知道您可以写入任何私有字段就足够了,这是一个安全问题。找到要写入的内容来破坏安全管理器并不难。寻求灵感:github.com/schierlm/JavaPayload/blob/master/JavaPayload/src/…
  • @MarkoTopolnik 好吧,你是对的,它可能不是那么明显。该方法在调用方提供的字段实例上调用setAccessible,这意味着在将其设置回之前的时间窗口内,另一个线程可以使用该字段实例写入该字段。即使你觉得机会很小,重复尝试调用方法和设置字段的两个线程通常会在不到一秒后成功......
  • @mihi 啊,现在我们正在谈论...我一直对有状态的accessible API 有疑问。我真的看不出它有什么好处,而且安全问题比比皆是。

标签: java reflection privileges


【解决方案1】:

如果没有安装安全管理器,您就不需要特权块。但是,如果您正在编写完全通用的库代码,可以使用适当的安全管理器执行,并且库的调用者可能没有所需的权限,那么如果没有PrivilegedAction,您的代码也将被拒绝访问,即使代码本身(其 CodeSource)确实具有权限。

【讨论】:

    【解决方案2】:

    是的,即使代码(在本例中为 accessDeclaredField 方法)是由没有这些权限的外部代码调用的,您也可以获得使用调用类权限调用 PrivilegedAction 的好处。

    如果不使用AccessController.doPrivileged,那么如果某个代码X调用ReflectionUtils API来访问一个声明的字段并且代码X没有安全权限suppressAccessChecks,那么该操作将失败并出现安全异常。

    通过将操作包装在AccessController.doPrivileged 中,ReflectionUtils 标记其操作应使用其自己的权限执行,即使调用代码 X 没有这些权限。

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 2018-09-12
      • 1970-01-01
      • 2015-09-23
      • 2011-02-10
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多