比特幣安全漏洞:時間扭曲攻擊
概述
2025年3月26日,比特幣开發者Antoine Poinsot發布了一個新的 比特幣改進提案 。這是一個被稱為"大共識清理"的軟分叉提案。該升級修復了多年來一直存在於比特幣協議中的幾個漏洞和弱點。其中一個漏洞是我們最近討論過的 重復交易問題 。另一個將被該清理軟分叉修復的更為嚴重的漏洞被稱為"時間扭曲攻擊",這正是本文要討論的主題。
比特幣區塊時間戳保護規則
在討論時間扭曲攻擊之前,讓我們回顧一下當前的時間操縱保護 規則 :
中位過去時間(MPT)規則 — 時間戳必須比最後十一個區塊的中位時間更靠後。
未來區塊時間規則 — 基於MAX_FUTURE_BLOCK_TIME常量,時間戳不能比節點對等體的中位時間超前超過2小時。節點提供的時間與本地系統時鐘之間允許的最大差距是90分鐘,這是另一個安全保障。
MPT規則旨在確保區塊不會太過於回到過去,而未來區塊規則則防止它們進入未來。請注意,不能實施類似於未來區塊規則的規則來防止區塊有過去的時間戳,因為這可能會影響初始區塊鏈同步。時間扭曲攻擊涉及僞造時間戳,使時間戳遠遠回到過去。
中本聰的"差一"錯誤
在比特幣中,一個難度調整周期包含2016個區塊,以10分鐘區塊目標計算,這大約是兩周的時間。為了計算 挖礦難度調整 ,協議計算相關2016區塊窗口中第一個和最後一個區塊之間的時間戳差。這個2016區塊的窗口包含2015個區塊之間的間隔(即2016減一)。因此,使用的相關目標時間應該是60秒 * 10分鐘 * 2015個間隔,等於1,209,000秒。然而,比特幣協議使用數字2016來計算目標。60秒 * 10分鐘 * 2016 = 1,209,600秒。這是一個差一錯誤。這是一個容易犯的錯誤,中本聰似乎混淆了區塊與區塊之間的間隔。
原始中本聰代碼
來源:https://sourceforge.net/p/bitcoin/code/1/tree//trunk/main.cpp#l687
這個錯誤意味着目標時間比應有的長0.05%。因此,比特幣目標間隔時間實際上不是10分鐘,而是10分鐘零0.3秒。這個漏洞並不重要,實際上自比特幣啓動以來,平均間隔一直是9分鐘36秒,明顯少於10分鐘。這是因為自2009年以來,平均算力一直在增加。這就是為什么最後的減半發生在2024年4月,而不是2025年1月。我們提前了進度。無論如何,中本聰這0.3秒的錯誤在整體上相當無關緊要。也許有一天,在遙遠的未來,當價格和算力停止增長時,這個漏洞會讓我們重新回到進度上。
雖然0.3秒的漏洞本身不是重大問題,但存在一個相關的問題,這是一個較為嚴重的漏洞。難度計算基於每個2016區塊窗口內的第一個和最後一個區塊。這也是錯誤的。在我們看來,相關周期應該是前一個2016區塊窗口的最後一個區塊與當前窗口的最後一個區塊之間的差異。這似乎是計算難度調整窗口長度的最合理方式,其中關鍵是時間跨度覆蓋不同的調整窗口。如果這樣做,那么2016也將是計算目標的正確間隔數。也許中本聰犯這個錯誤的原因是他必須考慮第一個難度調整周期,而該周期從未有過前一周期的最後一個區塊可用。
時間扭曲攻擊
比特幣的時間扭曲攻擊約在2011年首次被發現,利用了中本聰在難度計算中犯的錯誤。要進行攻擊,假設挖礦是100%中心化的,礦工可以設置協議允許的任何時間戳。在攻擊中,對於幾乎所有區塊,礦工將時間戳設置為比前一個區塊前進一秒,因此區塊鏈在時間上向前移動,並遵守MTP規則。為了盡可能慢地向前移動時間,礦工可以連續六個區塊保持相同的時間戳,然後在下一個區塊中將時間增加一秒,以此類推。這意味着區塊時間戳每六個區塊向前移動一秒。
這種攻擊意味着區塊鏈會越來越落後於真實時間,難度會增加,使挖礦變得越來越困難。然而,為了增強攻擊效果,在每個難度調整周期的最後一個區塊中,礦工將時間戳設置為真實世界時間。下一個區塊,即每個難度調整窗口的第一個區塊,然後被設置回過去,比前一個難度調整窗口的倒數第二個區塊提前一秒。這仍然符合MTP規則,因為在這種情況下,一個異常不會影響11個區塊的中位數。
當進行這種攻擊時,第一個周期後的難度不會受到影響。然而,在攻擊开始後的第二個調整周期後,難度將向下調整。然後礦工可以以極快的速度創建區塊,可能創造大量比特幣,然後可能出售這些幣並獲利。
簡化說明
由於難度周期是2016個區塊,在圖表中說明這種攻擊可能很困難。因此,我們創建了以下場景來嘗試解釋這種攻擊。
- 每個難度調整窗口有五個區塊
- 目標間隔為10分鐘
- MTP規則基於最後三個區塊
- 每個區塊的時間戳增加一分鐘,除了每個周期的最後一個區塊,它使用真實時間戳
說明性時間扭曲攻擊
如上圖所示,有兩條曲线:
- 代表每個難度調整窗口最後一個區塊真實時間的曲线。隨着礦工越來越快地找到區塊,難度降低,這條曲线變得不那么陡峭
- 代表其他區塊操縱時間戳的直线
比特幣時間扭曲攻擊計算
下表顯示了礦工如何以最極端的方式使用這種攻擊來操縱難度向下。
每個周期的難度向下調整漸近到略高於2.8倍。這是因為隨着每個周期在時間上變短,難度調整減速的速率降低。
在上表的第11個周期,在攻擊的第39天,每秒產生超過6個區塊,准確地說是每秒10.9個區塊。此時,分配給區塊的時間戳限制以不同的方式發揮作用。根據MTP規則,時間必須每6個區塊向前移動,最小的時間增量是1秒。因此,在這一點上,基於我們的理解,時間戳开始比真實時間前進得更快,區塊鏈時鐘开始向前移動,接近真實世界時間,但仍然遠遠落後。盡管如此,攻擊可以繼續,難度不斷降低,直到達到允許的最小值。
攻擊可行性
雖然理論上這種攻擊是毀滅性的,但實施它有一些挑战。執行攻擊可能需要大部分算力。如果有誠實的礦工輸入誠實的時間戳,那么攻擊變得更加困難。MTP規則和誠實礦工的時間戳可能會限制惡意礦工時間戳可以回溯的程度。此外,如果誠實的礦工產生任何難度調整窗口的第一個區塊,該周期的攻擊將無法工作。另一個可能使攻擊更難執行的緩解因素是,它對所有人都是可見的。任何人都可以看到時間戳,在難度向下調整之前必須操縱四周的時間戳,可能給我們時間推出緊急軟分叉修復。
解決方案
修復這個漏洞相對簡單,盡管可能需要軟分叉協議更改。通過改變難度調整算法來計算不同2016窗口中區塊之間的時間跨度並完全修復差一錯誤,直接修復這個問題相當復雜。這可能也是一個硬分叉。另一種修復方法是取消MTP規則,而是要求時間在每個區塊中總是向前移動,雖然這可能意味着時間可能會卡在太遠的前方,也意味着礦工可能會因為在系統時鐘上使用真實時間而遇到麻煩,如果另一個礦工的時鐘提前幾秒,這可能會有無效的時間。
幸運的是,有一個更簡單的解決方案。為了防止時間扭曲攻擊,我們只需要要求新難度周期的第一個區塊的時間不早於前一周期最後一個區塊之前的特定分鐘數。這個新限制規則的分鐘數已經被討論過,提案從10分鐘到2小時不等。就緩解時間扭曲攻擊而言,兩者可能都可以。
在Poinsot的大共識清理提案中,他現在確定為 2小時 。2小時僅約為難度調整周期目標時間的0.6%,因此操縱難度向下的能力受到嚴格限制。我們在下表中總結了關於應使用的寬限期的討論:
10分鐘限制 | 兩小時限制 | |
積極方面 |
這具有抵消"差一"錯誤影響的良好特性。如果進行攻擊,其影響正好被中本聰的錯誤所抵消。這是一個足夠長的時間段,可以最小化意外無效區塊的風險。 |
這是一個足夠長的時間段,可以最大限度地降低意外無效區塊的風險。 這是 Fabian Jahr 在測試此功能時為 testnet4 選擇的時間段 這 2 個小時的時間段與未來區塊時間戳規則相匹配,因此允許礦工始終在一個區塊中糾正最大允許的未來時間誤差 與當前規則集相比,這是一個更為保守的變化,在正常情況下可能沒有 MTP 規則那么嚴格 0.6% 是一個相當小的數字 |
消極方面 |
|
這仍然允許攻擊礦工每個周期將難度向下操縱約0.6%,但這只會是一次性變化,無法復合 |
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
AB慈善基金會正式啓動 探索“制度信任 + 技術驅動”的全球公益新範式
近日AB 慈善基金會宣布正式啓動,並上线新版官網 www.ab.org,標志着一個以“制度信任”為...
川普操縱市場「不演了」,白宮讚美下屬影片曝光:你賺25億他賺5億,今天真美好
美 國總統川普在昨晚(9)於 TruthSocial 上發布了一則「快進場買 DJT」消息,隨後宣...
價值投資大師霍華馬克斯最新備忘錄《無人知曉》:別信專家了,沒人能預測金融末日何時來臨
2 008 年 9 月 15 日星期五,紐約證券交易所收盤後不久,雷曼兄弟突然申請破產的訊息震驚全...
評論