我是java安全新手;有一个基本问题。
我目前的理解是:
Subject.doAsPrivileged
块中运行不受信任的代码来实现此目的。AccessController.doPrivileged
来实现此目的。我的问题是:
什么阻止恶意代码插入AccessController.doPrivileged
调用?
例如,就我而言:
AccessController.doPrivileged
语句运行。那么是什么阻止了Groovy脚本运行一段代表AccessController.doPrivileged ( some_malicious_code )
的代码?
答案 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的实现,所以不能评论它如何处理这个问题,甚至不管它是否有问题。