Ymosod ar Node.js trwy Drin Prototeipiau Gwrthrych JavaScript

Dadansoddodd ymchwilwyr o Ganolfan Diogelwch Gwybodaeth Helmholtz (CISPA) a'r Sefydliad Technoleg Brenhinol (Sweden) gymhwysedd techneg llygredd prototeip JavaScript i greu ymosodiadau ar lwyfan Node.js a chymwysiadau poblogaidd yn seiliedig arno, gan arwain at weithredu cod.

Mae'r dull llygru prototeip yn defnyddio nodwedd o'r iaith JavaScript sy'n eich galluogi i ychwanegu priodweddau newydd at brototeip gwraidd unrhyw wrthrych. Gall rhaglenni gynnwys blociau cod (teclynnau) y mae priodwedd amnewidiol yn effeithio ar eu gweithrediad; er enghraifft, gall y cod gynnwys lluniad fel 'const cmd = options.cmd || "/bin/sh", y bydd ei resymeg yn cael ei newid os yw'r ymosodwr yn llwyddo i roi'r priodwedd “cmd” yn y prototeip gwraidd yn ei le.

Mae ymosodiad llwyddiannus yn ei gwneud yn ofynnol i'r cais ddefnyddio data allanol i greu eiddo newydd ym mhrototeip gwraidd y gwrthrych, a bod gweithrediad yn dod ar draws teclyn sy'n dibynnu ar yr eiddo wedi'i addasu. Cyflawnir newid y prototeip trwy brosesu'r priodweddau gwasanaeth “__proto__” ac “adeiladwr” yn Node.js. Mae'r eiddo "__proto__" yn dychwelyd prototeip dosbarth y gwrthrych, ac mae'r eiddo "adeiladwr" yn dychwelyd y swyddogaeth a ddefnyddir i greu'r gwrthrych.

Os yw cod y cymhwysiad yn cynnwys yr aseiniad “obj[a][b] = value” a bod y gwerthoedd yn cael eu gosod o ddata allanol, gall ymosodwr osod “a” i'r gwerth “__proto__” a chyflawni gosod ei eiddo ei hun gyda'r enw “b” a'r gwerth “gwerth” ym mhrosiect gwraidd y gwrthrych (obj.__proto__.b = gwerth;), a bydd yr eiddo a osodwyd yn y prototeip i'w weld ym mhob gwrthrych. Yn yr un modd, os yw'r cod yn cynnwys ymadroddion fel “obj[a][b][c] = value”, trwy osod “a” i'r gwerth “constructor”, a “b” i “prototeip” ym mhob gwrthrych sy'n bodoli, gallwch chi diffinio eiddo newydd gyda'r enw "c" a'r gwerth "gwerth".

Enghraifft o newid y prototeip: const o1 = {}; const o2 = Gwrthrych newydd(); o1.__proto__.x = 42; // creu eiddo “x” yn y consol prototeip gwraidd.log (o2.x); // eiddo mynediad “x” o wrthrych arall // bydd yr allbwn yn 42, gan fod y prototeip gwraidd wedi'i newid trwy wrthrych o1, a ddefnyddir hefyd yn gwrthrych o2

Enghraifft o god bregus: swyddogaeth entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; dychwelyd p; }

Os yw'r dadleuon swyddogaeth entryPoint yn cael eu ffurfio o ddata mewnbwn, yna gall ymosodwr drosglwyddo'r gwerth “__proto__” i arg1 a chreu priodwedd gydag unrhyw enw yn y prototeip gwraidd. Os byddwch yn pasio arg2 y gwerth "toString" ac arg3 y gwerth 1, gallwch ddiffinio'r priodwedd "toString" (Object.prototype.toString=1) a chwalu'r cymhwysiad yn ystod yr alwad i toString().

Mae enghreifftiau o sefyllfaoedd a allai arwain at weithredu cod ymosodwyr yn cynnwys creu'r eiddo "prif", "cragen", "allforion", "contextExtensions" ac "env". Er enghraifft, gall ymosodwr greu priodwedd “prif” ym mhrototeip gwraidd gwrthrych, gan ysgrifennu ynddo y llwybr at ei sgript (Object.prototype.main = “./../../pwned.js”) a bydd yr eiddo hwn yn cael ei alw ar adeg gweithredu yng nghod y gofyniad adeiladu ("fy-pecyn"), os nad yw'r pecyn sydd wedi'i gynnwys yn diffinio'n benodol y "prif" eiddo yn package.json (os nad yw'r eiddo wedi'i ddiffinio, fe'i ceir o'r prototeip gwraidd). Gellir amnewid priodweddau “cragen”, “allforion” ac “env” yn yr un modd: let rootProto = Object.prototype; rootProto[ "exports" ] = { ".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // angen galwad sbardun ("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "nôd"; Object.prototype.env = {} ; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // galwad sbardun angen ("beit");

Dadansoddodd yr ymchwilwyr 10 o becynnau NPM gyda'r nifer fwyaf o ddibyniaethau a chanfuwyd nad oes gan 1958 ohonynt brif eiddo yn package.json, mae 4420 yn defnyddio llwybrau cymharol yn eu datganiadau angen, ac mae 355 yn defnyddio'r API amnewid gorchymyn yn uniongyrchol.

Enghraifft weithredol yw ecsbloetio ar gyfer ymosod ar gefn y Parse Server sy'n diystyru'r eiddo evalFunctions. Er mwyn symleiddio'r broses o nodi gwendidau o'r fath, mae pecyn cymorth wedi'i ddatblygu sy'n cyfuno dulliau dadansoddi statig a deinamig. Yn ystod profion Node.js, nodwyd 11 teclyn y gellir eu defnyddio i drefnu ymosodiadau sy'n arwain at weithredu cod yr ymosodwr. Yn ogystal â Parse Server, nodwyd dau wendid y gellir eu hecsbloetio hefyd yn CLI yr NPM.

Ffynhonnell: opennet.ru

Ychwanegu sylw