1. 背景
イーサリアム・ローゼン橋としても知られるワームホールは、時空間の離れた点を結びつける推測的な構造です。ブロックチェーンの世界では、ワームホールは、異なるチェーン(例:SolanaとEthereum)間のブリッジとして使用されています。ユーザーはワームホールを通じてトークン化された資産をブロックチェーン間で転送できます。
2022年2月2日、ワームホールがハッキングされ、攻撃者は3億2000万ドル相当の12万ETH(ラップドイーサ)を鋳造することに成功しました。これは、DeFi史上Poly Networkに次ぐ2番目に大きな損失です。

2. ワームホールの仕組み
ワームホールは、各チェーンで発行されるメッセージを監視することによって機能します。監視されたメッセージはターゲットチェーンに転送され、クロスチェーン通信プロトコルを構築できます。
直感的な疑問は、監視されたメッセージの信頼性をどのように保証するかということです。この問題に対処するため、ワームホールはガーディアンと呼ばれる19の追加ノードを導入しました。現在のガーディアンセットはワームホールエクスプローラーで確認できます。各ガーディアンは、監視されたメッセージを独立して検証し、メッセージに署名できます。
ワームホールでは、メッセージはVAA形式で整理されます。VAAは2つの部分から構成されます。1つはヘッダーで、ガーディアンからの署名が収集されます。もう1つはボディで、ターゲットチェーンの情報、メッセージペイロードなどが含まれます。
ガーディアンからの署名がコンセンサスしきい値に達すると、VAAはチェーンに投稿できます。
要約すると、ガーディアンは転送されたメッセージの整合性に責任を負います。
3. トークンブリッジ
異なるチェーン間でメッセージがどのように転送されるかを説明した後、ワームホールの主要なアプリケーションであるトークンブリッジの仕組みを理解するのは難しくありません。
トークンをチェーンAからチェーンBに転送するには、ワームホールはチェーンAでトークンをロックし、チェーンBで鋳造します。これが大まかなアイデアです。実際には、これは3つのステップに分けることができます。まず、チェーンAのトークンがロックされます。次に、チェーンAのトークンをチェーンBに転送すべきというメッセージがブロードキャストされます。第三に、チェーンBがメッセージを受信し、対応するトークンが鋳造されます。これで完了です。
4. Solanaの手順
Solanaでは、トランザクションは複数の手順で構成されます。各手順は、プログラムID、アカウント、およびデータを含みます。プログラムIDは、手順を処理するプログラム(スマートコントラクト)を表します。プログラムはデータを解釈し、提供されたアカウントを操作します。
5. ワームホール攻撃
要するに、攻撃者はEthereumで資産をロックすることなく、Solanaで12万ETHを鋳造しました。トランザクションはこちらにあります。
したがって、問題は攻撃者がSolanaで12万ETHを鋳造できた方法です。ステップを詳しく見てみましょう。トークンを鋳造するために、手順complete_wrappedが呼び出されます。この手順はいくつかのアドレスを受け取り、3番目は署名されたメッセージを格納するアドレスです。12万ETHを鋳造する前に、チェーンB(つまりSolana)は、チェーンA(つまりEthereum)で12万ETHがロックされたことを示す署名済みメッセージ(つまりVAA)を受信する必要があります。
メッセージを投稿するために、post_vaa.rsで定義されているpost_vaaが呼び出されます。その結果、メッセージを格納するための中央アカウントが作成されます。しかし、post_vaaはガーディアンからの署名をチェックしません。代わりに、verify_signatures.rsで定義されているverify_signauresが署名を検証します。

verify_signaturesに渡される4番目のアカウントはシステム手順アカウントです。ここでverify_signaturesがどのように機能するかを調べましょう。

103行目では、関数load_instruction_atが呼び出され、以前に実行された手順secp_ixがロードされます。secp_ixはSecp256k1署名検証関数を呼び出します。したがって、verify_signaturesは、以前に実行された手順secp_ixをチェックすることによって署名を検証します。さて、すべて理解できましたか?関数load_instruction_atは、どこから手順をロードするかをチェックしません!!!手順はSysvar:Instructionsからロードすることが期待されています。
しかし、攻撃トランザクションの4番目アカウントは、Sysvar:Instructionsではなく[2tHS1cXX2h1KBEaadprqELJ6sV9wLoaSdX68FqsrrZRd]です。この場合、攻撃者は署名検証プロセスを正常にバイパスしました。ワームホールは検証がパスしたと考え、メッセージがチェーンに投稿され、結果として何もロックせずに12万ETHが鋳造されました!

正規の検証手順を見てみましょう。このトランザクションは2つの手順で構成されています。最初のものはSecp256k1検証関数を呼び出し、2番目のものはverify_signatures手順を呼び出します。ここでの4番目アカウントはSysvar:Instructionsです。

12万ETHを鋳造した後、攻撃者はそれをEthereumに戻し、他のトークンに交換して利益を得ることができました。
6. パッチ
リポジトリで述べられているように、バージョン1.8.0以降、load_instruction_atは安全ではなく、Sysvarアカウントのアドレスはチェックされません。代わりに、load_instruction_at_checkedが推奨されます。
7. 私たちの考え
- 開発者は、使用する外部関数に精通している必要があります。
- 使用するライブラリの重要な変更に常に注意を払ってください。ライブラリが変更された場合、ライブラリを使用するコードも変更が必要になる場合があります。
- ライブラリのメンテナーは、指定された変更による潜在的なリスクを認識し、コミュニティ全体にタイムリーに通知する必要があります。単に注釈を追加するだけでは機能せず、十分ではありません。
- ライブラリとコードのバージョンが変更された場合は、コントラクトコードを監査する必要があります。
BlockSecについて
BlockSecは、2021年に世界的に著名なセキュリティ専門家グループによって設立された先駆的なブロックチェーンセキュリティ企業です。同社は、新興のWeb3の世界のセキュリティとユーザビリティを向上させ、その大規模な採用を促進することにコミットしています。この目的を達成するために、BlockSecはスマートコントラクトとEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3開発者が仮想通貨の世界で効率的にサーフィンするためのMetaSuites拡張機能を提供しています。
現在までに、同社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300を超える著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達で数千万米ドルを受け取っています。
公式ウェブサイト:https://blocksec.com/ 公式Twitterアカウント:https://twitter.com/BlockSecTeam



