
ScaleBit デプスセレクト:ブロックチェーンエコシステムにおけるセキュリティ脆弱性と攻撃面リストを一文で分析
TechFlow厳選深潮セレクト

ScaleBit デプスセレクト:ブロックチェーンエコシステムにおけるセキュリティ脆弱性と攻撃面リストを一文で分析
このレポートは、現在存在する各種のセキュリティ脆弱性および攻撃面を詳細に分析している。
ブロックチェーン技術は、非中央集権性、セキュリティ、信頼メカニズムの面で大きな可能性を示しているものの、そのエコシステムには依然として多種多様なセキュリティリスクが潜んでいる。L1/L2間のクロスチェーン通信におけるさまざまな脆弱性(ブロックのロールバック未考慮、トランザクション失敗時の不適切な処理、ライトクライアント検証の欠陥など)から、Cosmosアプリケーションチェーンにおけるモジュール順序、乱数使用、トランザクションロールバックに関するリスク、さらにビットコイン拡張エコシステムにおけるスクリプト構成、UTXO処理、ロールバックに起因する問題まで、ブロックチェーンアプリケーションには厳しい課題が存在する。また、スマートコントラクトや一般的なプログラミング言語においてよく見られる整数オーバーフロー、無限ループ、競合状態、例外クラッシュなどのバグも、システムの可用性と安全性に重大な脅威を与える。
さらに、P2Pネットワークアーキテクチャの脆弱性(Sybil攻撃、Eclipse攻撃)やDoS攻撃は、ブロックチェーンシステムの効率性と信頼性を損なう要因となり得る。暗号学的な脆弱性(安全でないハッシュアルゴリズム、弱い署名アルゴリズム、安全でない乱数生成など)は、データの機密性と完全性を脅かす。帳簿レイヤーにおいて、トランザクションのmempool(未承認トランザクションプール)、孤立ブロック、Merkle木の不適切な処理は、チェーン上のデータ不整合や資産リスクを引き起こす可能性がある。最後に、経済モデルやガバナンスメカニズムの設計が不十分である場合、ネットワークのインセンティブバランスが崩れ、分断につながり、攻撃者がこの不均衡を利用してシステムの安定性を損なうことも可能である。
上記のリスクを総合的に見ると、進化し続けるブロックチェーンエコシステムの中で安全性と持続可能な発展を確保するためには、深く理解し、厳格な予防策を講じることが不可欠である。2024年末、ScaleBitの母体ブランドであるBitsLabは、「2024 新興エコパブリックチェーン全観測およびセキュリティ研究レポート」を発表した。本レポートでは、現在存在する各種セキュリティ脆弱性および攻撃面について詳細に分析しており、実用的で豊富な内容を提供している。本稿では、同レポートの一部を抜粋し、ブロックチェーンエコシステムにおける主要なセキュリティ脆弱性のタイプに焦点を当て、読者が事前にリスクを把握し、業界の安全かつ健全な発展を共に推進することを目指す。
レポート原文を閲覧:https://bitslab.xyz/reports-page

1)セキュリティ脆弱性タイプ一覧
1.1 L2/L1 クロスチェーン通信の脆弱性
クロスチェーン通信は、ブロックチェーンエコシステムの相互運用性を高める重要な手段であるが、その実装プロセスには多くのセキュリティ上の懸念が伴う。主な注目点は以下の通りである:
L2がL1のブロックロールバックを考慮していない
L1へのトランザクション送信またはL1チェーン上のデータ取得時に、このような状況を考慮しない場合、資産損失につながる可能性がある。
L2がL1へ送信したトランザクションの成功を検証していない
ネットワーク状況やガス代の問題により、送信されたトランザクションが失敗する可能性がある。こうしたケースを考慮しない場合、プロジェクトやユーザーの資産損失が生じる恐れがある。
チェーン上イベントの偽造
クロスチェーンブリッジがチェーン上イベントを監視する際、イベントが指定されたコントラクトアドレスからのものかどうかを検証していない場合、他のコントラクトがイベントを偽造できる。

