読者の皆様へ、
今週は奇妙な一週間でした。ここ数ヶ月、私たちは一連の重大なサプライチェーン攻撃を目にしてきました。コミュニティはしばらく前から警鐘を鳴らしており、実のところ、私たちは薄氷の上を歩いているような状態でした。より大規模で、より悪い何かが起こることは避けられないように感じられます。
この投稿では、今週の主要な教訓をいくつか共有したいと思います。私はJosh Junon(Qixとして知られています)と座って、この苦難の最中での彼の経験についてインタビューする機会がありました。Joshはフィッシング攻撃で侵害されたメンテナーであり、npmエコシステムで最も広く使用されているパッケージのいくつかにも関わっています。
その会話に入る前に(インタビューは以下を参照)、ここに至るまでの出来事を簡単に振り返ってみましょう。
プロローグ - 影響
月曜日、社内のAikido Intelダッシュボードで最初にアラートを見たとき、これは夜も眠れないような最悪のシナリオの一つになり得ることがすぐに明らかになりました。debugやchalkといった主要なパッケージを含む16のパッケージがマルウェアに感染していました。その潜在的な影響は壊滅的としか言いようがありませんでした。
数字が物語っています:
- 総合的に見て、侵害されたパッケージは毎週26億回ほどダウンロードされています。
- JFrogの推定では、悪意のあるバージョンだけでもおよそ260万回ダウンロードされました。
- Wizは、彼らのクラウド環境の99%がこれらのパッケージの少なくとも1つに依存しており、10%のケースで悪意のあるコードが存在していたと報告しました。
どのような尺度で見ても、これは危機一髪でした。多くの人が指摘しているように、私たちは間一髪で危機を回避しました。被害がはるかに悪化しなかった唯一の理由は、次の2つの要因に集約されます。
- 攻撃者は暗号通貨の窃盗に集中していました。
- 彼らは検出されないようにあらゆる努力をしました。
しかし、歴史は、その幸運がいかに脆いものであるかを私たちに教えてくれます。攻撃者が実行においてより注意を払わなかった場合に何が起こるかを見るには、2025年8月26日を振り返るだけで十分です。
プロローグ - Nxの侵害
8月26日、Nxパッケージマネージャーが侵害されましたが、攻撃者はこれまでとは全く異なる手口を選びました。
- 彼らは開発者マシンからシークレットとトークンを抜き出し、GitHubに公開しました。
- 彼らはそのトークンを使用してGitHubアカウントに侵入し、プライベートリポジトリを公開状態にしました。
これは典型的な「スマッシュ・アンド・グラブ」(強奪)でした。広く利用されているパッケージの侵害は、単なる不便さにとどまらないという厳しい警告です。それは現実的で永続的な損害を引き起こす可能性があります。多くの点で、それは私たちがどれほど無防備であるかを示す警告射撃でした。
ジョシュとの対話
侵害についてジョシュに警告し、その後も会話を続ける中で、私の同僚のマッケンジーと私は、彼と直接会って、この経験がどのようなものであったかを直接聞くことは非常に興味深いだろうと気づきました。幸いにも、ジョシュはそれに応じてくれました。

