Serangan ke atas Node.js melalui manipulasi prototaip objek JavaScript

Penyelidik dari Pusat Keselamatan Maklumat Helmholtz (CISPA) dan Institut Teknologi Diraja (Sweden) menganalisis kebolehgunaan teknik pencemaran prototaip JavaScript untuk mencipta serangan pada platform Node.js dan aplikasi popular berdasarkannya, yang membawa kepada pelaksanaan kod.

Kaedah pencemar prototaip menggunakan ciri bahasa JavaScript yang membolehkan anda menambah sifat baharu pada prototaip akar sebarang objek. Aplikasi mungkin mengandungi blok kod (alat) yang operasinya dipengaruhi oleh sifat yang diganti; sebagai contoh, kod mungkin mengandungi binaan seperti 'const cmd = options.cmd || "/bin/sh"', logiknya akan diubah jika penyerang berjaya menggantikan sifat "cmd" dalam prototaip akar.

Serangan yang berjaya memerlukan aplikasi boleh menggunakan data luaran untuk mencipta sifat baharu dalam prototaip akar objek, dan pelaksanaan itu menemui alat yang bergantung pada sifat yang diubah suai. Menukar prototaip dicapai dengan memproses sifat perkhidmatan "__proto__" dan "pembina" dalam Node.js. Sifat "__proto__" mengembalikan prototaip kelas objek, dan sifat "pembina" mengembalikan fungsi yang digunakan untuk mencipta objek.

Jika kod aplikasi mengandungi tugasan "obj[a][b] = value" dan nilai ditetapkan daripada data luaran, penyerang boleh menetapkan "a" kepada nilai "__proto__" dan mencapai pemasangan harta mereka sendiri dengan nama "b" dan nilai "nilai" dalam prototaip akar objek (obj.__proto__.b = nilai;), dan harta yang ditetapkan dalam prototaip akan kelihatan dalam semua objek. Begitu juga, jika kod mengandungi ungkapan seperti "obj[a][b][c] = nilai", dengan menetapkan "a" kepada nilai "pembina" dan "b" kepada "prototaip" dalam semua objek sedia ada, anda boleh tentukan harta baharu dengan nama "c" dan nilai "nilai".

Contoh menukar prototaip: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // cipta sifat β€œx” dalam prototaip akar console.log (o2.x); // akses harta "x" dari objek lain // output akan menjadi 42, kerana prototaip akar telah ditukar melalui objek o1, ​​yang juga digunakan dalam objek o2

Contoh kod terdedah: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; kembali p; }

Jika argumen fungsi entryPoint dibentuk daripada data input, maka penyerang boleh menghantar nilai "__proto__" kepada arg1 dan mencipta harta dengan sebarang nama dalam prototaip akar. Jika anda memberikan arg2 nilai "toString" dan arg3 nilai 1, anda boleh menentukan sifat "toString" (Object.prototype.toString=1) dan ranap aplikasi semasa panggilan ke toString().

Contoh situasi yang boleh membawa kepada pelaksanaan kod penyerang termasuk penciptaan sifat "utama", "shell", "eksport", "contextExtensions" dan "env". Sebagai contoh, penyerang boleh mencipta sifat "utama" dalam prototaip akar objek, menulis di dalamnya laluan ke skripnya (Object.prototype.main = "./../../pwned.js") dan sifat ini akan dipanggil pada masa pelaksanaan dalam kod construct require("my-package"), jika pakej yang disertakan tidak secara eksplisit mentakrifkan sifat "utama" dalam package.json (jika harta itu tidak ditakrifkan, ia akan diperolehi daripada prototaip akar). Sifat "shell", "eksport" dan "env" boleh digantikan dengan cara yang sama: biarkan rootProto = Object.prototype; rootProto["eksport"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // trigger call memerlukan("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "nod"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "β€”inspect-brk=0.0.0.0:1337"; // trigger call memerlukan("bait");

Para penyelidik menganalisis 10 pakej NPM dengan bilangan kebergantungan terbesar dan mendapati bahawa 1958 daripadanya tidak mempunyai sifat utama dalam package.json, 4420 menggunakan laluan relatif dalam penyataan keperluan mereka dan 355 menggunakan API penggantian arahan secara langsung.

Contoh yang berfungsi ialah eksploitasi untuk menyerang bahagian belakang Pelayan Parse yang mengatasi sifat evalFunctions. Untuk memudahkan pengenalpastian kelemahan tersebut, kit alat telah dibangunkan yang menggabungkan kaedah analisis statik dan dinamik. Semasa ujian Node.js, 11 alat telah dikenal pasti yang boleh digunakan untuk mengatur serangan yang membawa kepada pelaksanaan kod penyerang. Selain Pelayan Parse, dua kelemahan yang boleh dieksploitasi juga dikenal pasti dalam NPM CLI.

Sumber: opennet.ru

Tambah komen