同一トランザクション内に複数のチェーン上イベントが含まれる
一つのトランザクションに複数のイベントが含まれる場合、これを考慮しないと、プロジェクトやユーザーの資産損失につながる可能性がある。
ライトクライアント検証の脆弱性
1. PoWチェーンが独自マイニング攻撃を考慮していない
2. 公式推奨のアルゴリズムを使用していない
中間者による乗っ取り(Man-in-the-Middle)
L2/L1間のクロスチェーン通信において、メッセージ伝達メカニズムは極めて重要であり、伝達過程での情報の完全性と機密性を確保する必要がある。異なるチェーン間でのメッセージ伝達は、改ざんや盗聴のリスクにさらされるため、暗号化手段を用いて情報の安全性を保護する必要がある。さらに、メッセージがチェーン間で転送される際の否認防止性も重要であり、悪意ある改ざんを防ぐために不可欠である。
遅延と最終性の問題
クロスチェーン通信では、しばしば遅延や最終性の問題に直面する。異なるチェーンのコンセンサスメカニズムや確認時間の違いにより、クロスチェーン取引の確認時間が不一致になり、状態更新の遅延が生じ、潜在的なセキュリティリスクが増大する。クロスチェーンプロトコルを設計する際には、最終性の定義を明確にし、トランザクション状態の一貫性を保証し、確認遅延による二重支払い攻撃や状態不一致の問題を防ぐ必要がある。
1.2 Cosmosアプリケーションチェーンの脆弱性
Cosmosは、ブロックチェーンの相互運用性を核とするエコシステムであり、IBC(Inter-Blockchain Communication Protocol)を通じて異なるブロックチェーンを接続できる。しかし、Cosmosアプリケーションチェーンの実装プロセスにもいくつかの脆弱性やセキュリティリスクが存在する可能性がある。主な注目点は以下の通りである:
BeginBlocker および EndBlocker のクラッシュ脆弱性
BeginBlocker および EndBlocker は、モジュール開発者が自身のモジュール内で実装可能な任意のメソッドであり、各ブロックの開始時および終了時にトリガーされる。BeginBlockおよびEndBlockメソッドでエラー処理にクラッシュを使用すると、エラー発生時にチェーンが停止する可能性がある。
ローカルタイムの不適切な使用
ノード間のローカルタイムに差異があるため、コンセンサス生成時にこれを考慮しないと、コンセンサスの問題が生じる。
参考資料:

出典
https://forum.cosmos.network/t/cosmos-sdk-security-advisory-jackfruit/5319
乱数の不適切な使用
ノードごとに生成される乱数が異なるため、コンセンサス生成時にこれを考慮しないと、コンセンサスの問題が生じる。
Map反復機能の不適切な使用
Go言語のmapの反復は非決定的であるため、コンセンサス生成時にこれを考慮しないと、コンセンサスの問題が生じる。例コードは以下の通り:

