Serangan Sumber Trojan untuk memperkenalkan perubahan pada kode yang tidak terlihat oleh pengembang

Para peneliti dari Universitas Cambridge telah menerbitkan teknik untuk memasukkan kode berbahaya secara diam-diam ke dalam kode sumber yang ditinjau oleh rekan sejawat. Metode serangan yang disiapkan (CVE-2021-42574) disajikan dengan nama Sumber Trojan dan didasarkan pada pembentukan teks yang terlihat berbeda bagi kompiler/penerjemah dan orang yang melihat kode. Contoh metode ini didemonstrasikan untuk berbagai compiler dan interpreter yang disediakan untuk C, C++ (gcc dan clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go dan Python.

Metode ini didasarkan pada penggunaan karakter Unicode khusus dalam komentar kode yang mengubah urutan tampilan teks dua arah. Dengan bantuan karakter kontrol tersebut, beberapa bagian teks dapat ditampilkan dari kiri ke kanan, sementara bagian lain - dari kanan ke kiri. Dalam praktik sehari-hari, karakter kontrol tersebut dapat digunakan, misalnya, untuk menyisipkan baris kode dalam bahasa Ibrani atau Arab ke dalam file. Namun jika Anda menggabungkan baris dengan arah teks berbeda dalam satu baris, menggunakan karakter yang ditentukan, bagian teks yang ditampilkan dari kanan ke kiri dapat tumpang tindih dengan teks biasa yang ditampilkan dari kiri ke kanan.

Dengan menggunakan metode ini, Anda dapat menambahkan konstruksi berbahaya ke kode, tetapi kemudian membuat teks dengan konstruksi ini tidak terlihat saat melihat kode, dengan menambahkan di komentar berikut atau di dalam karakter literal yang ditampilkan dari kanan ke kiri, yang akan mengarah ke sepenuhnya karakter yang berbeda ditumpangkan pada penyisipan berbahaya. Kode tersebut akan tetap benar secara semantik, namun akan ditafsirkan dan ditampilkan secara berbeda.

Serangan Sumber Trojan untuk memperkenalkan perubahan pada kode yang tidak terlihat oleh pengembang

Saat meninjau kode, pengembang akan dihadapkan dengan urutan visual karakter dan akan melihat komentar yang tidak mencurigakan di editor teks modern, antarmuka web, atau IDE, tetapi kompiler dan juru bahasa akan menggunakan urutan logis karakter dan akan memproses penyisipan berbahaya apa adanya, tanpa memperhatikan teks dua arah di komentar. Masalahnya mempengaruhi berbagai editor kode populer (VS Code, Emacs, Atom), serta antarmuka untuk melihat kode di repositori (GitHub, Gitlab, BitBucket dan semua produk Atlassian).

Serangan Sumber Trojan untuk memperkenalkan perubahan pada kode yang tidak terlihat oleh pengembang

Ada beberapa cara menggunakan metode ini untuk mengimplementasikan tindakan jahat: menambahkan ekspresi β€œreturn” tersembunyi, yang menyebabkan penyelesaian fungsi lebih awal; mengomentari ekspresi yang biasanya terlihat sebagai konstruksi yang valid (misalnya, untuk menonaktifkan pemeriksaan penting); menetapkan nilai string lain yang menyebabkan kegagalan validasi string.

Misalnya, penyerang mungkin mengusulkan perubahan yang menyertakan baris: if access_level != "user{U+202E} {U+2066}// Periksa apakah admin{U+2069} {U+2066}" {

yang akan ditampilkan di antarmuka ulasan seolah-olah access_level != β€œuser” {// Periksa apakah admin

Selain itu, varian serangan lain telah diusulkan (CVE-2021-42694), terkait dengan penggunaan homoglif, karakter yang memiliki tampilan serupa, tetapi berbeda makna dan memiliki kode unicode yang berbeda (misalnya, karakter β€œΙ‘β€ menyerupai β€œ a”, β€œΙ‘β€ - β€œg”, β€œΙ©β€ - β€œl”). Karakter serupa dapat digunakan dalam beberapa bahasa atas nama fungsi dan variabel untuk menyesatkan pengembang. Misalnya, dua fungsi dengan nama yang tidak dapat dibedakan dapat didefinisikan dan melakukan tindakan berbeda. Tanpa analisis mendetail, tidak akan segera jelas mana dari kedua fungsi ini yang dipanggil di tempat tertentu.

Serangan Sumber Trojan untuk memperkenalkan perubahan pada kode yang tidak terlihat oleh pengembang

Sebagai tindakan keamanan, disarankan agar kompiler, juru bahasa, dan alat perakitan yang mendukung karakter Unicode menampilkan kesalahan atau peringatan jika ada karakter kontrol yang tidak berpasangan dalam komentar, literal string, atau pengidentifikasi yang mengubah arah keluaran (U+202A, U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E dan U+200F). Karakter tersebut juga harus secara eksplisit dilarang dalam spesifikasi bahasa pemrograman dan harus dihormati dalam editor kode dan antarmuka repositori.

Tambahan 1: Patch kerentanan telah disiapkan untuk GCC, LLVM/Clang, Rust, Go, Python dan binutils. GitHub, Bitbucket, dan Jira juga memperbaiki masalah ini. Perbaikan untuk GitLab sedang berlangsung. Untuk mengidentifikasi kode yang bermasalah, disarankan untuk menggunakan perintah: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/ sumber

Tambahan 2: Russ Cox, salah satu pengembang OS Plan 9 dan bahasa pemrograman Go, mengkritik perhatian berlebihan terhadap metode serangan yang dijelaskan, yang sudah lama dikenal (Go, Rust, C++, Ruby) dan tidak dianggap serius . Menurut Cox, masalahnya terutama berkaitan dengan tampilan informasi yang benar dalam editor kode dan antarmuka web, yang dapat diselesaikan dengan menggunakan alat dan penganalisis kode yang benar selama peninjauan. Oleh karena itu, daripada menarik perhatian pada serangan spekulatif, akan lebih tepat jika fokus pada peningkatan proses peninjauan kode dan ketergantungan.

Ras Cox juga percaya bahwa kompiler bukanlah tempat yang tepat untuk memperbaiki masalah ini, karena dengan melarang simbol-simbol berbahaya di tingkat kompiler, masih ada lapisan besar alat di mana penggunaan simbol-simbol ini tetap dapat diterima, seperti sistem build, assembler, manajer paket dan berbagai parser konfigurasi dan data. Sebagai contoh, proyek Rust diberikan, yang melarang pemrosesan kode LTR/RTL di kompiler, tetapi tidak menambahkan perbaikan pada manajer paket Cargo, yang memungkinkan serangan serupa melalui file Cargo.toml. Demikian pula, file seperti BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml, dan requiremen.txt dapat menjadi sumber serangan.

Sumber: opennet.ru

Tambah komentar