FreeMarker 沙箱逃逸新姿势:暴露对象 × Aviator 表达式(JeecgBoot RCE)
FreeMarker 沙箱逃逸新姿势:暴露对象 × Aviator 表达式(JeecgBoot RCE)
一句话:在 ?new 被 SAFER_RESOLVER、?api 未开启、内置对象全被拦的"净化"
FreeMarker SSTI 环境里,作者审计 JimuReport(JeecgBoot 报表模块)暴露到模板上下文的
自定义对象,借 Aviator 表达式引擎完成沙箱逃逸 RCE(CVE-2026-51086/51087,
CVE-2023-4450 的延伸)。
要点:
- 前提:JeecgBoot/JimuReport 的 SSTI 入口,模板引擎侧传统 FreeMarker RCE 套路
(Execute/ObjectConstructor/JythonRuntime、getClassLoader 绕过)全部失效 - 思路转变:不在引擎本身找洞,转向业务方暴露到模板上下文的对象——找到能读文件、
能求值的自定义方法,是"净化沙箱"类 SSTI 的通用突破面 - 借 Aviator 表达式求值原语跳出 FreeMarker 的方法级沙箱达成 RCE;文中附
FreeMarker 1999–2026 攻防四阶段的完整时间线,适合当检索索引 - 也记录了用 LLM 在攻防史知识辅助下发现文件读取路径的过程
原语抽象:沙箱封死引擎自带能力后,宿主注入上下文的对象成为新的逃逸面——
"暴露面 = 攻击面":引擎配置再严,安全性由暴露对象里最弱的一个决定。
亲戚手法:表达式引擎当跳板家族(与 pre-auth-rce-enterprise-java-bonita-ofbiz
OFBiz 链的 Groovy eval 同族);差异:入口不是把表达式注进引擎,而是在模板里调用
业务方塞进上下文的对象方法,绕的是方法级沙箱而不是解析层。
防御启示:模板/表达式上下文的对象暴露要按全量 classpath 审计后白名单化——
只审引擎配置(SAFER_RESOLVER、unsafeMethods)会漏掉真正出事的层面。
原文: https://xz.aliyun.com/news/92754
来源发布时间: 2026-08-31