Skip to content
Go back

躲在 NAT 后面也不安全:门罗币不可达节点 27 分钟被彻底隔离

Edit page

TL;DR

门罗币节点躲在 NAT 后面、拒绝入站连接,长期被默认为“更安全”。CCS 2026 这篇论文推翻了这个直觉:不可达不是护盾,反而是陷阱——它只能向外连接,一旦出站连接全被控制,就没有任何诚实节点能从外部找到它、把它拉回来。 针对老节点的 Nyx 先污染全网可达节点名单,再借正常同步把毒记录间接送进目标,最后靠门罗币自身的出站刷新机制换掉良性连接,27 分钟完成 12/12 接管,此后 17 小时 47 分钟基本稳固。针对新节点的 Moros 直接污染 6 个官方种子节点,新节点一启动就拿到 233/250 条恶意记录,出生 8 秒即被隔离。这不是实现 bug,而是名单机制的前提被击穿:它默认“大多数记录诚实”,而攻击者用 1000 个不同 /24 子网 IP 就能买断这个前提。

论文信息卡

  • 标题:Are Unreachable Nodes Truly Safe? Fully Eclipsing Monero’s P2P Network!
  • 作者:Ruisheng Shi、Jiaqi Zeng、Lina Lan、Shihan Zhang、Bing Han、Xiapu Luo、Qishu Jin、Wenliang Du、Qin Wang
  • 单位:北京邮电大学、香港理工大学、浙江大学、CSIRO
  • 会议:ACM CCS 2026(已接收)
  • 原文链接:https://arxiv.org/abs/2609.10260
  • 负责任披露:作者已通过 HackerOne(编号 #3702913)向门罗币官方报告

背景

门罗币隐私名声来自交易层:隐身地址、环签名、RingCT 让“谁付给谁”难以追踪。但交易要进网络、节点要跟上链高,首先得活在 P2P 网络里。如果节点看到的网络是攻击者布置的假象,交易层隐私再强也会打折,这就是 Eclipse(日蚀)攻击——不是攻破密钥,而是垄断全部连接,让受害者只能看见攻击者想让它看见的网络,

此前 Eclipse 攻击大多要求攻击者能直接向目标发起入站连接,于是形成共识:NAT 后面、只出不进的节点攻击面更小。这个共识只算了一半账:不可达节点确实少了入站攻击面,但也失去了“自愈通道”。可达节点被隔离后,诚实节点仍可能主动连进来救它;不可达节点出站连接全灭后,外部诚实节点根本无法主动找到它,隔离自我强化、长期稳定。论文称之为“自愈困境”。而门罗币名单传播恰好留了间接通道:目标不见攻击者没关系,它的出站邻居会把毒记录“转交”给它。

方法拆解

先看底图。每个节点有两张名单:白名单最多 1000 条“已验证”记录,灰名单最多 5000 条“未验证”候选。白名单写入有三条路:入站连接经 PING/PONG 验证后写入;每分钟随机抽一条灰名单记录做握手探测,成功则晋升;建立出站连接时写入。灰名单则来者不拒:握手和定时同步返回的记录不做可达性验证就收下,满了按先进先出淘汰最老记录。每次握手或同步最多带 250 条记录,同步约每 60 秒一次。出站连接也非静态:协议约每 101 秒触发一次 update_sync_search,主动放掉一条已同步出站连接,再从名单里挑替补——这是正常运转,不是攻击者强拆。新生节点更脆弱:两张名单都空着,只能向硬编码种子节点要第一批最多 250 条记录。

攻击者资源并不夸张:1000 个不同 /24 子网 IP 填白名单,另加 20 个 IP 填灰名单,加一台跑轻量 py-levin 的工作站。论文指出,1000 个跨子网 IP 用云厂商和代理池“低成本就能凑齐”,/24 多样性过滤只能把成本抬高一个常数因子。攻击者甚至不需要知道目标 IP、不用连目标一次:Nyx 对全网“无差别下毒”。

flowchart LR
    A[攻击者:1000 个跨 /24 子网 IP] -->|握手验证| B[全网可达节点白名单被污染]
    B -->|定时同步,每轮最多 250 条| C[目标灰名单被间接污染]
    C -->|晋升| D[目标白名单被渗透]
    D -->|约每 101 秒换一条| E[12 条出站连接全部接管]
    E -->|恶意邻居持续回传| C

Nyx:老节点的三段绞索

N-I:全网下毒。 攻击者向每个可达节点发起 1000 个 IP 的握手,各 IP 经验证后写进对方白名单,一轮塞满 1000 个槽位。关键细节在端口:如果所有 IP 对所有节点都报同一端口,目标灰名单按〈IP, 端口〉去重后只剩 1000 条记录,第二轮起注入速率归零。于是攻击者给每个可达节点分配专属端口:同一 IP 在不同节点白名单里呈现为不同记录,目标 12 条出站连接每轮最多返回的 3000 条记录互不重复、全部过关。恶意记录池由此膨胀到约 1000×3000=300 万条,是目标 5000 条灰名单容量的约 600 倍。同时,20 个额外节点向每个可达节点持续回传随机“垃圾记录”,把灰名单塞满,让晋升机制抽到的几乎都是无法连通的地址。白名单有个理论上限:每个可达节点 12 条稳定出站连接的记录每 60 秒被同步刷新、钉在头部,攻击者最多占 988/1000,即 98.8%。

N-II:隔着 NAT 送毒。 目标每 60 秒向 12 个出站邻居同步,每邻居最多回 250 条,一轮最多注入 3000 条。灰名单 5000 条、先进先出,乐观情形两分钟可灌进 6000 条恶意记录、顶出全部良性记录;最保守情形下,每个邻居的 1000 条白名单约 4 分钟被去重机制排空,期间最多漏进 12×12=144 条良性记录,灰名单恶意占比下限为 (5000−144)/5000≈97.1%。灰名单一旦被污染,每分钟一次的晋升抽中的几乎全是恶意记录,毒就这样“晋升”进了白名单。

N-III:让协议自己换人。 这是最难防的一段:攻击者不拆任何连接,等门罗币自己的刷新机制约每 101 秒放掉一条出站连接,再从已被污染的灰名单里挑替补。模型很简单:已有 k 条恶意出站连接时,单轮选中恶意替补的概率为 Pk,掉的恰好是恶意连接的概率为 qk=k/12,期望变化为 Pk−qk。只要灰名单恶意占比够高,Pk 始终大于 qk,k 就会期望递增地爬向 12。恶意节点还有个小把戏:每次握手和同步都把创世区块报为最高区块,目标始终判定它们“已同步正常”,刷新循环不会停。更狠的是正反馈:第一条恶意出站连接建立后,它自己每轮同步又回传新毒记录,灰名单越来越毒,下一轮选中恶意的概率越来越高。

Moros:新生节点出生即隔离

新生节点没有历史、没有锚点、没有独立视角。Moros 只做一件事:提前用 1000 个公网 IP 对 6 个官方种子节点做持续白名单污染。新生节点启动时向种子节点要第一批 250 条记录——如果种子节点白名单已被污染,这 250 条就是它的全部初始世界观,12 条初始出站连接几乎必然从中毒灰名单里挑。之后和 N-III 一样:恶意出站邻居持续回传毒记录,灰名单迅速彻底变质,短暂出现的良性连接会被后续刷新挤出去。主网实验里攻击面收得很小:只对 6 个种子节点做白名单污染,不做灰名单污染,因为新生节点的初始灰名单本来就只有种子节点返回的那 250 条,毒种子白名单本身就够了。

实验与数据

伦理原因使两条实验线分开:Nyx 在仿真环境验证,Moros 在主网对受控目标验证,绝不在主网对任意老节点发动 Nyx。

Nyx 仿真用 SEED Emulator 搭建:1200 个节点、100 个自治域、BGP 路由、6 个种子节点,跑门罗币 v0.18.4.3,并按主网实测注入延迟、抖动、丢包。攻击前快照是正常运行中的节点:可达节点白名单平均 847/1000、灰名单 353/5000;目标白名单 483/1000、灰名单 717/5000。

N-I 几乎贴着理论上限走。 每批 120 个节点并行填充,10 批一轮约 5 分钟。第一轮结束(T+5 分钟),89.6% 的可达节点(1074/1199)白名单恶意占比已达 95% 以上,到 T+10 分钟,99.5%(1193/1199)达标,中位数恶意占比 98.5%,与 98.8% 理论上限只差 0.3 个百分点,残留 1.5% 正是那 12 条被同步钉住的出站连接记录。灰名单垃圾填充同样稳定:18.2 小时均值 98.15%,1.5 分钟内冲到 97.38%,5 分钟稳定在 99.02%。

N-II 比理论保守估计还快。 第 2 分钟,目标灰名单已有约 1492 条恶意记录;第 4 分钟灰名单达到 5000 条容量,先进先出开始顶出原有良性记录;第 9 分钟快照是 4993 条恶意、仅 2 条良性,恶意占比 99.96%,远好于 97.1% 的理论下限(良性上限 144 条)。前 9 分钟里晋升约 9 次,8 次选中恶意,唯一一次选中良性发生在 N-I 第一轮还没完成、灰名单恶意占比不足 70% 的窗口。

N-III 接管分三段,终点干净利落。 0–2 分钟热身:第一次刷新约第 2 分钟触发,此时灰名单 1492 条恶意对 715 条良性(67.6%);2–15 分钟快速接管:第一条恶意出站连接建立后正反馈启动,k 从 1 爬到 9;15–27 分钟边界收敛:k≥9 后 qk 升到 0.75–0.92,刷新更可能掉已控制的恶意连接,只有当掉的恰好是良性连接且替补仍是恶意时 k 才前进,但 Pk 接近 1 保证期望仍为正。全程 17 轮刷新、16 轮选中恶意(命中率 94.1%),约第 27 分钟 CTR 达到 100%(12/12)。此后 17 小时 47 分钟稳态窗口:630 次刷新里 626 次选中恶意(99.4%),4 次短暂选中良性让 CTR 从 12 跌回 11,但毒记录池立刻把良性候选顶出去;从第 85 分钟起 CTR 永久钉在 12/12。终态彻底:12 条出站连接、5000 条灰名单、1000 条白名单全部被控制,晋升 1074 次里 1073 次是恶意记录。由于目标不可达,没有任何诚实节点能主动连进来打破这个状态。

Moros 主网实测短得令人不安。 对 6 个官方种子节点的白名单污染几分钟内收敛,稳定在平均 934 条恶意记录(93.4%),没达到 988 条理想值,但 93.4% 已足够:新生节点期望从 250 条种子记录里拿到约 234 条恶意记录。实测新生目标拿到 233/250 条恶意(93.2%)、仅 17 条良性;灰名单 6 分钟内彻底变质;12 条出站连接在启动后 8 秒内全部沦陷,中途经过 k=7、k=10;此后 650 分钟(约 10.8 小时)监测里只有一次短暂出现良性出站连接(第 63 秒),很快被挤出,白名单 1.5 小时内被恶意记录主导。8 秒的冲击力在于:新生节点根本没有“先建立正确世界观、再慢慢被腐蚀”的过程——它的第一口空气就是毒的。

指标Nyx(老节点,仿真)Moros(新生节点,主网受控目标)
攻击面全网可达节点白名单6 个官方种子节点白名单
关键中间态T+10 分钟 99.5% 可达节点白名单恶意占比 ≥95%种子节点白名单恶意占比 93.4%(均值 934/1000)
目标灰名单第 9 分钟 4993 恶意 / 2 良性启动即 233/250 恶意,6 分钟内 100% 恶意
完全隔离耗时约 27 分钟(17 轮刷新,命中率 94.1%)8 秒
稳定性17 小时 47 分钟稳态,第 85 分钟后永久 12/12650 分钟监测,基本全程隔离

相关工作对比

比特币经典工作(Heilman 等,USENIX Security 2015)奠定了“垄断连接即控制视图”的范式,但要求攻击者能直接连目标,且接管时机依赖目标重启;后续改进大多还在这个框架里打转。门罗币此前攻击(Shi 等,NDSS 2025)已摸到名单机制弱点,但它依赖双花冲突主动重置连接——要持续主动干扰才能维持隔离,成本高、也更容易被发现。本文 Nyx 恰恰反其道而行之:不靠重启、不靠主动重置,靠协议自己的刷新节律把良性连接“正常地”换掉,攻击一旦启动就进入自动驾驶,隐蔽性和稳定性都上了一个台阶。

更根本的区别在目标类别上。此前工作默认攻击对象是可达节点,等于排除了 NAT 后面那个“沉默的大多数”——而这篇论文指出,沉默的大多数恰恰因为沉默而更脆弱:可达节点被隔离后还有“被诚实节点重新发现”这条生路,不可达节点没有。Moros 则把时间线再往前推一步:从“如何腐蚀已有世界观的节点”,变为“如何在世界观形成之前就污染它的第一批输入”。

局限与开放问题

  • Nyx 没有在主网对任意老节点实测:出于伦理原因只在 1200 节点仿真里验证,主网结论是“机制可迁移”而非“已在主网复现”;仿真用单机容器加注入延迟模拟主网条件,真实主网的节点 churn、地理分布、版本多样性都可能拖慢收敛。
  • Moros 主网实验放宽了一个关键防御:作者的 1000 个公网 IP 来自较窄的 /24 集合,因此实验中关闭了目标的 /24 子网多样性过滤。8 秒这个数字是在该条件下测得的;若严格保留过滤,攻击者需要真正凑齐跨子网 IP 池,成本与耗时都会上升(论文认为仍可负担,但未在主网实测该情形)。
  • 覆盖率收敛速率未实测:理论上即使 N-I 没有直接毒到所有可达节点,未被毒到的节点也会经由日常同步被间接污染、最终覆盖率趋向 1,但论文明确承认没有实测直接覆盖率与有效覆盖率的收敛速率。
  • 防御方案都不彻底:作者提出的三个协议修改——丢弃入站方向同步返回的名单、灰名单按 IP 而非〈IP, 端口〉去重、种子节点每 /24 写入限速——各自只堵一条路径,且作者自己承认,在“持续 Sybil 能力”威胁模型下,没有任何一个方案能彻底堵住攻击。
  • 开放问题:不可达节点如何获得“不完全由当前出站邻居决定”的诚实信号?

一点思考

对普通用户最实际的提醒是:不要把“NAT 后面”当成安全措施,它只是让你看不见攻击、也让别人救不了你。 运营重要节点的话,应把出站邻居多样性当成安全指标监控,而不只看“连上了没有”:邻居短时间内高度同质化、陌生记录占比陡增,都是值得告警的信号。我的判断是:这篇论文真正有价值的不是 Nyx/Moros 这两个攻击名字,而是它逼社区回答的那个问题——一个不能接受入站连接的节点,凭什么相信自己的邻居名单?在给出独立于 P2P 层的诚实信号之前,所有“不可达即安全”的说法都应作废。 短期内最值得落地的补丁是种子节点的每 /24 写入限速和灰名单按 IP 去重,前者拖慢 Moros,后者废掉端口多样化放大术;但两者都只是“拖慢”,不是“堵死”,别指望一次升级就高枕无忧。

原文链接


Edit page
Share this post on:

Next Post
对齐社区正在给审查者递刀:ICML 2026 最佳立场论文解读