AI Security Playbook

解説 / 約20分

自分は直していないのに、更新が必要になるのはなぜ?

公開済みのアプリを育てる人へ。知らないパッケージの通知から、影響判断・修正・本番で動く版の確認までをつなぐ。

実践 · アプリと依存部品の基本を知り、更新が稼働先まで届くか確かめる方へ。

読む前の補足
  • 直接使うライブラリと、その先の依存を分けて読む。
  • 検知・影響判断・修正・本番確認の違いを説明する。
  • 未検査と検出0件を分け、次の確認を残す。
  • 更新先を、数字の新しさではなく提供元の予定と全部直る版で選ぶ。
この記事の目次

公開したアプリに、セキュリティ更新の通知が届きました。見覚えのないパッケージ名です。

「それ、自分では入れていないけど?」「このところコードは変えていないのに?」。AIと作ったアプリでは、使っている部品を一つずつ選んだ記憶がないこともあります。

通知を見て更新PRをマージした。では、これで公開中のアプリも直ったでしょうか。保存されたコードと、本番で動くものの間には、もう少し確認が残ります。

この記事は、公開済みのアプリを運営し、依存の通知や更新PRを受け取る人に向けたものです。専門の監査ツールを一式そろえる前に、何が入り、何を判断し、どこまで届けば完了かを整理します。

公開したアプリに更新通知が来たら部品を直した。その更新は、本番まで届いた?

自分のアプリには、誰かが作った部品も入っている

ライブラリは、ほかのプログラムから利用する機能のまとまりです。日付の計算、画像処理、認証、画面表示など、自分で一から書かずに使える部品があります。

自分のアプリがライブラリAを使い、AがさらにBを使っていることもあります。自分が直接指定したAは直接依存、その先のBのようなものは推移的依存と呼びます。

自分で指定していなくても、部品の先に部品がある

  1. 自分のアプリ

    画像を表示するライブラリAを指定。

  2. 直接依存:A

    A自身が、別の部品Bを使っている。

  3. 推移的依存:B

    自分が直接選ばなくても、構成に含まれる。

架空の依存関係です。実際は複数の経路から同じ部品が入る場合もあります。

見覚えのない名前でも、アプリの部品として入っているかもしれません。そのときは「その名前は知らない」で閉じず、どの部品から入ったかをたどります。

JavaScriptではpackage.jsonに依存の指定を書き、package-lock.jsonなどのロックファイルに、解決された版や依存関係の情報を記録します。指定する範囲と、実際に選ばれた版を分けるためです。使う仕組みによってファイル名は異なります。

アプリのライブラリだけでなく、Node.jsやPHPなどの実行環境、コンテナを使うならその中のOSの部品、バックグラウンドで一緒に動く補助ツールも確認範囲になります。ソースの依存一覧とは別に、実行環境も調べます。

自分のコードを変えなくても、問題が分かることがある

分類:脆弱性の公表。 Java向けのログ用ライブラリLog4j 2では、2021年12月にCVE-2021-44228などの脆弱性が公表されました。Apache Logging Servicesの一次資料には、影響する版や条件、修正に関する情報が整理されています。

これは、すべてのJavaアプリや、自分のアプリで攻撃が成立するという意味ではありません。ここでは具体的な攻撃手順や、当時の特定の修正版を現在の万能な対策として紹介しません。

大切なのは、同じコード・同じ部品を使い続けていても、後からその部品の問題が分かることです。公開した日の検査結果は、その後に新しく公表される問題まで先に知っているわけではありません。

昨日の検査は、昨日分かったこと。

「前に0件だった」と「今回も確認できた」を分けます。部品を変えていなくても、新しい情報を受け取る窓口と、確認する担当が必要です。

通知が来たことと、自分の環境での影響は分ける

検知ツールは、把握している依存や公表情報を照合して通知します。例えばDependabotは、既知の脆弱性情報や依存関係の変化に応じて、対応する依存への警告を出します。ただし、すべての問題や環境を検出するものではありません。GitHub公式:Dependabot alerts

