1. 背景
ワームホール(Einstein-Rosen bridgeとしても知られる)は、時空の離れた点を結ぶ理論上の構造です。ブロックチェーンの世界では、ワームホールは異なるチェーン(例:SolanaとEthereum)間のブリッジとして使用されます。ユーザーはワームホールを介してトークン化された資産をブロックチェーン間で転送できます。
2022年2月2日、ワームホールはハッキングされ、攻撃者は3億2000万ドル相当の120,000ラップドイーサをミントすることに成功しました。これはDeFi史上、Poly Networkに次ぐ2番目に大きな損失です。

2. ワームホールはどのように機能するか
ワームホールは、各チェーンで発行されたメッセージを監視することで機能します。監視されたメッセージはターゲットチェーンに転送され、クロスチェーン通信プロトコルを構築できます。
直感的な疑問は、監視されたメッセージの信頼性をどのように保証するかです。この問題に対処するために、ワームホールは19の追加ノードを導入しており、これらはガーディアンと呼ばれます。現在のガーディアンセットはWormhole Explorerで確認できます。各ガーディアンは、監視されたメッセージを独立して検証し、メッセージに署名できます。
ワームホールでは、メッセージはVAA形式で構成されます。VAAは2つの部分から構成されます。1つはヘッダーで、ガーディアンからの署名が収集されます。もう1つはボディで、ターゲットチェーンの情報、メッセージペイロードなどが含まれます。
ガーディアンからの署名がコンセンサスしきい値に達すると、VAAはオンチェーンに投稿できます。
要約すると、ガーディアンは転送されるメッセージの整合性を担当します。
3. トークンブリッジ
異なるチェーン間でメッセージがどのように転送されるかを紹介した後、ワームホールの主要なアプリケーションであるトークンブリッジがどのように機能するかを理解することは難しくありません。
チェーンAからチェーンBへトークンを転送するには、ワームホールはチェーンAのトークンをロックし、チェーンBでミントします。これが大まかなアイデアです。実際には、これは3つのステップに分割できます。まず、チェーンAのトークンがロックされます。次に、チェーンAのトークンがチェーンBに転送されるべきであるというメッセージがブロードキャストされます。第三に、チェーンBはメッセージを受け取り、対応するトークンがミントされます。これで完了です。
4. Solanaの説明
Solanaでは、トランザクションは複数の命令で構成されます。各命令は、プログラムID、アカウント、およびデータを含みます。プログラムIDは、命令を処理するプログラム(スマートコントラクト)を表します。プログラムはデータを解釈し、提供されたアカウントを操作します。
5. ワームホール攻撃
要するに、攻撃者はEthereumで資産をロックすることなく、Solanaで120,000 ETHをミントしました。トランザクションはこちらにあります。
したがって、問題は攻撃者がSolanaで120,000 ETHをミントできた方法です。ステップを詳しく見ていきましょう。トークンをミントするために、命令complete_wrappedが呼び出されます。この命令はいくつかのリソース(アドレス)を受け取り、3番目のリソースは署名済みメッセージが保存されているアドレスです。120,000 ETHをミントする前に、チェーンB(つまりSolana)は、チェーンA(つまりEthereum)で120,000 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です。この場合、攻撃者は署名検証プロセスを正常にバイパスしました。ワームホールは検証がパスしたと判断し、メッセージはチェーンに投稿され、結果として何もロックせずに120K ETHがミントされました!

合法的な検証命令を見てみましょう。このトランザクションは2つの命令で構成されています。最初の命令はSecp256k1検証関数を呼び出し、2番目の命令はverify_signatures命令を呼び出します。ここの4番目のリソースがSysvar:Instructionsであることに注意してください。

120K 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



