Ҳамла ба Node.js тавассути коркарди прототипҳои объекти JavaScript

Муҳаққиқони Маркази амнияти иттилоотии Ҳелмҳолтс (CISPA) ва Донишкадаи Шоҳии Технология (Шветсия) татбиқи техникаи ифлоскунии прототипи JavaScript-ро барои эҷоди ҳамлаҳо ба платформаи Node.js ва барномаҳои маъмул дар асоси он, ки боиси иҷрои рамзҳо мешаванд, таҳлил карданд.

Усули ифлоскунии прототип аз хусусияти забони JavaScript истифода мебарад, ки ба шумо имкон медиҳад хосиятҳои навро ба прототипи решаи ҳама гуна объект илова кунед. Барномаҳо метавонанд дорои блокҳои рамзӣ (гаҷетҳо) бошанд, ки ба амалиёти онҳо моликияти ивазшуда таъсир мерасонад; масалан, код метавонад сохтореро дар бар гирад, ба монанди 'const cmd = options.cmd || "/bin/sh"', ки мантиқи он тағир хоҳад ёфт, агар ҳамлакунанда тавонист амволи "cmd" -ро дар прототипи реша иваз кунад.

Ҳамлаи бомуваффақият талаб мекунад, ки барнома метавонад маълумоти берунаро барои эҷоди моликияти нав дар прототипи решаи объект истифода барад ва иҷрои он бо гаҷет дучор мешавад, ки аз моликияти тағирёфта вобаста аст. Тағир додани прототип тавассути коркарди хосиятҳои хидматрасонии "__proto__" ва "созанда" дар Node.js анҷом дода мешавад. Хосияти "__proto__" прототипи синфи объектро бар мегардонад ва хосияти "созанда" функсияеро, ки барои сохтани объект истифода мешавад, бармегардонад.

Агар рамзи барнома супориши "obj[a][b] = арзиш" дошта бошад ва арзишҳо аз маълумоти беруна муқаррар карда шуда бошанд, ҳамлакунанда метавонад "a" -ро ба арзиши "__proto__" муқаррар кунад ва ба насби амволи худ ноил шавад. бо номи "б" ва арзиши "арзиш" дар прототипи решаи объект (obj.__proto__.b = арзиш;) ва амволи муқарраршуда дар прототип дар ҳама объектҳо намоён хоҳад буд. Ба ҳамин монанд, агар код ибораҳоеро ба мисли "obj[a][b][c] = арзиш дошта бошад, бо гузоштани "a" ба арзиши "созанда" ва "b" ба "прототип" дар ҳама объектҳои мавҷуда, шумо метавонед моликияти навро бо номи "c" ва арзиши "арзиш" муайян кунед.

Намунаи тағир додани прототип: const o1 = {}; const o2 = Объекти нав(); o1.__proto__.x = 42; // дар прототипи решаи console.log (o2.x) амволи "x" -ро эҷод кунед; // дастрасии моликияти "x" аз объекти дигар // натиҷа 42 хоҳад буд, зеро прототипи реша тавассути объекти o1 тағир дода шудааст, ки он дар объекти o2 низ истифода мешавад

Намунаи рамзи осебпазир: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; баргардонидани саҳ; }

Агар аргументҳои функсияи entryPoint аз маълумоти воридшаванда сохта шуда бошанд, он гоҳ ҳамлакунанда метавонад арзиши “__proto__”-ро ба arg1 гузаронад ва дар прототипи решавӣ хосиятеро бо дилхоҳ ном эҷод кунад. Агар шумо arg2-ро арзиши "toString" ва arg3 арзиши 1-ро гузоред, шумо метавонед моликияти "toString"-ро муайян кунед (Object.prototype.toString=1) ва ҳангоми занг ба toString() барномаро вайрон кунед.

Намунаҳои ҳолатҳое, ки метавонанд ба иҷроиши рамзи ҳамла оварда расонанд, иборатанд аз эҷоди хосиятҳои "асосӣ", "шелл", "экспортҳо", "contextExtensions" ва "env". Масалан, ҳамлакунанда метавонад дар прототипи решаи объект моликияти "асосӣ" эҷод кунад ва дар он роҳи скрипти худро нависад (Object.prototype.main = "./../../pwned.js") ва ин амвол ҳангоми иҷро дар коди construct require("my-package") даъват мешавад, агар бастаи дохилшуда хосияти "main"-ро дар package.json ба таври возеҳ муайян накунад (агар амвол муайян нашуда бошад, он аз прототипи реша гирифта мешавад). Хосиятҳои "ниҳонӣ", "экспортҳо" ва "env" метавонанд ба ҳамин монанд иваз карда шаванд: бигзор rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // триггер занг талаб мекунад("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "гиреҳ"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // занги триггер талаб мекунад("байт");

Муҳаққиқон 10 бастаи NPM-ро бо шумораи бештари вобастагиҳо таҳлил карданд ва муайян карданд, ки 1958-тои онҳо моликияти асосӣ дар package.json надоранд, 4420-тои онҳо дар изҳороти зарурии худ роҳҳои нисбӣ истифода мебаранд ва 355-тои онҳо мустақиман API ивазкунии фармонро истифода мебаранд.

Намунаи корӣ як истисмор барои ҳамла ба пуштибонии Parse Server мебошад, ки моликияти evalFunctions-ро бекор мекунад. Барои содда кардани муайян кардани чунин осебпазирӣ, асбобе таҳия шудааст, ки усулҳои таҳлили статикӣ ва динамикиро муттаҳид мекунад. Ҳангоми санҷиши Node.js 11 гаҷет муайян карда шуд, ки метавонанд барои ташкили ҳамлаҳое истифода шаванд, ки боиси иҷрои рамзи ҳамлагар мешаванд. Илова ба Parse Server, дар NPM CLI низ ду осебпазирии истифодашаванда муайян карда шуданд.

Манбаъ: opennet.ru

Илова Эзоҳ