ソフトウェア・インテグリティ

 

[CyRC脆弱性解析]ソフトウェアサプライチェーンにおけるリポジトリジャック

リポジトリジャックは、サプライチェーン攻撃の最初の段階で行われることがよくあります。どのような手法やツールを用いて組織を攻撃から守ることができるでしょうか。

CyRC analysis on repo jacking | Synopsys

いままで、オープン ソース リポジトリに対する脅威がますます蔓延していることは、リポジトリ ハイジャック (略してリポ ジャッキング) の増加に見られます。

リポ ジャッキングについて

リポ ジャッキングは意図的に、オーナーやメンテナのアカウントでホストされているリポジトリを、悪意ある攻撃者が強制的に奪うものです。攻撃者に対して、アカウントへのアクセスを許諾し、悪意あるコードをプロジェクトに実装するか、プロジェクトが依存するようにします。

この手のサプライチェーン攻撃は、通常、GitHub などのホスティング プラットフォームでの再登録検証の有無を悪用する 2 つの方法のいずれかによって実行されます。

  • 名前の変更:ホスティング プラットフォームのユーザーがユーザー名を変更すると、攻撃者が元のユーザー名でリポジトリを再登録できる可能性があり、リポジトリを再作成できますが、元のリポジトリ URL は、攻撃対象のユーザーのパッケージによって依存関係として使用され、更新の度に継続してアクセスされる可能性があります。
  • アカウントの削除:名前の変更と同様に、攻撃者は削除されたアカウントを再登録し、リポジトリを再作成できます。 この方法では、プロジェクトが URL を介してリポジトリを取得しようとするとエラーが発生する可能性が高くなります。これはリンクが壊れるためで、リポジトリを取得しようとするプロジェクトの削除と更新の間に、削除されたユーザー名を再登録することで正常に回避できてしまうためです。

どちらの場合も、攻撃者は効果的かつ完全にリポジトリを制御できるようになり、さまざまな特権に基づく操作を実行できるようになります。 これらには、他の悪意のあるユーザーまたは自分で作成したアカウントを管理者/メンテナとして任命することが含まれる場合があり、これを使用して、リポジトリへのプッシュおよびプル リクエストを承認することができます。 このようにして、悪意のあるコードや不要なコードがプロジェクトの新しいバージョンに強制される可能性があります。 逆に、バージョンと機能コードをリポジトリから削除したり、意図的にコミットを壊したりして、既存の機能の妨害や破損を許してしまう可能性があります。

セキュリティへの悪影響

リポジトリ ハイジャック攻撃が成功すると、特に影響を受けるパッケージが依存関係として使用されている場合に、パッケージまたは製品のユーザーに深刻なセキュリティ上の影響を与える可能性があります。 これは多くの場合、既存のバージョンの再リリースまたは新しいバージョンのリリースにより、悪意のあるコードの無制限のアップロードを可能にする攻撃の性質によるものです。 これらは、影響を受けるパッケージの新しいバージョンに自動的にバンプするか、手動で設定された最近リリースされたバージョンを使用する外部プロジェクトに悪意のあるコードを直接供給するために使用されます。

攻撃は数日から数週間も検出されない可能性があり、通常、用心深い研究者、タカ目のユーザー、またはハイジャックされたことに気付いた元の所有者 (UAParser.js の場合など) によってのみ開示されます。 通常、この問題に対処する責任はホスティング プラットフォームにあり、悪意のあるパッケージ バージョンを削除するか、侵害されたアカウントを一時停止することで、悪意のあるパッケージ バージョンを軽減するための措置を講じることができます。

これらの攻撃は、悪用可能性という点では比較的単純ですが、特に頻繁に更新されるプロジェクトなど、人気のあるプロジェクト オーナーのアカウントには通常見られない条件に大きく依存しています。このような場合、攻撃者は、フィッシングまたはより正確な「ホエーリング」手法を使用してアクティブなアカウント所有者を標的にし、アカウントへのアクセスを試みます。
または、何らかの形のクロスサイト スクリプティング攻撃でアクションを実行するように強制しますが、多くのブラウザーやサイトにはこれに対する組み込みの保護機能があります。

リポ ジャッキングの実例

CTX

リポジトリのハイジャックの最近の例は、2022 年 5 月に Python パッケージ CTX の形で発生し、人気のある Python パッケージ ホスティング サイト PyPI でそのリポジトリがハイジャックされました。 この場合、所有者アカウントの元のドメイン ホスティング メールの有効期限が切れており、第三者によるパスワードのリセットとドメインの再登録にさらされています。 アカウントの有効期限が切れてからハイジャックの試みが成功するまでにどれくらいの時間が経過したかは不明ですが、ハイジャックが開始されてから、攻撃者がパッケージの悪意のあるバージョンのアップロードを開始し、元のバージョンを置き換えるのにわずか 40 分しかかかりませんでした。

この乗っ取りは 10 日間発見されず、悪意のあるバージョンの CTX が 27,000 回以上ダウンロードされました。

悪意のあるコードについては、ctx.py ファイルにコードのセクションが追加され、ユーザーの環境変数を盗み出し、データを外部エンドポイント (この場合はホストされた Heroku サーバー) に送信しました。 盗み出されたデータには、API キーやパスワードなどの機密ユーザー情報が含まれている可能性があり、これらは環境変数として保存され、簡単にアクセスできるようになっていました。

PyPI 管理者は、ハイジャックされたアカウントを一時停止し、CTX の悪意のあるバージョンとオリジナルのバージョンをすべて削除しましたが、この記事の執筆時点では復元されていません。

この脆弱性は、Black Duck® Security Advisory BDSA-2022-1523 でカバーされています。

