运行AccessController.doPrivileged的恶意代码

时间:2016-06-22 08:04:35

标签: java security

我是java安全新手;有一个基本问题。

我目前的理解是:

  • 每当您需要限制不受信任的代码可以执行的操作时,可以通过使用自定义安全策略并在Subject.doAsPrivileged块中运行不受信任的代码来实现此目的。
  • 如果不受信任的代码需要调用一段需要某些提升权限的代码(例如文件访问等),则可以通过AccessController.doPrivileged来实现此目的。

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

例如,就我而言:

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

那么是什么阻止了Groovy脚本运行一段代表AccessController.doPrivileged ( some_malicious_code )的代码?

2 个答案:

答案 0 :(得分:1)

你没有做对,使用AccessController.doPrivileged并没有向JVM表明:

  嘿,不要检查我做了什么,你可以相信我,我是一个好人!

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

让我们举个例子,让我们说我有一个类A,它调用第三方库Foo,它执行一些需要一些特权的代码。

默认情况下,当我调用AccessController.doPrivileged时不使用Foo,JVM将检查完整的调用堆栈是否具有足够的权限,因此在我的策略文件中,我需要为我的类提供所需的权限{ {1}}也适用于我的第三方图书馆A

如果在我的班级Foo中,我将呼叫包裹到A中的第三方库Foo,我无需向第三方库提供权限{{ 1}}只有AccessController.doPrivileged仍然需要它们。

  

那么是什么阻止了Groovy脚本运行一段代码呢?   Foo

如果您的groovy代码没有执行恶意代码所需的权限,即使它使用A来调用它,它仍然无法执行代码先前。

答案 1 :(得分:0)

如何停止有效调用AccessController.doPrivileged恶意代码取决于代码的含义。

如果代码是编译的字节码,那么容器需要做的一件事就是在代码加载时为其分配受限制的权限。 AccessController.doPrivileged中的权限检查可以追溯到包含该方法的调用者,所以我们没事。

如果我们有翻译,那么我们会有更多乐趣。解释器应在调用随机方法之前降低权限。解释器必须明确防范的方法之一是doPrivileged解释器的定义在这里非常广泛。任何使用不受信任来源的指示的反射都可以使用。

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