Kerentanan di cdnjs yang memungkinkan eksekusi kode di server Cloudflare

Kerentanan kritis telah diidentifikasi di jaringan pengiriman konten cdnjs Cloudflare, yang dirancang untuk mempercepat pengiriman pustaka JavaScript, memungkinkan eksekusi kode arbitrer di server CDN. Bahaya masalah ini diperparah oleh fakta bahwa sekitar 12.7% dari semua situs di Internet menggunakan layanan untuk mengunduh pustaka JavaScript, dan kompromi infrastruktur memungkinkan penggantian pustaka yang disediakan oleh salah satu situs ini.

Layanan cdnjs mengunduh paket dari Git atau repositori NPM, setelah itu mengizinkan situs mana pun menggunakan jaringan pengiriman konten Cloudflare secara gratis untuk mempercepat pemuatan pustaka JavaScript. Saat mempelajari kode komponen cdnjs yang dipublikasikan di GitHub, terungkap bahwa untuk membongkar paket NPM dalam arsip tgz, digunakan modul arsip/tar standar dalam bahasa Go, yang menghasilkan daftar file apa adanya, tanpa normalisasi jalur. Dalam kasus ketika skrip membongkar konten berdasarkan daftar yang diberikan, keberadaan file seperti "../../../../../../../tmp/test" di arsip dapat menyebabkan penimpaan file sewenang-wenang dalam sistem, sejauh hak akses memungkinkan.

Disarankan agar penyerang dapat mengajukan permohonan untuk menambahkan perpustakaannya ke cdnjs dan mengunggah arsip yang dirancang khusus berisi file dengan karakter β€œ../” di jalur ke repositori NPM. Di server cdnjs, operasi "pembaruan otomatis" dilakukan secara berkala, di mana pengendali mengunduh versi baru dari perpustakaan yang diusulkan dan membongkar isinya. Menggunakan file dengan jalur β€œ../”, penyerang dapat menimpa file dengan skrip layanan dan mengeksekusi kodenya di server tempat pembongkaran dilakukan.

Dalam hal mengunduh pembaruan dari Git, ditemukan bahwa pengendali yang mengunduh pembaruan tidak memperhitungkan tautan simbolis saat menyalin file dari Git. Fitur ini memungkinkan untuk mengatur pembacaan file apa pun dari server dengan menambahkan tautan simbolis ke Git.

Diputuskan untuk memulai eksperimen dengan demonstrasi peretasan cdnjs untuk menerima hadiah di HackerOne dengan menguji hipotesis mengenai pembacaan file. Tautan simbolik test.js telah ditambahkan ke repositori Git dari perpustakaan JavaScript yang disajikan melalui CDN, menunjuk ke file /proc/self/maps. Setelah menerbitkan versi baru perpustakaan, pengendali pembaruan memproses repositori ini dan menerbitkan file yang ditentukan di cdnjs (test.js dibuat sebagai tautan simbolis dan ketika file ini diminta, konten /proc/self/maps dikembalikan ).

Mengganti tautan simbolis ke file /proc/self/environ, penulis penelitian memperhatikan bahwa data yang diberikan berisi nilai variabel lingkungan GITHUB_REPO_API_KEY dan WORKERS_KV_API_TOKEN. Variabel pertama menyimpan kunci API untuk akses tulis ke repositori robocdnjs di GitHub. Variabel kedua menyimpan token ke penyimpanan KV di cdnjs. Dengan menggunakan informasi yang diterima, penyerang dapat membuat perubahan pada cdnjs dan sepenuhnya membahayakan infrastruktur.

Sumber: opennet.ru

Tambah komentar