モジュール順序の不合理さが引き起こす問題
Cosmosアプリケーションチェーンは複数のモジュールで構成されており、特定のイベント処理ではモジュール間に順序がある。順序設定が不合理な場合、セキュリティ問題が発生する可能性がある。
トランザクション失敗時でもデータがロールバックされない
Cosmosアプリケーションチェーンにおいて、トランザクションの実行に失敗しても、設計上の欠陥によりデータ状態が元に戻らない場合、チェーン上のデータ不整合が生じる。これはユーザーの信頼を損なうだけでなく、資金損失を招く可能性もある。そのため、設計段階でスマートコントラクトが失敗したトランザクションを適切に処理し、状態の一貫性と信頼性を確保し、必要に応じて自動ロールバック機構を実装する必要がある。
誤った状態検証
Cosmosアプリケーションチェーンの状態検証ロジックは非常に厳密である必要がある。状態検証が正確でないと、不正なトランザクションが承認され、チェーンの安全性に影響を与える可能性がある。開発者は状態遷移ロジックを慎重に設計し、包括的なテストを実施して、誤った状態検証による脆弱性を防止しなければならない。
クロスチェーンメッセージ伝達のセキュリティ
CosmosのIBCメカニズムにより、異なるアプリケーションチェーン間でメッセージを交換できるが、これにより潜在的なセキュリティリスクも生じる。例えば、クロスチェーンメッセージが伝達中に改ざんされると、誤った状態更新や攻撃者がそのメッセージを利用して悪意ある操作を行う可能性がある。メッセージの完全性と真正性を保証するため、暗号化および署名メカニズムを採用し、伝達中の改ざんを防止すべきである。
コントラクトアップグレードとバージョン管理の問題
Cosmosアプリケーションチェーンのコントラクトは使用中にアップグレードが必要になる場合があるが、不適切なアップグレードにより旧コントラクト状態との互換性が失われたり、セキュリティ脆弱性が生じたりする可能性がある。開発者は明確なコントラクトアップグレード戦略(バージョン管理および移行計画を含む)を策定し、アップグレード中にチェーンの正常稼働に影響を与えないようにする必要がある。
経済モデルとインセンティブメカニズム
Cosmosエコシステムの経済モデル設計は、チェーンの安全性と安定性に直接影響を与える。インセンティブメカニズムの設計が不合理な場合、参加者の行動が不均衡になり、悪意ある行為や経済攻撃が発生する可能性がある。経済モデルを包括的に評価し、インセンティブメカニズムがネットワークの安全性と健全性を維持できるよう確保する必要がある。
ガバナンスメカニズムの脆弱性
Cosmosアプリケーションチェーンのガバナンスメカニズムにより、トークン保有者はチェーンの意思決定に参加できるが、ガバナンス設計が不適切な場合、ガバナンス攻撃や集中化の問題が生じる可能性がある。ガバナンスメカニズムの公平性と透明性を確保し、少数者による意思決定プロセスの操作を防ぐべきである。
1.3 ビットコイン拡張エコシステムの脆弱性
ビットコインスクリプト構築の脆弱性
ビットコインスクリプトは多くの場合、リアルタイムで生成されBitcoinにデプロイされ、その内容にはユーザーが提供したデータが含まれる。スクリプト構築が安全でない場合、資産損失につながる。
派生資産を考慮していないことによる脆弱性
代表的なビットコイン派生資産には、インスクリプション(Inscriptions)やルーン(Runes)がある。L2がユーザー資産を操作する際にネイティブBTCのみを考慮し、派生資産を無視すると、ユーザーの資産損失が生じる。
UTXO金額計算エラーの脆弱性
1. トランザクション手数料計算のミス
2. お釣り金額計算のミス
例えば、以下のコードでは、お釣り出力の計算に「お釣り金額が546サトシ以上の場合のみお釣り出力を追加する」という条件が含まれている。この値は従来のP2PKHトランザクションのダスト制限に対応している。しかし、アドレスタイプごとにダスト制限は異なり、特にTaprootアドレスの場合は330サトシがダスト制限となる。

このハードコードされた値はTaprootアドレスの低いダスト制限を考慮しておらず、Taprootアドレスを含むトランザクションで小額資産が失われる可能性がある。各種アドレスタイプのダスト制限の詳細については、Bitcoin CoreのソースコードおよびBitcoinTalkフォーラムの議論を参照できる。
https://bitcointalk.org/index.php?topic=5453107.msg62262343#msg62262343
UTXOが"op_return"を含んでいるかどうかを検査していない
“op_return”を含むUTXOは使用できない。
SPV検証の脆弱性
1. ブロックヘッダーのタイムスタンプを検証していない
2. ブロックヘッダーの仕事量証明(PoW)を検証していない
ロールバック状況を考慮していない
ビットコインはPoWに基づいているため、頻繁にブロック再編成が発生する。ビットコイントランザクションの送信やチェーン上データの取得時に、この状況を考慮しないと、資産損失につながる可能性がある。
ビットコイントランザクションが成功したかどうかを検証していない
ビットコイントランザクションは送信後すぐにマイナーによってブロックに取り込まれるとは限らないため、トランザクションが実際にチェーンに登録されたかを検証する必要がある。また、第三者がより高いトランザクション手数料を持つトランザクションを構築することで、L2が送信したトランザクションが長期間mempoolに滞留し、ブロックに取り込まれない状態を引き起こすことができる。
絶対時間ロックと相対時間ロックの混同脆弱性
ビットコインスクリプトを構築する際に、この2種類の時間を混同すると、深刻な場合は資産損失につながる。
ハッシュ時間ロック契約(HTLC)の時間設定が不適切
よくあるケースは以下の3つ:
1. 時間設定が大きすぎる
2. 時間設定が小さすぎる
3. L1とL2の時間同期が取れていない
1.4 プログラミング言語における一般的な脆弱性タイプ
1.4.1 整数オーバーフロー
整数オーバーフローは、数値がその型が表現可能な範囲を超えたときに発生し、数値が巻き戻ったり、論理エラーを引き起こしたりする。Rustはデバッグモードで自動的にオーバーフローを検出するが、Goでは境界チェックを手動で追加する必要がある。

