АтакуванС Π½Π° Node.js Ρ‡Ρ€Π΅Π· ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈ Π½Π° JavaScript ΠΎΠ±Π΅ΠΊΡ‚ΠΈ

Π˜Π·ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΎΡ‚ Π¦Π΅Π½Ρ‚ΡŠΡ€Π° Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Π° сигурност Π₯Π΅Π»ΠΌΡ…ΠΎΠ»Ρ† (CISPA) ΠΈ ΠšΡ€Π°Π»ΡΠΊΠΈΡ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅Π½ институт (ШвСция) Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ…Π° прилоТимостта Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°Ρ‚Π° Π·Π° Π·Π°ΠΌΡŠΡ€ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° JavaScript (β€žΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ½ΠΎ Π·Π°ΠΌΡŠΡ€ΡΡΠ²Π°Π½Π΅β€œ) Π·Π° създаванС Π½Π° Π°Ρ‚Π°ΠΊΠΈ срСщу ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Node.js ΠΈ популярни прилоТСния, Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ Π½Π° Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ изпълнСниС Π½Π° ΠΊΠΎΠ΄.

ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π·Π° Π·Π°ΠΌΡŠΡ€ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° функция Π½Π° Π΅Π·ΠΈΠΊΠ° JavaScript, която Π²ΠΈ позволява Π΄Π° добавятС Π½ΠΎΠ²ΠΈ свойства към основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° всСки ΠΎΠ±Π΅ΠΊΡ‚. Π’ прилоТСнията ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ (Π΄ΠΆΠ°Π΄ΠΆΠΈ), чиято Ρ€Π°Π±ΠΎΡ‚Π° Π΅ засСгната ΠΎΡ‚ замСстСно свойство, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° конструкция ΠΊΠ°Ρ‚ΠΎ 'const cmd = options.cmd || "/bin/sh"', чиято Π»ΠΎΠ³ΠΈΠΊΠ° Ρ‰Π΅ бъдС ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½Π°, Π°ΠΊΠΎ атакуващият успСС Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈ свойството "cmd" Π² основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ.

Π£ΡΠΏΠ΅ΡˆΠ½Π°Ρ‚Π° Π°Ρ‚Π°ΠΊΠ° изисква ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²Ρ…ΠΎΠ΄ ΠΎΡ‚Π²ΡŠΠ½, Π·Π° Π΄Π° създадС Π½ΠΎΠ²ΠΎ свойство Π² основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π° ΠΈ Ρ‡Π΅ ΠΏΡ€ΠΈΡ‚ΡƒΡ€ΠΊΠ°, която зависи ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΎΡ‚ΠΎ свойство, сС срСща ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС. ΠŸΡ€ΠΎΠΌΡΠ½Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΎΡ‚ Node.js, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ свойствата Π½Π° ΠΏΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° "__proto__" ΠΈ "constructor". Бвойството "__proto__" Π²Ρ€ΡŠΡ‰Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° Π½Π° класа Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π°, Π° свойството "constructor" Π²Ρ€ΡŠΡ‰Π° функцията, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π·Π° създаванС Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π°.

Ако ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ срСщнС присвояванСто "obj[a][b] = value" ΠΈ стойноститС са Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΎΡ‚ външни Π΄Π°Π½Π½ΠΈ, атакуващият ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ "a" Π½Π° стойността "__proto__" ΠΈ Π΄Π° постигнС настройката Π½Π° своСто свойство с ΠΈΠΌΠ΅Ρ‚ΠΎ "b" ΠΈ стойността "стойност" Π² основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π° (obj.__proto__.b = стойност;), Π΄ΠΎΠΊΠ°Ρ‚ΠΎ свойството, Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°, Ρ‰Π΅ бъдС Π²ΠΈΠ΄ΠΈΠΌΠΎ във всички ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. По ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½, Π°ΠΊΠΎ Π² ΠΊΠΎΠ΄Π° ΠΈΠΌΠ° ΠΈΠ·Ρ€Π°Π·ΠΈ ΠΊΠ°Ρ‚ΠΎ "obj[a][b][c] = стойност", Ρ‡Ρ€Π΅Π· Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° "a" Π½Π° стойността "constructor" ΠΈ "b" Π½Π° "prototype" във всички ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ Π½ΠΎΠ²ΠΎ свойство с ΠΈΠΌΠ΅Ρ‚ΠΎ "c" ΠΈ стойността "value".

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° промяна Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°: const o1 = {}; const o2 = Π½ΠΎΠ² ΠΎΠ±Π΅ΠΊΡ‚ (); o1.__proto__.x = 42; // създаванС Π½Π° свойството "x" Π² основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ console.log(o2.x); // ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ към свойството "x" ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ ΠΎΠ±Π΅ΠΊΡ‚ // ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ 42 Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ основният ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ Ρ‡Ρ€Π΅Π· ΠΎΠ±Π΅ΠΊΡ‚Π° o1, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡ‰ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΎΠ±Π΅ΠΊΡ‚Π° o2

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° уязвим ΠΊΠΎΠ΄: функция entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; Π²Ρ€ΡŠΡ‰Π°Π½Π΅ p; }

