Hoʻouka iā Node.js ma o ka hoʻopunipuni ʻana i nā prototypes mea JavaScript

Ua kālailai nā mea noiʻi mai ka Helmholtz Center for Information Security (CISPA) a me ka Royal Institute of Technology (Sweden) i ka hoʻohana ʻana o ka ʻenehana hoʻohaumia prototype JavaScript e hana i nā hoʻouka kaua ma ka platform Node.js a me nā noi kaulana e pili ana iā ia, e alakaʻi ana i ka hoʻokō code.

Hoʻohana ka prototype polluting method i kahi hiʻohiʻona o ka ʻōlelo JavaScript e hiki ai iā ʻoe ke hoʻohui i nā waiwai hou i ke kumu prototype o kekahi mea. Loaʻa paha i nā noi nā poloka code (mau mea hana) i hoʻopili ʻia ka hana e kahi waiwai i hoʻololi ʻia; no ka laʻana, aia paha ka code i kahi kūkulu e like me 'const cmd = options.cmd || "/ bin / sh"', e hoʻololi ʻia ka loiloi inā hoʻokele ka mea hoʻouka e hoʻololi i ka waiwai "cmd" i ke kumu prototype.

Pono ka hoʻouka kaua e hoʻohana i ka ʻikepili waho e hana i kahi waiwai hou i loko o ke kumu prototype aʻa o ka mea, a ʻo ia hoʻokō e hālāwai me kahi gadget e hilinaʻi ana i ka waiwai i hoʻololi ʻia. Hoʻololi ʻia ka prototype ma ka hana ʻana i nā waiwai lawelawe "__proto__" a me "mea hana" ma Node.js. Hoʻihoʻi ka waiwai "__proto__" i ka prototype o ka papa o ka mea, a hoʻihoʻi ka waiwai "mea hana" i ka hana i hoʻohana ʻia e hana i ka mea.

Inā loaʻa i ka code app ka haʻawina "obj[a][b] = waiwai" a ua hoʻonohonoho ʻia nā waiwai mai ka ʻikepili waho, hiki i ka mea hoʻouka ke hoʻonohonoho iā "a" i ka waiwai "__proto__" a hoʻokō i ka hoʻokomo ʻana i kā lākou waiwai ponoʻī. me ka inoa "b" a me ka waiwai "waiwai" ma ke kumu prototype o ka mea (obj.__proto__.b = waiwai;), a me ka waiwai i hoonohoia ma ka prototype e ikeia ma na mea a pau. Pēlā nō, inā loaʻa i ke code nā huaʻōlelo e like me "obj[a][b][c] = waiwai", ma ka hoʻonohonoho ʻana i "a" i ka waiwai "mea hana", a me "b" i "prototype" i nā mea āpau, hiki iā ʻoe ke e wehewehe i kahi waiwai hou me ka inoa "c" a me ka waiwai "waiwai".

Ka laʻana o ka hoʻololi ʻana i ka prototype: const o1 = {}; const o2 = mea hou (); o1.__proto__.x = 42; // hana i ka waiwai "x" ma ke kumu prototype console.log (o2.x); // komo i ka waiwai “x” mai kekahi mea ʻē aʻe // he 42 ka hopena, no ka mea, ua hoʻololi ʻia ke kumu prototype ma o ka mea o1, i hoʻohana pū ʻia i ka mea o2

Ka laʻana o ka code vulnerable: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; ho'i p; }

Inā hoʻokumu ʻia nā manaʻo hana entryPoint mai ka ʻikepili hoʻokomo, a laila hiki i ka mea hoʻouka ke hāʻawi i ka waiwai "__proto__" i arg1 a hana i kahi waiwai me kekahi inoa i loko o ke kumu prototype. Inā hāʻawi ʻoe i ka arg2 i ka waiwai "toString" a me ka arg3 i ka waiwai 1, hiki iā ʻoe ke wehewehe i ka waiwai "toString" (Object.prototype.toString=1) a hāʻule i ka noi i ke kāhea ʻana iā toString ().

ʻO nā laʻana o nā kūlana i hiki ke alakaʻi i ka hoʻokō code attacker me ka hana ʻana i nā waiwai "main", "shell", "exports", "contextExtensions" a me "env". No ka laʻana, hiki i ka mea hoʻouka ke hana i kahi waiwai "nui" i ke kumu prototype o kahi mea, e kākau i ke ala i kāna palapala (Object.prototype.main = "./../../pwned.js") a e kapa ʻia kēia waiwai i ka manawa o ka hoʻokō ʻana i ke code o ke kūkulu ʻana e koi ("my-package"), inā ʻaʻole i wehewehe pono ka pūʻolo i ka waiwai "main" ma package.json (inā ʻaʻole i wehewehe ʻia ka waiwai, e loaʻa ia mai ke kumu prototype). Hiki ke hoʻololi like i nā waiwai "shell", "exports" a me "env" like: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // e koi aku i ke kelepona ("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "node"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // e koi aku i ke kelepona ("bytes");

Ua kālailai nā mea noiʻi i nā pūʻolo NPM 10 me ka heluna nui loa o nā hilinaʻi a ʻike ʻia ʻaʻohe waiwai nui o 1958 o lākou i package.json, 4420 hoʻohana i nā ala pili i kā lākou mau ʻōlelo koi, a hoʻohana pololei ʻo 355 i ka API hoʻololi kauoha.

ʻO kahi hiʻohiʻona hana he mea hoʻohana no ka hoʻouka ʻana i ka hope Parse Server e hoʻopau i ka waiwai evalFunctions. No ka hoʻomaʻamaʻa ʻana i ka ʻike ʻana o ia mau nāwaliwali, ua hoʻomohala ʻia kahi hāmeʻa e hoʻohui i nā ʻano loiloi static a dynamic. I ka wā o ka hoʻāʻo ʻana iā Node.js, ua ʻike ʻia nā hāmeʻa 11 i hiki ke hoʻohana ʻia e hoʻonohonoho i nā hoʻouka kaua e alakaʻi i ka hoʻokō ʻana i ke code a ka mea hoʻouka. Ma kahi o Parse Server, ua ʻike ʻia ʻelua mau mea palupalu i ka NPM CLI.

Source: opennet.ru

Pākuʻi i ka manaʻo hoʻopuka