2016-06-22 139 views
2

我是java security的新手;有一个基本的问题。运行AccessController.doPrivileged的恶意代码

我现在的理解是:

  • 当你需要限制哪些不可信的代码可以做,你可以做到这一点的方法之一,是通过使用自定义的安全策略,并运行不可信代码在Subject.doAsPrivileged块中。
  • 如果不可信代码需要调用一些需要某些提升权限的代码(例如文件访问等),则可以通过使用AccessController.doPrivileged来完成此操作。

我的问题是: 什么阻止恶意代码插入AccessController.doPrivileged调用本身?

例如,在我的情况:

  • 我运行在沙盒环境中的用户自定义的Groovy脚本;我有一个非常严格的策略,否认Groovy可以做的大部分工作。但是,我允许这些脚本执行某些需要提升权限的操作(通过向groovy脚本发送一个对象并说“嘿,只要你需要某些东西,只需在这个对象上调用这个方法”)。
  • 需要提升权限的代码通过AccessController.doPrivileged语句运行。

那么,什么使Groovy脚本停止运行一段代码AccessController.doPrivileged (some_malicious_code)

回答

1

你没有得到它的权利,使用AccessController.doPrivileged并不表示到JVM:

哎不检查我在做什么,你可以相信我,我是个好人!

它只向JVM表明他不需要检查其余的调用堆栈是否有足够的权限。

让我们来看一个例子,假设我有一个类A,它调用第三方库Foo,它执行一些需要某些权限的代码。

默认情况下不使用AccessController.doPrivileged当我打电话Foo,JVM将检查完整的调用堆栈有足够的权限,以便在我的政策文件,我需要提供所需的权限,以我的A类,但也给我的第三方库Foo

如果我A课,我敷调用第三方库FooAccessController.doPrivileged,我也没有必要提供权利对第三方库Foo了只有A仍然需要它们。

那么停止运行了一段代码,上面写着 AccessController.doPrivileged (some_malicious_code) Groovy脚本?

如果你的Groovy代码不具有所需的权限执行恶意代码,它将不能够执行代码,即使它使用AccessController.doPrivileged叫它为前面所述的原因。

0

恶意代码如何停止有效呼叫AccessController.doPrivileged取决于您的意思代码

如果代码是编译的字节码,那么容器需要做的事情之一是在代码加载时为其分配限制特权。在AccessController.doPrivileged的权限检查回到包括该方法的调用者,所以我们没事。

如果我们有一个口译员,那么我们有更多的乐趣。在调用随机方法之前,口译员应该降低权限。口译员必须明确防范的方法之一是doPrivileged解释器的定义在这里相当广泛。从不可靠的来源发出的指示反射的任何狡猾的使用都可以做到。

我不熟悉Groovy的实现,所以不能评论它如何处理这个问题,甚至不管它是否困扰。