通知で見たいのは、対象の名前、版、対象ファイル、影響する条件、修正版の有無、元の公表資料です。複数の表示を行き来しても、どの通知への判断かをたどれるようにします。

検出0件と、検査できなかった結果は違う

  1. 検査が成功した

    対象と時点の範囲で、既知の問題の結果が分かった。

  2. 失敗・対象外・未確認

    結果が取れていない。0件へ置き換えない。

0件は完全な安全証明ではありません。何を検査したかも確かめます。

検査が失敗した、対象外だった、まだ調べていない。これらは「検出0件」と違います。0件でも、その検査の対象と時点で既知の問題が見つからなかったという意味で、完全な安全証明ではありません。

npmの監査機能のように、依存の情報を設定済みのレジストリへ送って照合する仕組みもあります。仕事や非公開のプロジェクトで使う際は、送信先と送る情報も確認します。ここでは、実際のパッケージを変更するコマンドや、一括修正の実行を手順にはしません。npm公式:auditの動作

重大度だけでも、使っていないはずでも判断しない

重大度は、脆弱性の性質や影響を評価する手掛かりです。自分のサービスへの影響を調べるときは、それだけでなく、対象の版、使っている機能、外から入力が届く経路、実行時の権限も確認します。

表がはみ出す場合は、横にスクロールして読めます。

確認する問い 見るもの 判断の注意
対象の部品は入っている? ロックファイル、ビルド結果、実行環境 指定ファイルだけで推移的依存を見落とさない
問題の処理へ届く? 利用機能、入力経路、提供元の条件 「画面で使わない」だけで断定しない
修正版や回避策はある? 公式の公表・更新案内 別の問題への対策と混同しない
どの公開先にある? 本番、プレビュー、バッチ、古い環境 一つの更新を全対象の完了に数えない
まだ分からないことは? 未確認の経路、確認する担当 未確認を影響なしとして閉じない

開発時だけの部品でも、ビルドやCIで秘密を扱う場合があります。逆に、検知されたからといって、すでに侵害されたという証明でもありません。

影響がないと判断するなら、その根拠を残します。修正版がまだない場合や、すぐに更新できない場合も、理由、暫定的な対応、次の確認日と担当を決めます。数値だけを見て、すべての環境に同じ猶予を当てはめません。

検知から、自分の構成への判断へ

  1. 対象を照合

    部品、版、利用している機能を確認。

  2. 条件と経路を確認

    外部の入力、実行権限、公開先をたどる。

  3. 判断と次の確認

    修正・影響なし・未確認・修正版待ちを分ける。

重大度だけでも、名前に見覚えがないだけでも、影響判断を終えません。

PRは終わった。でも、本番は更新できた?

更新PRをマージすると、リポジトリのコードは変わります。しかし、本番へのビルドやデプロイがまだなら、古いものが動いているかもしれません。

ここでは、実パッケージの版を比べて「安全」と判定するのではなく、確認したリリースが、稼働先に反映されたかを見る架空例を使います。release-Bは、別に検証を済ませた目標のリリースという前提です。

実行する場合は、手元のNode.jsの練習用ファイルで試します。メモリ上の架空記録だけで、通信・インストール・デプロイは行いません。

function progress(record) {
  if (record.scan !== "ok") return "検査の確認が必要";
  if (!record.targetRelease) return "目標が未確認";
  if (!record.prMerged) return "修正を確認中";
  if (!record.runningRelease) return "稼働先が未確認";
  if (record.runningRelease !== record.targetRelease) return "反映待ち";
  return "反映を照合済み";
}
const targets = [
  { name: "本番", scan: "ok", prMerged: true,
    targetRelease: "release-B", runningRelease: "release-A" },
  { name: "確認環境", scan: "ok", prMerged: true,
    targetRelease: "release-B", runningRelease: "release-B" },
  { name: "別プロジェクト", scan: "failed", prMerged: true,
    targetRelease: "release-B", runningRelease: "release-B" },
];
for (const record of targets) console.log(record.name + ": " + progress(record));
本番: 反映待ち
確認環境: 反映を照合済み
別プロジェクト: 検査の確認が必要

