Skip to content

aviatorScript组件调用enableSandboxMode启用沙箱时,没有移除用例创建时增加的ioModule模块,因此如果执行环节存在io模块,导致攻击者可通过 io.slurp()io.spit()io.delete() 等函数实现任意文件读取、写入和删除操作,完全绕过沙箱的文件系统隔离 #703

Description

@wangyun2018

AviatorEvaluatorInstance构造方法自动调用loadModule方法:

// AviatorEvaluatorInstance.java 第 894-901 行
private void loadModule() {
    try {
        addModule(IoModule.class);  // IoModule 被加载到 moduleCache
    } catch (Exception e) {
        System.err.println("Fail to load internal modules.");
        System.exit(1);
    }
}

调用enableSandboxMode时,通过 disableFeature(Feature.Module) 禁用了 require/load 函数,阻止脚本动态加载新模块。但该方法未调用 removeModule("io") 将已加载的 IoModule 从模块缓存中移除:

// AviatorEvaluatorInstance.java 第 470-480 行
public void enableSandboxMode() {
    disableFeature(Feature.Module);       // 移除了 require/load 函数
    disableFeature(Feature.NewInstance);
    disableFeature(Feature.InternalVars);
    disableFeature(Feature.StaticMethods);
    setFunctionMissing(null);
    setOption(Options.MAX_LOOP_COUNT, 65535);
    setOption(Options.ALLOWED_CLASS_SET, Collections.emptySet());
    setOption(Options.ASSIGNABLE_ALLOWED_CLASS_SET, Collections.emptySet());
    setOption(Options.EVAL_TIMEOUT_MS, 1000L);
    // ← 缺少 removeModule("io")
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions