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报告查看器, 内存安全, 客户端加密, 情报收集, 暴力破解, 漏洞研究