最初の本番は、PRがマージされていても目標のリリースではありません。最後の対象は版の表示が一致しても、検査が確認できていないため、完了にはしていません。

「反映を照合済み」も、全脆弱性がないという意味ではありません。この例で確認しているのは、前提となる検査と、対象のリリースが合っていることだけです。実際には、修正した版、動作、検査結果、公表条件も確かめます。

どこまで終わった状態か、開いて比べる

PRをマージした

本番の反映は、まだ別の確認

リポジトリの変更が終わっても、ビルド・公開・起動中の版が変わったとは限りません。

検査結果が不明

検出0件とは扱わない

検査のエラーや対象外を確認します。未確認のまま、問題なしの記録にはしません。

稼働先まで照合した

その対象の反映を確認

確認したリリースと動作、元の問題の条件を照合します。ほかの環境や未知の問題まで保証するものではありません。

完了と数える対象を分けるための比較です。実際のプロジェクトの状態を判定する機能ではありません。

部品の更新から、利用者の動作までたどる

更新は、数字を新しくすれば終わる作業ではありません。互換性、つまり、これまでの呼び出し方やデータの扱いが引き続き使えるかも確かめます。

更新案内と差分を見て、依存の変更だけでなく、設定やAPIの変更、ロックファイルの変化を確認します。自分が直接指定していない部品なら、親のライブラリを更新することで修正版へ進める場合もあります。

修正したものを、本番で動くものまで届ける

  1. 差分と互換性を確認

    部品・設定・ロックファイルと動作の変化を見る。

  2. 検証して公開

    対象の操作を確かめ、リリースを識別する。

  3. 稼働先で照合

    本番の版・動作・解消確認を記録する。

PRをマージした状態と、稼働先の反映を別に確認します。

テストでは、更新した部分に関わる操作を確認します。認証の更新なら、ログイン成功だけでなく拒否も。保存の更新なら、書き込みと読み戻し、失敗時の扱いも見ます。テストが通っても、確認していない機能まで通ったとは言いません。

公開後は、本番のリリース、実際に動く実行環境、主要な操作、エラーや待ち時間を確認します。コンテナや常駐処理を使う場合、ビルドした新しいものと、起動中の古いものが混在していないかも調べます。

修正PRと、公開先の確認をつなげよう。

AIに修正を頼むときは、変更理由、対象の部品、検証結果、未確認の範囲まで出してもらいます。マージした記録と、どの公開先へ反映したかを別に残すと、途中で止まった対象が分かります。

新しい版が、上げてよい版とは限らない

更新の通知を見ると、「いちばん新しい版にすれば安心」と考えがちです。しかし、どの版へ進むかは、数字の大きさだけでは決められません。ここでは、更新先を選ぶときに見落としやすい4つの点を整理します。

実行環境は、提供元のサポート予定で選ぶ

分類:提供元の方針の公表。 Node.jsでは、長く保守される版をLTS(Long Term Support)と呼びます。Node.jsのリリース予定によると、v25までは奇数の版がLTSにならず、短い期間で保守が終わっていました。v25の保守終了は2026年6月1日です。

一方で、同じ資料には、v27からはすべての版がAlpha、Current、LTSの順に進むと書かれています。v27がLTSになる予定日は2027年10月20日で、資料にも「日付は変わる場合がある」と注記されています。

つまり、「奇数の版は短命」という覚え方は、v25までは合っていても、v27以降には当てはまりません。経験則は、提供元の方針が変わると古くなります。AIに更新先を提案してもらうときも、記憶ではなく、提供元の予定表を確かめてから答えてもらいます。

セキュリティ更新でも、大きな変更の提案が来ることがある

分類:脆弱性の公表。 CSSの部品の一つであるpostcss-selector-parserでは、GHSA-rj75-hqrm-r3gf(2026年10月5日公表、重大度は中)が公表され、修正版は7.1.6とされています。一方、Tailwind CSS 3は、この部品の6系を使う指定になっています。

