比特幣安全漏洞:時間扭曲攻擊

本文我們分析了比特幣的一個安全漏洞,即所謂的時間扭曲攻擊。

比特幣安全漏洞:時間扭曲攻擊

概述

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規則是基於最後三個區塊
  • 每個區塊的時間戳增加一分鐘,除了每個週期的最後一個區塊,它使用真實時間戳

說明性時間扭曲攻擊

比特幣安全漏洞:時間扭曲攻擊

如上圖所示,有兩條曲線:

  • 代表每個難度調整視窗最後一個區塊真實時間的曲線。隨著礦工越來越快找到區塊,難度降低,這條曲線變得不那麼陡峭
  • 代表其他區塊操縱時間戳記的直線

比特幣時間扭曲攻擊計算

下表顯示了礦工如何以最極端的方式使用這種攻擊來操縱難度向下。

比特幣安全漏洞:時間扭曲攻擊

注意:協議允許的任何週期的最大難度調整是4倍,但在上表中沒有達到這個值

各週期的難度向下調整漸近到略高於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% 是一個相當小的數字
消極方面
  • 如果礦工使用真實世界時鐘產生時間戳,無效區塊的風險會增加
  • 這條規則是一個更重要的協定更改,在正常情況下可能比MTP規則更嚴格,進一步增加複雜性
這仍然允許攻擊礦工每個週期將難度向下操縱約0.6%,但這只會是一次性變化,無法複合
分享至:

作者:BitMEX Research

本文為PANews入駐專欄作者的觀點,不代表PANews立場,不承擔法律責任。

文章及觀點也不構成投資意見

圖片來源:BitMEX Research如有侵權,請聯絡作者刪除。

關注PANews官方賬號,一起穿越牛熊
推薦閱讀
7分鐘前
1小時前
10小時前
10小時前
15小時前
16小時前

熱門文章

行業要聞
市場熱點
精選讀物

精選專題

App内阅读