Ако Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° функцията entryPoint сС Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Ρ‚ ΠΎΡ‚ Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ, Ρ‚ΠΎΠ³Π°Π²Π° атакуващият ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ стойността "__proto__" Π½Π° arg1 ΠΈ Π΄Π° създадС свойство с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ ΠΈΠΌΠ΅ Π² основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ. Ако ΠΏΡ€Π΅Π΄Π°Π΄Π΅Ρ‚Π΅ стойността "toString" Π½Π° arg2 ΠΈ 3 Π½Π° arg1, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ свойството "toString" (Object.prototype.toString=1) ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Ρ‚Π΅ срив Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΈΠ·Π²ΠΈΠΊΠ° функцията toString().

ΠšΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ситуации, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π°Ρ‚ Π΄ΠΎ изпълнСниС Π½Π° Π°Ρ‚Π°ΠΊΡƒΠ²Π°Ρ‰ ΠΊΠΎΠ΄, Π΅ Π΄Π°Π΄Π΅Π½ΠΎ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° свойствата "main", "shell", "exports", "contextExtensions" ΠΈ "env". НапримСр, атакуващият ΠΌΠΎΠΆΠ΅ Π΄Π° създадС "основно" свойство Π² основния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π°, ΠΊΠ°Ρ‚ΠΎ напишС ΠΏΡŠΡ‚Ρ Π΄ΠΎ нСговия скрипт Π² Π½Π΅Π³ΠΎ (Object.prototype.main = "./../../pwned.js") ΠΈ Ρ‚ΠΎΠ²Π° свойство Ρ‰Π΅ бъдС ΠΈΠ·Π²ΠΈΠΊΠ°Π½ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Π² ΠΊΠΎΠ΄Π° Π½Π° конструкцията require("my-package"), Π°ΠΊΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ свойството "main" Π² package.json (Π°ΠΊΠΎ свойството Π½Π΅ Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ, Ρ‚ΠΎ Ρ‰Π΅ Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΎΡ‚ корСнния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ). По ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ свойствата "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 1958 NPM ΠΏΠ°ΠΊΠ΅Ρ‚Π° с Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ зависимости ΠΈ установиха, Ρ‡Π΅ 4420 ΠΎΡ‚ тях нямат основно свойство Π² package.json, 355 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ относитСлни ΠΏΡŠΡ‚Π΅ΠΊΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π·Π° изискванС, Π° XNUMX Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ API Π·Π° замСстванС Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.

Π Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅ Сксплойт Π·Π° Π°Ρ‚Π°ΠΊΠ° Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° Π½Π° Parse Server, ΠΊΠΎΠΉΡ‚ΠΎ замСства свойството evalFunctions. Π—Π° Π΄Π° сС опрости ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° уязвимости, Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π΅Π½ инструмСнтариум, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° статичСн ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅Π½ Π°Π½Π°Π»ΠΈΠ·. По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° тСстванСто Π½Π° Node.js бяха ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ 11 Π΄ΠΆΠ°Π΄ΠΆΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Π°Ρ‚Π°ΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ водят Π΄ΠΎ изпълнСниС Π½Π° ΠΊΠΎΠ΄Π° Π½Π° нападатСля. Π’ допълнСниС към Parse Server, Π΄Π²Π΅ СксплоатируСми уязвимости ΡΡŠΡ‰ΠΎ са ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ Π² NPM CLI.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€