概要
- Apollo Guidance Computer (AGC) のコードに、57年間見逃されていたバグを発見
- Allium という行動仕様言語を用いてAGCのIMUサブシステムを形式的に検証
- バグは LGYROリソースロック の解放漏れによるもので、特定のエラーパスで発生
- バグが発現すると ジャイロ操作が完全に停止 し、復旧にはリセットが必要
- 現代のプログラミング にも通じるリソース管理の重要な教訓
AGCコードベースの歴史と注目
- Apollo Guidance Computer (AGC) は最も精査されたコードベースの一つ
- 2003年にRon Burkeyとボランティアが MIT Instrumentation Laboratory の印刷リストから手作業でコードを転記
- 2016年、Chris Garryの GitHubリポジトリ が話題となり、多数の開発者がAGCのアセンブリコードを閲覧
- AGCは 2KBの消去可能RAM、 1MHzのクロック、 74KBのコアロープメモリ を搭載
- コアロープメモリは手作業で銅線を磁気コアに通して作成
- 作業者は"Little Old Ladies"、メモリ自体はLOL memoryと呼ばれた
- Ken Shirriffによる回路レベルの解析、Virtual AGCプロジェクトによるエミュレーションとバイト単位での検証
- これまで 形式的検証やモデルチェック は行われていなかった
Alliumによる新しい検証アプローチ
- Allium を使い、IMUサブシステムから 行動仕様 を抽出
- 各共有リソースのライフサイクル(取得・解放)をモデル化
- コードの全経路でリソースが適切に解放されているかを明示的に検証
- このアプローチで 従来の読解・エミュレーションでは発見できなかったバグ が浮上
発見されたバグの詳細
- AGCはIMUの制御に LGYROロック を使用
- ジャイロのトルク操作開始時にロック取得、3軸のトルク完了後に解放
- 同時操作を防ぐための排他制御
- 異常経路(BADEND) でロック解放処理が抜け落ちていた
- "CAF ZERO"→"TS LGYRO"の2命令(4バイト)が欠落
- ロックが解放されず、以降のジャイロ操作はすべてブロック
- エラー発生時、再起動しない限り復旧不可
実運用での影響シナリオ
- 月周回中の Michael Collins がP52プログラムで星位置合わせを実施中、誤ってIMUのケージスイッチを作動
- ケージイベントでトルク処理中断、BADEND経由でロック未解放
- 再度P52や手動トルクを試みても応答なし、エラー表示もない
- 他の機能は正常、原因不明のままジャイロ操作不能に
- 再起動すれば復旧するが、状況からは必要性が判断できない
AGC開発チームの防御的設計とバグの隠蔽
- Margaret Hamilton 率いるMITチームによる先進的なソフトウェア設計
- 優先度スケジューリング、非同期マルチタスク、リスタート保護、ソフトウェアエラー回復
- 1202アラーム時の負荷分散も設計通り動作
- 多くの重大バグは 仕様の誤り であり、コーディングミスではなかった
- BADENDは一般的なリソース解放処理のみを行い、LGYROのような特定リソースには未対応
- AGCのリスタートロジックが副次的にLGYROを初期化し、問題を隠蔽
- 再起動を伴わないケージイベントではバグが発現
Alliumによる仕様記述とバグ発見のメカニズム
- Allium仕様では各リソース(例: gyros_busy)を 取得・解放の義務 として明示
- 仕様記述により、各パスで解放が抜けていないかを網羅的に検証
- BADEND経由でのみLGYROが解放されないことを特定
- テストではなく 仕様ベースの検証 がこの発見を導く
リソース管理の現代的意義
- AGCではロック解放を 手動で明示的に記述 する必要
- Goのdefer、Javaのtry-with-resources、Pythonのwith、Rustの所有権システムなど、現代言語はロック漏れを構造的に防止
- しかし、 CWE-772(リソース解放漏れ) として依然として一般的なバグパターン
- データベース接続、分散ロック、ファイルハンドルなど、手動管理が残る領域で再発の可能性
結論と教訓
- Apolloの全クルーは無事帰還したが、この IMUモード切替バグ は複数ミッションに渡って未修正のまま
- 57年間隠れていた深刻なバグが形式的仕様から発見
- 現代のシステム開発 においても、リソース管理と仕様記述の重要性を再認識する必要
- Allium仕様やバグ再現例は GitHub で公開中
謝辞
- Farzad “Fuzz” Pezeshkpourによるバグの独立再現、Danny SmithおよびPrashant Gandhiによる初期ドラフトのレビュー