更新 tech

minimum release age, cooldownを使ったサプライチェーン攻撃対策

Dependabotとnpm

前回、GitHub ActionsのコミットSHAについての記事を書きました。

最近のサプライチェーン攻撃を踏まえたバージョンアップの戦略はどのような方針にするのがベストプラクティスでしょうか。 例えば以下のようなものが挙げられそうです。

  1. 最新のアップデートに更新し続ける。
    • 新機能、バグ修正、脆弱性対応など、最新のバージョンを追うのは最近では当たり前になってきた。
  2. ただし、新バージョンがリリースして直ぐにアップデートはせずに、一定期間は様子見をする。
    • Tanstackの例であった通り、最近の攻撃手法では新バージョンにマルウェアが仕込まれるケースが増えている。
    • OSSコミュニティの一定期間の反応・対応を待つことである程度信頼性を有した状態のバージョンのみを取り込む。
  3. 新バージョンを取り込む際は安全であることを確認した上で取り込む。
    • バージョンアップの自動化などに伴い、アップデートされた内容に問題ないか事前に検証を行うプロセスを設ける。
    • CIで検証を自動化する。

特に、2に関しては最近だとminimum release ageや、cooldownといった最新バージョンリリースから自動的に猶予を設ける仕組みも出てきており、最小労力での対策が可能になってきています。

Dependabotでのcooldown#

Dependabotは、GitHubが提供する依存関係の自動更新ツールで、プロジェクトで使用されているライブラリやパッケージに更新があった際に、自動でプルリクエストを作成してくれます。

主な機能として、

  • Dependabot alerts

    • リポジトリ内の脆弱性を検出してくれ管理者に通知してくれる仕組み。仮にMalware検出の際は以下の画面に通知が来る。 Dependabot alertsでマルウェアを検出した際の通知画面
  • Dependabot security updates

    • 依存ライブラリに脆弱性が見つかると自動的にアップデートPRが作成される仕組み。GitHub Advisory Databaseの情報をもとに動作する。
  • Dependabot version updates

    • セキュリティ問題に関わらず、新しいバージョンがリリースされたら定期的にアップデートのPRが作成される。
    • .github/dependabot.ymlの設定ファイルで具体的な設定値を変更できる。
version: 2
updates:
    # npm のアップデートを有効にする
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      # 毎週
      interval: "weekly"
    # openなPRの上限を設定できる
    open-pull-requests-limit: 5
    # リリースされてから7日経過したバージョンのみが対象
    cooldown:
        default-days: 7

上記の例について、cooldownを使うことでnpmパッケージで最新バージョンがリリースされて7日の経過を待つことができます。これにより、リリース直後のマルウェアに感染するリスクを抑えることが可能です。

cooldown:
  default-days: 7

npmパッケージのmin-release-age#

npmについても同等の機能があります。.npmrcに以下を記載するか、npm install --min-release-age=3のオプションを使うことで最小限の労力で最新バージョンのリリースからの経過を待つことが可能です。

ignore-scripts=true
min-release-age=7