gpt4 book ai didi

java - 使用AccessController.doPrivileged()限制权限并不总是按预期方式工作

转载 作者:行者123 更新时间:2023-12-01 19:24:53 30 4
gpt4 key购买 nike

我设法用以下代码设置了一个“ Java沙箱”:

    // #1
new File("xxx").exists();

// #2
PrivilegedExceptionAction<Boolean> untrusted = () -> new File("xxx").exists();
untrusted.run();

// #3
Policy.setPolicy(new Policy() {
@Override public boolean implies(ProtectionDomain domain, Permission permission) { return true; }
});
System.setSecurityManager(new SecurityManager());

AccessControlContext noPermissionsAccessControlContext;
{
Permissions noPermissions = new Permissions();
noPermissions.setReadOnly();

noPermissionsAccessControlContext = new AccessControlContext(
new ProtectionDomain[] { new ProtectionDomain(null, noPermissions) }
);
}

AccessControlContext allPermissionsAccessControlContext;
{
Permissions allPermissions = new Permissions();
allPermissions.add(new AllPermission());
allPermissions.setReadOnly();

allPermissionsAccessControlContext = new AccessControlContext(
new ProtectionDomain[] { new ProtectionDomain(null, allPermissions) }
);
}

// #4
try {
AccessController.doPrivileged(untrusted, noPermissionsAccessControlContext);
throw new AssertionError("AccessControlException expected");
} catch (AccessControlException ace) {
;
}

// #5
PrivilegedExceptionAction<Boolean> evil = () -> {
return AccessController.doPrivileged(untrusted, allPermissionsAccessControlContext);
};
try {
AccessController.doPrivileged(evil, noPermissionsAccessControlContext);
throw new AssertionError("AccessControlException expected"); // Line #69
} catch (AccessControlException ace) {
;
}


#1和#2应该是不言自明的。

#3是设置沙箱的代码:它设置了一个完全不受限制的 Policy(否则我们将立即锁定自己),然后设置系统 SecurityManager

然后,#4在完全受限制的 AccessControlContext中执行“不受信任”的代码,这将导致我想要的 AccessControlException。精细。

现在进入#5,其中一些邪恶的代码试图从沙箱中“逃脱”:它创建了另一个完全不受限制的 AccessControlContext,并在其中运行不受信任的代码。我希望这也会抛出 AccessControlException,因为邪恶的代码成功地离开了沙箱,但事实并非如此:

Exception in thread "main" java.lang.AssertionError: AccessControlException expected
at sbtest.Demo.main(Demo.java:69)


从我在JRE JAVADOC中阅读的内容

doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context)
throws PrivilegedActionException

Performs the specified PrivilegedExceptionAction with privileges enabled and restricted by the
specified AccessControlContext. The action is performed with the intersection of the the permissions
possessed by the caller's protection domain, and those possessed by the domains represented by the
specified AccessControlContext.

If the action's run method throws an unchecked exception, it will propagate through this method.

Parameters:
action - the action to be performed
context - an access control context representing the restriction to be applied to the caller's
domain's privileges before performing the specified action. If the context is null,
then no additional restriction is applied.
Returns:
the value returned by the action's run method
Throws:
PrivilegedActionException - if the specified action's run method threw a checked exception
NullPointerException - if the action is null
See Also:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)


,我希望不受信任的代码将在没有权限的情况下执行,并因此引发 AccessControlException,但是不会发生。

为什么??我该怎么办才能修复该安全漏洞?

最佳答案

好吧,不受信任的代码最初不会在没有权限的情况下执行...直到它请求恢复权限(使用doPrivileged AllPermission嵌套AccessControlContext调用)。该请求得到了满足,因为根据您的Policy,您的所有代码(包括“邪恶”操作)都具有完全特权。否则,doPrivileged不是“按需沙箱工具”。它仅用作其直接调用方在策略决策点(ClassLoader + SecurityManager / Policy)已授予它的权限范围内限制或增加其特权的一种方法。线下的主叫方绝对可以自由地“还原”更改的权限,再次根据策略决策点,而不是先前任何主叫方的意见。因此,这是预期的行为,而不是安全漏洞。

有什么解决方法?

首先,肯定有一种使用基础架构的“规范” /理智的方法。根据最佳实践,应通过打包和类加载器将受信任的代码与不受信任的代码隔离,从而使二者与可以单独授权的不同域相关联。如果仅对不信任的代码授予了读取特定文件系统目录的权限,则没有多少doPrivileged调用将使它无法打开URL连接。

除此之外,当然可以提出一百零二种选择(创造性地(但不一定安全地)利用基础架构的不同移动部分以发挥其优势)。例如,Here我曾建议过一个带有线程本地的自定义保护域,以大致完成您想要的操作,即在执行不可信操作的过程中按需对普通特权域进行沙箱处理。

关于java - 使用AccessController.doPrivileged()限制权限并不总是按预期方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59321958/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com