【问题标题】:Why AccessController is not blocking the non-privileged access为什么 AccessController 不阻止非特权访问
【发布时间】:2017-05-14 09:12:18
【问题描述】:

免责声明:旧版本的问题混淆了SecurityManagerAccessController。但现在我知道我犯了一个错误,问题得到了提炼。

茎很直;我正在寻找一种方法来限制脚本可以在某些 ScriptEngine 中执行的操作。

我读过一些类似的新旧问题。 NashornScriptEngine 似乎有一个解决方案,使用一个名为 ClassFilter 的类。但是无论他们的脚本引擎实现如何,我都在寻找一种通用的方式。有人建议 Java 的 AccessController 是一种方式。所以我开始阅读和玩AccessController,到目前为止我已经有了这个:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

Permissions perms = new Permissions();
ProtectionDomain domain = new ProtectionDomain(new CodeSource( null, (Certificate[]) null ), perms);
AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] { domain });

AccessController.doPrivileged(new PrivilegedAction() {
    @Override
    public Object run() {
        try {
            //I want the following line to throw a SecurityException
            return engine.eval("var System = Java.type('java.lang.System'); print(System.getProperty('java.home'));");
        }
        catch (ScriptException e) {
            e.printStackTrace();
        }
        return null;
    }},
    acc
);

//At the same time I want the following line to work
System.out.println(System.getProperty("java.home"));

脚本的运行就像没有涉及到 AccessController 一样!

所以我的问题是; AccessController 是这样做的吗?如果是,那我该怎么做呢?

【问题讨论】:

  • 绝对是这样做的方法,但我没有看到 SecurityManager 在您的代码中注册
  • 您能告诉我如何修复此代码吗?我不知道它有什么问题。还有一件事,我的应用程序的其余部分都很好。换句话说,我只想将 SecurityManager 应用于 engine.eval 行,而不是应用程序的其余部分。谢谢。

标签: java sandbox whitelist securitymanager scriptengine


【解决方案1】:

所以我自己设法解决了这里的问题。又看了一点,发现AccessController没有激活SecurityManager是没有作用的。激活它的方法如下:

  1. 添加两个虚拟机选项:-Djava.security.manager -Djava.security.policy=security.policy

  2. 在项目根目录下创建security.policy文件,内容如下: grant { permission java.security.AllPermission; };

这将为您的项目激活SecurityManager 并授予它所有权限。换句话说,它只会激活SecurityManager,但您的代码将像以前一样工作。现在您可以使用上面给出的代码来控制应用程序的部分访问控制。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    相关资源
    最近更新 更多