JavaScript объектын прототипүүдийг ашиглах замаар Node.js руу халдах

Хелмгольцын мэдээллийн аюулгүй байдлын төв (CISPA) болон Хатан хааны технологийн хүрээлэнгийн (Швед) судлаачид Node.js платформ болон түүн дээр суурилсан алдартай программуудад халдлага үүсгэхийн тулд JavaScript прототипийн бохирдлын техникийг ашиглах боломжтой эсэхэд дүн шинжилгээ хийж, кодыг гүйцэтгэхэд хүргэсэн.

Прототип бохирдуулах арга нь JavaScript хэлний онцлогийг ашигладаг бөгөөд энэ нь аливаа объектын эх загварт шинэ шинж чанарыг нэмэх боломжийг олгодог. Аппликейшн нь орлуулсан шинж чанарт нөлөөлсөн кодын блок (гаджет) агуулж болно; жишээлбэл, код нь 'const cmd = options.cmd || "/bin/sh"', хэрэв халдагч эх прототип дэх "cmd" шинж чанарыг орлуулж чадвал логик нь өөрчлөгдөнө.

Амжилттай халдлага нь тухайн программ нь объектын эх загварт шинэ өмч үүсгэхийн тулд гадаад өгөгдлийг ашиглах боломжтой бөгөөд гүйцэтгэл нь өөрчлөгдсөн шинж чанараас хамаарах гаджеттай тулгарах шаардлагатай. Прототипийг өөрчлөх нь Node.js доторх "__proto__" болон "constructor" үйлчилгээний шинж чанаруудыг боловсруулах замаар хийгддэг. "__proto__" шинж чанар нь тухайн объектын ангийн прототипийг буцаадаг ба "constructor" шинж чанар нь тухайн объектыг үүсгэхэд хэрэглэгдэх функцийг буцаана.

Хэрэв програмын код нь "obj[a][b] = утга" гэсэн даалгаврыг агуулж байгаа бөгөөд утгуудыг гадаад өгөгдлөөс тохируулсан бол халдагч "a"-г "__proto__" утгаар тохируулж, өөрийн өмчийг суулгаж болно. Объектийн эх загварт "b" нэртэй, "утга" гэсэн утгатай (obj.__proto__.b = утга;), загварт тохируулсан шинж чанар бүх объектод харагдах болно. Үүний нэгэн адил, хэрэв код нь "obj[a][b][c] = утга" гэх мэт илэрхийллийг агуулж байвал одоо байгаа бүх объектод "a"-г "constructor" утга, "b"-г "prototype" гэж тохируулснаар та боломжтой. "c" нэртэй, "утга" гэсэн утгатай шинэ өмчийг тодорхойлно.

Прототипийг өөрчлөх жишээ: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // эх прототипийн console.log (o2.x) дотор "x" өмчийг үүсгэх; // өөр объектоос "x" шинж чанарт хандах // эх прототипийг o42 объектод ашигладаг o1 объектоор дамжуулан өөрчилсөн тул гаралт нь 2 байх болно.

Эмзэг кодын жишээ: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; буцах p; }

Хэрэв entryPoint функцийн аргументууд нь оролтын өгөгдлөөс үүссэн бол халдагчид “__proto__” утгыг arg1 рүү дамжуулж, эх прототипт дурын нэрээр өмч үүсгэж болно. Хэрэв та arg2-д "toString" утгыг, arg3-д 1 гэсэн утгыг өгвөл "toString" шинж чанарыг (Object.prototype.toString=1) тодорхойлж, toString() руу залгах үед програмыг сүйрүүлж болно.

Халдагчийн кодыг гүйцэтгэхэд хүргэж болзошгүй нөхцөл байдлын жишээнд "үндсэн", "бүрхүүл", "экспорт", "контекстExtensions" болон "env" шинж чанаруудыг бий болгох орно. Жишээлбэл, халдагч объектын эх загварт "үндсэн" шинж чанарыг үүсгэж, түүн дотор өөрийн скриптийн замыг бичих боломжтой (Object.prototype.main = "./../../pwned.js") болон Хэрэв өгөгдсөн багц нь package.json доторх "main" шинж чанарыг тодорхой заагаагүй бол (хэрэв өмч тодорхойлогдоогүй бол) шаардлагатай ("my-package") бүтцийн кодыг гүйцэтгэх үед энэ өмчийг дуудах болно. үүнийг эх загвараас авах болно). “Shell”, “exports” болон “env” шинж чанаруудыг ижил төстэй байдлаар орлуулж болно: let 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-г шууд ашигладаг болохыг тогтоожээ.

Ажиллаж буй жишээ бол evalFunctions шинж чанарыг дарангуйлдаг Parse Server backend-д халдсан мөлжлөг юм. Ийм эмзэг байдлыг тодорхойлоход хялбар болгохын тулд статик болон динамик шинжилгээний аргуудыг хослуулсан багаж хэрэгслийг боловсруулсан. Node.js-ийг турших явцад халдагчийн кодыг гүйцэтгэхэд хүргэдэг халдлагуудыг зохион байгуулахад ашиглаж болох 11 гаджетыг тодорхойлсон. Parse Server-ээс гадна NPM CLI-д ашиглах боломжтой хоёр эмзэг байдлыг илрүүлсэн.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх