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, 安全防御评估, 文件完整性监控, 漏洞分析, 漏洞复现环境, 版权保护, 请求拦截, 路径探测, 逆向工具