የጃቫ ስክሪፕት የነገር ፕሮቶታይፕን በመጠቀም Node.jsን ማጥቃት

በሄልምሆልትዝ የመረጃ ደህንነት ማእከል (ሲአይኤስፒኤ) እና የሮያል ቴክኖሎጂ ኢንስቲትዩት (ስዊድን) ተመራማሪዎች የጃቫስክሪፕት ፕሮቶታይፕ የነገር ብክለት ቴክኒክ ("ፕሮቶታይፕ ብክለት") በ Node.js መድረክ እና ታዋቂ አፕሊኬሽኖች ላይ የተመሰረቱ ጥቃቶችን ተግባራዊነት ተንትነዋል። ወደ ኮድ አፈፃፀም ይመራል ።

የፕሮቶታይፕ ብክለት ዘዴው የጃቫስክሪፕት ቋንቋ ባህሪን ይጠቀማል ይህም በማንኛዉም ነገር ስር ፕሮቶታይፕ ላይ አዳዲስ ንብረቶችን ለመጨመር ያስችላል። አፕሊኬሽኖች ውስጥ ኮድ ብሎኮች (gadgets) ሊኖሩ ይችላሉ ስራቸው በተተካ ንብረት የተጎዳ ለምሳሌ በኮዱ ውስጥ እንደ 'const cmd = options.cmd አይነት ግንባታ ሊኖር ይችላል || "/ bin/sh"'፣ አጥቂው የ"cmd" ንብረትን በስሩ ፕሮቶታይፕ ውስጥ ለመተካት ከቻለ አመክንዮው የሚቀየር ይሆናል።

የተሳካ ጥቃት አፕሊኬሽኑ ከውጭ የሚመጡ ግብአቶችን ተጠቅሞ በእቃው ስር ፕሮቶታይፕ ውስጥ አዲስ ንብረት መፍጠር እንዲችል እና በተቀየረው ንብረት ላይ የሚመረኮዝ መግብር በአፈፃፀም ወቅት ያጋጥመዋል። ፕሮቶታይፕን መቀየር በ Node.js የ"__ፕሮቶ__" እና "ገንቢ" የመገልገያ ባህሪያትን በመያዝ ይከናወናል። የ"__ፕሮቶ__" ንብረቱ የነገሩን ክፍል ፕሮቶታይፕ ይመልሳል፣ እና "ገንቢ" ንብረቱ ነገሩን ለመፍጠር ጥቅም ላይ የዋለውን ተግባር ይመልሳል።

የማመልከቻው ኮድ "obj[a][b] = value" የሚለውን ተግባር ካጋጠመው እና እሴቶቹ ከውጫዊ ውሂብ ከተዋቀሩ አጥቂው "a"ን ወደ "__proto__" እሴት በማዋቀር የንብረቱን መቼት ማሳካት ይችላል "ለ" የሚለው ስም እና የእቃው ስርወ ፕሮቶታይፕ ውስጥ ያለው "እሴት" (obj.__proto__.b = value;) በምሳሌው ውስጥ የተቀመጠው ንብረት በሁሉም ነገሮች ላይ የሚታይ ይሆናል። በተመሳሳይም በኮዱ ውስጥ እንደ "obj[a][b][c] = value" ያሉ አገላለጾች ካሉ፣ "a"ን ወደ "ገንቢ" እሴት በማቀናበር እና "ለ" በሁሉም ነባር ነገሮች ውስጥ "ፕሮቶታይፕ" አዲስ ንብረት በ "ሐ" ስም እና "እሴት" መግለፅ ይችላሉ.

ፕሮቶታይፕን የመቀየር ምሳሌ፡ const o1 = {}; const o2 = አዲስ ነገር (); o1.__proto__.x = 42; // የ "x" ንብረትን በስር ፕሮቶታይፕ ኮንሶል.ሎግ (o2.x) ይፍጠሩ; // ንብረቱን "x" ከሌላ ነገር ተመልከት // በውጤቱ ላይ 42 እናገኛለን, ምክንያቱም የስር ፕሮቶታይፕ የተቀየረው በኦ1 ነገር ነው, እሱም በ o2 ነገር ውስጥም ጥቅም ላይ ይውላል.

