Tejanadh/firedancer-gossip-rce-research
GitHub: Tejanadh/firedancer-gossip-rce-research
针对 Firedancer Gossip 反序列化器 CVSS 10.0 零点击 RCE 漏洞的完整私有研究包,包含 PoC、ASAN 证据、Kill Chain 分析及修复方案。
Stars: 0 | Forks: 0
# Firedancer GHSA-2h9j-5m96-974c - 私有研究包
**安全通告:** [严重] Gossip 反序列化器中的零点击远程越界写入可逃逸沙箱至 Verify Tile
**GHSA ID:** GHSA-2h9j-5m96-974c
**报告者:** Tejanadh
**严重程度:** 严重 (CVSS 10.0)
**CVSS 向量:** CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
**CWE:** CWE-20 (不当输入验证),CWE-787 (越界写入)
此私有仓库包含上述 GitHub 安全通告的完整研究产物。
## 快速链接(供 Firedancer 维护者参考)
| 文件 | 描述 |
|------|-------------|
| `real_gossip_deser_poc_final.c` | 可用的 PoC,使用真实的 struct 布局触发确切的反序列化器漏洞模式。在 ASAN 下产生干净的 stack-buffer-overflow。 |
| `ASAN_CRASH_LOG.txt` | 包含编译/运行命令的完整原始 AddressSanitizer 输出。 |
| `REPRO.md` | 确切的复现步骤。 |
| `FIREDANCER_CRITICAL_RCE_KILL_CHAIN_REPORT.md` | 完整的技术报告(摘要、攻击面、Kill Chain、影响、缓解措施)。 |
| `GOSSIP_VERIFY_KILL_CHAIN_REAL_WORLD_IMPACT.md` | 现实影响分析(运营、财务、共识)。 |
## 漏洞摘要 (TL;DR)
**位置:** `src/flamenco/gossip/fd_gossip_message.c`(位于第 574 行的 `deser_pull_response` 以及 `deser_push`)
```
READ_U64(message->pull_response->values_len, payload, payload_sz); // attacker-controlled (up to 2^64)
for (ulong i = 0; i < message->pull_response->values_len; i++) {
message->pull_response->values[i].offset = ...; // OOB write when i >= 17
CHECK(deser_value(...));
}
```
**根本原因:**
- `fd_gossip_pull_response_t` / `fd_gossip_push_t` 声明了 `fd_gossip_value_t values[FD_GOSSIP_MESSAGE_MAX_CRDS]`,其中 `FD_GOSSIP_MESSAGE_MAX_CRDS == 17`。
- `values_len` 直接从不受信任的 UDP gossip 数据包中读取,**没有边界检查**。
- 主要的零点击路径:`src/discof/gossip/fd_gossvf_tile.c:770` (`handle_net()`)。
- 次要路径:GUI tile 栈分配。
**提权路径:**
一旦 gossip/GUI tile 被破坏,攻击者就可以伪造一个 VOTE 更新到 Verify tile 的共享内存(`mcache/dcache`)中。Verify tile 会执行:
```
dst->payload_sz = (ushort)msg->vote->value->transaction_len;
fd_memcpy(..., transaction_len); // unbounded, no validation
```
这构成了一个**跨 tile 沙箱逃逸**,进入负责所有签名验证的组件(`fd_verify_tile.c:90-94`,`IN_KIND_GOSSIP` 路径)。
## PoC 证据 (ASAN)
参见 `ASAN_CRASH_LOG.txt` 和 `REPRO.md`。
**崩溃输出示例:**
```
==46269==ERROR: AddressSanitizer: stack-buffer-overflow
WRITE of size 8 at ...
#0 ... in deser_pull_response ...real_gossip_deser_poc_final.c:XX
[144, 23576) 'pr' (line 105) <== Memory access at offset 23688 overflows this variable
```
该写入与生产代码(`fd_gossip_message.c:576`)中 `.offset = ...` 的存储操作完全匹配。
## 本仓库中的文件
- `README.md`(此文件)
- `real_gossip_deser_poc_final.c`
- `ASAN_CRASH_LOG.txt`
- `REPRO.md`
- `FIREDANCER_CRITICAL_RCE_KILL_CHAIN_REPORT.md`
- `GOSSIP_VERIFY_KILL_CHAIN_REAL_WORLD_IMPACT.md`
## 建议的最小修复方案
**在 `fd_gossip_message.c` 中**,在 `deser_pull_response` 和 `deser_push` 中读取 `values_len` 之后立即执行:
```
if (FD_UNLIKELY(message->pull_response->values_len > FD_GOSSIP_MESSAGE_MAX_CRDS))
return -1;
```
**额外加固** Verify tile 的 gossip 路径:
- 在执行 `memcpy` 和 `payload_sz` 赋值之前,针对合理的边界(例如 TPU MTU 或实际的分片大小)验证 `transaction_len`。
## 当前状态
- GHSA 已提交,目前处于 **Triage** 状态。
- 完整的 PoC + ASAN 日志 + 详细分析可在本仓库中获取。
- 报告者已准备好就修复工作进行协作(通过临时私有 fork 或通告评论)。
如果您需要:
- 调用更多真实 `fd_gossip_message_deserialize()` 入口点版本的 PoC
- 包含候选补丁 + 测试的 branch
- 对 Verify tile 写入原语的进一步分析
- 或其他任何协助
...请在通告评论中回复或 @mention 我。我在本地拥有完整的源代码树,可以快速迭代。
**此软件包代表了关于所报告问题的当前完整研究。**
— Tejanadh
GitHub: @Tejanadh
Email: tejanadh927@gmail.com
标签:CISA项目, Firedancer, PoC, Web报告查看器, 内存安全, 客户端加密, 情报收集, 暴力破解, 漏洞研究