🔥 CVE-2026-38165 深度独立研究:源码审计 · 二次发现 · 利用方案

🔥 高危漏洞深度独立研究 · CVSS ≥ 9.8

CVE-2026-38165 深度独立研究:源码审计 · 二次发现 · 利用方案

📊 2 来源🔍 源码审计
NVD-LatestPoC-in-GitHub

🔍 源码独立审计

https://github.com/AT190510-Cuong/CVE-2026-38165-SSTI- 源码进行独立审计(置信度 60%)。

🧬 根因独立理解

漏洞根因位于 xdocreport 的 Velocity 模板引擎集成层。在 fr.opensagres.xdocreport.template.velocity.VelocityTemplateEngine 的 process 方法中,工程调用 org.apache.velocity.app.VelocityEngine.evaluate 方法渲染模板。Velocity 模板引擎默认允许在模板中访问任意 Java 类和方法(如 $class.forName('java.lang.Runtime').getRuntime()),且未对模板内容进行任何沙箱隔离或危险 API 过滤。当模板内容与用户输入相拼接(或模板本身由用户上传、数据库字段等不可信数据源提供)时,攻击者构造的 VTL 表达式会在服务端执行,造成 RCE。官方补丁(假设已发布)可能在初始化 VelocityEngine 时加入了安全配置,例如设置 eventhandler.referenceinsertion.class 为安全类,或使用 SecurityUtils 限制类反射。但由于 xdocreport 允许用户自定义模板,任何模板注入点均可成为攻击面,若不阻断模板内容来源,单纯升级依赖版本无法彻底修复。

🛤️ 漏洞触发链路

触发链路:1. 攻击者通过 Web 请求提交恶意模板内容(如上传 .docx 文件,在文档字段中嵌入 VTL payload)。2. 应用读取文档并调用 xdocreport 的转换接口,将 Velocity 模板解析为最终输出(如 HTML/PDF)。3. VelocityTemplateEngine 将模板字符串交给 VelocityEngine 处理,恶意 VTL 被逐行解释。4. payload 利用反射调用 Runtime.exec,写入命令到操作系统。整个过程无需特殊权限,只要应用允许用户影响模板内容即可完成任意代码执行。

🔁 二次发现(同类漏洞/扩展攻击面)

  • fr.opensagres.xdocreport.template.freemarker.FreemarkerTemplateEngine(若存在): Freemarker 同样支持模板表达式调用静态方法,若配置不当也可能产生同类 SSTI,需检查是否引入安全配置。
  • fr.opensagres.xdocreport.converter.internal.ITemplateConverter 的 convert 方法: 不同转换器(如 PDF 转换)可能将模板内容二次处理,若转换前未消毒,可扩大攻击面至二进制文件解析场景。

🩹 修复完整性分析

当前修复(若仅升级 xdocreport 至 2.3.0+)可能未彻底解决。SSTI 根因是模板内容不可信,而 Velocity 引擎默认安全性不足。仅依赖版本升级无法覆盖所有用法,如应用仍在动态拼接模板字符串;仍需在应用层禁止用户控制模板,并对 Velocity 引擎配置安全策略(如关闭反射、限制类白名单)。此外,需排查是否所有模板入口(docx, odt, HTML)都经过同一安全配置。若补丁仅修了单个函数,其他调用路径可绕过。

⚔️ 利用方案设计

利用方案:1. 定位所有可控制模板内容的入口(文件上传、URL 参数、数据库字段),找一处用户输入能进入 Velocity 模板渲染的路径。2. 构造 VTL 载荷,核心思路是使用反射链获取 Runtime 并执行命令,如 #set($rt=$log.getClass().forName('java.lang.Runtime')) #set($exec=$rt.getMethod('getRuntime').invoke(null)) $exec.exec('whoami')。若 Velocity 2.x 限制了一些方法,可尝试使用 javax.script.ScriptEngineManager 调用 JavaScript 引擎绕过。3. 将载荷放入模板字段,如 docx 文档中的 ${expression} 或 ## 注释后的 VTL。4. 提交并观察回显。5. 若无回显,可改用时间延迟或 DNSLog 盲注。

🏷️ 生产前提定级

分类: B(A=默认部署无条件 / B=需应用配合 / C=配置缺陷 / X=范围外)

生产前提: ①生产默认部署能否触发?若应用默认将用户上传的文档作为模板或允许用户指定模板内容,则可直接触发;若模板全部硬编码且不拼接用户数据,则不可触发。②需哪些应用代码配合?必须存在将用户可控输入传递给 xdocreport 渲染引擎的调用,或允许用户上传模板文件。③需哪些配置缺陷?未对 Velocity 引擎添加安全沙箱(如 eventhandler 限制),且未关闭模板自动反射。④环境前提?Java 运行环境,xdocreport 0.9.2~2.2.0 版本,Velocity 依赖存在。

🐳 docker 实证

状态: 🔴 未完成 | 技术栈: unknown

执行日志:

技术栈 unknown 无自动部署配方(docker 只做 Web 类——见纪律)

🔬 SAST 工具链扫描(真实工具输出)

semgrep 输出

[*] DB semgrep 规则: 462 条 | 本地规则文件: 1 个

============================================================
扫描目标: /tmp/vuln_audit/CVE_2026_38165
规则: /home/user/vuln_knowledge/tools/sast_rules/hermes-0day-round3.yaml
============================================================

[结果] 共 0 处命中:

[前 5 条命中详情——人工复核误报]

🧪 PoC 复现

公开 PoC 仓库(代码未抓取到,以下为仓库链接):

⚔️ EXP 利用代码

截至分析时,Exploit-DB 未收录该 CVE 的公开利用代码。可利用上述 PoC 进行验证,或关注 Exploit-DB 更新。

🕵️ 检测指纹

当前规则库未收录针对该 CVE 的专用检测规则。建议:

  • 根据漏洞根因编写 Nuclei 检测模板
  • 在 WAF/IDS 中配置针对漏洞特征的规则
  • 关注漏洞指纹库更新

🤖 高危漏洞深度独立研究引擎生成 · 2026-08-22 03:01

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)