Ketahui Lebih Lanjut tentang Buku Karya Benny Czarny, *Cybersecurity Upside Down*

Pelajari Lebih Lanjut
Kami menggunakan kecerdasan buatan untuk menerjemahkan situs ini, dan meskipun kami berupaya semaksimal mungkin untuk memastikan keakuratan, terjemahan tersebut mungkin tidak selalu 100% tepat. Kami mengucapkan terima kasih atas pengertian Anda.

Menganalisis dan Memperbaiki Kerentanan Git CVE-2024-32002

Oleh OPSWAT
Bagikan Postingan Ini
Minh Pham dan Thai Do, mahasiswa dari Universitas Teknologi Ho Chi Minh, yang mengikuti Program Beasiswa “ OPSWAT ”
Para siswa mengikuti Program Beasisw OPSWAT .

Sebuah kerentanan kritis di Git yang memungkinkan terjadinya serangan RCE (eksekusi kode jarak jauh) baru-baru ini terungkap, yang memengaruhi beberapa versi Git dan Microsoft Visual Studio 2017. Kerentanan ini memungkinkan penyerang memanipulasi repositori Git menggunakan submodul, dengan memanfaatkan bug di Git yang memungkinkan file ditulis di luar pohon kerja submodul dan masuk ke direktori .git/.   Bug ini memungkinkan eksekusi hook berbahaya saat operasi kloning repositori masih berjalan [1]. 

Kerentanan CVE-2024-32002 memengaruhi Microsoft Visual Studio 2017 versi 15.9 dan Git versi yang lebih lama dari 2.45.1, 2.44.1, 2.43.4, 2.42.2, 2.41.1, 2.40.2, dan 2.39.4. Kerentanan ini dapat dieksploitasi di lingkungan di mana dukungan tautan simbolik diaktifkan pada sistem operasi yang tidak membedakan huruf besar-kecil. 

Informasi tingkat keparahan dan vektor CVSS (Common Vulnerability Scoring System) 3.x dengan skor dasar 9,0 yang dikategorikan sebagai "kritis", disediakan oleh GitHub, Inc.

Memahami Git

Git adalah sistem kontrol versi terdistribusi yang gratis dan bersumber terbuka, yang dirancang untuk membantu pengembang perangkat lunak mengelola basis kode dengan cepat dan efisien. Sistem ini meningkatkan kolaborasi di antara anggota tim pengembangan dengan mengatur dan melacak perubahan pada berkas dan direktori secara terstandarisasi dan terstruktur. 

Git banyak digunakan dalam pengembangan perangkat lunak. Platform seperti GitHub, GitLab, dan Bitbucket dibangun di atas Git untuk meningkatkan kolaborasi di antara para pengembang berkat fitur-fiturnya yang canggih: 

  • Mencatat perubahan yang dapat dilacak pada berkas kode, yang dikenal sebagai commit. 
  • Mengembalikan perubahan kode ke versi sebelumnya jika diperlukan. 
  • Menggabungkan perubahan dari berbagai cabang atau kontributor secara efisien. 
  • Menyimpan catatan riwayat mengenai siapa saja yang melakukan perubahan serta tanggal-tanggalnya.
Representasi visual dari struktur folder .git, yang menampilkan direktori-direktori seperti config, HEAD, hooks, objects, dan refs.

Git Hooks 

Saat repositori Git dibuat atau dikloning, menggunakan perintah `git init ` atau `git clone `, direktori ` .git` akan dibuat di akar pohon kerja. Struktur direktori ` .git ` pada awalnya terlihat seperti ini: 

Hook Git adalah skrip yang dapat dieksekusi, yang terletak di direktori .git/hooks atau di direktori .git/modules/module_type/module_name/hooks. Hook akan terpicu secara otomatis ketika peristiwa tertentu terjadi di dalam repositori Git.  

Apabila sebuah berkas di direktori `hooks` tidak memiliki akhiran `.sample `, perintah-perintah dalam berkas tersebut akan dijalankan sebelum atau sesudah tindakan Git tertentu yang tercantum dalam nama berkas, seperti ` pre-commit`, `post-commit`, dan `post-checkout`. 