PhPass

同様に、Packagist PHP ホスティング プラットフォームと GitHub でホストされている PHP パッケージ PhPass も、2022 年 5 月に同じ方法で悪用されました。元の所有者のアカウントが削除され、悪意のある人物によって再登録され、元のリポジトリへのアクセスが許可されました。 このアクセスを使用して、元のパッケージ バージョンが悪意のあるバージョンに置き換えられました。

これらの代替バージョンに含まれる悪意のあるコードは、CTX の乗っ取りと同じアクションを実行し、まったく同じエンドポイントに環境変数を抽出しました。

この問題の解決策として、元の無害なバージョンを含むフォークされたリポジトリが作成されました。 悪意のあるレポのバージョンがそれ以上ダウンロードされないようにするために、Packagist は元のダウンロード URL を新しいフォークに再ルーティングしました。

この脆弱性は、Black Duck Security Advisory BDSA-2022-1526 でカバーされています。

UAParser.js

2021 年 10 月には、作成者の npm アカウントが乗っ取られ、人気のある JavaScript ライブラリ UAParser.js が武器化され、さらに極端なレポジトリ ハイジャックが発生しました。攻撃者は、0.7.29、0.8.0、および 1.0.0 の 3 つの悪意のあるバージョンを公開しました。パッケージは毎週 800 万から 900 万回ダウンロードされ、プロジェクト全体で広く使用されているため、これはすぐに大規模な攻撃になりました。

これらの悪意のあるバージョンで導入されたコードは、特に有害な影響を及ぼしました。特に、インストール時に、コードはリモート サーバーからバイナリをダウンロードして実行します。そのようなバイナリの 1 つが暗号通貨マイニング ソフトウェアで、リモートの攻撃者が被害者のシステムを制御できることを示しています。 Windows システムにのみ導入された別のバイナリは、システムから機密情報を盗み出すトロイの木馬でした。

UAParser.js 攻撃の数時間後、パッケージの作成者は侵害されたバージョンを npm から削除し、3 つの新しいバージョン (0.7.30、0.8.1、および 1.0.1) をリリースして、悪意のあるバージョンが保持されないように自動的に計画されたアップグレードを緩和しました。

この脆弱性は、Black Duck Security Advisory BDSA-2021-3228 でカバーされています。

リポ ジャッキングから組織を守る方法

サプライ チェーン攻撃が増加しているため、レポ ハッキングのケースも増加しています。これは、サプライ チェーン攻撃の最初のステップであることが多いためです。リポジトリの乗っ取りは簡単なプロセスですが、深刻で有害な影響をもたらす可能性があります。この種の攻撃の増加に対処するための軽減策が現在利用可能であり、パイプラインにあります。

一般に 2 要素認証 (2FA) として実装される多要素認証は、アカウントへのアクセスに 2 番目のセキュリティ レイヤーを提供します。理論的には、悪意のある人物が期限切れまたは削除されたアカウントにアクセスするのを防ぐ必要があります。最大のホストの 1 つである GitHub は、2023 年以降、すべてのメンテナー アカウントで 2FA が必須になると発表しました。これは、2FA の採用が大幅に増加したことを示しており、現在、アクティブな GitHub ユーザーの 16.5% のみが 2FA を使用しています。一方、人気のある JavaScript パッケージ マネージャーである npm は、2FA を実施しておらず、2FA を実施する意向も発表していません。ただし、上位 35 の npm パッケージの 32% が 2FA の欠如によりアカウント乗っ取りのリスクにさらされているにもかかわらず、Aqua Security チームノーチラス。

ドメインの乗っ取りは、悪意のある人物がメールの期限切れのドメインを再登録し、そのドメインを使用してパスワードのリセットを要求する場合など、リポジトリのハイジャックにおけるサプライ チェーンの一般的な部分です。リポジトリ ホスティング プラットフォームは、有効期限が近づいているドメインや有効期限が切れているドメインを持つアカウントを先制的に削除または一時停止することで、これを防ぐことができます。チェーン内のリンクを切断することは、侵害される可能性のあるアカウントへのアクセスをブロックするための重要なステップです。ただし、これには、ホスティング プラットフォームのメンテナンスと監視の責任が大きくなります。

今後数年から数か月にわたって、オープンソース プロジェクトは拡大と量の増加を続け、依存関係がさらに強まり、ハイジャックに対して脆弱になるでしょう。この拡張と並行して、より多くの所有者と作成者のアカウントが非アクティブになり、削除されるため、悪意のある人物がリポジトリをハイジャックする機会がさらに開かれます。

これらの脆弱性の多くを防止するための軽減策は可能ですが、現在の業界の状況では、MFA などの防止技術にオプトインしているユーザーの数は限られています。リポジトリの所有者が 2FA の採用に消極的であることが、リポジトリのハイジャックの影響を軽減する取り組みを妨げている可能性があるため、2FA などの方法を強制的に実施することが今後の道筋となる可能性があります。

Synopsys Black Duck セキュリティ アドバイザリがどのように役立つか?

Black Duck セキュリティ アドバイザリ (BDSA) は、Black Duck のお客様に、脆弱性が公開された際に詳細な情報を提供し、脆弱なコードの概要と使用済みパッケージの軽減策を示す警告を伴います。 お客様は BDSA を使用して新しい脆弱性を迅速に軽減し、レポ ジャッキングなどのパッケージ内の悪意のある開発について通知を受けることができます。 ハイジャックされたパッケージの BDSA には、脆弱なバージョン、重要な情報、フォークされたリポジトリなどの新しい開発が詳述されています。

Black Duck セキュリティアドバイザリについて

 

この著者によるその他の情報