1. アリアン5ロケットの爆発(1996年)
欧州宇宙機関(ESA)のアリアン5ロケットは、打ち上げ37秒後に爆発した。原因は、64ビット浮動小数点数を16ビット整数に変換する際のオーバーフロー。この変換処理はアリアン4から流用されたもので、アリアン5の高速な飛行パラメータには対応していなかった。
教訓:コードの再利用には、新しい環境での動作検証が不可欠。型の安全性は命に関わる。
2. ナイトキャピタルの45分間4.6億ドル損失(2012年)
米国の高頻度取引会社ナイトキャピタルは、ソフトウェアのデプロイミスにより、45分間で4億6,000万ドルの損失を出した。古いテストコードが本番環境で実行され、意図しない大量の取引が発生した。
教訓:デプロイプロセスの自動化と、ロールバック手順の整備が不可欠。テストコードが本番に混入しない仕組みを。
3. Heartbleed(2014年)
OpenSSLの深刻な脆弱性Heartbleedは、TLSのハートビート機能の実装バグが原因だった。バッファの境界チェックが欠落しており、サーバーのメモリ内容(パスワード、秘密鍵を含む)が漏洩する可能性があった。全世界のWebサーバーの約17%が影響を受けた。
教訓:セキュリティクリティカルなコードには厳密なコードレビューと自動テストを。オープンソースの重要インフラには十分なリソースを。
4. Y2K(2000年問題)
西暦2000年を迎える際、年を2桁で管理していたシステムが「00」を1900年と誤認識する問題。世界中で推定3,000億ドル以上の対策費用が投じられた。
教訓:短期的な最適化(メモリ節約のための2桁年)が、長期的に巨大なコストを生む。設計時にスケーラビリティを考慮すべきだ。
5. Therac-25 放射線事故(1985-1987年)
放射線治療装置Therac-25のソフトウェアバグにより、患者に致死量の放射線が照射される事故が複数回発生した。レースコンディション(競合状態)が原因で、少なくとも6人が過剰照射を受け、3人が死亡した。
教訓:ソフトウェアの安全性はハードウェアのフェイルセーフに依存してはならない。人命に関わるシステムの検証は徹底すべきだ。
6. Mars Climate Orbiter の墜落(1999年)
NASAの火星探査機Mars Climate Orbiterは、ヤード・ポンド法とメートル法の変換ミスにより火星の大気圏に突入して消失した。ロッキード・マーティンがポンド力秒で計算した推力データを、NASAがニュートン秒として処理した。3億2,800万ドルの損失。
教訓:インターフェースの仕様を明確に文書化し、単位の不一致を自動検出する仕組みを導入すべきだ。
7. 東京証券取引所のシステム障害(2020年)
2020年10月1日、東京証券取引所のarrowheadシステムが終日停止した。共有ディスク装置の故障時にバックアップへの切り替え(フェイルオーバー)が正常に作動しなかったことが原因。
教訓:フェイルオーバーの動作は、定期的に本番に近い環境でテストすべき。冗長構成は「設定しただけ」では不十分。
8. Log4Shell(2021年)
Javaの広く使われたログライブラリLog4jにリモートコード実行の脆弱性が発見され、世界中のサーバーが影響を受けた。JNDI Lookupの入力値を適切にサニタイズしていなかったことが原因。
教訓:依存ライブラリの脆弱性は自社のリスク。SBOM(Software Bill of Materials)による依存関係の管理が重要だ。
9. Cloudflareの大規模障害(2019年)
Cloudflareの正規表現ルールのデプロイにより、全世界のCDNが約30分間ダウン。「.*.*=.*」という正規表現が、バックトラッキングによりCPU使用率100%を引き起こした。
教訓:正規表現の計算量爆発に注意。カナリアデプロイやステージドロールアウトの重要性を再認識する事例だ。
10. CrowdStrikeのブルースクリーン障害(2024年)
セキュリティ企業CrowdStrikeのFalconセンサーアップデートにより、世界中のWindows PCがブルースクリーンでクラッシュ。航空会社、病院、銀行など社会インフラに大きな影響を与えた。
教訓:カーネルレベルで動作するソフトウェアのアップデートには、より慎重なテストとロールアウト戦略が必要。単一障害点の排除を。
バグは避けられない。だからこそ
バグを完全に防ぐことは不可能だ。しかし、過去のバグから学ぶことで、同じ失敗を繰り返すリスクは大幅に減らせる。
型安全性、コードレビュー、自動テスト、カナリアデプロイ、フェイルオーバーテスト。これらは「面倒な作業」ではなく、歴史が教えてくれた「保険」だ。あなたのコードベースには、十分な保険がかけられているだろうか。