その後、私に深い印象を残した思慮深く率直な対話が行われました。ここでは、その中で私が得た最も重要な学びをいくつか共有したいと思います。全体の文脈を知りたい場合は、45分間のディスカッション全体をこちらでご覧いただけます。
インサイト:脆弱性を通じた信頼
セキュリティは通常、脆弱性を排除することです。しかし、オープンソースにおいては、脆弱性があるからこそ信頼が成り立ちます。メンテナーは自身のコードと、その一部を世界に公開し、何十億ものダウンロードと無数のユーザーにさらします。その公開には、信頼に基づく飛躍が必要です。
ジョシュがフィッシング詐欺に遭った経緯を率直に語った時、彼は信頼を実際に強化する種類の脆弱性を示しました。過ちを認め、透明性を保ち、コミュニティとの関わりを続けることで、オープンソースが顔のない企業ではなく、人々によって運営されていることを私たちに思い出させました。そして、その人々への信頼こそが、システム全体を機能させるのです。
結局のところ、セキュリティは脆弱性を排除しようとしますが、オープンソースへの信頼はその脆弱性の上に築かれているというパラドックスがあります。
大きな違いを生んだのは、一般的な反応だったと思います。脆弱性が評価されたことは何度か指摘されていました。そして、それは以前から知っていたと思います。オープンソースで、セキュリティ面ではなく、ただ透明性と誠実さを示すことで、多くの人々の頭痛の種、時間、お金をすぐに節約できたケースがいくつかありました。そして、それは常に高く評価されます。
インサイト:オープンソースへの傾倒
ジョシュはJavaScriptエコシステムの柱となることを目指していたわけではありませんでした。彼は10代の頃にコーディングを始め、PHP、C#、JavaScriptを試しており、オープンソースは彼が興味を持ったプロジェクトを共有する場に過ぎませんでした。ターミナルに色を追加したり、小さなユーティリティを構築したりすることに惹かれていましたが、それらが現代のソフトウェアの中核をなすことになるとは想像もしていませんでした。
時間が経つにつれて、彼の貢献はより大きな責任へとつながりました。Chalkのような一部のライブラリでは、修正に貢献した後、メンテナーとして参加するよう招待されました。Debugのような他のライブラリでは、以前のメンテナーから管理を引き継ぎました。楽しみのためのいじくり回しとして始まったものが、徐々にエコシステムで最も広く利用されているパッケージのいくつかを維持することへと発展していきました。
数年後、ジョシュは毎週数十億回のダウンロードを担う責任を負うことになりました。かつては小さなサイドプロジェクトだったものが、重要なインターネットインフラとなりました。それは綿密な計画や野心によるものではなく、単に適切な時に適切な場所にいて、助けを求められたときに「はい」と答えた結果でした。
それらはますます多くの場所で使われるようになり、おそらく本来使われるべきではなかった場所でも使われました。正直なところ、それらのパッケージのいくつかは全く存在すべきではなく、私が最初にそれを認めます。そしてある日、目が覚めると、配列の値を移動させるために書いた小さなユーティリティが55,000人に使われ、毎週3億回ダウンロードされていることに気づきます。そのような責任を求めたことは一度もありませんでした。
インサイト:制御を失う無力感
ジョシュにとってこの事件で最も辛かったのは、自分がフィッシングに遭ったと気づいたことではなかったかもしれません。それは、その後に続く無力感でした。攻撃者が彼のパスワードと2FAコードを手に入れた途端、npmの目には彼らが実質的にジョシュ自身と映りました。彼らは2FAトークンをリセットし、認証情報を変更し、彼自身のアカウントから締め出しました。パスワードのリセットやアクセス回復といった基本的な操作さえも機能しませんでした。
約12時間もの間、ジョシュは自身のパッケージの悪意あるバージョンがインターネット中に拡散していくのを、ただ外から見ていることしかできませんでした。彼には直接介入する手段も、押すべきボタンも、npmサポートへの迅速な連絡チャネルもありませんでした。その代わりに、彼は公開のヘルプフォーラムに頼り、待つしかありませんでした。
無力感が彼に強く残りました。彼が言うには、透明性がなく、危機に瀕したメンテナーが制御を取り戻すためのツールもありませんでした。最近の記憶にあるサプライチェーンの侵害の中でも最大級のものの最中に、それらのパッケージを最も信頼されていた人物は傍観するしかありませんでした。
パスワードリセットボタンが機能しませんでした。この間、メールは一切届きませんでした。パスワードリセットは何も効果がありませんでした。そのため、アカウントのメールアドレスが以前と同じだったとしても(私はそう信じていますが)、パスワードリセットは機能していませんでした… 公開されている非認証のヘルプフォームを通じてnpmに連絡する以外に、対処法はありませんでした。
インサイト:危機一髪の回避
chalk、debug、およびその他の侵害されたパッケージに仕込まれたマルウェアは深刻でしたが、その範囲は奇妙なほど狭いものでした。ブラウザのコンテキストに自身を注入することで、暗号通貨を盗もうとしました。攻撃者によるその決定が、貪欲さからか近視眼的なものからかは不明ですが、被害がはるかに悪化しなかった唯一の理由です。
ジョシュが言うように、これは簡単に壊滅的な事態になり得ました。これらのパッケージは、ラップトップ、エンタープライズサーバー、CI/CDパイプライン、クラウド環境など、あらゆる場所で実行されます。AWSキーを抜き取ったり、シークレットを漏洩させたり、ファイルをランサムウェアで暗号化したりしていた可能性があります。しかし、攻撃者は一つの狭い目標に限定しました。
それは何でも実行可能であり、企業のマシン、個人のマシン、中小企業、CI/CDパイプライン上で実行されていました。そして、それが(それ以上)何も悪いことをしなかったという事実は、私たちが回避した危機でした。
この教訓は、システムが機能したということではありません。今回は運が味方したということです。「大したことではない」と捉えるのは、本質を見誤っています。次の攻撃者は、これほど抑制的ではないかもしれません。
インサイト:オープンソースの人道的コスト
広く利用されているすべてのパッケージの背後には、多くの場合、静かに、そして目立たずに活動している人間がいます。ジョシュにとって、最も困難だったのは技術的な侵害だけではありませんでした。それに続く精神的な負担でした。彼は初日を純粋なオートパイロット状態と表現し、被害を食い止めようと奔走しました。その後になって初めて、その重みが彼を襲いました。恥ずかしさ、不安、そして自分の過ちが人々を傷つけたかもしれないという不穏な考えです。
それは月曜日のことでした。その日の午後か夕方にアカウントを取り戻すと、「よし、これでスイッチを切って、ベッドに横たわって天井を見つめ、何が起こったのかを考えることができる」という気持ちになりました… 翌日はただただ恥ずかしさでいっぱいでした。顔を見せたくありませんでした。外に出たくありませんでした。
これがオープンソースの隠された現実です。「楽しみのために」作られた小さなプロジェクトが、何十億ものダウンロードを伴う重要なインフラとなります。メンテナーはその責任を求めたわけではありませんが、問題が発生した際にはそのストレスを負います。コミュニティはコードを見ますが、それを維持するための人道的コストを見落としがちです。
ジョシュの経験は、エコシステムセキュリティがより強力なMFAや迅速なインシデント対応だけではないことを思い出させます。それはまた、この責任を負うメンテナーをサポートすることでもあります。境界を尊重し、共感を示し、信頼がコードの背後にいる人々に依存していることを認識することです。
行動喚起
このインシデントは、単一の侵害がソフトウェアサプライチェーン全体にどのように波及するかを浮き彫りにしました。今回は壊滅的なものではありませんでしたが、容易にそうなり得ました。教訓はパニックになることではなく、行動することです。
- レジストリ(npm、PyPIなど)の場合: 影響力の大きいメンテナーに対してフィッシング耐性のあるMFAを強制し、アカウントが侵害された際には明確で迅速な対応チャネルを提供してください。
- 組織向け: 依存関係の衛生状態を改善します。バージョンを固定し、改ざんを監視し、サプライチェーンセキュリティチェックをCI/CDパイプラインに統合します。
メンテナー向け: ハードウェアキーを使用し、ストレス下での性急なセキュリティ決定を避け、問題が発生した場合は透明性を重視してください。 - コミュニティの場合: オープンソースの背後にいる人々をサポートしましょう。彼らの境界を尊重し、可能な限りリソースを提供し、間違いが起こった際には共感を持って対応しましょう。
真の行動喚起はシンプルです。エコシステムセキュリティを共有責任として捉えることです。プラットフォーム、企業、コミュニティのすべてが、次のインシデントがさらに悪い事態にエスカレートしないようにするために果たすべき役割を持っています。
エピローグ
多くの報道と注目を集め、正当な理由があったとはいえ、嵐の目の中にいるような現実離れした一週間でした。ダッシュボードでの最初のアラートから大量の公開レポートに至るまで、リアルタイムで事態が展開するのを見るのは、足元の地面が変動する断層線の上に立っているような感覚でした。これは、私たちのエコシステムがいかに脆弱であるかを改めて認識させるものです。
展開された事態は、私が日々オープンソースセキュリティで懸念している最悪のシナリオに不快なほど近いものでした。しかし、私が最も恐れているのは、フィッシングメールやマルウェア、あるいは見出しそのものではありません。この瞬間を変化なしにやり過ごしてしまうことです。
業界がこの出来事を単なる別のインシデントとして軽視し、通常業務に戻ってしまうなら、私たちは何も学ばないでしょう。そして次回、次回は必ず来るのですから、私たちはこれほど幸運ではないかもしれません。最初は攻撃者の恥。二度目は私たちの恥です。
そして、このことから学ぶための対策を講じなければ、オープンソースにおける信頼の静かな浸食が、最も破壊的な結果となるかもしれません。

