← ブログ一覧

GitHubの無料セキュリティ機能で依存パッケージを守る方法

先日のaxiosサプライチェーン攻撃は、npm install するだけでマルウェアに感染するという衝撃的な事件だった。週間1億ダウンロードのパッケージが標的になり、npm史上最大級のインシデントとなった。

「lockfileをコミットする」「バージョンをピン留めする」といった対策は前回の記事で書いたが、GitHubには無料で使えるセキュリティ機能がいくつもある。自分も知らなかったので、この記事ではDependabotを中心に、個人開発者でも今すぐ使える機能をまとめる。

GitHubの無料セキュリティ機能の全体像

まず、何が無料で使えるのかを整理しておく。

機能パブリックリポジトリプライベートリポジトリ
Dependency Graph無料無料
Dependabot Alerts無料無料
Dependabot Malware Alerts無料無料
Dependabot Security Updates無料無料
Dependabot Version Updates無料無料
Secret Scanning無料有料
Push Protection無料有料
Code Scanning (CodeQL)無料有料
Dependency Review Action無料有料

Dependabot関連は全プランで完全無料。プライベートリポジトリでも使える。この記事ではDependabotの機能に絞って紹介する。

Dependabot Alerts — 脆弱性の通知

Dependabot Alertsは、プロジェクトの依存パッケージに既知の脆弱性が見つかったときに通知してくれる機能だ。

仕組みはこうなっている。

  1. Dependency Graphがpackage.jsonやpackage-lock.jsonを解析して依存関係を把握する
  2. GitHub Advisory Database(28,000件以上のレビュー済みアドバイザリ)と照合する
  3. 脆弱な依存が見つかればアラートを出す

有効化の手順

リポジトリの Settings → Security → Advanced Security から有効化できる。パブリックリポジトリではデフォルトで有効になっている場合が多い。

axios攻撃での限界

ただし、Dependabot Alertsには限界がある。この機能は「誰かが脆弱性を発見・報告し、GitHubのデータベースに登録された後」にアラートを出す仕組みだ。つまり、問題が起きてから知らせてくれる事後対応型の防御であって、未知の攻撃をリアルタイムに防ぐものではない。axiosの場合、悪意あるバージョンが公開されてからデータベースに登録されるまで12時間以上かかった。その間にインストールしていれば手遅れだ。

Alertsは「知る」ための機能であって、「防ぐ」ための機能ではない。他の対策と組み合わせて初めて意味がある。

Dependabot Malware Alerts — 悪意あるパッケージの検出

2026年3月17日、axiosの事件のわずか2週間前に追加された機能がこれだ。通常のDependabot Alertsが「脆弱性(CVE)」を検出するのに対して、Malware Alertsはマルウェアと判定されたパッケージそのものを検出する。

通常のAlertsとの違い

通常のAlertsは「このバージョンにはバッファオーバーフローの脆弱性がある」といったCVEベースの問題を検出する。一方、Malware Alertsは「このパッケージ自体が悪意を持って公開されたマルウェアである」というケースを検出する。

axiosの事件では、依存に追加された plain-crypto-js@4.2.1 はまさにこのカテゴリだ。脆弱性ではなく、最初からマルウェアとして作られたパッケージだった。

対応エコシステム

現時点でMalware Alertsが対応しているのはnpmのみ。npmのセキュリティチームが悪意あるパッケージを特定し、GitHub Advisory Databaseにマルウェアアドバイザリとして登録する。Dependabotはこのデータベースと照合してアラートを出す。

有効化の手順

Malware Alertsは**オプトイン(手動で有効化)**が必要だ。デフォルトでは有効になっていない。

リポジトリの Settings → Security → Advanced Security から「Dependabot malware alerts」の Enable をクリックする。前提として通常のDependabot Alertsが有効になっている必要がある。有効化した時点で、既存の依存に対してもバックフィル(過去分のチェック)が実行される。

通常のCVEアラートとは明確に分離して表示されるため、トリアージの邪魔にならない設計になっている。

axios攻撃ではどうだったか

注意しておきたいのは、Malware Alertsも通常のAlertsと同じく事後対応型だという点だ。検出の対象が「脆弱性」から「マルウェア」に変わっただけで、GitHub Advisory Databaseに登録されてからアラートが出る仕組みは同じになる。

axiosの事件では、plain-crypto-js@4.2.1 のマルウェアアドバイザリがデータベースに登録されたのは悪意あるバージョンの公開から12時間以上後だった。その間にインストールしていた場合、Malware Alertsでも間に合わない。

ちなみに、最も早く検出したのはSocketで、パッケージ公開からわずか6分後だった。Socketは依存関係の振る舞い(postinstallスクリプトの実行、外部サーバーへの通信など)をリアルタイムに分析するアプローチを取っている。

Malware Alertsは「有効にしておいて損はない」機能だが、これだけで防げるとは思わないほうがいい。後述するCooldownなど、事前に攻撃を回避する仕組みとの組み合わせが重要になる。

Dependabot Security Updates — 脆弱性の自動修正

Alertsが「知らせる」機能なら、Security Updatesは「直す」機能だ。