1.4.2 無限ループ
無限ループとは、特定の条件下でプログラムが無限に繰り返されることで、システムリソースを消費し、プログラムがフリーズしたり応答できなくなったりする現象である。この問題を回避する鍵は、適切なループ脱出条件を設定し、Rustのタイムアウト機構やGoのcontextパッケージを使って長時間実行されるループを制御することにある。

1.4.3 無限再帰呼び出し
無限再帰呼び出しとは、再帰関数に終了条件がなく、スタックオーバーフローを引き起こし、クラッシュする現象である。再帰には明確なベースケースを設け、必要に応じて再帰深度を制限することで、この問題を効果的に防止できる。

Rustはデバッグ情報にスタックオーバーフローのエラーを表示し、以下のような出力を示す:

1.4.4 競合状態(Race Condition)
複数のスレッドが共有リソースに同期せずにアクセスすると、データ競合が発生し、データ不整合が生じる。Rustは所有権メカニズムとスレッドセーフライブラリで競合状態を回避し、Goはchannelとsyncパッケージで並行処理をサポートする。
以下のUnsafe Rustの例では、2つのスレッドが同時に同じ共有変数にアクセス・変更を行い、未定義の動作を引き起こしている。このコードは同期機構を使用していないため、データ競合を引き起こす:

Safe Rustではデータ競合は防止されるが、論理的な競合は依然として発生し得る。論理的競合状態(Race Condition)とは、コードの特定の実行順序により予期しない挙動が生じる現象であり、これは論理的な競合である。たとえば、以下のシナリオ:
1. 時間に敏感な操作:2つのスレッドの操作順序が最終的な結果に影響を与える。例えば:
a. 一方のスレッドがある条件をチェックしている間に、他方のスレッドがその条件を変更する。これはRustでは Arc<Mutex<T>> といった同期機構でアクセス順序を調整できるが、論理的な競合までは防止できない。
2. ダブルチェックロック(Double-Checked Locking):複数のスレッドが共有リソースの初期化を試み、いずれもリソースが初期化されていないと判断すると、論理エラーが生じる。この場合、データ競合は発生しないが、予期しない論理エラーが発生する可能性がある。
3. 不適切なロック順序:複数のロックを使用する場合、スレッドが一貫性のない順序でロックを取得すると、デッドロックを引き起こす可能性がある。Rustの型システムは、このようなデッドロック型の競合状態を防止できない。
以下は、Safe Rustにおける条件競合の脆弱性のデモンストレーションである。この例では:
● 2つのスレッドがそれぞれ共有変数 data を1ずつ増加させる。各スレッドは data をロックし、その後その値を増加させる。
● 操作がステップ別に完了するため、データがMutexで保護されていても、スレッド1とスレッド2の実行順序が最終的な出力結果に影響を与える。理論的には最終値は2になるが、スレッドの出力順序は固定されない。

1.4.5 例外クラッシュ
例外クラッシュは、未処理のエラーによって引き起こされ、プログラムが予期せず終了する。Goはdefer/panic/recoverで例外を捕捉し、RustはResultおよびOption型システムを使用して、より堅牢なエラー処理を提供する。
以下はpanicを捕捉せず、プログラムがクラッシュする例である:

1.4.6 除算ゼロの脆弱性
除算ゼロの脆弱性とは、プログラムが除算操作を行う際に分母がゼロであることを指し、例外やクラッシュを引き起こす可能性がある。除算前に分母の値をチェックし、ゼロ除算を防止することで、プログラムの安定性を確保すべきである。

TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News










