npm などのサプライチェーン攻撃に、どう備えますか

乗っ取られたパッケージや名前の似た偽物が入り込む危険を説明し、lockfile で固定する、依存を減らす、更新を管理する、インストール時の処理と CI の権限を絞る、と答える問い。

答えてみる

面接官に「npm などのサプライチェーン攻撃に、どう備えますか」と聞かれたつもりで、答えを見る前に自分の言葉で答えます。

声に出して答えた人は「書かずに答えを見る」で開けます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「npm などのサプライチェーン攻撃に、どう備えますか」
  • 「使っているパッケージが乗っ取られたら、どうなりますか」
  • 「依存のパッケージの更新は、どう回していますか」

面接官が見ている点

  • 自分で書いたコード以外から入ってくる危険を、具体的に言えるか
  • 「固定する」と「更新する」の両方を、仕組みとして回せるか
  • CI の秘密の値や権限まで、守る範囲に入れているか

短い答え

  • サプライチェーン攻撃は、使っているパッケージが乗っ取られたり、名前の似た偽物を入れてしまったりして、悪い処理が自分のアプリに入り込む攻撃です。
  • lockfile で入る版を固定し、要らない依存は減らし、Dependabot や Renovate のような道具で更新を見える形で回します。
  • インストールのときに走る処理を絞り、CI に渡すトークンは要る分だけの権限にして、入り込まれたときの被害を小さくします。

少し詳しい答え

どこから入り込むか

  • 乗っ取り人気のパッケージの作者のアカウントが奪われ、悪い処理を足した新しい版が出されます
  • 名前の似た偽物 react を raect と打ち間違えるような名前で、偽物が置かれています
  • 依存の依存自分が直接入れた物ではなく、その中で使われている物が狙われます

npm のパッケージは、インストールのときに処理を走らせる仕組み (install のスクリプト) を持てるため、入れた瞬間に手元や CI の秘密の値を読まれることがあります。

固定して、見える形で更新する

ターミナル

# lockfile のとおりに入れる (勝手に版を上げない)
npm ci

# インストールのときのスクリプトを走らせない
npm ci --ignore-scripts

# 知られている脆弱性を調べる
npm audit

lockfile (package-lock.json など) は、依存の依存まで含めて、どの版のどの中身を入れたかを記録した物です。CI では lockfile のとおりに入れる形を使い、勝手に版が上がらないようにします。

一方、固定したままだと、直された版を取り込めません。更新の提案を自動で出す道具を使い、変更点を読んでテストを通してから取り込みます。出たばかりの版はすぐ入れず、少し待ってから入れる設定にする手もあります。

被害を小さくする

  • CI に渡すトークンは、そのジョブに要る権限だけにします (最小権限)
  • 秘密の値は、それが要るジョブにだけ渡します
  • 本番に入れる依存と、開発のときだけ使う依存を分けます

トレードオフ

依存を減らすと入り込む口は減りますが、自分で書いて保守する量が増えます。暗号や日付の扱いのように、自分で書くと間違えやすい所は、実績のあるパッケージに任せるほうが安全です。インストールのときのスクリプトを止めると、ビルドに要る処理まで止まるパッケージもあるので、要る物だけを許す形にします。

よくある間違い

  • lockfile をリポジトリに入れない人や CI ごとに違う版が入り、何が入ったか後から追えません
  • 固定したまま何年も更新しない直された脆弱性を取り込めません。固定と更新は組で回します
  • CI に強い権限のトークンを渡したままにする 入り込まれたとき、本番や公開の権限まで奪われます

深掘りの問い

  • 「npm install と npm ci は何が違いますか」 npm ci は lockfile のとおりに入れ、合わなければ止まる、と答えます
  • 「脆弱性の通知が大量に来たら、どう選びますか」本番で実際に呼ばれる所か、外から届く所かで優先を決める、と答えます
  • 「入れる前に、パッケージの何を見ますか」保守が続いているか、利用者の数、依存の多さ、名前の綴りを見る、と答えます

確認日 2026年10月24日

技術面接問題の一覧へ戻る