脆弱性が見つかった依存パッケージについて、安全なバージョンへ更新するPRを自動で作成してくれる。直接の依存だけでなく、間接的な依存(transitive dependency)もカバーする。

有効化は同じ Settings → Security → Advanced Security から行える。Alertsを有効にしていれば、Security Updatesもワンクリックで有効にできる。

Dependabot Version Updates — 依存を常に最新に保つ

Version Updatesは脆弱性に限らず、すべての依存パッケージを最新に保つためのPRを定期的に作成する機能だ。

Security Updatesとの違いは、脆弱性が報告されていなくてもPRが作られる点にある。古いバージョンを使い続けること自体がリスクなので、日常的にアップデートを回していくことが重要になる。

dependabot.ymlの基本設定

Version Updatesを有効にするには、リポジトリのルートに .github/dependabot.yml を作成する。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"

これだけで、毎週npmの依存パッケージの更新PRが自動で作られるようになる。

Cooldown — 新しいリリースに「待ち」を入れる

ここがaxios攻撃に直接効く防御策だ。

cooldownオプションを設定すると、パッケージが公開されてから一定日数が経過するまでPRの作成を遅延できる。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 3
      semver-major-days: 7

axiosの悪意あるバージョンは約3時間で削除された。default-days: 3 を設定していれば、DependabotはそのバージョンのPRを3日間作らない。削除されたバージョンのPRが作られることはない。

セマンティックバージョニングの種類ごとに日数を変えることもできる。メジャーアップデートはリスクが高いので長めに、パッチは短めに、といった調整が可能だ。

    cooldown:
      default-days: 3
      semver-major-days: 14
      semver-minor-days: 5
      semver-patch-days: 3

注意点として、cooldownはVersion Updatesにのみ適用され、Security Updatesには適用されない。脆弱性が確認されたパッケージの修正PRは即座に作成される。

Grouped Updates — PRの洪水を防ぐ

依存パッケージが多いプロジェクトでは、Version Updatesを有効にすると大量のPRが作られて管理が大変になる。groupsオプションで関連するパッケージをまとめると、PRの数を減らせる。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 3
    groups:
      production-dependencies:
        dependency-type: "production"
      development-dependencies:
        dependency-type: "development"
        update-types:
          - "minor"
          - "patch"

この設定では、本番用の依存と開発用の依存がそれぞれ1つのPRにまとめられる。

Auto-triage Rules — アラートのノイズを減らす

Dependabot Alertsを有効にしていると、開発用依存(devDependencies)の低リスクな脆弱性にもアラートが出て通知がうるさくなることがある。

GitHubには「Dismiss low impact issues for development-scoped dependencies」というプリセットルールがある。パブリックリポジトリではデフォルトで有効になっており、開発用依存の低リスクなアラートを自動で非表示にしてくれる。

プライベートリポジトリの場合は、Settings → Security → Advanced Security の「Dependabot rules」のギアアイコンから、GitHub presetsセクションで手動で有効にできる。

実践:設定例

GitHub Docsのベストプラクティスを参考に、npmプロジェクト向けの dependabot.yml の設定例を用意した。

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      timezone: "Asia/Tokyo"
    # 新しいリリースに待ちを入れる(サプライチェーン攻撃対策)
    cooldown:
      default-days: 3
      semver-major-days: 14
      semver-minor-days: 5
      semver-patch-days: 3
    # PRをまとめてノイズを減らす
    groups:
      production-dependencies:
        dependency-type: "production"
      development-dependencies:
        dependency-type: "development"
        update-types:
          - "minor"
          - "patch"

ポイントを補足する。

  • cooldownの日数はsemverレベルごとに分ける。 メジャーアップデートは破壊的変更のリスクが高いので長めに待ち、パッチは短めにする。クリティカルなシステムではさらに長い日数(30日等)が推奨されている
  • timezoneを指定する。 指定しないとUTCで実行されるため、日本時間の深夜に動かしたい場合はAsia/Tokyoを明示する
  • open-pull-requests-limitはデフォルトの5のままで良い。 個人開発なら5で十分。Security Updatesは別枠(上限10)で管理されるため、この設定の影響を受けない

加えて、リポジトリの Settings → Security → Advanced Security で以下を確認しておく。

  • Dependabot Alerts: 有効
  • Dependabot Malware Alerts: 有効(npmを使っているなら必須)
  • Dependabot Security Updates: 有効
  • Grouped security updates: 有効
  • Auto-triage(低影響の開発用依存を自動非表示): 有効

設定にかかる時間は10分もあれば十分だ。

まとめ

axiosの事件で改めて実感したのは、npmエコシステムの信頼モデルが脆いということだ。1人のメンテナーのアカウントが突破されるだけで、何百万ものプロジェクトが影響を受ける。

GitHubのDependabotは、この脆さを前提とした現実的な防御ラインを無料で提供してくれる。

  • Alertsで脆弱性を知り
  • Malware Alertsで悪意あるパッケージを検出し
  • Security Updatesで自動修正し
  • Version Updates + Cooldownで日常的に依存を更新しつつ怪しいリリースを待つ

完璧な防御は存在しないが、これらを組み合わせるだけで攻撃が成功する確率は大幅に下がる。まだ設定していなければ、この機会にやっておくことをおすすめする。

参考リンク