2026.03.19

npmソフトウェアサプライチェーン攻撃から学んだJFrog Curationの実践編

Alex Wang
JFrog Japan
このエントリーをはてなブックマークに追加

先日、「【注意喚起】史上最大のnpmソフトウェアサプライチェーン攻撃:Shai-Hulud 20種類以上の悪意あるOSSパッケージが1週間で200万回ダウンロード」というブログで、組織に対するnpmパッケージダウンロードによる被害をまとめました。今回は、その実践編として対策をまとめました。

本ブログ記事の詳細について、 https://jfrog.com/ja/platform/schedule-a-demo/、 もしくは本書作者Alex Wang(王 子龍) wanga@jfrog.comへお気軽に問い合わせいただけたら幸いです。(日本語、英語の両方に対応)

JFrog Curationは、オープンソースソフトウェア(OSS)が社内の開発環境に「入る前」に、悪意のあるパッケージやリスクの高いコンポーネントを自動で検知・ブロックするソリューションです。
 
従来のセキュリティ対策(Xrayなど)が「入ってきたものをスキャンする」のに対し、Curationは「玄関口(ゲート)で門前払いする」役割を担います。

下記の図における「0」の位置付けです。

JFrog202603_1.png

🔳JFrog Curation の主な仕組み

  1. リクエスト時のリアルタイム・メタデータ検証

開発者が npm installpip install などのコマンドを実行し、JFrog Artifactory(リモートリポジトリ)経由でパッケージを要求した際、Curationがそのリクエストをインターセプトします。

バイナリ・メタデータの活用: パッケージ本体をダウンロードしてスキャンする前に、リポジトリ上のメタデータを基に判定を行います。これにより、ダウンロード時間を無駄にせず高速に処理できます。

JFrog Catalog との連携: JFrogが保有する膨大なOSSカタログのメタデータと照合し、最新のセキュリティ情報を即座に反映します。

 

  1. ポリシーベースの自動ブロック

管理者は、組織の基準に合わせて「どのようなパッケージを拒否するか」のポリシーを柔軟に設定できます。

悪意のあるパッケージ: マルウェアやタイポスクワッティング(名前の打ち間違いを狙った攻撃)の即時ブロック。

脆弱性 (CVE): 指定したスコア(CVSS)以上の脆弱性を持つパッケージを遮断。

ライセンスコンプライアンス: 組織で許可されていないライセンス(例:GPLなど)を検知。

運用リスク: メンテナンスが止まっている(プロジェクトが死んでいる)、またはリリースされたばかりで信頼性が低いパッケージを制限。

 

  1. Shift Left」の徹底と開発者の生産性

セキュリティを開発プロセスの極めて初期段階(パッケージ取得時)に組み込むことで、後段での手戻りを防ぎます。

代替バージョンの提案: 特定のバージョンがブロックされた際、ポリシーに適合する最新の「安全なバージョン」を自動的に案内する機能があります。

ドライラン(シミュレーション): ポリシーを本番導入する前に、現在の開発フローにどれだけ影響が出るかをシミュレーションし、意図しないブロックを防ぐことができます。

監査トレイル: 誰が、いつ、どのパッケージを要求し、なぜブロックされたかの全履歴が記録され、コンプライアンス遵守を証明できます。

 

 

🔳それでは、やってみましょう。

デモのシナリオとして、
 Remote Repository
経由で、CVE脆弱性を持つlodash 4.17.7をキャッシュします。
 
その後、Curationによってブロック、もしくは承認プロセス(Dry Run)を実行します。

① JFrog UI上で、OSSをキャッシュするためのRemote Repositoryを作成する

Administration→Create a Repository →Remote Repository  

JFrog202603_2.png

該当するパッケージタイプを選択します。今回はnpmです。  

JFrog202603_3.png

 

Repository Key(リポジトリ名)を入力し、「Create Remote Repository」をクリックして保存します。今回は「AlexCuration-npm-Remote」という名前のリポジトリを作成しました。

JFrog202603_4.png

 

② GitHubYAMLで、Remote Repository経由のキャッシュを指定する

 

-------------------------------------------------------------------------------------

name: npm build via JFrog AlexCuration (OIDC) 

on:

  push:

    branches: [ main ]

 

# OIDC認証に必要な権限

permissions:

  id-token: write

  contents: read

 

