なぜ11行のコードが世界のビルドを一斉に壊せたのか
2016年、たった11行のnpmパッケージ「left-pad」の削除がBabelなど著名プロジェクトを巻き込みビルド不能を連鎖させた。犯人は行数でなく依存の連鎖構造にあったと分かる。
- 2016年3月、npmパッケージ作者Azer Koçuluがパッケージ名を巡るnpm運営との対立に抗議し、自作の全パッケージを一括削除。その中に文字列を指定長までパディングするだけの11行程度の関数「left-pad」が含まれていた。
- left-padはBabelをはじめ無数のプロジェクトが間接的に(推移的依存として)取り込んでいた基盤部品で、削除直後から世界中でビルドが一斉に失敗。npmは異例の対応としてパッケージを復元し数時間で収束させた。
- npmは以後、公開後に他から依存されたパッケージを単純削除できない方針へ変えた。少数の個人が支える基盤への集中という構造は、HeartbleedやXZ Utils事件にも形を変えて現れる。
結論:壊れたのは「行数」ではなく「依存の連鎖」
横にスクロール
left-pad事件が教えるのは、「11行しかない小さな関数が世界を壊した」という数字の意外性そのものではありません。本当の原因は、無数のプロジェクトが自分では意識すらしていない末端の1パッケージを、何層もの推移的依存を通じて共有していたという構造にあります。中心にあったコードの小ささは、この構造的な脆弱性を誰の目にも分かる形で可視化しただけの、いわば症状の表面にすぎませんでした。
当時の状況と競合:パッケージ名を巡る対立と、抗議としての一括削除
2016年当時のnpmは、パッケージ名を早い者勝ちで登録できる一方、名前の所有権を巡るトラブルへの調停ルールが今ほど整っていませんでした。開発者Azer Koçuluは複数の小さなユーティリティパッケージをnpmに公開していましたが、そのうちの一つが、メッセージングアプリを提供する企業Kikのプロダクト名と衝突。Kik側からの申し立てを受けたnpm運営がKoçuluのパッケージ名を移管する判断を下したことで、両者の対立が表面化しました。
この対応に納得できなかったKoçuluは、抗議の意思表示として自分がnpmに公開していた全パッケージを一括で削除(unpublish)するという行動に出ます。当時のnpmは、公開者が自分のパッケージをいつでも自由に削除できる設計になっていました。個人の作品を個人の判断で取り下げること自体は筋が通っています。問題は、削除されたパッケージ群の中に、文字列の先頭を指定の文字で埋めて長さを揃えるだけの、わずか十数行の関数left-padが含まれていたことでした。
left-padは単体では何のブランド力もない地味なユーティリティです。しかし当時のJavaScriptエコシステムでは、Babelのような広く使われるビルドツール自身がこれを間接的な依存先として取り込んでおり、開発者の多くは「自分のプロジェクトがleft-padに依存している」という事実をpackage.jsonを熟読するまで認識していませんでした。
決定打・経緯:削除から数時間で世界中のビルドが壊れ、npmが緊急復元
left-padがレジストリから消えた瞬間、これに依存する無数のパッケージのnpm installが「パッケージが見つからない」エラーで失敗し始めました。left-pad自身を直接使っていたプロジェクトはごく一部でも、Babelのように多層の依存ツリーの奥深くでこれを取り込んでいたツールが軒並み巻き込まれたため、影響範囲はJavaScriptエコシステムの広い範囲に一気に波及しました。CI(継続的インテグレーション)のビルドが世界中で赤くなり、SNS上では「11行のコードがインターネットを壊した」という文脈で瞬く間に話題になりました。
| 観点 | left-pad事件(2016) | 一般的な『よくあるビルド障害』 |
|---|---|---|
| 直接の引き金 | 作者本人による全パッケージの意図的な一括削除 | コードのバグ・設定ミス・インフラ障害 |
| 影響が広がった理由 | 推移的依存として無数のプロジェクトの奥深くに潜んでいた | 通常は依存関係が限定的で影響範囲も局所的 |
| 収束の速さ | npmが例外的に介入し数時間規模で復元 | 原因究明とデプロイに数日かかることも多い |
| 再発防止 | 一定条件を満たすパッケージの削除を制限するポリシー変更 | 個別障害ごとの対症療法にとどまりやすい |
事態を受けてnpm運営は、通常なら行わない例外的な判断として、Koçuluの意思とは別にleft-padパッケージ自体をレジストリ上で復元する措置を取りました。これによりビルド不能は数時間規模で収束しましたが、「公開者の意思に反してnpmがパッケージを復元した」という対応自体も、オープンソースの所有権とレジストリ運営者の権限を巡る新たな議論を呼びました。
left-padが仮に1000行のライブラリだったとしても、同じ場所に同じ依存構造で存在していれば同じ規模の障害は起きていました。行数の少なさは「こんな些細なものにここまで依存していたのか」という驚きを増幅させた演出要素であり、障害の直接原因は依存グラフにおける位置——多くのプロジェクトから間接的に参照される「ハブ」だったという事実——にあります。
この一件を受けて、npmは公開から一定時間が経過し、かつ他の公開パッケージから依存されているパッケージについては、作者であっても単純なunpublish操作を制限するようポリシーを改めました。個人の自由な削除権と、エコシステム全体の安定性のどちらを優先するかという線引きが、実際の障害を経てようやく明文化された形です。
今への影響と教訓:「バス係数」問題は今も終わっていない
left-pad事件が突きつけたのは、現代のソフトウェア開発が、ごく少数の—多くは無償の—個人が保守する基盤部品の上に、想像以上に大規模に積み上がっているという現実でした。あるプロジェクトの持続性が「特定の一人が興味を失ったら、あるいは燃え尽きたらどうなるか」という問い、いわゆるバス係数(bus factor)の低さに左右される構造は、この事件だけの特殊事情ではありません。
- 依存の「量」より「位置」が効く:直接依存が少なくても、推移的依存の奥に潜む1パッケージが多数のプロジェクトの共通経路になっていれば、そこが単一障害点になる。
- 『削除できる』設計は諸刃の剣:公開者の自由を尊重する設計は健全だが、影響範囲が大きくなった依存先ではエコシステム全体への配慮とのバランスが必要になる。left-pad事件後のnpmのポリシー変更はその調整の一例。
- 同じ構造は形を変えて繰り返す:少人数体制での維持というリスクは、実装の欠陥として露呈すればHeartbleedのような脆弱性に、悪意ある侵入を許せばXZ Utilsバックドアのような供給網攻撃になる。left-padはその中でも「作者の一存で善意の削除をしただけ」という最も穏当なきっかけで起きた点が異質。
依存グラフの奥に潜むリスクを可視化する仕組みや、パッケージのロックファイル・レジストリの仕組みそのものについてはプログラミング、少人数運営のOSSが結果的に攻撃対象になった経緯は脆弱性シリーズ、CI/CDパイプラインの設計や依存関係の固定・監査の実務はDevOpsの各トピックを参照してください。
- 直接の引き金は、パッケージ名を巡るnpm運営との対立に抗議した作者自身による全パッケージの一括削除(2016年3月)。攻撃や脆弱性ではない。
- 被害が広がった本質的な原因は、left-padが多数のプロジェクトの推移的依存の奥深くに位置する「ハブ」だったこと。行数の少なさは主因ではない。
- npmはこの事件を機に、公開済みで他パッケージから依存されているパッケージの削除を制限するポリシーへ変更した。
- 「少数の個人・少人数体制が広く依存される基盤を支える」という構造的リスクは、HeartbleedやXZ Utilsバックドアにも共通する視点である。
一段で言うと
left-pad事件は、パッケージ名を巡る対立への抗議として作者が自分の全作品を削除したところ、その中の十数行の小さな関数が実は無数のプロジェクトの依存の奥深くで使われており、世界中のビルドが数時間規模で連鎖的に壊れたという出来事でした。壊れた理由はコードの短さではなく依存グラフ上の位置であり、少数の個人が支える基盤に大規模なエコシステムが乗っかっているという構造は、形を変えながら今も繰り返されています。
なぜ?の記事ガイド
なぜ11行のコードが世界のビルドを一斉に壊せたのかを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
npm
比較で見る軸
難易度: advanced / カテゴリ: なぜ? / タグ数: 6
導入後に効く点
left-padはBabelをはじめ無数のプロジェクトが間接的に(推移的依存として)取り込んでいた基盤部品で、削除直後から世界中でビルドが一斉に失敗。npmは異例の対応としてパッケージを復元し数時間で収束させた。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- なぜ?
- タグ数
- 6
判断チェックリスト
- 自社の用途が「npm / サプライチェーン」に近いか確認する。
- 強みである「2016年3月、npmパッケージ作者Azer Koçuluがパッケージ名を巡るnpm運営との対立に抗議し、自作の全パッケージを一括削除。その中に文字列を指定長までパディングするだけの11行程度の関数「left-pad」が含まれていた。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。