Kolu lori Node.js nipasẹ ifọwọyi ti JavaScript ohun prototypes

Awọn oniwadi lati Ile-iṣẹ Helmholtz fun Aabo Alaye (CISPA) ati Royal Institute of Technology (Sweden) ṣe atupale iwulo ti ilana idoti Afọwọkọ JavaScript lati ṣẹda awọn ikọlu lori pẹpẹ Node.js ati awọn ohun elo olokiki ti o da lori rẹ, ti o yori si ipaniyan koodu.

Ọna idoti Afọwọkọ naa nlo ẹya kan ti ede JavaScript ti o fun ọ laaye lati ṣafikun awọn ohun-ini tuntun si apẹrẹ root ti eyikeyi nkan. Awọn ohun elo le ni awọn bulọọki koodu (awọn ohun elo) ti iṣẹ wọn kan nipasẹ ohun-ini aropo; fun apẹẹrẹ, koodu naa le ni itumọ kan ninu bi 'const cmd = awọn aṣayan.cmd || "/ bin/sh"', imọ-ọrọ ti eyiti yoo yipada ti olukoni ba ṣakoso lati paarọ ohun-ini “cmd” ni apẹrẹ root.

Ikọlu aṣeyọri nbeere pe ohun elo le lo data ita lati ṣẹda ohun-ini tuntun ninu apẹrẹ gbongbo ohun naa, ati pe ipaniyan pade ohun elo kan ti o da lori ohun-ini ti a yipada. Yiyipada Afọwọkọ naa jẹ ṣiṣe nipasẹ sisẹ awọn ohun-ini iṣẹ “__proto__” ati “oluṣeto” ni Node.js. Ohun-ini "__proto__" da apẹrẹ ti kilasi ohun naa pada, ati ohun-ini “akọle” da iṣẹ ti a lo lati ṣẹda ohun naa pada.

Ti koodu ohun elo ba ni iṣẹ iyansilẹ “obj[a] [b] = iye” ati pe awọn iye ti ṣeto lati data ita, ikọlu le ṣeto “a” si iye “__proto__” ati ṣaṣeyọri fifi sori ẹrọ ti ohun-ini tirẹ. pẹlu awọn orukọ "b" ati iye "iye" ni root Afọwọkọ ti awọn ohun (obj.__proto__.b = iye;), ati ohun ini ṣeto ni Afọwọkọ yoo jẹ han ni gbogbo awọn ohun. Bakanna, ti koodu naa ba ni awọn ikosile bi “obj[a][b][c] = iye”, nipa tito “a” si iye “olupilẹṣẹ”, ati “b” si “afọwọṣe” ninu gbogbo awọn nkan to wa tẹlẹ, o le setumo ohun-ini tuntun pẹlu orukọ “c” ati iye “iye”.

Apeere iyipada apẹrẹ: const o1 = {}; const o2 = titun Nkan (); o1.__proto__.x = 42; // ṣẹda ohun ini "x" ni root prototype console.log (o2.x); // ohun-ini wiwọle “x” lati ohun miiran // abajade yoo jẹ 42, nitori afọwọṣe root ti yipada nipasẹ ohun o1, eyiti o tun lo ninu ohun o2

Apẹẹrẹ koodu alailagbara: Akọsilẹ iṣẹ (arg1, arg2, arg3){const obj = {}; const p = obj[arg1]; p[arg2] = arg3; pada p; }

Ti awọn ariyanjiyan iṣẹ titẹsiPoint ba ti ṣẹda lati inu data titẹ sii, lẹhinna ikọlu le kọja iye “__proto__” si arg1 ati ṣẹda ohun-ini kan pẹlu orukọ eyikeyi ninu apẹrẹ root. Ti o ba kọja arg2 ni iye “toString” ati arg3 iye 1, o le ṣalaye ohun-ini “toString” (Object.prototype.toString=1) ki o si kọlu ohun elo naa lakoko ipe si toString ().

Awọn apẹẹrẹ ti awọn ipo ti o le ja si ipaniyan koodu ikọlu pẹlu ṣiṣẹda awọn ohun-ini "akọkọ", "ikarahun", "okeere", "contextExtensions" ati awọn ohun-ini "env". Fun apẹẹrẹ, ikọlu le ṣẹda ohun-ini “akọkọ” ni apẹrẹ root ti ohun kan, kikọ sinu rẹ ọna si iwe afọwọkọ rẹ (Object.prototype.main = “./../../pwned.js”) ati yi ohun ini yoo wa ni a npe ni akoko ti ipaniyan ni awọn koodu ti awọn ikole beere ("mi-package"), ti o ba ti package to wa ko ni pato awọn "akọkọ" ini ni package.json (ti o ba ti ohun ini ti ko ba telẹ, ao gba lati inu apẹrẹ root). Awọn ohun-ini “ikarahun”, “okeere” ati “env” ni a le paarọ rẹ bakanna: jẹ ki rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/ona/to/npm/awọn iwe afọwọkọ/"; // okunfa ipe beere ("./target.js"); Object.prototype.main = "/ona/to/npm/scripts/changelog.js"; Object.prototype.shell = "ipade"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "-inspect-brk=0.0.0.0:1337"; // okunfa ipe beere ("baiti");

Awọn oniwadi ṣe itupalẹ awọn idii 10 NPM pẹlu nọmba ti o tobi julọ ti awọn igbẹkẹle ati rii pe 1958 ninu wọn ko ni ohun-ini akọkọ ni package.json, 4420 lo awọn ọna ibatan ni awọn alaye ibeere wọn, ati 355 taara lo API fidipo aṣẹ.

Apẹẹrẹ iṣiṣẹ jẹ ilokulo fun ikọlu ẹhin olupin Parse ti o dojukọ ohun-ini evalFunctions. Lati jẹ ki o rọrun idanimọ iru awọn ailagbara, ohun elo irinṣẹ kan ti ni idagbasoke ti o dapọ awọn ọna itupalẹ aimi ati aimi. Lakoko idanwo ti Node.js, awọn ohun elo 11 jẹ idanimọ ti o le ṣee lo lati ṣeto awọn ikọlu ti o yori si ipaniyan koodu ikọlu naa. Ni afikun si olupin Parse, awọn ailagbara ilokulo meji ni a tun ṣe idanimọ ni NPM CLI.

orisun: opennet.ru

Fi ọrọìwòye kun