jobs:

  build:

    runs-on: ubuntu-latest

 

    steps:

      - name: Checkout code

        uses: actions/checkout@v4

 

      - name: Setup Node.js

        uses: actions/setup-node@v4

        with:

          node-version: '20'

 

      # JFrog CLIのセットアップとOIDC認証の実行

      - name: Setup JFrog CLI

        uses: jfrog/setup-jfrog-cli@v4

        env:

          JF_URL: ${{ secrets.JF_URL }}

          # JFrog側で設定したプロバイダー名に合わせてください

          JF_OIDC_PROVIDER_NAME: github-oidc-provider

        with:

          oidc-provider-name: ${{ env.JF_OIDC_PROVIDER_NAME }}

 

      # 指定されたリモートリポジトリを解決先として.npmrcを自動生成

      - name: Configure npm to use AlexCuration-npm-Remote

        run: |

          jf npm-config --repo-resolve=AlexCuration-npm-Remote

 

      # JFrog経由でのインストール(GitHub Actionsのキャッシュは不使用)

      # jf npm install を使うことでJFrog側にビルド情報が記録されます

      - name: Install dependencies

        run: jf npm install

 

      - name: Run build

        run: npm run build --if-present

-------------------------------------------------------------------------------------

 

③ UI上で対象のRemote Repositoryに対してCurationを有効化し、ポリシーを作成します。

 

Administration→Curation Settings→Remote Repositories→npm→該当Remote Repository(「AlexCuration-npm-Remote」)のConnectedボタンを有効   

JFrog202603_5.png

 

Platform → Curation → Create Policy の順に進み、新規ポリシーを作成します。 

JFrog202603_6.png

Policy Nameは任意に設定します。
 Scope
では、「Organization-Wide」ですべてのRemote Repositoryに適用するか、または「Specific Remote Repositories」で特定のリポジトリのみに適用するかを選択できます。今回はテストのため、上記で作成した「AlexCuration-npm-Remote」というリポジトリのみを選択しました。

JFrog202603_7.png

続いて、Policy Conditionでポリシー条件を設定します。

例えば、「Malicious Package」にチェックを入れることで、悪意のあるパッケージをブロックできます。 

JFrog202603_8.png

 

さらに、「Create Condition」ボタンをクリックすると、より詳細な設定が可能です。

例えば、CVSSスコア9.0以上のCVEをブロックしたい場合は、「Package has vulnerability with CVSS score in range」で絞り込むことができます。  

JFrog202603_9.png

 

また、「Package version is immature」を使用すると、利用するパッケージのリリース日を制御できます。「How many days from the release date?」に14を入力すると、コミュニティ上で公開されてから14日以内のパッケージは利用できないように制限するガバナンスを設定できます。

JFrog202603_10.png

 

本ルールに違反した場合、ブロックするか、もしくはDry Run(承認フロー)を実行するかを選択できます。今回はブロックに設定しました。

最後に「Save Policy」をクリックすると、作成したポリシーが適用されます。

JFrog202603_11.png

今回は一部の機能のみを紹介しています。

より詳細な設定については、Curationの公式設定マニュアルをご参照ください:

JFrog Curation公式マニュアル

 

④ GitHub Actionsを使用して、ビルドおよびキャッシュを実行します。

 

ビルドおよびキャッシュを実行すると、JFrog Curationのポリシーに該当するパッケージのダウンロードがブロックされ、403エラーが発生します。

JFrog202603_12.png

それと同時に、「あなたが使おうとした lodash のバージョン 4.17.11 には、非常に危険なセキュリティの穴(CVE-2019-10744)があるため、会社のポリシーで利用を禁止しました。安全な 4.17.12 以上に上げてください。次に行うべきステップとして、 package.json(またはプロジェクトの依存関係管理ファイル)を開き、lodash のバージョンを 4.17.12 またはそれ以降(最新は 4.17.21 等)に書き換えて、再度インストールを試みてください。」 というメールがきます。

JFrog202603_13.png

 

 

開発者や組織にとって、下記の3つのメリットがあります。

 

​​① 致命的なサイバー攻撃の未然防止:検出された CVE-2019-10744 は、CVSS(脆弱性の深刻度)が9.0以上という「緊急」レベルです。この通知に従ってアップデートするだけで、外部からの不正操作やデータ漏洩のリスクを、コードを1行も書かずに排除できます。

