Argano の松田です。

最近、オープンソースパッケージの脆弱性やサプライチェーン攻撃のニュースをよく目にするようになりました。とはいえ、日々アップデートされる無数のパッケージ情報をすべて追いかけるのは現実的ではありません。そこで、私が行っているセキュリティ情報の収集方法と、リポジトリでの対策をご紹介します。

セキュリティ情報の収集

  • X
    • Node.js や React の公式、セキュリティ関連のアカウントをフォローしています
    • 速報性が高く、脆弱性情報をいち早くキャッチできます
  • 毎朝確認するサイト
    • The Hacker News
      • 海外のニュースサイトで、速報性が高く、脆弱性情報をいち早くキャッチできます
      • Security Next に比べ、より技術的な内容が多い印象です
    • はてなブックマーク
      • IT 系のニュースがまとめられています。
    • 各リポジトリの Security and quality > Dependabot > Vulnerabilities
      • 自分が関わっているリポジトリの脆弱性情報を確認できます
      • 対応方法は後述
  • 社内の朝会で確認するサイト
    • Security Next
      • 技術的な記事以外にも、ニュースや脆弱性情報がまとめられています
      • 朝会では各自、気になる記事を取り上げて共有しています
    • GitHub Advisory Database
      • GitHub が提供する脆弱性情報のデータベースです
      • 朝会では npm をメインに Severity が High 以上の脆弱性情報を確認しています

毎朝の確認ルーティンに入れようか検討中のサイトもあります。

そもそも脆弱なパッケージを入れないための対策

事後対応の前に、まずは「脆弱性が入り込みにくい状態を作る」ことも重要です。新しいパッケージを導入する際は、以下の基準で判断しています。

  • メンテナンス状況の確認 : 最終更新日が数年前で止まっていないか。
  • 利用実績の確認 : npm trends や GitHub の Star 数等でダウンロード数を比較し、マイナーすぎるパッケージは避ける。
  • 依存関係の深さ : そのパッケージの依存関係が深すぎる場合、脆弱性が入り込むリスクが高まるため、なるべく依存関係の浅いパッケージを選ぶ。

リポジトリでの対策

情報収集はあくまで「知るため」の手段でしかないので、実際にリポジトリでの対策も重要です。

pnpm の導入

パッケージマネージャーとして npm や Yarn ではなく pnpm を採用するプロジェクトが増えています。

pnpm はインストール速度だけでなくセキュリティ面でも大きなメリットがあります。

  • インストールスクリプトの実行制限
    • サプライチェーン攻撃の多くは、パッケージインストール時に自動実行される postinstall などのライフサイクルスクリプトを悪用します。
    • pnpm はデフォルトでライフサイクルスクリプトの実行を無効化します。
  • blockExoticSubdeps
    • git+ssh://...https://.../package.tgz からインストールされるパッケージを拒否する設定が可能です。
  • minimumReleaseAge の設定
    • パッケージが乗っ取られて悪意のあるコードが仕込まれた場合、数時間〜数日で発覚してレジストリから削除されるケースが多いです。
    • pnpm は、パッケージの公開から一定期間が経過していない場合、インストールを拒否する設定が可能です。
    • これにより、公開直後のパッケージを誤ってインストールしてしまうリスクを減らせます。
  • trustPolicy
    • パッケージの信頼レベルが以前のリリースと比較して低下した場合、インストールを拒否する設定が可能です。

これらの設定の一部は npm にも存在する、または追加されようとしていますが、2026年7月14日現在、pnpm の方がより多くのセキュリティ対策が可能です。

バージョン更新・脆弱性対応関連のコマンドをご紹介します。

# プロジェクト内の依存関係に脆弱性がないかチェックする
pnpm audit

# CI (GitHub Actionsなど) での活用例
# High 以上の脆弱性が見つかった場合のみエラー(終了コード1)にしてマージをブロックする
pnpm audit --audit-level high

# あるパッケージがどこの依存関係で使われているかを確認する
pnpm ls esbuild --depth Infinity
pnpm why esbuild

