高級
Eclipse Attack
了解日蝕攻擊如何隔離比特幣節點,以及 Bitcoin Core 的防護措施。
12 分鐘
日蝕攻擊(Eclipse Attack)是一種網路層攻擊,攻擊者通過控制受害節點的所有 入站和出站連接,將其與真實的比特幣網路隔離,從而操縱受害者看到的區塊鏈視圖。
攻擊原理
正常情況:
┌─────────────┐
│ 比特幣網路 │
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│Node A │ │Node B │ │Node C │
└───────┘ └───────┘ └───────┘
│
真實區塊鏈視圖
日蝕攻擊:
┌─────────────┐
│ 比特幣網路 │
└─────────────┘
✕ 隔離
┌────────────────────────────────┐
│ 攻擊者節點群 │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ M │ │ M │ │ M │ │ M │ │
│ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ │
└────┼─────┼─────┼─────┼────────┘
│ │ │ │
└─────┼─────┼─────┘
│
┌────▼────┐
│ 受害節點 │ ← 只看到攻擊者提供的數據
└─────────┘ 攻擊目標
1. 雙重支付
攻擊流程:
1. 攻擊者日蝕商家節點
2. 向商家發送支付 TX1(支付商品)
3. 向真實網路發送 TX2(回到自己地址)
4. TX2 被真實礦工確認
5. 攻擊者向商家顯示偽造的確認
6. 商家發貨
7. 商家重連真實網路後發現 TX1 無效 2. 0-conf 攻擊
攻擊流程:
1. 日蝕商家節點
2. 向商家廣播 TX1(支付)
3. 隱藏 TX2(衝突的雙重支付)
4. 商家接受 0-conf
5. TX2 在真實網路被確認
6. 商家損失商品和資金 3. 算力竊取(針對礦工)
攻擊流程:
1. 日蝕目標礦池或礦工
2. 向目標提供陳舊的區塊鏈視圖
3. 礦工在舊區塊上浪費算力
4. 攻擊者在真實網路挖礦
5. 受害者的有效區塊無法傳播
結果:
- 攻擊者獲得更多區塊獎勵
- 受害礦工浪費電力和算力 攻擊實施方法
// 階段 1: 地址污染
攻擊者運行大量節點,向目標 ADDR 表注入惡意地址
for each attacker_node:
connect_to_target()
send_addr_message(attacker_addresses)
disconnect()
// 目標的 AddrMan 逐漸被惡意地址填滿
// 階段 2: 等待重啟
當目標節點重啟時:
- 從 AddrMan 選擇地址連接
- 大部分是攻擊者的地址
- 所有 8 個出站連接都連到攻擊者
// 階段 3: 入站連接控制
攻擊者快速佔據目標的所有入站槽位
- 默認 125 個連接(117 入站 + 8 出站)
- 攻擊者需要約 4,600 個 IP 地址 Bitcoin Core 防護措施
AddrMan 改進
// 地址儲存桶設計
AddrMan 使用兩個表:
- tried: 成功連接過的地址
- new: 新學習到的地址
// 桶隨機化
桶選擇 = hash(source_ip, addr) % num_buckets
// 這使得:
- 單一來源無法填滿所有桶
- 攻擊者需要大量不同 IP
- 地址分佈更均勻 連接多樣性
// Bitcoin Core 的保護
1. 出站連接保護
- 8 個全中繼出站連接
- 2 個僅區塊中繼連接(隱蔽)
- 從不同 /16 網段選擇
2. 錨點連接 (Anchor Connections)
- 記住最後成功連接的節點
- 重啟時優先重連
- 防止冷啟動時被日蝕
3. Feeler 連接
- 定期嘗試連接新地址
- 驗證地址有效性
- 更新 tried 表
4. 網路群組限制
- 同一 /16 網段最多 2 個連接
- 增加地址多樣性 入站連接保護
// 入站連接驅逐策略
當入站槽位滿時:
1. 保護最後發送區塊的連接
2. 保護最後發送交易的連接
3. 保護低延遲連接
4. 保護長時間連接
5. 保護本地網路連接
驅逐評分考慮:
- 網路群組多樣性
- 連接時長
- 有用性(區塊/交易貢獻) 配置建議
# bitcoin.conf
# 添加可信節點
addnode=trusted-node.example.com:8333
# 手動指定節點(優先連接)
connect=my-other-node.example.com:8333
# 使用 Tor 增加多樣性
proxy=127.0.0.1:9050
listen=1
# 增加出站連接(需要更多資源)
maxconnections=150
# 白名單可信 IP
whitelist=192.168.1.0/24
# 啟用僅區塊中繼連接
blocksonly=0 # 不要啟用,會減少保護 檢測日蝕攻擊
# 檢查連接多樣性
bitcoin-cli getpeerinfo | jq '[.[].addr | split(":")[0] | split(".")[0:2] | join(".")] | unique | length'
# 如果結果遠小於連接數,可能存在問題
# 檢查區塊時間戳
bitcoin-cli getblockchaininfo | jq '.time - .mediantime'
# 如果差異異常大,可能收到陳舊區塊
# 驗證區塊鏈高度
# 與多個獨立來源比較
bitcoin-cli getblockcount
# 對比公開的區塊瀏覽器高度 節點運營者建議
- 多個連接源:使用 addnode 添加可信節點
- 多網路連接:同時使用 IPv4、IPv6、Tor
- 監控區塊鏈:定期與外部來源比較
- 避免頻繁重啟:重啟是最脆弱的時刻
- 使用錨點:確保 anchors.dat 未被篡改
- 更新軟件:使用最新版 Bitcoin Core
相關研究
- Eclipse Attacks on Bitcoin's Peer-to-Peer Network (2015)
- Hijacking Bitcoin (2018)
- Bitcoin Core PR #8282: 錨點連接
- Bitcoin Core PR #16702: 僅區塊中繼連接
已複製連結