Move言語の整数オーバーフローの脆弱性の分析:参照セキュリティからDoS攻撃まで

robot
概要作成中

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を引き起こす手順は次のとおりです:

  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/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(

MOVE3.29%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 4
  • リポスト
  • 共有
コメント
0/400
PretendingToReadDocsvip
· 23時間前
どんなに上手くても動く、これも問題だよ
原文表示返信0
WalletDetectivevip
· 08-14 07:06
じっくり考えてみると、この欠陥はちょっと面白いですね。
原文表示返信0
ponzi_poetvip
· 08-14 07:00
それは誠実なのか、それともお金儲けのためのmoveのオーバーフローなのか
原文表示返信0
ForkTonguevip
· 08-14 06:52
引き続きセキュリティバグを書いているということですね
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)