# 脆弱性が見つかった場合、修正可能なものは自動で修正する
pnpm audit --fix override # → pnpm-workspace.yaml の minimumReleaseAgeExclude と override が更新される

# 依存関係を最新バージョンに更新する
pnpm update --latest

# 依存関係の重複を解消する
pnpm dedupe

pnpm lspnpm why の違い

  • pnpm ls
    • プロジェクトに何がインストールされているか(トップダウン)を確認する
    • デフォルトではトップレベルの依存関係しか表示されないため、--depth Infinity を付けるとすべての依存関係を確認できる
  • pnpm why
    • 指定したパッケージを誰が要求しているか(ボトムアップ・逆引き)を確認する

Dependabot Security Updates

Dependabot の設定はリポジトリの Settings > Advanced Security > Dependabot から行えます。

各項目の詳細は以下の通りです。

  • Dependabot alerts
    • リポジトリで使われている依存関係に脆弱性が見つかった場合、 GitHub が自動で通知してくれます
  • Dependabot malware alerts
    • リポジトリで使われている依存関係にマルウェアが見つかった場合、 GitHub が自動で通知してくれます
  • Dependabot security updates
    • Dependabot alerts で通知された脆弱性に対して、GitHub が自動で Pull Request を作成してくれます
    • Pull Request の内容は、脆弱性が修正されたバージョンへのアップデートです
  • Dependabot version updates
    • リポジトリで使われている依存関係のバージョンが古い場合、 GitHub が自動で更新の Pull Request を作成してくれます
    • 脆弱性の有無は関係ありません
    • 有効化するには .github/dependabot.yml の設定が必要です
  • Dependabot on self-hosted runners
    • Dependabot は GitHub が提供するランナー上で動作しますが、セルフホストランナー上でも動作させることができます

「Dependabot on self-hosted runners」以外は基本的に有効化する方針ですが、一部リポジトリでは「Dependabot security updates」や「Dependabot version updates」を無効化し、自前で依存関係を更新する GitHub Actions を用意している場合もあります。(プライベートレジストリに依存関係を置いている場合など。Personal Access Token (PAT) を発行すれば Dependabot でも対応可能ですが、セキュリティ上の理由で PAT を発行したくない場合があります。)

自前で依存関係を更新する GitHub Actions の例は以下の通りです。

name: Update dependencies

on:
  schedule:
    # 毎週月曜日の朝 9:00 (日本時間) に実行
    - cron: "0 0 * * 1"
  workflow_dispatch:

jobs:
  update-dependencies:
    runs-on: ubuntu-latest

    permissions:
      contents: write
      pull-requests: write

    steps:
      - uses: actions/checkout@v7

      - uses: pnpm/action-setup@v6
        with:
          version: latest

      - uses: actions/setup-node@v6
        with:
          node-version: 24

      - run: pnpm install

      # 依存関係を最新バージョンに更新する
      - run: pnpm update --latest

      - name: Commit and Push
        run: |
          if git diff --quiet; then
            echo "No changes to commit."
            exit 0
          fi

          BRANCH_NAME="update-dependencies"

          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

          git checkout -b "$BRANCH_NAME"

          git add .
          git commit -m "Update dependencies"
          git push origin "$BRANCH_NAME"

          echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV          

      - name: Create Pull Request
        env:
          # ghコマンドの認証に必要
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gh pr create \
            --title "Update dependencies" \
            --body "GitHub Actionsから \`gh\` コマンドを使用して自動生成されたプルリクエストです。" \
            --head "${{ env.BRANCH_NAME }}" \
            --base "main"          

まとめ

セキュリティ対策に「これさえやっておけば絶対安全」という銀の弾丸はありません。重要なのは、「致命的なものにすぐ気づける仕組みを作ること」と「攻撃を防ぐ設定をデフォルトにしておくこと」です。

Dependabot の設定や pnpm の導入は、一度設定してしまえば日々の運用コストをほとんどかけずに高い防衛効果を発揮してくれます。もし「自分のプロジェクトは設定が漏れていたかも」という方がいれば、ぜひこの機会に見直してみてください。