このように、推移的依存を直すには、それを使う親の部品ごと大きく上げるしかない場合があります。Dependabotのセキュリティ更新でも、メジャー更新(互換性のない変更を含みうる更新)の提案が届くことがあるのはこのためです。

提案が届いたら、何の通知を直すための更新か、その更新で設定や書き方が変わるかを確かめます。ビルドが失敗したら、更新を無理に通さず、移行するか、別の方法で守るかを判断します。

同じ部品に複数の通知があれば、全部直る版を見る

一つの部品に、複数の脆弱性の通知が届くことがあります。通知ごとに修正版が違う場合、ある通知の修正版に上げても、別の通知は残ったままかもしれません。

次の例は、架空の部品「demo-image」に届いた3件の通知から、すべての通知が直る版を求めるものです。手元のNode.jsで、練習用のファイルとして試せます。通信やインストールは行いません。

const alerts = [
  { id: "通知1", fixedIn: "12.3.0" },
  { id: "通知2", fixedIn: "13.0.0" },
  { id: "通知3", fixedIn: null },
];
function newer(a, b) {
  const x = a.split(".").map(Number);
  const y = b.split(".").map(Number);
  for (let i = 0; i < 3; i++) if (x[i] !== y[i]) return x[i] > y[i] ? a : b;
  return a;
}
function versionFixingAll(list) {
  if (list.some((a) => !a.fixedIn)) return "修正版がまだない通知がある";
  return list.map((a) => a.fixedIn).reduce(newer);
}
console.log(versionFixingAll(alerts.slice(0, 2)));
console.log(versionFixingAll(alerts));
13.0.0
修正版がまだない通知がある

最初の結果は、12.3.0では通知2が残るため、全部が直るのは13.0.0だと示しています。2つ目は、修正版のない通知が1件でもあれば、版を上げるだけでは完了にできないことを示しています。その通知は、暫定的な対応と再確認日を決めて追います。

「当面上げない」設定は、理由と見直す日を残す

大きな変更を今は見送ると決めることもあります。Dependabotでは、設定ファイルのignoreで特定の更新を止められます。ただし、GitHubの設定リファレンスでは、ignoreはセキュリティ更新の提案にも影響する設定として示されています。

広く止めると、後で必要になる修正の提案まで届かなくなるおそれがあります。止める範囲は、版の範囲や更新の種類で絞ります。止める理由、根拠にした一次資料、見直す日も設定の近くに残します。設定で止まるのは提案(PR)で、通知そのものは別に確認できます。

表がはみ出す場合は、横にスクロールして読めます。

迷う場面 見るもの 判断の注意
実行環境の版を選ぶ 提供元のリリース予定(LTSと保守終了日) 「新しい」「偶数」などの覚え方で決めない
大きな変更の提案が来た 元の通知、移行ガイド、依存先が対応している範囲 セキュリティ更新だから安全な変更だと考えない
同じ部品に複数の通知 各通知の修正版 1件の修正版で全部直ったと数えない
当面上げないと決める 止める範囲、理由、根拠、見直す日 修正の提案まで止めていないか確かめる

その覚え方、いつの情報?

版の選び方やサポート期間は、提供元の方針で変わります。AIや自分の記憶が「いつもこう」と言ったら、提供元の予定表や更新案内で、今の情報か確かめてから決めます。

管理を整えた現場から、個人開発へ持ち帰る

2026年10月22日公開のanizozinaさん「脆弱性管理の仕組みを整えた」は、検知、判断、修復、本番での確認をつなぐ運用の報告です。事故の被害報告として紹介しているわけではありません。

複数のツールを集めたことよりも、元の検知から判断理由、修正、本番への反映までたどれるようにした点を、個人開発にも活かせます。原記事の社内期限や企業向けツール一式を、すべての読者の必須条件にはしません。

一人なら、既存のIssueなどへ次の項目をまとめるだけでも、次の確認につなげられます。

