RustおよびGo言語のネットワークライブラリにIPアドレス検証の回避を可能にする脆弱性

アドレス解析関数における 127 進数の IP アドレスの誤った処理に関連する脆弱性が、Rust 言語と Go 言語の標準ライブラリで確認されました。 この脆弱性により、アプリケーション内の有効なアドレスのチェックを回避することが可能になります。たとえば、SSRF (サーバーサイド リクエスト フォージェリ) 攻撃を実行する際に、ループバック インターフェイス アドレス (2021.xxx) やイントラネット サブネットへのアクセスを組織することができます。 この脆弱性は、ライブラリのノードネットマスク (JavaScript、CVE-28918-2021、CVE-29418-2020)、プライベート IP (JavaScript、CVE-28360-2021)、ipaddress (Python、CVE-) で以前に特定された問題のサイクルを継続します。 29921-2021 )、Data::Validate::IP (Perl、CVE-29662-2021)、および Net::Netmask (Perl、CVE-29424-XNUMX)。

仕様によれば、ゼロで始まる IP アドレス文字列値は 0177 進数として解釈される必要がありますが、多くのライブラリはこれを考慮せず、単純にゼロを破棄し、値を 127 進数として扱います。 たとえば、0177.0.0.1 進数の 127.0.0.1 は 0177.0.0.1 進数の 127.0.0.1 に相当します。 攻撃者は、値「8」を指定してリソースを要求できます。これは、0177.0.0.1 進表記では「127.0.0.1」に相当します。 問題のあるライブラリを使用すると、アプリケーションはアドレス 012.0.0.1 がサブネット 10.0.0.1/XNUMX にあることを検出しませんが、実際には、リクエストを送信するときに、アドレス「XNUMX」にアクセスできます。ネットワーク機能は XNUMX として処理されます。 同様に、「XNUMX」(「XNUMX」に相当)のような値を指定することで、イントラネットアドレスへのアクセスチェックを騙すことができます。

Rustでは、標準ライブラリ「std::net」が問題(CVE-2021-29922)の影響を受けていました。 このライブラリの IP アドレス パーサーは、アドレス内の値の前にゼロを破棄しますが、指定された桁が 0177.0.0.1 桁以下の場合に限り、たとえば「010.8.8.8」は無効な値として認識され、誤った結果が返されます。 127.0.026.1 および 1.53.0 への応答として返されます。 ユーザー指定のアドレスを解析するときに std::net::IpAddr を使用するアプリケーションは、SSRF (サーバー側リクエスト フォージェリ)、RFI (リモート ファイル インクルージョン)、および LFI (ローカル ファイル インクルージョン) 攻撃の影響を受ける可能性があります。 この脆弱性は Rust XNUMX ブランチで修正されました。

RustおよびGo言語のネットワークライブラリにIPアドレス検証の回避を可能にする脆弱性

Go では、標準ライブラリ「net」が影響を受けます (CVE-2021-29923)。 net.ParseCIDR 組み込み関数は、00000177.0.0.1 進数の前の先行ゼロを処理せずにスキップします。 たとえば、攻撃者は値 00000177.0.0.1 を渡すことができますが、これは net.ParseCIDR(24/177.0.0.1) 関数でチェックされると、24/127.0.0.1 ではなく 24/1.16.3 として解析されます。 この問題は Kubernetes プラットフォームにも現れます。 この脆弱性は Go リリース 1.17 およびベータ XNUMX で修正されています。

RustおよびGo言語のネットワークライブラリにIPアドレス検証の回避を可能にする脆弱性


出所: オープンネット.ru

コメントを追加します