- Bug pelepasan kunci sumber daya yang terlewat ditemukan dalam kode Apollo Guidance Computer(AGC) yang selama 57 tahun dianggap nyaris sempurna
- Tim JUXT menganalisis 130 ribu baris assembly menggunakan bahasa spesifikasi AI Allium dan Claude, lalu mengidentifikasi cacat yang tidak terlihat lewat metode verifikasi sebelumnya
- Pada jalur terminasi abnormal (BADEND) di rutinitas kontrol gyro, kunci
LGYROtidak dilepas, sehingga seluruh fungsi terkait gyro setelahnya bisa berhenti - Jika sakelar Cage sempat tertekan secara keliru saat misi nyata di orbit bulan, pekerjaan penyelarasan Program 52 bisa terhenti dan Collins mungkin mengiranya sebagai kerusakan perangkat keras
- Kasus ini menunjukkan bahwa analisis berbasis spesifikasi perilaku adalah metode yang ampuh untuk menemukan cacat baru bahkan pada kode lama
Cacat Potensial yang Ditemukan di Komputer Pemandu Apollo 11
- Apollo Guidance Computer(AGC) adalah salah satu codebase yang paling teliti ditinjau dalam sejarah, dan telah dianalisis oleh banyak pengembang serta peneliti
- Namun, bug kunci sumber daya yang tidak dilepas yang tak terdeteksi selama 57 tahun kini ditemukan di kode kontrol gyro
- Masalahnya adalah pada jalur error, kunci tidak dilepas sehingga fungsi penyelarasan ulang platform pemandu menjadi nonaktif
- Tim JUXT menggunakan bahasa spesifikasi berbasis AI Allium dan Claude untuk mengubah 130 ribu baris assembly AGC menjadi 12.500 baris spesifikasi perilaku
- Mereka mengekstrak spesifikasi langsung dari kode untuk memodelkan semua jalur akuisisi dan pelepasan sumber daya
- Dalam proses ini, muncullah cacat yang tidak terlihat lewat pembacaan kode atau emulasi biasa
Struktur Kode dan Pendekatan Analisis
- Kode sumber AGC dipublikasikan pada 2003 setelah Ron Burkey dan para relawan menyalin secara manual versi cetak dari MIT Instrumentation Laboratory
- Pada 2016, repositori GitHub milik Chris Garry dipublikasikan sehingga para pengembang di seluruh dunia dapat menelaah kode assembly dengan RAM 2KB dan CPU 1MHz
- Program disimpan dalam core rope memory berukuran 74KB, yang merepresentasikan 1 dan 0 dengan menenun kawat tembaga secara manual ke inti magnetik
- Para teknisi perempuan yang melakukan pekerjaan ini dijuluki “Little Old Ladies”, dan memorinya dinamai LOL memory
- Hingga kini, tidak ada catatan bahwa verifikasi formal, model checking, atau analisis statis pernah dilakukan terhadap AGC
- Sebagian besar verifikasi berfokus pada pembacaan kode, emulasi, dan pengecekan akurasi transkripsi
- JUXT menulis spesifikasi perilaku subsistem IMU(Inertial Measurement Unit) dalam Allium
- Dengan memodelkan waktu akuisisi dan pelepasan tiap sumber daya bersama, mereka berhasil mengidentifikasi cacat
Kunci yang Tidak Dilepas di Rutinitas Kontrol Gyro
- AGC mengelola IMU dengan kunci bersama bernama
LGYRO- Saat memberi torsi pada gyroscope, sistem mengambil kunci tersebut dan melepaskannya setelah ketiga sumbu selesai
- Ini melindungi agar dua rutinitas tidak memanipulasi perangkat keras secara bersamaan
- Namun, pada jalur terminasi abnormal, kunci itu tidak dilepas
- Dalam terminasi normal, rutinitas
STRTGYR2melepaskanLGYRO, tetapi ketika terjadi ‘Caging’ (kunci fisik untuk melindungi gyro), alur berpindah ke rutinitasBADEND - Di
BADEND, dua instruksiCAF ZEROdanTS LGYRO(total 4 byte) tidak ada, sehingga kunci tetap tertahan
- Dalam terminasi normal, rutinitas
- Jika
LGYROtidak dilepas, semua rutinitas torsi gyro berikutnya akan berhenti sambil menunggu kunci- Penyelarasan halus, koreksi drift, torsi manual, dan seluruh fungsi terkait gyro akan terhenti
Dampak Potensial di Sisi Gelap Bulan
- Pada 21 Juli 1969, Michael Collins secara berkala menjalankan Program 52 (program penyelarasan pengamatan bintang) saat berada di orbit bulan
- Jika platform mengalami drift, ada risiko arah mesin pulang menjadi salah
- Jika sakelar Cage tanpa sengaja tertekan saat proses torsi berlangsung dan alur masuk ke
BADEND,LGYROmungkin tidak akan dilepas sehingga semua P52 berikutnya bisa macet- DSKY (display-keyboard) tetap menerima input tetapi tidak memberi respons
- Karena fungsi lain tetap berjalan normal, Collins bisa saja mengiranya sebagai kerusakan perangkat keras
- Jika restart (hard reset) dilakukan, masalah ini kemungkinan akan teratasi, tetapi pengalaman alarm 1202 saat pendaratan bulan mungkin membuat keputusan untuk segera melakukan reset tidak mudah
Desain Defensif Sistem Lama dan Keterbatasannya
- Tim MIT yang dipimpin Margaret Hamilton memperkenalkan konsep dasar rekayasa perangkat lunak modern seperti penjadwalan prioritas, multitasking asinkron, dan perlindungan restart
- Berkat desain ini, pendaratan tetap bisa dilakukan meski muncul alarm 1202
- Sebagian besar cacat besar merupakan kesalahan spesifikasi, dan seperti kasus yang didokumentasikan Don Eyles, pernah ada peningkatan beban CPU akibat sinkronisasi fase antaperangkat keras yang terlewat
- Cacat kali ini memiliki struktur serupa
BADENDadalah rutinitas terminasi umum untuk perpindahan mode IMU; ia melepaskan sumber daya umum sepertiMODECADR, tetapi tidak menanganiLGYRO- Karena logika restart menginisialisasi ulang
LGYRO, masalah ini pulih tanpa gejala saat pengujian sehingga cacatnya tetap tersembunyi
- Namun, dalam situasi nyata tanpa restart, gyro bisa tetap berada dalam keadaan terkunci secara permanen
Proses Penemuan Cacat dengan Allium
- Spesifikasi Allium memodelkan siklus hidup (lifecycle) tiap sumber daya
- Field
gyros_busymerepresentasikanLGYRO, aturanGyroTorquemendefinisikan pengambilan kunci, dan aturanGyroTorqueBusymendefinisikan keadaan menunggu saat kunci sudah diambil
- Field
- Spesifikasi tersebut menyatakan kewajiban bahwa “jika kunci menjadi true, maka ia harus kembali menjadi false”
- Setelah Claude melacak semua jalur, ditemukan bahwa pada jalur normal (
STRTGYR2) kunci dilepas, tetapi pada jalur error (BADEND) hal itu terlewat
- Setelah Claude melacak semua jalur, ditemukan bahwa pada jalur normal (
- Pendekatan berbasis spesifikasi memverifikasi bukan apa yang dilakukan kode, melainkan apa yang seharusnya dilakukan
- Pengujian memeriksa perilaku kode saat ini, sedangkan spesifikasi memverifikasi perilaku yang dimaksudkan
- Spesifikasi Allium dan kode reproduksi bug dipublikasikan di GitHub
Implikasi dan Pelajaran Modern
- Pada masa itu, programmer harus melepaskan kunci secara manual dengan instruksi
CAF ZEROdanTS LGYRO- Mereka harus mengingat semua jalur dan menyisipkan kode pelepasan secara manual
- Bahasa modern mencegah masalah sumber daya yang terlewat seperti ini secara lebih struktural
deferdi Go,try-with-resourcesdi Java,withdi Python, dan sistem ownership di Rust menjamin pelepasan otomatis
- Meski begitu, cacat tipe CWE-772 (Missing Release of Resource) masih tetap ada
- Koneksi database, kunci terdistribusi, file handle, dan urutan penghentian infrastruktur masih sering menjadi tanggung jawab programmer
- Semua misi Apollo berhasil kembali dengan selamat, tetapi cacat ini tetap ikut terbawa tanpa diperbaiki ke perangkat lunak COMANCHE(command module) dan LUMINARY(lunar module)
- Cacat yang tersembunyi selama 57 tahun ini menunjukkan pentingnya analisis berbasis spesifikasi perilaku
1 komentar
Komentar Hacker News
Saya Mike Stewart, memimpin proyek restorasi AGC di channel CuriousMarc dan salah satu admin VirtualAGC
Bug yang disebut kali ini memang benar merupakan cacat pada perangkat lunak AGC yang pernah ada. Namun, bug itu tidak dibiarkan selama seluruh masa program. Bug ini ditemukan saat pengujian tahap 3 SATANCHE, dicatat sebagai L-1D-02, dan diperbaiki antara Apollo 14 dan 15
Laporan terkait bisa dilihat di dokumen ibiblio 1 dan dokumen 2
Perbaikannya bukan sekadar menambahkan dua baris untuk menjadikan LGYRO bernilai 0, tetapi juga mencakup penataan ulang struktur kode dan logika untuk membangunkan tugas yang tertunda. Jika membandingkan kode Apollo 14 dan 15 (kode Apollo 14, kode Apollo 15), perbedaannya bisa dilihat
Ini bukan bug yang muncul diam-diam seperti dijelaskan di artikel. LGYRO juga diinisialisasi di STARTSB2, yang dijalankan setiap kali program berpindah sehingga masalah ini otomatis teratasi. Jadi dalam praktiknya, bug ini hanya jarang terjadi saat melakukan operasi torsi selama BADEND
Jika bug tetap bertahan, beberapa tugas akan menumpuk dan pada akhirnya memicu error 31202 (versi lanjutan dari 1202). Masalah ini ditemukan sebelum penerbangan Apollo 14 dan prosedur pemulihannya ditambahkan ke Apollo 14 Program Notes
Selain itu, meskipun disebut bahwa Ken Shirriff melakukan analisis pada level gerbang, sebenarnya sayalah yang melakukan sebagian besarnya
Virtual AGC baru menyelesaikan verifikasi kecocokan byte demi byte dengan dump core rope asli untuk sebagian program saja, dan untuk keseluruhan program itu masih belum memungkinkan. Sebagian besar source dipulihkan berdasarkan versi cetak atau checksum
Margaret Hamilton adalah ‘rope mother’ untuk Comanche (perangkat lunak command module), sedangkan Luminary (modul pendaratan bulan) ditangani oleh Jim Kernan. Ini bisa dikonfirmasi di bagan organisasi 1969
Saat alarm 1202 terjadi, AGC tidak dirancang untuk membuang tugas berprioritas rendah. Justru panduan pendaratan adalah tugas dengan prioritas paling rendah, sementara kontrol antena dan pembaruan display punya prioritas lebih tinggi. Dokumen ini merangkum prioritas tiap tugas
Terakhir, penyebab alarm 1202 bukanlah perbedaan fase melainkan perbedaan tegangan (28V vs 15V), dan hal ini telah dikonfirmasi lewat pengujian pada perangkat keras asli. Video eksperimen terkait bisa dilihat di tautan YouTube
Jika Anda tertarik dengan Apollo AGC, saya sangat merekomendasikan channel YouTube CuriousMarc. Tim yang sangat mumpuni secara teknis mendokumentasikan proses restorasi dan analisis berbagai komponen AGC
Bagian yang особенно menarik adalah penafsiran ulang alarm 1202 yang terkenal itu. Biasanya ini dikenal sebagai kesalahan sensor yang bisa diabaikan, tetapi sebenarnya dalam kondisi tertentu hal itu bisa sangat fatal
Potongan kode favorit saya adalah ini
Tautan GitHub
cadrdi LispSaya penasaran apakah pernah ada verifikasi bahwa bug ini benar-benar ada. AI memang kuat untuk analisis eksploratif seperti ini, tetapi tingkat false positive-nya masih tinggi
Bergantung konteksnya, ini bisa penting atau tidak. Ada juga banyak bug yang tidak ditemukan AI
Saya tidak punya keahlian untuk memverifikasinya sendiri, tetapi ini sangat menarik
Namun penjelasan tentang pengambilan lock dan skenario kegagalan memang cukup meyakinkan
Menarik bahwa mereka benar-benar menemukan bug nyata. Tetapi dramatisasi dalam tulisannya nyaris seperti fiksi
Misalnya menyenggol sakelar dengan siku, atau membesar-besarkan masalah yang sebenarnya bisa diatasi dengan reset. Hal-hal seperti ini memang membuat tulisannya lebih sensasional, tetapi mengurangi kredibilitasnya. Ditambah lagi gaya tulisannya terasa seperti ditulis AI, jadi makin mengganggu
Tetapi untuk menjelaskan bug yang subtil kepada pembaca umum, memang perlu sedikit storytelling. Kalau terlalu teknis orang jadi kehilangan minat, kalau terlalu dramatis para ahli akan mengkritik. Menurut saya, sulit mencari titik seimbangnya
Saya sempat menjalankan sendiri kode reproduksi (repro) yang disertakan di artikel
Tautan GitHub
Memang bisa dijalankan, tetapi Phase 5 (demo deadlock) sepenuhnya output palsu. Itu hanya mencetak hasil yang diharapkan tanpa benar-benar menjalankan emulator
Karena itu saya membuat PR sendiri untuk memperbaikinya agar benar-benar berjalan di emulator, dan juga memverifikasi bahwa patch dua baris tersebut memang memperbaiki bug
Kode hasil AI cenderung berhenti di titik “sekarang sudah sempurna!”, lalu orang-orang mempercayainya dan langsung merilisnya. Itulah masalah yang sebenarnya
Tulisan itu sendiri menarik, tetapi terasa sangat artifisial seperti ditulis LLM
Fakta bahwa bahkan perangkat lunak yang membawa manusia ke bulan dengan hanya 4KB memori masih punya bug yang belum ditemukan menunjukkan bahwa kompleksitas bisa tersembunyi bahkan dalam kode kecil
Ungkapan “menurunkan spesifikasi dari kode” itu keliru. Mungkin perlu melihat lagi arti specification
Baik artikelnya maupun repositorinya adalah hasil yang ceroboh (sloppy)
Kalau melihat tautan repositori, mereka menyebutnya “reproduksi”, padahal tidak menjalankan bug yang sebenarnya dan hanya menampilkan baris-baris output yang berkata “ini yang akan terjadi”