Apa yang perlu Anda ketahui tentang polusi prototipe dan bagaimana itu

Tidak, ini bukan tentang limbah padat yang dihasilkan dengan produksi prototipe atau model untuk produk yang berbeda. Polusi prototipe di sini mengacu pada ancaman siber kritis yang diberi peringkat 10/10 pada skala keparahan CVSS.

Dalam sebuah makalah yang diterbitkan pada bulan Juli tahun ini, berjudul “Silent Spring: Prototype Pollution Leads to Remote Code Execution in Node.js,” peneliti keamanan mengungkapkan kerentanan serius yang memengaruhi bahasa berbasis prototipe seperti JavaScript dan platform Node.js. Ancaman ini melibatkan penyuntikan properti ke dalam prototipe root objek saat runtime dan menyebabkan eksekusi gadget kode yang sah.

Para peneliti mengembangkan kerangka kerja yang dibangun di atas CodeQL untuk mendeteksi polusi prototipe dengan menggunakan analisis dinamis dan statis. Dengan menggunakan kerangka kerja ini, mereka dapat mengidentifikasi 11 gadget universal yang berpotensi mengaktifkan eksekusi kode jarak jauh di kode Node.js API.

Apa sebenarnya polusi prototipe?

Seperti disebutkan, polusi prototipe adalah kerentanan dunia maya yang dirancang untuk memungkinkan pelaku ancaman mengeksploitasi runtime JavaScript. Ini menghasilkan kompromi keamanan karena memungkinkan pengenalan properti ke dalam prototipe konstruksi JavaScript yang ada.

Nama ancaman ini sebenarnya adalah deskripsi cara kerjanya. Itu memungkinkan untuk menyuntikkan nilai yang menimpa “prototipe” dari objek dasar. Ini berarti bahwa prototipe pada dasarnya “tercemar”, menghasilkan pembuatan prototipe jahat yang kemudian dapat diteruskan ke objek lain yang mewarisi prototipe.

Dengan kemampuan aktor ancaman untuk mengontrol nilai properti objek, mereka dapat memodifikasi logika aplikasi dan meluncurkan serangan seperti penolakan layanan, eskalasi hak istimewa, dan eksekusi kode jarak jauh.

Munculnya polusi prototipe

Sebelum membahas secara rinci bagaimana polusi prototipe terjadi, berikut adalah definisi dari istilah-istilah penting yang terlibat dalam keberadaan polusi prototipe.

  • Objek — Ini mengacu pada semua yang dimasukkan dalam JavaScript kecuali primitif.
  • Prototipe — Ini adalah mekanisme yang memungkinkan objek JavaScript mengambil fitur dari objek lain.
  • __proto__ — Ini adalah atribut yang telah distandarisasi di seluruh browser. Ini mengacu pada prototipe suatu objek.

Polusi prototipe terjadi ketika aktor ancaman berhasil mengambil alih atribut __proto__, memiliki kemampuan untuk memanipulasi nilai untuk atribut ini. Mereka biasanya melakukan ini dengan menambahkan prototipe baru ke dalam atribut __proto__. Pengenalan prototipe baru memiliki efek membuat semua objek mewarisi prototipe yang disuntikkan karena setiap objek JavaScript sudah memiliki atribut __proto__ dan mewarisi prototipe.

Manipulasi atribut __proto__ memungkinkan modifikasi properti kode JavaScript yang ada, yang dapat mengakibatkan sejumlah kemungkinan konsekuensi, termasuk penolakan layanan (DoS), eksekusi kode jarak jauh (RCE), injeksi SQL, skrip lintas situs (XSS), eskalasi hak istimewa, dan hasil yang tidak diinginkan lainnya.

Dari eksploitasi ke serangan

Untuk menekankan, polusi prototipe bukanlah serangan itu sendiri. Ini adalah kerentanan yang dapat menyebabkan serangan siber ketika dieksploitasi. Ketika eksploitasi kerentanan mengakibatkan crash pada server, DoS terjadi. Denial of service mungkin tidak terdengar mengancam, tetapi sebuah studi Ponemon Institute mengatakan bahwa DoS dapat menghabiskan biaya $22.000 untuk setiap menit downtime.