የተጋላጭ ኮድ ምሳሌ፡ የተግባር መግቢያ ነጥብ (arg1, arg2, arg3){const obj = {}; const p = obj[arg1]; p[arg2] = arg3; መመለስ p; }

የመግቢያ ነጥብ ተግባር ነጋሪ እሴቶች ከግቤት ውሂቡ ከተፈጠሩ አጥቂው "__proto__" የሚለውን እሴት ወደ arg1 በማለፍ በስሩ ፕሮቶታይፕ ውስጥ ማንኛውንም ስም ያለው ንብረት መፍጠር ይችላል። "toString" የሚለውን እሴት ወደ arg2 እና 3 ወደ arg1 ካሳለፉት የ"toString" ንብረቱን (Object.prototype.toString=1) መግለፅ እና የtoString() ተግባር ሲጠራ አፕሊኬሽኑ እንዲበላሽ ማድረግ ይችላሉ።

ለአጥቂ ኮድ አፈፃፀም ሊዳርጉ የሚችሉ ሁኔታዎች እንደ ምሳሌ "ዋና", "ሼል", "ወደ ውጭ መላክ", "አውድ ኤክስቴንሽን" እና "ኤንቪ" ንብረቶችን መፍጠር ተሰጥቷል. ለምሳሌ፣ አጥቂ በእቃው ስር ፕሮቶታይፕ ውስጥ “ዋና” ንብረት መፍጠር ይችላል፣ ወደ እሱ ስክሪፕት የሚወስደውን መንገድ (Object.prototype.main = “./../../pwned.js”) እና ይህ ንብረት በአስፈላጊው ("የእኔ ጥቅል") ግንባታ ኮድ ውስጥ በሚፈፀምበት ጊዜ ይጠራል, የተካተተው ፓኬጅ በ pack.json ውስጥ ያለውን ንብረት "ዋና" በግልፅ ካልገለፀ (ንብረቱ ካልተገለጸ, እሱ ይሆናል). ከስር ፕሮቶታይፕ ማግኘት)። በተመሳሳይ የ"ሼል"፣ "ላኪ" እና "ኤንቪ" ንብረቶች ሊተኩ ይችላሉ፡ rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/ መንገድ/ወደ/npm/ስክሪፕቶች/"; // ቀስቅሴ ጥሪ ያስፈልጋል ("./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 ቱ በ pack.json ውስጥ ዋና ንብረት እንደሌላቸው ደርሰውበታል፣ 4420 በአስፈላጊው መግለጫ ውስጥ አንጻራዊ መንገዶችን ይጠቀማሉ እና 355 በቀጥታ የትዕዛዝ ምትክ ኤፒአይ ይጠቀማሉ።

የስራ ምሳሌ የኢvalፉውንሽን ንብረቱን የሚሽር የ Parse Server backendን ለማጥቃት የሚደረግ ብዝበዛ ነው። እንደነዚህ ያሉ ተጋላጭነቶችን ለመለየት ቀላል ለማድረግ የማይንቀሳቀስ እና ተለዋዋጭ ትንታኔ ዘዴዎችን የሚያጣምር የመሳሪያ ስብስብ ተዘጋጅቷል. በ Node.js ሙከራ ወቅት የአጥቂውን ኮድ አፈፃፀም የሚያደርሱ ጥቃቶችን ለማደራጀት የሚያገለግሉ 11 መግብሮች ተለይተዋል። ከ Parse Server በተጨማሪ፣ በNPM CLI ውስጥ ሁለት ሊበዘብዙ የሚችሉ ተጋላጭነቶችም ተለይተዋል።

ምንጭ: opennet.ru

አስተያየት ያክሉ