Submodul Git

Submodul Git adalah entri dalam repositori Git yang merujuk pada commit tertentu di repositori eksternal. Saat submodul ditambahkan ke repositori, sebuah berkas baru akan dibuat di direktori .gitmodules yang berisi metadata pemetaan antara URL submodul dan direktori lokalnya. Jika sebuah repositori berisi beberapa submodul, berkas .gitmodules akan memuat satu entri untuk masing-masing submodul. [3] 

Diagram yang menunjukkan interaksi antara repositori dan submodul, yang menggambarkan hubungan antara Repositori A, Submodul B, dan Folder C
Contoh isi berkas .gitmodules, yang menunjukkan konfigurasi untuk submodul bernama "Example"
Gambar berikut ini menunjukkan seperti apa tampilan berkas .gitmodules: 

Tautan Simbolik (Symlinks)

Tautan simbolis, yang juga dikenal sebagai symlink atau tautan lunak, adalah sebuah berkas yang mengarah ke berkas atau direktori lain (yang disebut sebagai "target") dengan menentukan jalurnya.  Jika sebuah symlink dihapus, targetnya tetap tidak terpengaruh. [4] 

Tautan simbolis (symlink) di Git dibuat sebagai berkas yang dilengkapi metadata agar berfungsi sebagai referensi atau jalan pintas ke berkas lain. Tautan simbolis dapat digunakan untuk membuat beberapa referensi ke suatu berkas tanpa menyalin isinya.

Diagram yang menggambarkan tautan simbolis dan tautan keras ke sebuah berkas (Berkas A), yang memperlihatkan bagaimana tautan-tautan tersebut mengakses isi berkas yang sama
Git memperlakukan tautan simbolis sebagai berkas khusus yang menyimpan jalur ke berkas atau direktori yang dirujuknya. 
Visualisasi tautan simbolis di dalam repositori Git, yang memperlihatkan struktur direktori dan berkas serta jalur tautan simbolisnya
Saat repositori atau cabang yang berisi tautan simbolik dikloning atau diambil, tautan simbolik yang tersimpan di Git akan diubah menjadi tautan simbolik di sistem berkas lokal. 

Analisis Kerentanan Keamanan GIT

Analisis Patch

Untuk memperoleh pemahaman yang lebih mendalam mengenai kerentanan keamanan, para pakar keamanan sering kali melakukan analisis patch. Teknik ini membantu mengidentifikasi fungsi-fungsi yang rentan serta vektor serangan potensial. Para anggota OPSWAT Fellows meneliti perubahan yang dilakukan pada versi yang telah diperbarui untuk mengatasi kerentanan CVE-2024-32002, dan mereka menemukan bahwa dua berkas telah diperbarui untuk mengatasi CVE tersebut.

Salah satu berkas yang diperbarui adalah berkas ` submodule--helper.c`, yang berisi kode yang menangani kloning submodul Git. Komit baru dalam versi yang telah diperbaiki mencakup dua hal berikut:  

  1. Menambahkan fungsi ` dir_contains_only_dotgit ` untuk memastikan bahwa direktori submodul tidak berisi file atau direktori .git apa pun.
Perubahan kode pada berkas bernama submodule-helper.c di dalam antarmuka Git, yang menunjukkan 83 penambahan tanpa penghapusan
  1. Fungsi ` clone_submodule()` telah diubah dengan menambahkan kondisi untuk memeriksa apakah direktori submodul sudah ada dan kosong. Jika direktori tersebut tidak kosong, proses kloning akan dihentikan. 
Cuplikan kode terperinci dari sebuah commit Git, yang menyoroti sebuah fungsi yang memeriksa isi direktori selama operasi submodul

Pembaruan kedua dalam commit baru tersebut terdapat pada berkas t/t7406-submodule-update.sh, yang menambahkan skrip pengujian untuk memastikan bahwa kerentanan keamanan telah diperbaiki. 

Perubahan kode yang diperluas dalam berkas uji T7406-submodule-update.sh, yang merinci konfigurasi pengujian untuk jalur submodul dan tautan simbolis

