比特币安全漏洞:时间扭曲攻击
概述
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% 是一个相当小的数字 |
消极方面 |
|
这仍然允许攻击矿工每个周期将难度向下操纵约0.6%,但这只会是一次性变化,无法复合 |
Loopscale Recovers $5.8M in Full After Exploit Deal With Hacker
Loopscale recovers $5.8M from hacker after April exploit with funds returned following 10% bounty de...
UK Government Publishes Crypto Regulation Draft Targeting Bitcoin and Digital Asset Firms
The UK unveils draft legislation for full crypto regulation, aligns with U.S. talks, and builds on F...
Arthur Hayes Predicts Bitcoin Price Will Hit $1M by 2028 At Token2049 Event
The post Arthur Hayes Predicts Bitcoin Price Will Hit $1M by 2028 At Token2049 Event appeared first ...