# Move言語のもう一つの危険な脆弱性デプス分析以前、私たちはAptos Moveevmの重大な脆弱性を発見し、深く研究した結果、新しい整数オーバーフローの脆弱性を発見しました。今回の脆弱性の発生プロセスはさらに興味深く、以下ではこの脆弱性を深く分析し、同時にMove言語の背景知識を紹介します。この記事の説明を通じて、あなたはMove言語についてより深く理解できると信じています。広く知られているように、Move言語はバイトコードを実行する前にコードユニットを検証します。検証プロセスは4つのステップに分かれており、この脆弱性はreference_safetyステップに存在します。reference_safetyモジュールは、プロセスの主体の参照安全性を検証するための転送関数を定義しています。そのチェックには、空の参照がないことの検証、可変参照へのアクセスが安全であるかどうか、グローバルストレージ参照へのアクセスが安全であるかどうかなどが含まれます。セキュリティ検証のエントリ関数は、analyze_functionを呼び出します。analyze_function内では、関数が各基本ブロックを検証します。基本ブロックとは、エントリとエグジット以外に分岐命令がないコードのシーケンスを指します。Move言語は、バイトコードを走査し、すべての分岐命令とループ命令のシーケンスを調べることで基本ブロックを特定します。典型的なMove IRコードの基本ブロックの例は、BrTrue、Branch、Ret命令によって決定される3つの基本ブロックを含む可能性があります。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-bde089e8295c5d7b9420c93ad5d47b35)## Moveにおける参照の安全性Rust言語の思想を借りて、Moveは二種類の参照をサポートします: 不可変参照(&)と可変参照(&mut)。不可変参照は構造からデータを読み取るために使用され、可変参照はデータを変更するために使用されます。参照タイプを適切に使用することで、安全性を維持し、読み取りモジュールを識別するのに役立ちます。Moveの参照安全モジュールは、関数単位で基本ブロックのバイトコード命令をスキャンし、すべての参照操作が合法であることを確認します。検証プロセスは主にAbstractState構造体に関与し、これにはborrow graphとlocalsが含まれており、関数内の参照の安全性を確保します。検証プロセスは、基本ブロックの前後の状態を比較し、結果を統合してブロックの状態を更新し、同時にそのブロックの後置条件を後続のブロックに伝播させます。このプロセスは、V8ターボファンのSea of Nodesの考え方に似ています。メインループはブロックコードを実行し、次にpre stateとpost stateをマージしようとします。状態が変化し、現在のブロックが自身を指す逆辺(を持っている場合、ループ)があることを示し、ループの先頭に戻り、この基本ブロックを実行し続けます。post stateがpre stateと等しくなるか、エラーによって中止されるまで。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-eb6397a8a98b556071724d98a4837b59)## 脆弱性分析バグは、joinの結果が変わるかどうかを判断する過程で発生します。join_関数は、ローカル変数と借用関係図を更新するために使用されます。関数の引数の長さとローカル変数の長さを合わせると256を超える場合、local変数はu8型であるため、localsを遍歴する際にオーバーフローが発生します。Moveにはローカルの数を検証するプロセスがあるが、check boundsモジュールではローカルのみを検証し、パラメータlengthは含まれていない。開発者はパラメータとローカル値の合計を検証する必要があることに気付いたようだが、実際のコードではローカル変数の数のみを検証している。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-6952376046c901dfae2b19d5144746b5)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-92892f2a9dffea9f805f3a1952e82703)## 整数オーバーフローからDoS攻撃へメインループはコードブロックをスキャンし、execute_block関数を呼び出し、その後、実行前後のstateをマージします。コードにループが存在する場合は、コードブロックの先頭にジャンプして再度実行します。もし私たちがループコードブロックを構築し、オーバーフローを利用してブロックのstateを変更し、新しいlocals mapが以前のものと異なる場合、再度execute_blockを実行すると、basic block内の命令シーケンスは新しいlocals mapにアクセスします。この時、命令がアクセスする必要のあるインデックスが新しいmapに存在しない場合、DoSが発生します。reference safetyモジュールでは、MoveLoc/CopyLoc/FreeRefオペコードがこの目標を実現できます。copy_loc関数を例に挙げると、LocalIndexを使ってローカル値を取得しようとしますが、LocalIndexが存在しない場合はpanicを引き起こし、ノード全体がクラッシュします。! [Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-1347ef8b31983109babdf8ef29270c67)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-ac937ab4f426d30a476feb32520a95b4)! [Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-a18dcf64108d1a75b728ffe8391100f1)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-7c8fe4e4cf376ad49d729a6f80df6f08)## PoCデモ無条件分岐命令を含むベーシックブロックを構築し、execute_blockとjoin関数を複数回呼び出すことができます。適切なパラメータとローカル変数の数を設定することで、最初の実行後に新しいlocalsマップの長さを8に削減できます。二回目の実行時に存在しないオフセットにアクセスしようとすると、パニックが発生し、DoSがトリガーされます。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-c598d61833550ec5494f9a5a4ee2a760)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-12c60c225a5629f6d927982a7585fc5b)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-94b0c97bb9e287ed715cddb5165f129d)! [Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-095e2b585c45a86b0a689214ca673619)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-5ebaa03263f7a87edd78d146c5beadd2)! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-fe905356cbee596e8aba08ec14f5d508)## まとめこの脆弱性は、厳密な静的検証を受けたMove言語でさえも安全上のリスクが存在することを示しています。バッファオーバーフローの脆弱性は境界検証を回避でき、コード監査の重要性を浮き彫りにしています。Move言語の安全研究のリーダーとして、私たちは言語設計者に対してMoveランタイムにさらなるチェックコードを追加し、予期しない事態を防ぐことを提案します。現在、Moveは主にverifyフェーズで安全チェックを行っていますが、ランタイムフェーズでは十分なセキュリティ強化が欠けており、より深刻な問題を引き起こす可能性があります。私たちはMove言語の別の脆弱性も発見しましたので、後ほど皆さんと共有します。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-ae25cc7d31726e2e1477e6d112b7aa75)
Move言語の新たな整数オーバーフローの脆弱性の分析:参照セキュリティからDoS攻撃まで
Move言語のもう一つの危険な脆弱性デプス分析
以前、私たちはAptos Moveevmの重大な脆弱性を発見し、深く研究した結果、新しい整数オーバーフローの脆弱性を発見しました。今回の脆弱性の発生プロセスはさらに興味深く、以下ではこの脆弱性を深く分析し、同時にMove言語の背景知識を紹介します。この記事の説明を通じて、あなたはMove言語についてより深く理解できると信じています。
広く知られているように、Move言語はバイトコードを実行する前にコードユニットを検証します。検証プロセスは4つのステップに分かれており、この脆弱性はreference_safetyステップに存在します。
reference_safetyモジュールは、プロセスの主体の参照安全性を検証するための転送関数を定義しています。そのチェックには、空の参照がないことの検証、可変参照へのアクセスが安全であるかどうか、グローバルストレージ参照へのアクセスが安全であるかどうかなどが含まれます。
セキュリティ検証のエントリ関数は、analyze_functionを呼び出します。analyze_function内では、関数が各基本ブロックを検証します。基本ブロックとは、エントリとエグジット以外に分岐命令がないコードのシーケンスを指します。
Move言語は、バイトコードを走査し、すべての分岐命令とループ命令のシーケンスを調べることで基本ブロックを特定します。典型的なMove IRコードの基本ブロックの例は、BrTrue、Branch、Ret命令によって決定される3つの基本ブロックを含む可能性があります。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
Moveにおける参照の安全性
Rust言語の思想を借りて、Moveは二種類の参照をサポートします: 不可変参照(&)と可変参照(&mut)。不可変参照は構造からデータを読み取るために使用され、可変参照はデータを変更するために使用されます。参照タイプを適切に使用することで、安全性を維持し、読み取りモジュールを識別するのに役立ちます。
Moveの参照安全モジュールは、関数単位で基本ブロックのバイトコード命令をスキャンし、すべての参照操作が合法であることを確認します。検証プロセスは主にAbstractState構造体に関与し、これにはborrow graphとlocalsが含まれており、関数内の参照の安全性を確保します。
検証プロセスは、基本ブロックの前後の状態を比較し、結果を統合してブロックの状態を更新し、同時にそのブロックの後置条件を後続のブロックに伝播させます。このプロセスは、V8ターボファンのSea of Nodesの考え方に似ています。
メインループはブロックコードを実行し、次にpre stateとpost stateをマージしようとします。状態が変化し、現在のブロックが自身を指す逆辺(を持っている場合、ループ)があることを示し、ループの先頭に戻り、この基本ブロックを実行し続けます。post stateがpre stateと等しくなるか、エラーによって中止されるまで。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
脆弱性分析
バグは、joinの結果が変わるかどうかを判断する過程で発生します。join_関数は、ローカル変数と借用関係図を更新するために使用されます。関数の引数の長さとローカル変数の長さを合わせると256を超える場合、local変数はu8型であるため、localsを遍歴する際にオーバーフローが発生します。
Moveにはローカルの数を検証するプロセスがあるが、check boundsモジュールではローカルのみを検証し、パラメータlengthは含まれていない。開発者はパラメータとローカル値の合計を検証する必要があることに気付いたようだが、実際のコードではローカル変数の数のみを検証している。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
整数オーバーフローからDoS攻撃へ
メインループはコードブロックをスキャンし、execute_block関数を呼び出し、その後、実行前後のstateをマージします。コードにループが存在する場合は、コードブロックの先頭にジャンプして再度実行します。
もし私たちがループコードブロックを構築し、オーバーフローを利用してブロックのstateを変更し、新しいlocals mapが以前のものと異なる場合、再度execute_blockを実行すると、basic block内の命令シーケンスは新しいlocals mapにアクセスします。この時、命令がアクセスする必要のあるインデックスが新しいmapに存在しない場合、DoSが発生します。
reference safetyモジュールでは、MoveLoc/CopyLoc/FreeRefオペコードがこの目標を実現できます。copy_loc関数を例に挙げると、LocalIndexを使ってローカル値を取得しようとしますが、LocalIndexが存在しない場合はpanicを引き起こし、ノード全体がクラッシュします。
! Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
PoCデモ
無条件分岐命令を含むベーシックブロックを構築し、execute_blockとjoin関数を複数回呼び出すことができます。適切なパラメータとローカル変数の数を設定することで、最初の実行後に新しいlocalsマップの長さを8に削減できます。
二回目の実行時に存在しないオフセットにアクセスしようとすると、パニックが発生し、DoSがトリガーされます。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
まとめ
この脆弱性は、厳密な静的検証を受けたMove言語でさえも安全上のリスクが存在することを示しています。バッファオーバーフローの脆弱性は境界検証を回避でき、コード監査の重要性を浮き彫りにしています。
Move言語の安全研究のリーダーとして、私たちは言語設計者に対してMoveランタイムにさらなるチェックコードを追加し、予期しない事態を防ぐことを提案します。現在、Moveは主にverifyフェーズで安全チェックを行っていますが、ランタイムフェーズでは十分なセキュリティ強化が欠けており、より深刻な問題を引き起こす可能性があります。
私たちはMove言語の別の脆弱性も発見しましたので、後ほど皆さんと共有します。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました