ビットコインのセキュリティ脆弱性: タイムワープ攻撃

概要

2025年3月26日、ビットコイン開発者のアントワーヌ・ポアンソ氏が新たなビットコイン改善提案を発表しました。これは、「Grand Consensus Cleanup」と呼ばれるソフトフォーク提案です。このアップグレードにより、ビットコイン プロトコルに長年存在していたいくつかの脆弱性と弱点が修正されます。これらの脆弱性の 1 つは、最近説明した 重複トランザクションの問題です。このクリーンアップ ソフト フォークによって修正されるもう 1 つのより深刻な脆弱性は、「タイム ワープ攻撃」と呼ばれ、この記事の主題です。

ビットコインブロックタイムスタンプ保護ルール

タイムワープ攻撃について説明する前に、時間操作保護の現在のルールを確認しましょう。

中央過去時間 (MPT) ルール- タイムスタンプは、最後の 11 ブロックの中央時間よりも後である必要があります。

将来のブロック時間ルール- MAX_FUTURE_BLOCK_TIME 定数に基づいて、タイムスタンプはノード ピアの中央時間より 2 時間以上先にすることはできません。ノードによって提供される時間とローカル システム クロックの間で許容される最大差は 90 分であり、これも安全性の保証となります。

MPT ルールは、ブロックが過去に遡りすぎないようにするために設計されており、未来ブロック ルールは、ブロックが将来に遡りすぎないようにするように設計されています。ブロックに過去のタイムスタンプが付くのを防ぐために、将来のブロックのルールと同様のルールを実装することはできないことに注意してください。これは、初期のブロックチェーンの同期に影響する可能性があるためです。タイムワープ攻撃では、タイムスタンプを偽造して、時間をはるかに遡らせます。

サトシ・ナカモトの「1つずれた」エラー

ビットコインでは、難易度調整サイクルは 2016 ブロックで構成され、これは 10 分のブロック目標に基づくと約 2 週間になります。 マイニング難易度調整を計算するために、プロトコルは関連する 2016 ブロック ウィンドウ内の最初のブロックと最後のブロック間のタイムスタンプの差を計算します。この 2016 ブロックのウィンドウには、2015 ブロック間の間隔 (つまり、2016 から 1 を引いた値) が含まれます。したがって、使用される関連するターゲット時間は、60 秒 * 10 分 * 2015 間隔、つまり 1,209,000 秒になります。ただし、ビットコイン プロトコルでは、ターゲットを計算するために 2016 という数字が使用されます。 60 秒 * 10 分 * 2016 = 1,209,600 秒。これは 1 つずれたエラーです。これは起こりやすい間違いで、サトシはブロック間の間隔を混同していたようです。

オリジナルサトシコード

ビットコインのセキュリティ脆弱性: タイムワープ攻撃

出典: https://sourceforge.net/p/bitcoin/code/1/tree//trunk/main.cpp#l687

このエラーは、目標時間が本来よりも 0.05% 長いことを意味します。したがって、ビットコインのターゲット間隔は実際には 10 分ではなく、10 分 0.3 秒です。このバグは重大ではありません。実際、ビットコインが発売されて以来、平均間隔は 9 分 36 秒で、10 分を大幅に下回っています。これは、平均ハッシュレートが 2009 年以降増加しているためです。最終的な半減期が 2025 年 1 月ではなく 2024 年 4 月に発生するのはこのためです。予定より早く進んでいます。いずれにせよ、サトシの 0.3 秒の誤差は、全体的な計画の中では非常に取るに足らないものです。おそらく、遠い将来、価格とハッシュレートの成長が止まったときに、このバグが私たちを軌道に戻してくれるでしょう。

ビットコインのセキュリティ脆弱性: タイムワープ攻撃