Eksekusi kode jarak jauh dapat dipicu melalui pembuatan shell terbalik yang serupa dengan apa yang terjadi dengan pustaka visualisasi data yang disebut Kibana. Selain itu, penjahat dunia maya dapat meluncurkan serangan injeksi SQL seperti yang terjadi beberapa tahun lalu dengan perpustakaan JavaScript TypeORM. Selain itu, pelaku ancaman dapat memicu eksekusi kode JavaScript sisi klien dengan mengeksploitasi kerentanan polusi prototipe di gadget yang mengandalkan properti suatu objek.

Sementara itu, penyerang dengan pengetahuan polusi prototipe yang lebih maju dapat melakukan eksploitasi sisi server, yang biasanya memiliki dampak yang lebih parah dibandingkan dengan rekan sisi kliennya. Eksploitasi sisi server juga dapat menyebabkan injeksi SQL, eksekusi kode jarak jauh, dan otorisasi dan otentikasi yang dilewati.

Cara memerangi polusi prototipe

Polusi prototipe adalah masalah yang kompleks, tetapi bukan tanpa solusi. Ada tiga cara utama untuk menghindarinya dan mengurangi dampaknya.

  • Pastikan keamanan perpustakaan sumber terbuka yang digunakan — Penggunaan perpustakaan sumber terbuka adalah praktik yang normal, tetapi ini tidak berarti bahwa sebagian besar merupakan praktik yang aman dan terjamin. Direkomendasikan untuk memeriksa ulang sumber perpustakaan yang akan digunakan untuk memastikan bahwa mereka bebas dari kerentanan yang dapat menyebabkan kompromi keamanan. Seringkali, masalah di dalamnya tidak sengaja ditambahkan, tetapi mereka berkembang sebagai akibat dari peristiwa yang berbeda termasuk penggabungan dua objek, kloning objek yang dalam, dan pembuatan objek melalui properti zip secara rekursif dengan nilai.
  • Hindari membuat objek dengan prototipe Java — Daripada menggunakan konstruktor objek “Object()atau objek-literal ” saat membuat objek baru, lebih baik menggunakan “Object.create()”. Metode ini lebih disukai karena memungkinkan pengaturan prototipe objek yang dibuat menggunakan argumen pertama yang diteruskan ke objek. Dengan ini, melewatkan nilai nol berarti tidak akan ada prototipe untuk objek yang dibuat. Oleh karena itu, objek baru menjadi bebas dari kemungkinan polusi karena tidak ada prototipe yang akan tercemar.
  • Batasi semua perubahan pada prototipe — JavaScript memungkinkan untuk memblokir semua perubahan yang dicoba pada prototipe melalui Object.freeze(). Ini mencegah semua kemungkinan perubahan pada atribut objek. Atau, paket nopp npm dapat diinstal. Melakukan ini secara otomatis membekukan semua prototipe objek umum, untuk mencegah perubahan apa pun dalam prototipe.
  • Validasi skema input JSON — Pendekatan ini menolak atribut yang tidak perlu untuk diadopsi. Untuk memiliki validasi skema input JSON, penting untuk menggunakan perpustakaan di npm seperti ajv. Validasi skema memastikan bahwa data JSON memiliki semua atribut yang diharapkan di dalamnya termasuk tipe data yang sesuai.
  • Gunakan peta sebagai pengganti objek — Setiap kali struktur kunci/nilai dibuat, disarankan untuk menggunakan “peta” daripada “objek”. Solusi ini beroperasi seperti HashMap dengan pengecualian hanya dapat dikonsumsi

Takeaways kunci

Polusi prototipe bukanlah ancaman kecil. Ini adalah kerentanan yang dapat memiliki konsekuensi serius ketika dieksploitasi. Ini dapat menyebabkan interupsi yang mahal karena penolakan layanan. Selain itu, meyakinkan untuk mengetahui bahwa ada cara yang relatif sederhana untuk mengatasi masalah ini. Bahkan lebih baik, ada solusi canggih komprehensif yang dapat melindungi JavaScript dari serangan dan mencegah eksploitasi kerentanan polusi prototipe.

Kredit Gambar: Pixabay

Peter Davidson bekerja sebagai rekan bisnis senior yang membantu merek dan perusahaan rintisan untuk membuat keputusan bisnis yang efisien dan merencanakan strategi bisnis yang tepat. Dia adalah penggila gadget besar yang suka berbagi pandangannya tentang teknologi dan aplikasi terbaru.

Perangkat Lunak