针对 P2P·区块链的攻击手法
没有管理员的去中心化网络,会面临与中心化系统不同的攻击。本节讲解代表性攻击的原理、为防范它们而在设计上所做的巧思,以及 Bitcoin、Ethereum 的实际应对方式。
左:目标与多样的正常节点相连。右:连接对象全被替换为攻击者节点,与真实网络隔离。
女巫攻击(Sybil Attack)
女巫攻击是指一个攻击者制造大量虚假身份(假节点),在网络中伪装成多数派以不正当地掌握影响力的攻击。名字取自描写多重人格的小说《西碧尔(Sybil)》。若一台实体能自称成千上万个节点,「多数决」「随机选择对象」等 P2P 的前提便会崩溃。
此时发挥作用的,正是分布式共识中的 PoW/PoS。PoW 让「投一票需要现实的算力」、PoS 让「一票需要锁定资产」,从而在经济上使无限增加身份成为不可能。这就是女巫抵抗力的本质:不以身份的数量,而以算力或质押量这种「无法伪造的稀缺资源」来衡量话语权,令女巫攻击就此失效。
另一方面,不具明确女巫抵抗力的 DHT(如 Kademlia),攻击者可通过在特定 ID 空间放置大量节点,来劫持该键区域的查找或隐匿数据。普通 Kademlia 允许节点自行申报 ID,因此攻击者可以自由选取靠近目标键的 ID 大量生成,这正是其弱点所在。
针对这一弱点,S/Kademlia(Secure Kademlia 扩展)给出了具体对策。核心有两点:一是为节点 ID 的生成施加crypto puzzle(计算谜题),让 ID 从公钥或 IP 地址单向导出,从而对大量生成强制施加成本;二是查找不依赖单一路径,而是通过多条独立路径(disjoint paths)并行验证,即便部分路径被假节点控制,也能从结果的不一致中察觉异常。此外,对同一 IP 子网可注册的节点数设置上限,也是常见的缓解手段。
日食攻击(Eclipse Attack)
日食攻击是把作为目标的某一个节点的连接对象,全部填满为攻击者准备的节点,从而将其从正常网络中「隔离(日食=eclipse)」的攻击。目标自以为在正常通信,但它所看到的世界全是攻击者备好的赝品。
女巫攻击瞄准整个网络的多数派,日食攻击则不同,它只支配特定节点的「视野」(多数情况下,以女巫攻击造出的大量假节点为基础实施)。由于被隔离的节点只会收到攻击者精心挑选的交易和区块,便可能被如下滥用:
- 用于双花:让目标(例如商家的节点)误以为「付款已确定」而交出商品,却在真实网络中令该交易失效。
- 窃取挖矿能力:让被隔离矿工的算力空耗,或让其挖出对攻击者有利的链。
- 遮断·篡改信息:阻止目标得知本应的链上状态。
- 审查:把特定地址的交易从目标视野中隐藏,让转账看起来像是从未到账。
对策可归结为提高「连接对象的多样性」:确保出站连接的数量、从广泛的地址范围选取连接 IP、固定持有若干已知可信节点,这些在实际的 Bitcoin、Ethereum 实现中也已引入。
Bitcoin 的实现对策
Bitcoin 的 P2P 网络在 2015 年 Heilman 等人发表论文《Eclipse Attacks on Bitcoin's Peer-to-Peer Network》后,对等地址管理机制(addrman)经历了一次大幅整改。主要对策如下:
- 确保出站连接:维持一定数量由自己主动发起的连接,而不是只依赖被动接受的入站连接。
- feeler connection(触角连接):在后台对未验证的地址进行短时间试连接,只有确认存活的地址才会晋升到高可信度的「tried」表。攻击者即便发来大量未验证地址,只要通不过存活验证,就无法进入信任表。
- 地址桶的分散设计:按来源 IP 或网络分组(如 /16)把候选对等地址分散到多个桶中,使单个攻击者即便只用少量 IP 段发送大量地址,也难以独占特定的桶。
- 并用已知种子节点:为缩短启动初期路由表为空、容易被日食的时间窗口,会并用可信的 DNS 种子和硬编码的种子节点。
Ethereum 的实现对策
Ethereum 的节点发现协议(discv4/discv5)同样基于 Kademlia 系的 DHT,因此也面临同样的日食抵抗设计课题。对策主要有三方面:一是对同一 /24 子网可接受的节点数设置上限,防止单一攻击者的 IP 段集中连接。二是通过 --bootnodes 或静态节点列表,在启动时确保连接到可信节点。三是对节点标识信息(ENR)要求签名验证,提高伪装身份和批量生成一次性 ID 的成本。
路由表污染与针对 DHT 的攻击
作为日食攻击的一种变体,DHT 还面临路由表污染。攻击者把自己掌控的大量假节点信息注入受害节点的 k-桶或 finger table,把正规节点挤出并取而代之。路由表一旦被污染,该节点的查找请求便会持续沿攻击者布置的路径进行,从而妨碍对特定键区域的到达,或返回伪造的应答。
- 仅在存活确认后才允许替换:许多 Kademlia 实现在有新候选节点到来时,会先对既有桶内节点执行 ping 存活确认,只要有应答就优先保留旧节点,这种「least-recently-seen」策略能削弱短时间内发送大量假节点的攻击效果。
- 多路径查找:如前述 S/Kademlia 那样,不只信任单一路径的结果,而是对多条独立路径的结果进行交叉核对。
- 赋予 ID 生成成本:让节点 ID 从公钥或 IP 地址单向导出,使攻击者无法自由选取任意 ID。
51% 攻击的经济学
51% 攻击是指掌握过半算力(PoW)或质押(PoS),从而回滚交易或实施审查的攻击。具体机制请参见分布式共识中 PoW 一节,这里着重看看「为何在多数链上难以真正成立」这一经济层面的原因。
获取过半算力大致有两条路:一是自建并扩充设备(前期投入巨大),二是从算力租赁市场临时租用(可租用的算力量有限)。网络整体算力或质押总额越大的链,攻击成本就越高;反之,规模较小的链仅凭租赁市场就有可能凑够过半算力,因而相对更容易成为目标。
此外,许多 PoS 设计带有惩罚性没收(slashing)机制,一旦查实验证者作恶,其抵押的资产会被没收,这使攻击者自身的资产也会因发动攻击而受损,形成一种抑制力。而且,一旦攻击得逞并被察觉,该链的可信度会受损、代币价格随之下跌,持有大量代币的攻击者自己往往就是最大的受害者,这种「自我抑制」结构也常被提及。交易所一侧的常见做法,是按币种风险相应提高入账所需的确认数。
| 攻击手法 | 主要目标 | 前提条件 | 主要对策 |
|---|---|---|---|
| 女巫攻击 | 网络整体的多数决 | 身份生成成本低 | PoW/PoS、crypto puzzle 的 ID 生成成本 |
| 日食攻击 | 特定节点的全部连接对象 | 能够占据目标的连接对象 | 出站连接多样化、feeler connection |
| 路由表污染 | DHT 的查找路径 | 能把假节点信息注入桶中 | 存活确认、多路径交叉核对 |
| 51% 攻击 | 交易确定性与抗审查性 | 过半算力或质押 | Slashing、提高确认数 |
| 路由(BGP)攻击 | 互联网路由本身 | 介入 ISP・路由控制层 | 加密、多路径连接 |
| DDoS·放大攻击 | 节点可用性与带宽 | 生成或放大流量 | 限速、防伪造对策 |
DDoS 与放大(Amplification)攻击
日食攻击是「操纵目标所见信息」的攻击,与之相对,DDoS(分布式拒绝服务)攻击则单纯用大量流量或连接请求把节点淹没,耗尽其带宽、CPU、内存,从而直接剥夺其可用性。在 P2P 网络中,广播大量无效交易或消息以耗尽内存池与带宽的「垃圾交易」,也属于这一类。
尤其需要留意的是放大(amplification)攻击。像 UDP 这样的无连接协议,允许伪造(欺骗)源 IP 地址发送请求。攻击者把受害者的 IP 伪装成源地址,向大量节点发送请求,应答便会全部涌向受害者。应答数据相对请求越大(即放大倍率越高)的协议,越能用少量攻击流量制造巨大破坏。因此,基于 UDP 的节点发现协议需要引入验证源合法性的握手机制,并在验证通过之前避免返回过大的应答。
- 限速与连接数上限:对单一对等节点的消息量或连接数设置上限。
- 不当行为评分:对违反协议或提出过度请求的节点累加「ban score」之类的扣分,一旦超过阈值就临时或永久断开、屏蔽。
- 防伪造握手:要求一次验证源 IP 的往返(挑战-应答),防止对伪造请求返回过大的应答。
- 为消息赋予成本:对交易中继要求手续费或最小限度的 PoW,使无法免费给网络增加负担。
从实例中学习防御,以及常见误解
前面提到的 Bitcoin 日食攻击对策(addrman 的革新、引入 feeler connection),是研究论文发表后实现随之改进的典型案例。而像 Ethereum Classic 这类算力相对较小的 PoW 链,过去曾多次遭受 51% 攻击,主要交易所因此把该币种入账所需的确认数调高。这些都是在「攻击终将发生」这一前提下,防御方设计与运营被持续更新的实例。
- 误解:节点数越多越安全。 若每个节点的生成成本几乎为零,节点数再多也得不到女巫抵抗力。重要的不是节点数量,而是它与「无法伪造的稀缺资源」的绑定关系。
- 误解:PoW 对 51% 攻击绝对安全。 算力可以在市场上租用,网络整体算力越小的链,相对攻击成本就越低。
- 误解:只要通信加密就能防住日食攻击。 加密对保密通信内容、检测篡改有效,但无法阻止攻击者掌控「你与谁连接」这一连接拓扑本身。对策在于确保连接的多样性。
- 实务提示:轻客户端和移动钱包的连接节点数远少于全节点,因而更容易受日食攻击影响。直接连接可信节点,并通过多个信息来源核对余额或入账情况,是一种有效的应对方式。
这些攻击研究并非为了威胁去中心化网络,而是把「即便存在恶意参与者也不会崩溃」这一拜占庭容错思想,落实为一项项具体的实现改进。