Stopwatch on fire

セキュリティ研究者は、プライベート パッケージの名前を明らかにする npm タイミング攻撃を発見しました。これにより、攻撃者は悪意のあるクローンを公開して、開発者をだまして代わりに使用させることができます。

この攻撃は、リポジトリに存在しないパッケージと比較して、プライベートを検索するときに「404 Not Found」エラーが返されるわずかな時間差に依存しています。

応答時間の差はわずか数百ミリ秒ですが、パッケージ偽装攻撃を実行するプライベート パッケージが存在するかどうかを判断するには十分です。

組織は、開発チームがタイポスクワッティング攻撃に陥るリスクを最小限に抑え、コードと機能を秘密に保つために、内部プロジェクトと特定のソフトウェア製品用のプライベート パッケージを作成します。

プライベート パッケージをプライベートに保つことは、それらを使用する組織にとって非常に重要です。そうしないと、攻撃者がクローンやタイポスクワッティングされたパッケージを作成して、ハッカーが組織の従業員をだましてダウンロードさせ、ソフトウェア プロジェクトで使用させることができます。

開発者と内部のソフトウェア テスターが侵害を発見しない場合、製品がエンド ユーザーに到達し、 サプライ チェーンの侵害を達成する可能性があります。

公開前に BleepingComputer と調査結果を共有した Aqua Security の脅威研究チームによるレポートでは、攻撃者はますますサプライ チェーン攻撃に注目しており、2021 年には関連する活動が 300% 増加しています。

タイミングアタックの詳細

npm には、ユーザーが既存のパッケージをダウンロードし、パッケージの存在を確認し、特定の範囲内のすべてのパッケージに関する情報を受け取ることができる レジストリ APIが含まれています。

npm レジストリを使用して、存在しないか非公開に設定されているパッケージをダウンロードすると、Web サイトは、パッケージが見つからなかったことを示す 404 HTTP エラー コードを返します。

404 npm での API リクエストに対する応答が見つかりません
404 npm での API リクエストに対する応答が見つかりません(Aqua Security)

Aqua Security は、この API を使用して npm で作成したプライベート パッケージの存在をチェックし、404 HTTP エラーの応答時間を、存在しないパッケージの API チェックと比較することで、npm タイミング攻撃を発見しました。

研究者は、パッケージ名の存在を 5 回チェックしてテストを実行しました。彼らは、npm がリクエストに応答するのに必要な平均時間に測定可能な差があることを発見し、パッケージが非公開か存在しないかを識別できるようにしました。

より具体的には、プライベート パッケージが存在する場合の平均応答時間は 648 ミリ秒ですが、存在しない場合の平均応答時間はわずか 101 ミリ秒に低下します。

5 つの要求に応答する時間
5回のリクエストに対応する時間(アクアセキュリティ)

研究者は、これはキャッシング メカニズムと、この情報漏えいの可能性を導入する npm の API のアーキテクチャによるものであると推測しています。

ハッカーは、「ブラインド」辞書攻撃を試みるか、標的となる組織の公開パッケージで命名パターンと組み合わせを探して、可能性のある非公開パッケージ名を導き出すことができます。

さらに、オンライン情報には過去のパッケージ情報が含まれているため、攻撃者はそれらを使用して、後で非公開になった可能性のある公開パッケージを特定できます。

後者の場合、以前は公開されていたパッケージの古いコピーが、それを使用するソフトウェア製品で意図したとおりに機能するのに十分な機能を保持している可能性があるため、クローン パッケージの潜在的な侵害は非常に目立たない可能性があります。

GitHub は問題を修正しません

Aqua Security は 2022 年 3 月 8 日に GitHub にバグを開示しましたが、3 月 25 日にアーキテクチャ上の制限により修正されないことが通知されました。

「これらのアーキテクチャ上の制限により、特定のプライベート パッケージが npm に存在するかどうかを判断するタイミング攻撃を防ぐことはできません」と GitHub は Aqua Security に語っています。

研究者は、組織は npm を頻繁に検索して、重複または類似の名前でプライベート パッケージを偽装する疑わしいパッケージを見つけることで、予防措置を講じることができると述べています。

さらに、npm ではパブリック リポジトリに同名のパッケージをアップロードできないため、組織はプライベート パッケージをプレースホルダーとして偽装するパブリック パッケージを作成できます。