沙箱的检查点是编译期织入的,那么只要能在脚本里创建一个新的、使用默认配置的 Groovy 解释器,把真正的 payload 作为字符串交给它,内层代码就会在一个从未织入检查的环境中编译执行。这不是绕过检查,而是让检查的调用点根本不存在。
SYNCOPE-1907 修复存在覆盖缺口:沙箱只在 Syncope 自身的 ImplementationManager 中注册生效,连接器脚本走的是 ConnId 框架(connector-framework-internal-1.6.1.0.jar)自己的 GroovyScriptExecutor,配套的是 ConnId 自带的一份黑名单。
对比两份黑名单(Syncope 的 253 行 vs ConnId 的约 100 行),ConnId 侧缺失约 100 条签名,其中就包括全部 GroovyShell 构造器重载、GroovyClassLoader、Eval、ScriptEngineManager/ScriptEngine.eval。于是:
id 执行成功。这里有个值得注意的细节:相比无沙箱时代的三步利用链(写 JAR → reload → 触发),绕过后的利用反而只需要一个请求、仅 CONNECTOR_READ 权限——修复不完整时,攻击成本比修复前还低。
SYNCOPE-1907 修复存在覆盖缺口:沙箱只在 Syncope 自身的 ImplementationManager 中注册生效,连接器脚本走的是 ConnId 框架(connector-framework-internal-1.6.1.0.jar)自己的 GroovyScriptExecutor,配套的是 ConnId 自带的一份黑名单。
对比两份黑名单(Syncope 的 253 行 vs ConnId 的约 100 行),ConnId 侧缺失约 100 条签名,其中就包括全部 GroovyShell 构造器重载、GroovyClassLoader、Eval、ScriptEngineManager/ScriptEngine.eval。于是:
id 执行成功。这里有个值得注意的细节:相比无沙箱时代的三步利用链(写 JAR → reload → 触发),绕过后的利用反而只需要一个请求、仅 CONNECTOR_READ 权限——修复不完整时,攻击成本比修复前还低。