対象:架空の画像ライブラリ / 本番と確認環境
気づいた日:2026-10-24
判断:対象条件のうち、外部入力の経路が未確認
次:経路を調査し、修正版の互換性を確認する
担当・再確認:自分 / 次の確認日を決める
修正・公開:修正PR、リリース、稼働先の確認へリンク

新しいIssueへ移したり、次のリリースへ持ち越したりしても、最初に気づいた日と判断の経緯を消しません。通知を閉じたことと、修正したことも区別します。

通知を閉じる理由を、証拠とつなげる

  1. 対象の検知

    最初に気づいた日と元の情報を残す。

  2. 修正する

    修正PRと本番反映、確認結果へリンク。

  3. 影響なしと判断

    該当しない条件と根拠、見直す契機を残す。

  4. 未修復・未確認

    理由、暫定対応、担当、再確認日を決める。

通知の抑制や終了を、修復や解消の証明にしません。

一人の開発でも、3つの役割で見直す

知る人:対象と通知の状態を確かめる

何を検査し、どこへ通知が来るかを確認します。検査エラー、対象外、停止中のプロジェクトを見つけます。古い検査結果を、現在の全対象の結果として扱いません。

判断して直す人:根拠と差分を確認する

公式の影響条件、使っている版や経路、修正案と互換性を確かめます。AIの「影響なし」は、根拠のファイルや設定と照合します。判断できない場合は、提供元やレビューできる人へ相談します。

公開して維持する人:動くものと次の確認を見る

どの環境へ、どのリリースを反映したかを確認します。修正版待ちや暫定対応も、放置にならないよう再確認日を決めます。使わなくなった環境は、残す必要と管理する担当を見直します。

継続するための、小さな確認の輪

  1. 知る

    対象と通知の成否、未検査を確認。

  2. 判断して直す

    根拠と差分、互換性を確認。

  3. 公開して見直す

    稼働先と結果、残った対象の次の確認を決める。

一人で兼任しても、どの段階にいるかを分けると抜けを見つけやすくなります。

通知を閉じた理由を、後から説明できる?

修正した、影響がないと判断した、いまは修正版がない。どれも違う状態です。理由と証拠、次に見直す条件を残しておくと、同じ調査を繰り返す負担も減らせます。

対応完了とする前に確かめる

  • 対象: 直接・推移的な部品と、実行環境や補助的な処理を、確認した範囲として整理した。
  • 検知: 元の通知、検査の時点と成否、対象外を確認し、取得失敗を0件にしていない。
  • 判断: 対象条件と自分の利用を照合し、影響あり・なし・未確認の根拠を分けた。
  • 修正: 変更する部品と設定、ロックファイル、必要な動作のテストを確認した。
  • 本番: 修正PRだけでなく、公開したリリースと実際の稼働先を照合した。
  • 継続: 担当と次の確認日を決め、修正版待ちや保留した対象も追えるようにした。

次は、更新を公開まで運ぶ仕組みへ

具体的な実行環境の確認はNode.jsやPHPへ、AIレビューや通知は運用の教材へ進みます。すでに不正利用や漏えいが疑われる場合は、通常の更新待ちではなく異常時の対応で初動を進めます。

一次資料と参考記事

情報確認日:2026年10月25日。対象の部品・版・機能について、最新の提供元の公表と利用するツールの仕様を確認してください。

書いた人

マーケティングの現場から、AIをつくり、仕事で使う側へ。実際に試したことや、つまずいたことを、図解と具体例で伝えています。

この記事のURL:https://nekoai-lab.github.io/ai-security-playbook/learn/dependency-updates/

続けて読む

学習ルート · 全3記事のうち1記事目

次に読むClaudeの実装とCodexのレビューから、秘密を漏らさない通知と段階的な自動化を学ぶ。
読む順番・ルートを見る更新を運用につなげる
  1. 自分は直していないのに、更新が必要になるのはなぜ?
  2. 更新とAIレビューを運用につなげる
  3. Node.jsの更新を完了させるチェックリスト

更新・公開後の運用の教材へ戻る →