Dari Analisis hingga Pemanfaatan

Analisis Alur Kerja Tautan Simbolik dan Submodul di Git

Selain wawasan yang diperoleh dari analisis patch dan uraian mengenai kerentanan CVE-2024-32002, para peserta program OPSWAT juga melakukan penyelidikan terhadap alur kerja symlink dan submodul di Git. Mereka menguraikan urutan peristiwa yang terjadi saat seorang pengguna mengkloning sebuah repositori:

  1. Git dimulai dengan mengunduh berkas dan direktori dari repositori utama. 
  2. Proses ini memanfaatkan definisi yang tercantum dalam berkas tautan simbolik untuk membuat ulang tautan simbolik yang sesuai di sistem berkas lokal.  
  3. Jika tautan simbolik tersebut mengarah ke berkas yang sudah ada, tautan simbolik tersebut akan berfungsi; sebaliknya, tautan simbolik tersebut tidak akan berfungsi sampai berkas tujuannya dipulihkan.  
  4. Jika repositori dikloning dengan opsi --recursive, Git akan mengkloning submodul (repositori eksternal) dan menempatkannya di jalur direktori sebagaimana tercantum dalam berkas .gitmodules.  
  5. Jika tautan simbolis (symlink) merupakan bagian dari jalur submodul (misalnya, util/module/test, di mana util adalah tautan simbolis yang mengarah ke direktori lain, seperti symlink_folder), Git akan menyimpan isi submodul di direktori sebenarnya yang dirujuk oleh tautan simbolis tersebut (misalnya, symlink_folder/module/test), sambil tetap memungkinkan akses melalui jalur tautan simbolis aslinya. 
Diagram alur visual yang menunjukkan langkah-langkah mengkloning repositori, mengunduh berkas dan direktori, membuat ulang tautan simbolis, mengkloning submodul, serta berpindah ke jalur yang benar

Memahami Kerentanan Keamanan Git CVE-2024-32002 

Membuat Repositori Berbahaya

OPSWAT Para peneliti kemudian meneliti lebih lanjut proses pembuatan repositori berbahaya berdasarkan pembaruan yang dilakukan pada berkast/t7406-submodule-update.sh dan menguraikan proses ini menjadi langkah-langkah berikut:

  1. Membuat repositori yang berisi hook pasca-checkout
Cuplikan kode terminal yang menunjukkan perintah-perintah untuk menyiapkan hook pasca-checkout di Git, termasuk membuat direktori dan menambahkan skrip
  1. Membuat repositori baru yang mencakup submodul, yang terletak di jalur A/modules/x. Submodul yang baru ini merujuk ke repositori yang telah dibuat sebelumnya.
Potongan kode terminal yang menunjukkan proses penambahan submodul ke repositori menggunakan perintah Git
  1. Membuat tautan simbolis bernama a, yang mengarah ke folder .git dalam indeks Git. 
Contoh skrip terminal yang menyoroti perintah untuk membuat dan melakukan commit berkas .git sebagai utilitas dalam sebuah repositori
Diagram alur yang menggambarkan skenario serangan di mana repositori hook berbahaya ditambahkan sebagai submodul ke repositori utama, yang mengakibatkan eksekusi skrip
Sebuah diagram yang menunjukkan bagaimana seorang penyerang dapat memanfaatkan kerentanan CVE dengan cara mengkloning sebuah repositori 

Memahami Kelemahan Keamanan

Ketika seorang pengguna mengkloning repositori berbahaya—yang dibuat pada langkah sebelumnya—menggunakan opsi --recursive, skrip berbahaya dari hook post-checkout akan dijalankan, sehingga memungkinkan penyerang untuk mengkompromikan perangkat pengguna. 

Eksekusi kode jarak jauh ini terjadi karena repositori utama mendeteksi tautan simbolis bernama `a` yang mengarah ke direktori `.git ` saat proses kloning dilakukan. Dengan mode rekursif yang diaktifkan, submodul juga dimasukkan ke dalam repositori hasil kloning. Repositori ini berisi folder `hooks`, yang berisi skrip hook ` post-checkout `, dan direktori lokalnya berada di `A/modules/x`.  

