JURNAL IT - Pada tahun 1984, Ken Thompson, salah satu penulis asli sistem operasi Unix, menerima Penghargaan Turing. Penghargaan Turing secara luas dianggap sebagai Hadiah Nobel dalam Ilmu Komputer.
| Ken Thompson, salah satu penulis asli sistem operasi Unix |
Namun, pidato penerimaannya sedikit berbeda, Thompson tidak membahas teori komputasi umum atau masa depan ilmu komputer.
Sebaliknya, ia merilis eksperimen pemikiran yang gelap dan menakutkan ke dunia, bagaimana jika setiap compiler telah dikompromikan secara permanen dan tidak dapat diperbaiki?.
Ia menyebut ide ini "Reflections on Trusting Trust" (Refleksi tentang Mempercayai Kepercayaan), yang merupakan contoh pertama dari meta-backdoor, sebuah virus yang begitu sempurna sehingga bahkan audit kode lengkap pun tidak dapat menangkapnya.
Thompson berteori mengenai "dosa asal" (original sin) yang diturunkan ke setiap generasi compiler tanpa obat.
Reproduksi Diri, Bagaimana Kompromi Menyebar
Untuk memahami bagaimana "dosa asal" compiler dapat menyebar melalui beberapa generasi, kita harus memahami bagaimana compiler dikompilasi.
Banyak bahasa pemrograman disebut self-hosted, yang berarti compiler mereka ditulis dalam bahasa yang mereka kompilasi. Contoh utamanya adalah compiler C yang ditulis dalam bahasa pemrograman C itu sendiri.
Ini menciptakan paradoks, jika compiler C ditulis dalam bahasa C, bagaimana compiler itu sendiri dikompilasi?. Jawabannya adalah melalui compiler lain.
Proses kompilasi dan derivasi ini berlanjut kembali ke generasi sebelum compiler C menjadi self-hosted (berasal dari compiler B).
Bahkan, untuk komputer paling awal, manusia adalah assembler aslinya, di mana pemrogram harus menulis tangan program assembly mereka, lalu secara manual menulis angka biner (satu dan nol) untuk kode operasi yang sesuai.
Konsep self-reproducing (sistem reproduksi diri) ini dapat didemonstrasikan melalui latihan pemrograman yang disebut quines.
Quine adalah program yang, ketika dikompilasi dan dieksekusi, akan menghasilkan salinan persis dari kode sumber aslinya. Nama ini diambil dari filsuf Willard Van Orman Quine.
Menyisipkan Kode Trojan
Thompson menunjukkan bahwa kendaraan terbaik untuk menghasilkan kode yang mereproduksi diri ini adalah Fortran, meskipun demonstrasinya juga dibuat dalam C.
Ide inti dari "dosa asal" adalah menyisipkan kode trojanized di dalam program yang mereproduksi diri ini.
Jika kode trojanized ini menjadi bagian dari compiler berbahaya, ia akan memiliki dua opsi berbeda saat beroperasi:
1. Mengkompilasi program biasa, compiler akan menyisipkan payload berbahaya ke dalam biner yang dikompilasi.
2. Mengkompilasi compiler sekunder (mengenali kode sumbernya sendiri), compiler akan menyisipkan kode yang digunakan untuk menghasilkan payload berbahaya tersebut (bukan payload-nya sendiri).
Ini memungkinkan compiler tersebut untuk meneruskan "dosa asal" ke compiler generasi berikutnya.
Deteksi yang Sulit dan Ancaman yang Meluas
Meskipun contoh sederhana trojanized quine mungkin terlihat jelas (seperti mengganti kata "right" menjadi "wrong" dalam komentar), teknik obfuscation (pengaburan kode) dapat membuatnya jauh lebih sulit dideteksi.
Misalnya, kode sumber dapat diubah menjadi representasi desimal dari nilai ASCII-nya, sehingga terlihat seperti larik angka yang membingungkan.
Bahkan dengan kode sumber yang di-obfuscate, mungkin hal ini tidak diperlukan, karena sebagian besar pengguna hanya menggunakan versi terkompilasi dari compiler tersebut (biner).
Jika Anda mengaudit kode sumber program yang dihasilkan oleh compiler yang terinfeksi, kode tersebut akan tampak bersih, karena proses infeksi hanya terjadi setelah biner dikompilasi.
Untuk mendeteksi perilaku trojanized ini, Anda harus melakukan reverse engineering (rekayasa balik) pada biner target.
Ancaman ini menjadi sangat pervasif karena struktur pohon keluarga bahasa pemrograman dan compiler yang rumit.
Banyak bahasa pemrograman baru dibangun di atas compiler yang sudah ada untuk menghindari penciptaan ulang fungsionalitas dasar.
Contoh bagus adalah proyek LLVM, infrastruktur compiler yang digunakan oleh banyak bahasa.
LLVM digunakan untuk mengkompilasi C, C++, atau Objective C melalui compiler Clang, dan juga digunakan secara tidak langsung oleh compiler Swift, Rust, dan bahkan Fortran.
Proyek LLVM begitu besar, repositori GitHub-nya sangat besar sehingga tidak mungkin untuk diaudit secara rutin oleh individu.
Insiden Nyata dan Mitigasi
Skema serangan ini telah terjadi dalam kehidupan nyata. Pada tahun 2015, terdapat keluarga malware Mac bernama Xcode Ghost.
Ini adalah versi trojanized dari compiler Xcode resmi yang menargetkan pengembang iOS.
Compiler yang terinfeksi itu menyisipkan kode berbahaya tambahan ke dalam aplikasi iOS akhir yang kemudian diterbitkan di App Store.
Akibatnya, ratusan aplikasi di App Store berasal dari pengembang yang sah namun mengandung kode Trojanized tanpa sepengetahuan pengembang.
Thompson sendiri mengaku pernah menyelinapkan kode login yang di-trojanized ke dalam grup dukungan Unix di Bell Labs untuk bersenang-senang.
Dia mengklaim kode tersebut akhirnya dihapus dari rantai compiler Bell Labs setelah seseorang menjalankannya dengan opsi -S (yang tidak menghasilkan versi trojanized), tetapi ia tidak yakin apakah compiler itu sempat lolos keluar dari Bell Labs.
Mitigasi
Mitigasi terhadap ancaman ini ada, meskipun rumit.
David Wheeler, sebagai bagian dari tesis PhD-nya, menciptakan teknik yang dikenal sebagai Diverse Double Compiling (DDC).
Langkah-langkah DDC:
1. Pilih compiler independen kedua yang Anda percayai.
2. Gunakan compiler kedua tersebut untuk membangun GCC baru dari sumber (disebut G1).
3. Gunakan G1 untuk membangun GCC lagi dari sumber (disebut G2).
4. Bandingkan G1 dengan G2. Jika keduanya identik bit-for-bit, maka compiler tersebut diketahui belum dirusak.
Alternatif lain adalah secara manual menulis compiler yang sangat kecil (teeny compiler) dan menggunakannya sebagai bootstrap untuk menghasilkan compiler yang lebih besar hingga Anda memiliki compiler akhir dengan garis keturunan murni yang sepenuhnya Anda tulis sendiri dan dapat Anda percayai.
Thompson merangkum masalah kepercayaan ini dengan kutipan yang menakutkan:
“Anda tidak bisa mempercayai kode yang tidak Anda tulis sepenuhnya sendiri, terutama bukan kode dari perusahaan yang mempekerjakan orang seperti saya.”
Namun, di zaman sekarang, filosofi ini tidak praktis. Tidak mungkin untuk mengaudit semua perangkat lunak atau aplikasi berpemilik yang digunakan setiap hari, apalagi menulis semuanya sendiri.(*)
0 Komentar