对象反射的安全风险是什么?

Leg*_*end 20 java security reflection code-access-security

因此,经过几个小时的解决方法,目前在Google App Engine上禁用了Reflection的限制,我想知道是否有人可以帮助我理解为什么对象反射可能构成威胁.是因为我可以检查一个类的私有变量还是有其他更深层次的原因?

ewe*_*nli 24

1 - 反思(作为一个概念)确实与安全/保障正交.

java的设计非常强调它使它成为一个安全的平台,具有静态类型,安全管理器,类加载器的规范使用,并且无法搞砸指针/ 内存.你可以在Masterminds编程中阅读James Gosling的访谈,这很有意思.

但是,你所拥有的反思能力越强,就越难以确保事情的安全.反射失败,特别是静态类型,可能导致运行时错误.

但也可能发生更微妙的事情.例如,类加载器 - 可以被认为是系统中的反射钩 - 在早期版本的Java中没有正确设计,导致潜在的类型替换.由Gilad Bracha 撰写的JVM动态类加载文章对此类问题非常有见地.

反思不能完全关闭; 它总是可以反思自己的公共领域/方法.AccessibleObject.setAccessible然而,对私有结构的反思可以被禁用,因为它破坏了封装.通过访问私人领域等,可以检查和修改内部数据.它可能导致各种恶意攻击,例如

  • strings不再是不可变的,可以改变(见这个问题)
  • 你可以揭示你不拥有的物体的合理信息
  • ......其他漏洞......

最后还有其他机制使安全性处于危险之中,特别是sun.misc.Unsafe可以直接访问内存 - 指针又回来了.

2 - 现在,问题在于反思(在实践中)是否会导致许多风险.

我已经阅读了@dbyrne指出的链接,但它主要是关于.net的.此外,我不确切知道Google App的禁用内容.它是ReflectPermission安全经理的唯一或其他许可吗?一个危险显然是访问文件系统并乱七八糟.

在实践中可以争论获取私有数据和打破封装的问题.编写安全代码确实非常困难,即使不更改访问修饰符,您也可以以不恰当的方式对类进行子类化 - 除非它们是final密封的,甚至更好的密封 - 并传递它们.这就是防御性复制试图防范的问题.

由于向下传播,类型安全性也受到运行时错误的威胁,所以这一点也可以争论.

在共享/托管环境中,安全性是相对的.在语言级别,您可以例如不阻止模块表单消耗100%的CPU或消耗所有内存直到a OutOfMemoryException.这些问题需要通过其他方式解决,通常是在操作系统级别,具有虚拟化和配额.

所以我个人的回答是:反思是一种安全风险,但与其他潜在的攻击媒介相比,实践中并没有那么大.