0.3 秒の脆弱性自体は重大な問題ではありませんが、より深刻な脆弱性である関連する問題があります。難易度の計算は、2016 年の各ブロック ウィンドウ内の最初のブロックと最後のブロックに基づいて行われます。これも間違いです。私たちの意見では、関連する期間は、前の 2016 ブロック ウィンドウの最後のブロックと現在のウィンドウの最後のブロックの差であるはずです。これは難易度調整ウィンドウの長さを計算する最も合理的な方法のようですが、重要なのは、期間が異なる調整ウィンドウをカバーすることです。こうすれば、2016 年も目標を計算するための正しい間隔数になります。おそらくサトシがこのミスを犯した理由は、前回のサイクルの最後のブロックが利用できなかった最初の難易度調整サイクルを考慮しなければならなかったためでしょう。

タイムワープアタック

ビットコインのタイムワープ攻撃は、サトシ・ナカモトが難易度計算で犯したミスを利用したもので、2011年頃に初めて発見されました。攻撃を実行するには、マイニングが 100% 集中化されており、マイナーがプロトコルで許可されている任意のタイムスタンプを設定できると想定します。この攻撃では、ほぼすべてのブロックについて、マイナーがタイムスタンプを前のブロックより 1 秒先に設定するため、ブロックチェーンは時間的に前進し、MTP ルールに従います。時間をできるだけゆっくりと進めるために、マイナーは 6 つのブロックにわたって同じタイムスタンプを維持し、次のブロックで時間を 1 秒ずつ増やす、といった処理を行うことができます。つまり、ブロックのタイムスタンプは 6 ブロックごとに 1 秒ずつ進みます。

この攻撃は、ブロックチェーンがリアルタイムにどんどん遅れ、難易度が上がり、マイニングがますます困難になることを意味します。しかし、攻撃をより効果的にするために、各難易度調整期間の最後のブロックでは、マイナーはタイムスタンプを現実世界の時間に設定します。次のブロック、つまり各難易度調整ウィンドウの最初のブロックは、前の難易度調整ウィンドウの最後から 2 番目のブロックよりも 1 秒早く、時間的に戻されます。この場合、1 つの異常が 11 ブロックの中央値に影響を与えないため、これは依然として MTP ルールに準拠しています。

この攻撃を実行すると、最初のサイクル以降の難易度は影響を受けません。ただし、攻撃開始後の 2 回目の調整サイクルの後は、難易度は下方に調整されます。マイナーは極めて高速にブロックを作成し、大量のビットコインを生成する可能性があり、それを売却して利益を得ることも可能です。

簡略化された説明

難易度サイクルは 2016 ブロックなので、この攻撃をグラフで示すのは難しいかもしれません。そこで、この攻撃を説明するために、次のシナリオを作成しました。

  • 各難易度調整ウィンドウには5つのブロックがあります
  • 目標間隔は10分
  • MTPルールは最後の3つのブロックに基づいています
  • 各ブロックのタイムスタンプは 1 分ずつ増加しますが、各サイクルの最後のブロックでは実際のタイムスタンプが使用されます。

タイムワープ攻撃の実例

ビットコインのセキュリティ脆弱性: タイムワープ攻撃

上の図に示すように、2 つの曲線があります。

  • 各難易度調整ウィンドウの最後のブロックの実際の時間を表す曲線。マイナーがブロックをより速く見つけるにつれて、難易度は下がり、この曲線は緩やかになります。
  • 他のブロック操作のタイムスタンプを表す行

ビットコインタイムワープ攻撃の計算

下のグラフは、マイナーがこの攻撃を最も極端な形で利用して難易度を下げる方法を示しています。

ビットコインのセキュリティ脆弱性: タイムワープ攻撃

注: プロトコルで許可されている最大難易度調整はどの期間でも 4 倍ですが、上記の表ではこの値に達していません。

難易度は、各サイクルごとに 2.8 倍強まで漸近的に下方に調整されます。これは、各サイクルの時間が短くなるにつれて、難易度の調整が遅くなる速度が低下するためです。