Karena a mengacu ke direktori.git dan sistem berkas tidak membedakan huruf besar-kecil, A diartikan sama dengan a. Git menjadi tertipu sehingga menulis skrip hook post-checkoutke dalam direktori .git/modules/query/fast/hooks/. Jika skrip hook post-checkout ditemukan di folder ` .git/modules/{module_type}/{module_name}/hooks `, skrip tersebut akan dijalankan saat repositori utama dikloning dengan opsi ` --recursive `. Akibatnya, penyerang dapat berhasil mengkompromikan perangkat pengguna dengan menjalankan kode jarak jauh.

Sebuah diagram yang menggambarkan interaksi korban dengan repositori berbahaya, termasuk proses kloning, pengunduhan submodul, dan eksekusi skrip yang tidak disengaja
Sebuah diagram yang menggambarkan alur serangan

Simulasi Eksploitasi Kerentanan Git

Berdasarkan temuan sebelumnya, para peserta program OPSWAT Fellows membuat sebuah repositori utama dan hook untuk mensimulasikan pembuatan repositori berbahaya:

  1. Pada awalnya, disarankan untuk mengonfigurasi Git agar selalu mengizinkan `protocol.file`, mengaktifkan `core.symlinks`, dan menetapkan nama cabang default menjadi `main` (untuk menghindari pesan peringatan). 
Cuplikan kode terminal yang menampilkan perintah untuk mengonfigurasi pengaturan Git secara global terkait penanganan tautan simbolis dan pengaturan cabang default
  1. Sebuah skrip hook post-checkout yang berbahaya telah ditambahkan ke direktori hooks. Untuk memastikan bahwa skrip post-checkout tersebut dapat dijalankan di perangkat pengguna, skrip bash yang membuat hook ini menyertakan perintah chmod +x fast/hooks/post-checkout. 
Skrip terminal yang menampilkan perintah Python yang dienkripsi secara berbahaya dan disematkan dalam hook post-checkout Git
  1. Sebuah tautan simbolis dibuat di repositori utama, yang mengarah ke direktori .git.
Skrip terminal yang memperlihatkan proses melakukan commit perubahan untuk menyertakan utilitas dan berkas .git ke dalam repositori
Tangkapan layar daftar direktori repositori yang menampilkan folder-folder seperti src, libs, dan .gitmodules di antarmuka Git
Repositori utama yang rentan
Tangkapan layar antarmuka repositori Git yang menampilkan sebuah direktori dengan hook post-checkout

Folder /hooks yang berisi hook post-checkout

Tangkapan layar yang menampilkan perintah terminal untuk mengkloning repositori Git dan sesi PowerShell dengan koneksi jaringan yang sudah terjalin
Ketika pengguna mengkloning repositori berbahaya ini, penyerang dapat membobol perangkat korban. 

Remediasi

Untuk menetralkan ancaman tersebut, pengguna dapat menghapus instalasi Git atau menerapkan patch keamanan terbaru. Sebagai alternatif, solusi seperti MetaDefender Endpoint dapat segera memberi tahu pengguna dan menampilkan semua CVE yang diketahui di dalam lingkungan tersebut melalui antarmuka yang intuitif. MetaDefender Endpoint dapat mendeteksi dan memitigasi CVE terbaru dengan memanfaatkan kemampuannya yang didukung oleh lebih dari 3 juta titik data dan lebih dari 30.000 CVE terkait beserta informasi tingkat keparahan.  Dengan menerapkan salah satu dari kedua tindakan pencegahan tersebut, CVE akan sepenuhnya terkendali, sehingga menghilangkan risiko serangan siber yang menghancurkan.

Apakah Anda siap menjadikan MetaDefender Endpoint sebagai garda terdepan dalam strategi keamanan siber Anda?


Ikuti terus kabar terbaru dari OPSWAT!

Daftar sekarang untuk mendapatkan kabar terbaru dari perusahaan, cerita, informasi acara, dan masih banyak lagi.