サプライチェーン攻撃を学ぶ会2025秋の振り返り
以下は/Nota/サプライチェーン攻撃を学ぶ会2025秋の振り返りからのほぼコピペです
サプライチェーン攻撃を学ぶ会 2025秋を振り返るshokai.icon
Deep Researchで自分が知らない分野を調査し、Cosenseに書いて理解する等の方法で作ったページ郡と、それらを一旦まとめた文芸的データベース4つぐらいを眺めながらしゃべりまくった
https://scrapbox.io/files/68e3c658bbbd640ebbd299e2.png
Google meetsの文字起こしと、発表資料 + 事例集や対策方法のSmart Context3つをGemini 2.5 proに渡して、何度かディスカッションしたらすごいわかりやすくなった
ダイジェストレポートのダイジェストレポート
対策は、寝かせる・隔離・検知の3つである
寝かせる
リリース直後のライブラリをインストールしない
隔離
開発環境をコンテナ化し、ホストとDocker内を分離
開発環境とproductionの設定値を分離し、ダメージコントロールする
検知
予防検知
コード自体の静的解析
ライブラリ開発側の、プロジェクト運営体制の評価
ランタイムセキュリティ
実行時の不審・不正な振る舞いを検出する
パッチバージョン更新を3日寝かせるさえ徹底すれば、実はgithub security alert + dependabot等でかなり防御できると思っているshokai.icon
この検知はコードだけでなくライブラリ開発者の行動も含めた静的解析
クラウドの複数のSaaSや、CVEやOpenSSFスコアカードやsnyc等の連携でより精度があがると思う
これは、かなり「寝かせる」さえ徹底すれば効果が出てくる
この検知をすり抜けてくるケースに対しては、まずダメージコントロールを考えたい
クラウドの複数SaaS + DBの連携した検知網を抜けてきた攻撃を、ローカルマシンで、実行前に検知できるとは考えないほうがいい
最悪は、汚染されたライブラリがproductionサーバーまで到達する事である
ローカル開発環境で、実際の攻撃が発生した時点。ここで検知したい
堅牢な設定にした上で、寝かせて、最後は開発環境でCrowdStrike FalconやFalcoなどのランタイムセキュリティに期待する
こいつらの挙動確認したい
という世界観を持って発表資料を見て回ると、さらにめちゃくちゃわかってくると思いますshokai.icon
ダイジェストレポート
2025年10月2日、ソフトウェア開発における喫緊の課題である「サプライチェーン攻撃」をテーマにした勉強会が開催されました。本レポートでは、その内容をダイジェストでお届けします。
死守すべきライン:2種類の「検知」を軸にした防衛戦略
勉強会では、サプライチェーン攻撃に対する我々の基本的な防衛戦略が共有されました。それは、2種類の「検知」を使い分けるという考え方です。
1. クラウドでの静的解析による「予防検知」
まず、パッチバージョンの更新を3日間「寝かせる」というプラクティスを徹底するだけで、防御の大部分は達成できると考えられます。
ライブラリがリリースされると、GitHub Security AlertsやDependabotといったクラウドサービスが、コードだけでなくライブラリ開発者の行動も含めた静的解析を実施します。これらの検知は、CVE、OpenSSF Scorecard、Snykといった複数のサービスが連携することで、より精度が高まります。つまり、「寝かせる」という時間的猶予が、クラウド側の検知能力を最大限に引き出す鍵となります。
2. 手元でのランタイムセキュリティによる、ダメージコントロール
次に、このクラウドの検知網をすり抜けてきた、より巧妙な攻撃に対してはダメージコントロールを最優先に考えます。
高度な静的解析をすり抜けてきた攻撃を、ローカルマシンの実行前スキャンで検知できると考えるのは現実的ではありません 。最悪のシナリオは、汚染されたライブラリが検知されないままプロダクション環境に到達してしまうことです。
そこで、ローカルの開発環境で実際に攻撃が発生した瞬間を検知することが重要になります 。この役割を担うのが、CrowdStrike FalconやFalcoといったランタイムセキュリティツールです。これらのツールで実行時の不審な挙動を監視することで、プロダクションに至る前の最終防衛ラインを構築します。
代表的なサプライチェーン攻撃の事例
会では、過去に発生したいくつかのインシデントが紹介されました。
xz utils 5.6.0と5.6.1にはバックドアが仕掛けられている: 3年もの歳月をかけてOSSコミュニティの信頼を勝ち取った攻撃者が、じっくりとバックドアを仕込んだという、まるでスパイ映画のような事件です 。ビルドが一瞬遅いという僅かな違和感から発見に至った経緯も紹介され、検知の難しさが浮き彫りになりました 。
colors npmご乱心: OSS開発者が経済的困窮から自身の有名ライブラリに悪意のあるコードを混入させた事件です 。これは、OSSと開発者の持続可能性という、技術だけでは解決できない根深い問題を提起しました 。
eslint-config-prettierやstylusなど大量のnpmライブラリにマルウェアが仕込まれていた (2025/7): 開発者のアカウントがフィッシング詐欺によって乗っ取られ、多数の人気パッケージが汚染された事例です 。npnjs.comやsupport@npmjs.helpといった巧妙な偽装メールが手口として紹介されました 。
Nxリポジトリへの攻撃 s1ngularity: GitHub Actionsのワークフローの脆弱性を突かれ、プルリクエストのタイトル経由でスクリプトを実行されてトークンが窃取された事例です 。AIに生成させたコードの脆弱性が見過ごされたことが原因の一つとされています 。
これらの事例から、攻撃がもはや他人事ではなく、すぐ隣にある脅威であることが共有されました。
サプライチェーン攻撃の事例に、他の事例もまとめてますshokai.icon
攻撃はどのように成立するのか?技術的背景
サプライチェーン攻撃が成功する背景には、パッケージマネージャの便利な機能が悪用されるケースが多くあります。
特にnpmのライフサイクルスクリプト(npm preinstall, npm postinstallなど)は、本来ネイティブモジュールのコンパイルなどのために用意された機能ですが、任意のUNIXコマンドを実行できるため、攻撃の温床となり得ます 。
悪意のあるコードは、インストール時に直接実行されるだけでなく、.git/hooks/のような場所に潜伏し、gitコマンド実行時など、後から開発者の意図しないタイミングで発火する可能性も指摘されました。
巧妙ではあるけど、魔法のようなとんでもない事が起きているわけではない事がご理解いただけたと思いますshokai.icon
詳細は発表資料へ
サプライチェーン攻撃はどのようにして成立するか(ライブラリ利用者側)
サプライチェーン攻撃はどのようにして成立するか(ライブラリ開発者側)
私たちが取るべき対策:「寝かせる・隔離する・検知する」
単一の完璧な解決策はなく、複数の対策を組み合わせた多層防御が重要です。
対策の考え方を「寝かせる」「隔離する」「検知する」の3つのキーワードで整理することが有効です。
サプライチェーン攻撃への対策(ライブラリ利用者側)に全リストがありますshokai.icon
寝かせる:リリース直後のライブラリをインストールしない
多くの攻撃は、ライブラリが公開されてから数時間〜数日以内に発覚し、取り下げられます。
以下の設定を活用し、リリースされたばかりのパッケージをすぐに導入しない「寝かせる」運用が極めて有効です。
dependabotのcooldownオプション
renovateでminimumReleaseAgeを設定してnpmのパッケージの公開直後に起きる問題を回避する
pnpmのminimumReleaseAge
72時間(3日間)が一つの目安とされています
隔離:開発環境をコンテナ化する
開発環境をDockerコンテナ内に隔離することで、万が一マルウェアが実行されても、その影響範囲をコンテナ内に限定できます。ホストマシン上のSSHキーや各種設定ファイルへのアクセスを防ぐ効果が期待できます。
検知:不審な振る舞いを監視する
CrowdStrike Falcon: ホストOS上での不審な挙動(例:ブラウザのCookieを盗む)を検知・ブロックする役割を担います。
Falco: コンテナ環境に特化したランタイム脅威検出ツールです 。Linuxのシステムコールを監視することで、CrowdStrikeが見ることのできないコンテナ内部の不審なファイルアクセスやネットワーク接続を検知し 、プロダクション環境へのマルウェア混入を防ぐ最後の砦として期待されます。
予防検知のプラクティス
pnpmの採用: 依存関係のバージョンを効率的に効率的にまとめ、インストールされるパッケージ数を減らすことで、攻撃対象領域(アタックサーフェス)を削減する効果があります 。
Node.jsの権限モデル: --experimental-permissionフラグを使い、プロセスごとにファイルシステムやネットワークへのアクセス権限を最小限に絞ることで、悪意のあるコードの活動を制限できます 。
Dependency Pinning: package.jsonのバージョン指定を^や~といった範囲指定ではなく、固定バージョンにピン留めすることで、意図しないバージョンのインストールを防ぎます 。
堅牢化だけうまくまとめれなかったshokai.icon
隔離でもあるし、予防検知の方法でもあるような気もする
単なる手法の1つかもしれない
ディスカッションハイライト
会の中では、参加者から活発な質疑応答や意見交換が行われました。
Q. minimumReleaseAgeを皆が設定すると、逆に攻撃の発覚が遅れるのでは?
A. 静的解析サービスによる検知も行われているため、一概にそうとは言えません 。ただし、xz utils 5.6.0と5.6.1にはバックドアが仕掛けられているの事例のように、高度な解析でしか見抜けない攻撃もあるため、完全な銀の弾丸ではないでしょう 。
Q. pnpmへの移行はすべきか?
A. minimumReleaseAgeは手動インストール時に特に有効ですが、既存の成熟したプロジェクトではライブラリはdependabotやrenovateで更新するので、手動インストールの機会は少ないかもしれません。新規プロジェクトでの採用は有力な選択肢です。標準のnpmにも同様の機能が追って実装されることを期待する声もありました 。
Q. safe-npmのようなコマンドラッパーは信頼できるのか?
A. 便利そうですが、そのツール自体が乗っ取られた場合のリスクも考慮する必要があります 。開発元が信頼できるかが一つの判断基準になるでしょう 。
サプライチェーン攻撃を学ぶ会 2025秋の下の方で、他にもたくさんディスカッションしていますshokai.icon