rootdirective-sec/CVE-2026-7465-Lab

GitHub: rootdirective-sec/CVE-2026-7465-Lab

一个用于本地复现和分析 WordPress Spectra Gutenberg Blocks 插件 CVE-2026-7465 漏洞的 Docker 实验环境,提供漏洞版本与修复版本的对比验证。

Stars: 0 | Forks: 0

# CVE-2026-7465 - Spectra Gutenberg Blocks 本地实验室 用于分析和复现 WordPress 插件 **Spectra Gutenberg Blocks** (`ultimate-addons-for-gutenberg`) 中 CVE-2026-7465 漏洞的本地 Docker 实验室。 本实验室对比: - `vuln`:Spectra `2.19.25` - `patched`:Spectra `2.19.26` 此证明刻意采取最小危害原则。它不执行 shell 命令、不上传文件、不创建用户,也不直接修改容器。PoC 会创建一个临时的 WordPress 草稿文章,检查渲染后的 block 行为,然后删除该草稿。 ## 摘要 CVE-2026-7465 是 Spectra Gutenberg Blocks 中的一个漏洞,用户可控的 Gutenberg block 属性可以被传递到 WordPress block 注册参数中。 在易受攻击的版本中,Spectra 使用来自文章内容的 block 属性动态注册解析后的 `uagb/*` block: ``` $registry->register( $block['blockName'], $block['attrs'] ); ``` 由于 Contributor 可以创建包含 Gutenberg block 注释的文章内容,因此经过身份验证的 Contributor 级别用户可以影响 `render_callback` 等注册参数。 `2.19.26` 版本通过使用空参数数组注册 block 修复了此问题: ``` $registry->register( $block['blockName'], array() ); ``` 这防止了受文章控制的 block 属性成为 PHP block 注册选项。 ## 受影响的组件 产品: ``` Spectra Gutenberg Blocks WordPress plugin slug: ultimate-addons-for-gutenberg ``` 本实验室中使用的版本: ``` vulnerable: 2.19.25 patched: 2.19.26 ``` `2.19.26` 的 WordPress.org 更新日志指出,该更新解决了一个安全漏洞,并感谢 Wordfence 进行了负责任的报告。 ## 根本原因 易受攻击的逻辑位于: ``` classes/class-uagb-init-blocks.php ``` 易受攻击的代码会检查解析后的 block 名称是否包含 `uagb/` 命名空间。如果该 block 尚未注册,它会动态注册该 block。 ### 易受攻击的行为 ``` if ( ! empty( $block['blockName'] ) && strpos( $block['blockName'], 'uagb/' ) !== false ) { $registry = WP_Block_Type_Registry::get_instance(); if ( ! $registry->is_registered( $block['blockName'] ) ) { $registry->register( $block['blockName'], $block['attrs'] ); } } ``` 问题在于第二个参数: ``` $block['attrs'] ``` 在 Gutenberg 中,block 属性可以存储在文章内容中,例如: ``` ``` Contributor 可以创建草稿文章内容。因此,攻击者可以影响 `$block['attrs']`。 当这些属性被传递给 `WP_Block_Type_Registry::register()` 时,它们就会成为 block 注册参数。其中一个敏感的注册参数是: ``` render_callback ``` 这创建了一个回调控制原语。 ### 修复后的行为 在 `2.19.26` 中,Spectra 仍然会注册解析后的 `uagb/*` block 名称,但不再将受文章控制的属性作为注册参数传递: ``` if ( ! empty( $block['blockName'] ) && strpos( $block['blockName'], 'uagb/' ) !== false ) { $registry = WP_Block_Type_Registry::get_instance(); if ( ! $registry->is_registered( $block['blockName'] ) ) { $registry->register( $block['blockName'], array() ); } } ``` 重要的更改在于: ``` - $registry->register( $block['blockName'], $block['attrs'] ); + $registry->register( $block['blockName'], array() ); ``` 这从 block 注册路径中移除了由攻击者控制的属性。 ## 为什么 PoC 使用 `maybe_serialize` PoC 不使用危险的 PHP 回调,例如 `system`、`exec`、`shell_exec` 或 `passthru`。 相反,它使用: ``` maybe_serialize ``` 证明 block 的内容为: ``` ``` 预期行为: ``` vulnerable: render_callback from block attrs is accepted marker appears in rendered content patched: render_callback from block attrs is ignored marker does not appear in rendered content ``` 这证明了易受攻击的行为,而无需执行命令或写入文件。 ## 实验室架构 服务: ``` db_vuln MariaDB for vulnerable WordPress db_patched MariaDB for patched WordPress vuln WordPress + Spectra 2.19.25 patched WordPress + Spectra 2.19.26 seed_vuln one-shot WordPress setup for vulnerable site seed_patched one-shot WordPress setup for patched site ``` 本地端口: ``` http://127.0.0.1:8181 -> vulnerable WordPress http://127.0.0.1:8182 -> patched WordPress ``` 预设的 WordPress 用户: ``` username: contributor password: contributorpass123! role: contributor ``` PoC 仅使用 HTTP。它通过登录和 REST API 请求与 WordPress 进行交互。 ## 仓库结构 ``` . ├── docker-compose.yml ├── patched │ └── Dockerfile ├── poc │ └── poc.py ├── scripts │ └── seed-wordpress.sh ├── vuln │ └── Dockerfile ``` ## 运行实验室 从干净的环境开始: ``` docker compose down -v --remove-orphans docker compose up -d --build ``` 检查容器: ``` docker compose ps ``` 检查种子日志: ``` docker compose logs seed_vuln seed_patched ``` 预期的种子结果: ``` [+] seed vuln: done [+] seed patched: done ``` ## 运行 PoC 测试易受攻击的目标: ``` python3 poc/poc.py -t http://127.0.0.1:8181 ``` 预期的漏洞判定结果: ``` [VERDICT] VULNERABLE_BEHAVIOR_OBSERVED ``` 测试已修补的目标: ``` python3 poc/poc.py -t http://127.0.0.1:8182 ``` 预期的修补判定结果: ``` [VERDICT] PATCHED_BEHAVIOR_OBSERVED ``` ## 预期输出 ### 易受攻击 - Spectra 2.19.25 ``` [SCOPE] local-only | HTTP-only | least-harm | no shell | no file write [TARGET] http://127.0.0.1:8181 [INFO] fingerprinting target spectra_stable_tag: 2.19.25 spectra_changelog_latest: 2.19.25 [INFO] logging in as contributor [OK] login successful [INFO] collecting REST nonce [INFO] nonce candidates found: 4 [OK] validated REST nonce [INFO] creating temporary draft post [OK] created draft post id=16 [INFO] fetching rendered content [EVIDENCE] raw_contains_marker: True rendered_contains_marker: True rendered_length: 227 proof_callback: maybe_serialize synthetic_block: uagb/cve-2026-7465-lab [VERDICT] VULNERABLE_BEHAVIOR_OBSERVED [INFO] cleaning up draft post id=16 [OK] cleanup complete ``` ### 已修补 - Spectra 2.19.26 ``` [SCOPE] local-only | HTTP-only | least-harm | no shell | no file write [TARGET] http://127.0.0.1:8182 [INFO] fingerprinting target spectra_stable_tag: 2.19.26 spectra_changelog_latest: 2.19.26 [INFO] logging in as contributor [OK] login successful [INFO] collecting REST nonce [INFO] nonce candidates found: 4 [OK] validated REST nonce [INFO] creating temporary draft post [OK] created draft post id=14 [INFO] fetching rendered content [EVIDENCE] raw_contains_marker: True rendered_contains_marker: False rendered_length: 1 proof_callback: maybe_serialize synthetic_block: uagb/cve-2026-7465-lab [VERDICT] PATCHED_BEHAVIOR_OBSERVED [INFO] cleaning up draft post id=14 [OK] cleanup complete ``` ## 证据解释 重要的对比在于: ``` raw_contains_marker rendered_contains_marker ``` 易受攻击和已修补的目标都应显示: ``` raw_contains_marker: True ``` 这确认了相同的 block 内容已成功保存到临时草稿文章中。 区别在于渲染输出: ``` vulnerable: rendered_contains_marker: True patched: rendered_contains_marker: False ``` 这表明易受攻击的版本接受了受文章控制的 `render_callback`,而已修补的版本则没有。 ## 清理 停止并移除容器、网络和卷: ``` docker compose down -v --remove-orphans ``` 移除 Python 缓存(如果存在): ``` rm -rf poc/__pycache__ ``` ## 安全提示 本仓库仅用于本地安全研究和作品集展示。 PoC: - 仅针对 localhost 或回环地址 - 在本地实验室中使用经过身份验证的 WordPress 访问权限 - 创建一个临时草稿文章 - 在检查渲染行为后删除该草稿文章 - 不执行 shell 命令 - 不上传文件 - 不创建用户 - 不直接修改 Docker 容器 - 不提供远程利用工作流 请勿对您不拥有或未获得明确测试权限的系统运行此操作。 ## 参考 - WordPress.org 插件页面:Spectra Gutenberg Blocks - Website Builder for the Block Editor https://wordpress.org/plugins/ultimate-addons-for-gutenberg/ - WordPress.org 更新日志:`2.19.26 - Monday, 4th May 2026` 安全更新,归功于 Wordfence https://wordpress.org/plugins/ultimate-addons-for-gutenberg/#developers - WordPress 插件 SVN / Trac https://plugins.trac.wordpress.org/browser/ultimate-addons-for-gutenberg/
标签:Docker, Go语言工具, Web报告查看器, WordPress, 安全防御评估, 文件完整性监控, 漏洞分析, 漏洞复现环境, 版权保护, 请求拦截, 路径探测, 逆向工具