# Move言語における整数オーバーフローの脆弱性分析## イントロダクションAptos Moveevmの詳細な研究の結果、新しい整数オーバーフローの脆弱性を発見しました。この脆弱性の発生過程は比較的興味深いものであり、以下ではこの脆弱性を詳しく分析し、Move言語の背景知識を紹介します。この記事を通じて、Move言語についてより深く理解できると信じています。Move言語はバイトコードを実行する前にコードユニットを検証します。検証プロセスは4つのステップに分かれており、この脆弱性はreference_safetyステップで発生します。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-bde089e8295c5d7b9420c93ad5d47b35)## Moveにおける参照の安全性Move言語は二種類の参照をサポートしています:不変参照(&)と可変参照(&mut)。不変参照は構造からデータを読み取るために使用され、可変参照はデータを修正するために使用されます。適切な参照タイプを使用することで、安全性を維持し、読み取りモジュールを識別するのに役立ちます。Moveの参照安全モジュールでは、関数単位で基本ブロックのバイトコード命令をスキャンして、すべての参照操作が合法であることを検証します。参照安全性を検証する主なプロセスには、基本ブロックの実行、後続状態の生成、前後状態のマージなどのステップが含まれます。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-eb6397a8a98b556071724d98a4837b59)## 脆弱性分析脆弱性は、安全モジュールを参照するjoin_関数に存在します。関数の引数の長さとローカル変数の長さの合計が256を超えると、local変数をu8型で表すため、整数オーバーフローが発生します。Moveにはlocalsの数を検証するプロセスがありますが、check boundsモジュールではlocalsのみが検証され、パラメータの長さは含まれていません。開発者はパラメータとローカル値の合計を検証する必要性に気付いているようですが、コードではローカル変数の数のみが検証されています。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-6952376046c901dfae2b19d5144746b5)## 整数オーバーフローからDoS攻撃へこの整数オーバーフローの脆弱性を利用することで、攻撃者はループコードブロックを生成し、ブロックの状態を変更できます。execute_block関数を再度実行する際に、命令がアクセスする必要のあるインデックスが新しいAbstractStateのローカルマップに存在しない場合、DoS攻撃が発生します。reference safetyモジュールでは、MoveLoc/CopyLoc/FreeRefなどのオペコードがこのような状況を引き起こす可能性があります。たとえば、copy_loc関数では、LocalIndexが存在しない場合にpanicが発生し、その結果、ノード全体がクラッシュする可能性があります。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました](https://img-cdn.gateio.im/social/moments-92892f2a9dffea9f805f3a1952e82703)## 脆弱性の再発以下のPoCコードを使用して、gitでこの脆弱性を再現できます:動かすパブリックファンtest(a:U64、B:U64、C:U64、D:u64){ x = 0とします。 ループ { if (x == 1) { ブレイク }; x = x + 1; }}DoSを引き起こす手順は次のとおりです:1. execute_block関数を初めて実行すると、パラメータとローカルが SignatureIndex(0) に設定され、num_locals 264 になります。 join_ 関数が実行されると、新しいローカルマップの長さは 8 になります。2. execute_block関数を2回目に実行すると、移動コードの最初の命令がcopyloc(57)されます。 locals の長さは 8 のみで、オフセット 57 は存在しないため、get(57).unwrap(928374656574839201 関数は None を返し、最終的にパニックを引き起こします。! [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(! [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言語のセキュリティ研究のリーダーとして、私たちはMoveのセキュリティ問題を引き続き深く研究し、今後さらに多くの発見を共有していきます。! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/social/moments-ae25cc7d31726e2e1477e6d112b7aa75(
Move言語の整数オーバーフローの脆弱性の分析:参照セキュリティからDoS攻撃まで
Move言語における整数オーバーフローの脆弱性分析
イントロダクション
Aptos Moveevmの詳細な研究の結果、新しい整数オーバーフローの脆弱性を発見しました。この脆弱性の発生過程は比較的興味深いものであり、以下ではこの脆弱性を詳しく分析し、Move言語の背景知識を紹介します。この記事を通じて、Move言語についてより深く理解できると信じています。
Move言語はバイトコードを実行する前にコードユニットを検証します。検証プロセスは4つのステップに分かれており、この脆弱性はreference_safetyステップで発生します。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
Moveにおける参照の安全性
Move言語は二種類の参照をサポートしています:不変参照(&)と可変参照(&mut)。不変参照は構造からデータを読み取るために使用され、可変参照はデータを修正するために使用されます。適切な参照タイプを使用することで、安全性を維持し、読み取りモジュールを識別するのに役立ちます。
Moveの参照安全モジュールでは、関数単位で基本ブロックのバイトコード命令をスキャンして、すべての参照操作が合法であることを検証します。参照安全性を検証する主なプロセスには、基本ブロックの実行、後続状態の生成、前後状態のマージなどのステップが含まれます。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
脆弱性分析
脆弱性は、安全モジュールを参照するjoin_関数に存在します。関数の引数の長さとローカル変数の長さの合計が256を超えると、local変数をu8型で表すため、整数オーバーフローが発生します。
Moveにはlocalsの数を検証するプロセスがありますが、check boundsモジュールではlocalsのみが検証され、パラメータの長さは含まれていません。開発者はパラメータとローカル値の合計を検証する必要性に気付いているようですが、コードではローカル変数の数のみが検証されています。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
整数オーバーフローからDoS攻撃へ
この整数オーバーフローの脆弱性を利用することで、攻撃者はループコードブロックを生成し、ブロックの状態を変更できます。execute_block関数を再度実行する際に、命令がアクセスする必要のあるインデックスが新しいAbstractStateのローカルマップに存在しない場合、DoS攻撃が発生します。
reference safetyモジュールでは、MoveLoc/CopyLoc/FreeRefなどのオペコードがこのような状況を引き起こす可能性があります。たとえば、copy_loc関数では、LocalIndexが存在しない場合にpanicが発生し、その結果、ノード全体がクラッシュする可能性があります。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
脆弱性の再発
以下のPoCコードを使用して、gitでこの脆弱性を再現できます:
動かす パブリックファンtest(a:U64、B:U64、C:U64、D:u64){ x = 0とします。 ループ { if (x == 1) { ブレイク }; x = x + 1; } }
DoSを引き起こす手順は次のとおりです:
execute_block関数を初めて実行すると、パラメータとローカルが SignatureIndex(0) に設定され、num_locals 264 になります。 join_ 関数が実行されると、新しいローカルマップの長さは 8 になります。
execute_block関数を2回目に実行すると、移動コードの最初の命令がcopyloc(57)されます。 locals の長さは 8 のみで、オフセット 57 は存在しないため、get(57).unwrap(928374656574839201 関数は None を返し、最終的にパニックを引き起こします。
! [Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-1347ef8b31983109babdf8ef29270c67.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-ac937ab4f426d30a476feb32520a95b4.webp(
! [Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-a18dcf64108d1a75b728ffe8391100f1.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-7c8fe4e4cf376ad49d729a6f80df6f08.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-c598d61833550ec5494f9a5a4ee2a760.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-12c60c225a5629f6d927982a7585fc5b.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-94b0c97bb9e287ed715cddb5165f129d.webp(
! [Numen Cyberは、移動言語に別のリスクの高い脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-095e2b585c45a86b0a689214ca673619.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-5ebaa03263f7a87edd78d146c5beadd2.webp(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-fe905356cbee596e8aba08ec14f5d508.webp(
まとめ
この脆弱性は、絶対的に安全なコードが存在しないことを示しています。Move言語はコード実行前に静的検証を行いますが、オーバーフローの脆弱性によって回避される可能性があります。これは再びコード監査の重要性を強調しています。
Move言語に関しては、意図しない状況を防ぐために、実行時により多くのチェックコードを追加することをお勧めします。現在、Moveは主に検証段階でセキュリティチェックを行っていますが、検証が回避されると、実行段階での十分なセキュリティ強化が欠如しているため、より深刻な問題を引き起こす可能性があります。
Move言語のセキュリティ研究のリーダーとして、私たちはMoveのセキュリティ問題を引き続き深く研究し、今後さらに多くの発見を共有していきます。
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-ae25cc7d31726e2e1477e6d112b7aa75.webp(