This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Move言語の引用セキュリティモジュールには整数オーバーフローの脆弱性が存在し、DoS攻撃を引き起こす可能性があります。
Move言語の引用安全モジュールにおける整数オーバーフローの脆弱性分析
最近、私たちはAptos Moveevmを深く研究している際に、新しい整数オーバーフローの脆弱性を発見しました。この脆弱性のトリガー過程は非常に興味深く、以下ではこの脆弱性を詳細に分析し、同時にMove言語のいくつかのコア概念について探討します。
Move言語はバイトコードを実行する前にコードユニットの検証を行い、このプロセスは4つのステップに分かれています。本記事で議論する脆弱性はreference_safetyステップで発生します。
reference_safetyモジュールは、コード内の参照の安全性を検証することを主な目的としています。これには、空の参照が存在するかどうか、可変参照のアクセスが安全かどうか、グローバルストレージの参照アクセスが適切かどうかを確認することが含まれます。
! Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました
安全検証プロセスを引用する際、システムは各基本ブロックを分析します。基本ブロックとは、エントリとエグジットを除いて分岐命令がないコードのシーケンスを指します。Move言語は、バイトコードを遍歴し、すべての分岐命令とループ命令のシーケンスを探すことで基本ブロックを識別します。
Move言語は2種類の参照タイプをサポートしています:不変参照(と可変参照)とmut(。不変参照はデータの読み取りに使用され、可変参照はデータの変更に使用されます。この設計はコードの安全性と可読性を向上させるのに役立ちます。
引用の安全性検証の主なプロセスには、関数内の基本ブロックをスキャンし、バイトコード命令を分析し、すべての参照操作が合法であるかどうかを判断することが含まれます。このプロセスでは、borrow graphとlocalsを含むAbstractState構造体を使用して、関数内の参照の安全性を共同で確保します。
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-eb6397a8a98b556071724d98a4837b59.webp(
検証プロセスでは、基本ブロックの前後の状態)pre stateとpost state(を比較し、結果を統合してブロック状態を更新します。状態が変化し、現在のブロックが自分自身を指すバックエッジを持っている場合(ループが存在することを示す)、状態が変化しなくなるかエラーが発生するまで、その基本ブロックを再実行します。
バグは、joinの結果が変更されたかどうかを判断するプロセスで発生します。関数の引数の長さとローカル変数の長さの合計が256を超えると、localインデックスをu8型で表現しているため、整数オーバーフローが発生する可能性があります。Move言語にはローカルの数を検証するプロセスがありますが、ローカル変数の数のみをチェックし、引数の長さは含まれていません。
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-6952376046c901dfae2b19d5144746b5.webp(
この整数オーバーフローの脆弱性は、サービス拒否攻撃)DoS(を引き起こす可能性があります。攻撃者は、オーバーフローを利用してブロックの状態を変更するために、ループコードブロックを構築することができます。新しいlocalsマップが以前のものと異なる場合、execute_block関数を再実行すると、指令がアクセスする必要のあるインデックスが新しいAbstractState localsマップに存在しない場合、panicが発生し、ノード全体がクラッシュします。
この脆弱性を示すために、私たちはgitで再現可能なPoCを提供します。このPoCは、無条件分岐命令を持つ基本ブロックを含んでおり、execute_blockおよびjoin関数を何度も呼び出すことができます。パラメータとローカル変数の数を巧妙に設定することで、新しいlocals mapの長さを8に減少させ、その後、2回目の実行時にpanicを引き起こすことができます。
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-92892f2a9dffea9f805f3a1952e82703.webp(
この脆弱性は、絶対に安全なコードは存在しないことを再び証明しました。Move言語は実行前に厳格な静的検証を行っていますが、オーバーフローの脆弱性によって回避される可能性があります。これは、コード監査の重要性と、言語設計における実行時のセキュリティチェックの必要性を強調しています。
Move言語の安全研究のリーダーとして、私たちはMoveの安全問題をさらに深く研究し、Moveランタイムにおいて言語設計者により多くのチェックコードを追加することを提案します。これは、予期しない事態が発生するのを防ぐためです。現在、Move言語は主にverify段階で安全チェックを行っていますが、私たちはこれでは不十分だと考えています。検証が回避された場合、実行段階での十分な安全強化が欠如していることが、より深刻な問題を引き起こす可能性があります。
! [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(
! [Numen Cyberは、移動言語に別の高リスクの脆弱性を独占的に発見しました])https://img-cdn.gateio.im/webp-social/moments-ae25cc7d31726e2e1477e6d112b7aa75.webp(