② コンプライアンスとガバナンスの遵守:企業環境では、脆弱性のあるライブラリを放置することはセキュリティ監査上のリスクになります。JFrog Curationによって自動的にブロック・通知されることで、開発チーム全体で「安全なコードしかビルド環境に入れない」というクリーンな状態を維持できます。

③ 運用コストの削減:深刻な脆弱性は、後から発覚するほど修正コスト(パッチ適用、再テスト、デプロイ、事後報告など)が膨れ上がります。ダウンロードしようとした「今」この瞬間に通知を受け取って修正することで、将来のトラブル対応に費やす時間を最小限に抑えられます。

 

ちなみに、この脆弱性は「プロトタイプ汚染(Prototype Pollution)」と呼ばれるもので、攻撃者がアプリケーションの動作を乗っ取ったり、クラッシュさせたりできる極めて深刻なものです。

 

 

組織の管理者として、JFrog Curationのダッシュボードで組織全体のセキュリティをモニタリングし、セキュリティガバナンスと開発速度の向上を両立させます。

 

▼全体のダッシュボード

JFrog202603_14.png

▼User Log

JFrog202603_15.png

 

具体的なメリットは、下記となります。

 

1. セキュリティ・リスクの「可視化」と「即時把握」

最大のメリットは、**「今、何が原因で、どれくらいの開発が止まっているか」**がリアルタイムでわかることです。

  • Request Overall Results: ブロックされたリクエスト(530件)や、Dry Run(テスト運用)で警告が出た件数が一目でわかります。
  • Blocking Policies by Type: 「悪意のあるパッケージ(Malicious)」「セキュリティ脆弱性(Security)」「ライセンス違反(Legal)」「運用ルール違反(Operational)」の4カテゴリで、どのリスクが最も多いか即座に特定できます。

2. 開発スピードへの影響を最小化

開発者が個別に脆弱性を調べるのではなく、プラットフォーム側で自動判定するため、組織全体の効率が上がります。

  • Blocked Requests By Package Type: npmやMavenなど、どのエコシステムでブロックが発生しやすいか傾向を掴めます。例えば「npmのブロック率が79%と高いので、依存関係の更新ルールを見直そう」といった戦略的な判断が可能になります。
  • Dry Run モードの活用: 実際にブロックする前に「もしこのポリシーを適用したらどうなるか」をシミュレーションできるため、開発現場を混乱させずに新しいセキュリティルールを導入できます。

3. コンプライアンスとガバナンスの自動強制

手動のチェックリストではなく、システムが自動で「門番」の役割を果たします。

  • ポリシーの自動適用: 下部のリストにあるように「GPLライセンスは禁止(Legal)」や「CVSS 9以上の脆弱性はブロック(Security)」といったルールを、全プロジェクトに一貫して適用できます。
  • 監査証跡(Audit: いつ、誰が、どのパッケージをダウンロードしようとして拒否されたかの履歴が残るため、監査対応が非常にスムーズになります。

4. AI/ML モデルの安全確保(HuggingFace対応)

このダッシュボードの特筆すべき点として、HuggingFaceML の項目が含まれていることが挙げられます。

  • 従来のライブラリだけでなく、AIモデルのダウンロードに対しても検閲をかけられるため、AI活用が進む現代において「悪意のあるモデル」が社内に紛れ込むのを防ぐことができます。

 

以上が、JFrog Curationを用いたソフトウェアサプライチェーン対策の実践手順となります。

JFrogの詳細はこちら

製品の概要やライセンスなどを確認いただけます。
ご不明点がございましたら、遷移先ページの「お問い合わせ」より
お気軽にお問い合わせください。

この記事の著者:Alex Wang (王 子龍)

JFrog Japan

戦略コンサル時代、IT、自動車、製造などの業界に対して、アジャイル、DevOpsのコーチとして開発環境構築、CICD構築などのプロジェクトをリードしてきました。現在、DevSecOpsやLiquid Softwareを日本への展開・普及を行っています。

Linked-in: https://www.linkedin.com/in/alex-wang-662290150/

Exin DevOps Professional /PMI Project management Professional/PCI・DSS Japan member/Aoyama Gakuin University MBA holder

  • 関連キーワード:
  • JFrog

DevOps Hubのアカウントをフォローして
更新情報を受け取る

  • Like on Feedly
    follow us in feedly

関連記事

このエントリーをはてなブックマークに追加

お問い合わせ

DevOpsに関することなら
お気軽にご相談ください。

Facebook、TwitterでDevOpsに関する
情報配信を行っています。