上記の表の 11 番目のサイクル、つまり攻撃の 39 日目には、1 秒あたり 6 個を超えるブロックが生成され、正確には 1 秒あたり 10.9 ブロックが生成されました。この時点で、ブロックに割り当てられたタイムスタンプの制限が別の方法で作用します。 MTP ルールによれば、時間は 6 ブロックごとに前進する必要があり、最小の時間増分は 1 秒です。したがって、この時点で、私たちの理解では、タイムスタンプは実際の時間よりも速く進み始め、ブロックチェーンのクロックは前進し始め、現実世界の時間に近づきますが、まだはるかに遅れています。それでも、攻撃は継続され、許容される最小値に達するまで難易度は低下します。

攻撃の実現可能性

このような攻撃は理論上は壊滅的ですが、実行するにはいくつかの課題があります。攻撃を実行するには、大量の計算能力が必要になる可能性があります。正直なマイナーが正直なタイムスタンプを入力すると、攻撃ははるかに困難になります。 MTP ルールと正直なマイナーのタイムスタンプにより、悪意のあるマイナーのタイムスタンプがどこまで遡れるかが制限される可能性があります。さらに、正直なマイナーが難易度調整ウィンドウの最初のブロックを生成すると、その期間中は攻撃は機能しません。攻撃の実行を困難にするもう 1 つの緩和要因は、攻撃が誰にでも見えることです。タイムスタンプは誰でも見ることができ、難易度を下げる前に 4 週間分のタイムスタンプを操作する必要があり、緊急のソフトフォーク修正を実施する時間が得られる可能性があります。

解決

この脆弱性を修正するのは比較的簡単ですが、ソフトフォークプロトコルの変更が必要になる場合があります。この問題を直接修正するのは、難易度調整アルゴリズムを変更して、2016 年の異なるウィンドウ内のブロック間の時間間隔を計算し、1 の違いによるエラーを完全に修正する必要があるため、非常に複雑です。これもハードフォークである可能性があります。もう 1 つの修正方法は、MTP ルールを廃止し、代わりに各ブロックで常に時間が進むようにすることですが、これにより、時間が進みすぎてしまう可能性があり、また、マイナーがシステム クロックで実時間を使用することで問題が発生する可能性があり、別のマイナーのクロックが数秒進んでいると、無効な時間になる可能性があります。

幸いなことに、もっと簡単な解決策があります。タイムワープ攻撃を防ぐために、新しい難易度期間の最初のブロックが、前の期間の最後のブロックより一定分以上前にならないようにする必要があります。この新しい制限の分数については議論されており、10 分から 2 時間までの提案があります。タイムワープ攻撃の軽減に関しては、おそらくどちらも問題ありません。

ポアンソット氏のグランド・コンセンサス浄化提案では、これを2 時間に設定しています。 2 時間は難易度調整サイクルの目標時間の約 0.6% に過ぎないため、難易度を下げる操作能力は大幅に制限されます。使用すべき猶予期間についての議論を次の表にまとめます。

10分制限2時間制限
良い点

これには、「off-by-one」エラーの影響を打ち消すという優れた特性があります。攻撃が実行された場合、その影響はサトシのミスによって完全に相殺されるでしょう。これは、誤って無効なブロックが発生するリスクを最小限に抑えるのに十分な長さの期間です。

これは、誤って無効なブロックが発生するリスクを最小限に抑えるのに十分な長さの期間です。
これは、Fabian Jahr がこの機能のテスト時に testnet4 に選択した期間です。この 2 時間の期間は将来のブロックのタイムスタンプ ルールと一致するため、マイナーは常に 1 つのブロックで許可される最大の将来の時間エラーを修正できます。これは現在のルールセットに比べてより保守的な変更であり、通常の状況では MTP ルールよりも厳しくない可能性があります。
0.6%はかなり小さい数字だ
マイナス面
  • マイナーが現実世界の時計を使用してタイムスタンプを生成すると、無効なブロックのリスクが高まります。
  • このルールは、より重要なプロトコル変更であり、通常の状況では MTP ルールよりも厳しくなり、複雑さがさらに増す可能性があります。
これにより、攻撃側のマイナーは難易度を 1 サイクルあたり約 0.6% 下げることができますが、これは 1 回限りの変更であり、複利で増加させることはできません。