| Title | Alfresco Software (Apache-2.0 open-source) Activiti (Alfresco BPMN / Workflow Engine) 7.21.0-rc Activiti JUEL Reflection Bypass → RCE |
|---|
| Description | Activiti BPM 引擎的 JUEL 表达式语言支持包含反射阻断绕过,允许任意代码执行。
根本原因。ELResolverReflectionBlockerDecorator(用 activiti-core-common/activiti-expression-language)旨在阻止 JUEL 表达式中的反射性和原生调用,但它只拦截:
其包恰好是java.lang.reflect的基础对象,以及
final/native 方法声明在 java.lang.Object 上。
它不会阻止java.lang.runtime(既非最终也非原生),也不会阻止java.lang.ProcessBuilder,也不会阻止通过替代路径到达解析链的方法调用。
绕过路径(0day元素)。JuelScriptEngine(在activiti-engine中)注册一个lang:import builtin(行~161: scriptCtx.setAttribute(“lang:import”, getImportMethod(), ...))。其处理程序importFunctions(ctx, namespace, obj)(第214–235行)通过ReflectUtil.loadClass()动态加载任意类的名称字符串,枚举其公开静态方法,并将每个类直接注册为可调用函数,直接在ScriptContext上。由于这些是绑定到脚本上下文的方法对象,而非通过CompositeELResolver路由,反射阻断器装饰器被完全绕过。
剥削。包含scriptTask且scriptFormat=“juel”的BPMN进程会触发JuelScriptEngine.eval():
<scriptTask id=“rce” scriptFormat=“juel”>
<脚本>
lang:import(“java.lang.Runtime”, “rt”);
RT:exec(“触摸/TMP/Pwned”);
</脚本>
</scriptTask>
他的计算结果是RCE作为应用用户。攻击面还因两个额外发现而扩大:
DynamicBpmnService(CWE-862)。DynamicBpmnServiceImpl会暴露changeServiceTaskExpression() / changeScriptTaskScript(),在运行时热插拔已部署进程的表达式/脚本,无需授权检查,并通过SaveProcessDefinitionInfoCmd持久化更改。拥有仓库服务访问权限的攻击者可以在不重新部署的情况下注入恶意 JUEL 表达式,并在下一个到达该元素的进程实例时触发。
春豆暴露。SpringBeanFactoryProxyMap + ReadOnlyMapELResolver(beans) 将每个 Spring bean 暴露给 JUEL,即使没有 lang:import,也能实现任意 bean 方法的链。
前提条件:能够部署BPMN进程,或能够调用DynamicBpmnService。一旦部署权限存在,无需认证绕过即可到达表达式引擎。
建议的供应商修复方案
在 JuelScriptEngine.createElContext() 中移除 lang:import 注册,或者在类名白名单后面 gate importFunctions()。
扩展ELResolverReflectionBlockerDecorator,阻止java.lang.Runtime和java.lang.ProcessBuilder(以及任何可达的执行流域),而不仅仅是java.lang.reflect。
将 SpringBeanFactoryProxyMap 限制为命名的豆子白名单,而不是暴露完整的豆子工厂。
在所有 DynamicBpmnService 写入方法上添加授权检查和审计日志。 |
|---|
| Source | ⚠️ https://github.com/Activiti/Activiti |
|---|
| User | onlyeagle (UID 101618) |
|---|
| Submission | 09/24/2026 17:23 (1 month ago) |
|---|
| Moderation | 10/24/2026 23:40 (1 month later) |
|---|
| Status | Accepted |
|---|
| VulDB entry | 426142 [Alfresco Activiti up to 7.21.0-rc.692 JuelScriptEngine.java JuelScriptEngine.eval code injection] |
|---|
| Points | 20 |
|---|