C#基于IronPython运行Python脚本时如何禁用系统库默认访问权限
关闭IronPython默认System模块访问的配置方法
IronPython默认会自动将当前AppDomain加载的.NET公共程序集(含System.dll)的类型注入脚本全局作用域,同时开放clr模块供脚本动态加载任意程序集,可通过以下配置完全关闭该默认权限:
- 初始化引擎时禁用默认程序集自动导入
// 自定义引擎初始化参数,关闭自动加载逻辑 var engineOptions = new Dictionary<string, object> { ["NoDefaultAssemblies"] = true, // 禁止自动导入System等默认.NET命名空间 ["NoImportOfAssemblies"] = true // 禁止自动导入当前AppDomain已加载的所有程序集 }; var engine = Python.CreateEngine(engineOptions); - 手动清理脚本作用域的默认注入内容
创建独立脚本作用域后,仅保留你指定开放的自定义业务模块,移除所有默认注入的.NET类型、内置危险模块:var scope = engine.CreateScope(); var defaultVariables = scope.GetVariableNames().ToList(); // 仅保留白名单内的变量/模块 var allowedVariables = new HashSet<string> { "MyCustomModAPI", "print", "math" }; foreach (var varName in defaultVariables) { if (!allowedVariables.Contains(varName)) { scope.RemoveVariable(varName); } } // 必须主动移除clr模块,禁止脚本动态加载任意.NET程序集 scope.RemoveVariable("clr"); - 重写内置导入函数
__import__实现白名单校验
防止脚本通过动态导入绕过限制,仅允许导入指定的安全模块:var builtinImport = engine.GetBuiltinModule("__import__"); // 自定义导入逻辑 Func<CodeContext, string, object, object, object[], object> customImport = (ctx, moduleName, globals, locals, fromList) => { var allowedModules = new HashSet<string> { "MyCustomModAPI", "math", "json" }; if (!allowedModules.Contains(moduleName)) { throw new Exception($"未授权导入模块: {moduleName}"); } return builtinImport.Invoke(ctx, moduleName, globals, locals, fromList); }; // 注入自定义导入函数到作用域 scope.SetVariable("__import__", customImport); - 可选:启用*代码访问安全(CAS)*限制
.NET Framework环境下可创建部分信任的AppDomain,给IronPython引擎分配最小权限集,禁止访问文件系统、注册表、反射等敏感系统能力;.NET Core/.NET 5+环境下可使用AssemblyLoadContext隔离程序集加载范围,避免未授权程序集被加载。
适配权限隔离需求的替代实现方案
如果上述配置仍无法满足严格的隔离要求,可选择以下适配模组场景的实现方案:
- 升级到IronPython 3
IronPython 3对.NET程序集导入的控制粒度更细,支持直接通过ScriptHost配置完全禁用默认的.NET类型注入,同时修复了IronPython 2中多个权限绕过的漏洞,适合需要继续保留.NET互操作能力的场景。 - 嵌入式CPython + 自定义桥接层
放弃IronPython的.NET原生互操作,改用嵌入式CPython(通过Pythonnet或原生C API嵌入),仅通过自研的C扩展层将指定的业务模块暴露给Python解释器,原生不开放任何系统级API,同时可结合操作系统级沙箱(如Windows Job Object、Linux seccomp)限制进程的系统调用权限。 - WebAssembly(WASM)沙箱运行时
若业务场景支持WebView或WASM运行环境,可使用Pyodide(CPython编译的WASM版本),利用WASM天生的沙箱隔离机制,天然禁止脚本访问宿主系统能力,仅通过自定义桥接层开放业务API,无需手动处理底层权限控制。 - 纯Python沙箱解释器
如果不需要兼容第三方Python库,可使用纯Python实现的沙箱解释器(如Skulpt、PyPy沙箱模式),解释器完全运行在托管环境中,没有任何底层系统访问能力,仅通过自定义API注入实现模组功能,隔离性最强。
内容的提问来源于stack exchange,提问作者TopchetoEU
相关产品推荐
相关产品推荐

