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