JavaScript වස්තු මූලාකෘති හැසිරවීම හරහා Node.js වෙත පහර දීම

Helmholtz Center for Information Security (CISPA) සහ Royal Institute of Technology (Sweden) හි පර්යේෂකයන් Node.js වේදිකාවට සහ ඒ මත පදනම් වූ ජනප්‍රිය යෙදුම්වලට ප්‍රහාර එල්ල කිරීම සඳහා JavaScript මූලාකෘති දූෂණ තාක්‍ෂණයේ අදාළත්වය විශ්ලේෂණය කර කේත ක්‍රියාත්මක කිරීමට හේතු විය.

මූලාකෘති දූෂණය කිරීමේ ක්‍රමය ඕනෑම වස්තුවක මූල මූලාකෘතියට නව ගුණාංග එක් කිරීමට ඉඩ සලසන JavaScript භාෂාවේ විශේෂාංගයක් භාවිතා කරයි. යෙදුම්වල කේත කුට්ටි (ගැජට්) අඩංගු විය හැක, ඒවායේ ක්‍රියාකාරිත්වය ආදේශක දේපලකින් බලපෑමට ලක් වේ; උදාහරණයක් ලෙස, කේතයේ 'const cmd = options.cmd || වැනි ඉදිකිරීම් අඩංගු විය හැක. "/bin/sh"', මූල මූලාකෘතියේ "cmd" ගුණය ආදේශ කිරීමට ප්‍රහාරකයා සමත් වුවහොත් එහි තර්කය වෙනස් වේ.

සාර්ථක ප්‍රහාරයක් සඳහා යෙදුමට වස්තුවේ මූල මූලාකෘතියේ නව දේපලක් නිර්මාණය කිරීමට බාහිර දත්ත භාවිතා කළ හැකි අතර, ක්‍රියාත්මක කිරීම නවීකරණය කරන ලද දේපල මත රඳා පවතින ගැජට් එකක් හමු වේ. මූලාකෘතිය වෙනස් කිරීම Node.js හි "__proto__" සහ "constructor" සේවා ගුණාංග සැකසීමෙන් සිදු කෙරේ. "__proto__" ගුණාංගය වස්තුවේ පන්තියේ මූලාකෘතිය ආපසු ලබා දෙයි, සහ "ඉදි කරන්නා" ගුණාංගය වස්තුව සෑදීමට භාවිතා කරන ශ්‍රිතය ලබා දෙයි.

යෙදුම් කේතයේ “obj[a][b] = value” පැවරුම අඩංගු නම් සහ අගයන් බාහිර දත්ත වලින් සකසා තිබේ නම්, ප්‍රහාරකයෙකුට “__proto__” අගයට “a” සකසා ඔවුන්ගේම දේපල ස්ථාපනය කර ගත හැක. වස්තුවේ මූල මූලාකෘතියේ "b" නම සහ "අගය" අගය සමඟ (obj.__proto__.b = අගය;), සහ මූලාකෘතියේ පිහිටුවා ඇති දේපල සියලු වස්තූන් තුළ දෘශ්‍යමාන වනු ඇත. ඒ හා සමානව, කේතයේ “obj[a][b][c] = value” වැනි ප්‍රකාශන තිබේ නම්, “a” “constructor” අගයට සහ “b” සිට “prototype” වෙත සැකසීමෙන්, ඔබට පුළුවන් "c" යන නම සහ "අගය" යන නම සහිත නව දේපලක් නිර්වචනය කරන්න.

මූලාකෘතිය වෙනස් කිරීමේ උදාහරණය: const o1 = {}; const o2 = නව වස්තුව (); o1.__proto__.x = 42; // මූල මූලාකෘති console.log (o2.x) හි දේපල "x" සාදන්න; // වෙනත් වස්තුවකින් "x" ගුණාංගයට ප්‍රවේශ වීම // වස්තුව o42 හි ද භාවිතා වන වස්තුව o1 හරහා මූල මූලාකෘතිය වෙනස් කර ඇති බැවින් ප්‍රතිදානය 2 වනු ඇත.

අවදානමට ලක්විය හැකි කේතයේ උදාහරණය: ශ්‍රිතය 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() වෙත ඇමතුම අතරතුර යෙදුම බිඳ වැටිය හැක.

"ප්‍රධාන", "ෂෙල්", "අපනයන", "සන්දර්භය දිගු" සහ "env" ගුණාංග නිර්මාණය කිරීම ප්‍රහාරක කේත ක්‍රියාත්මක කිරීමට හේතු විය හැකි තත්වයන් සඳහා උදාහරණ වේ. උදාහරණයක් ලෙස, ප්‍රහාරකයෙකුට වස්තුවක මූල මූලාකෘතියේ “ප්‍රධාන” ගුණාංගයක් නිර්මාණය කළ හැකිය, එහි ඔහුගේ පිටපතට යන මාර්ගය (Object.prototype.main = “./../../pwned.js”) සහ ඇතුලත් කරන ලද පැකේජය package.json හි ඇති "ප්‍රධාන" දේපල පැහැදිලිව නිර්වචනය නොකරන්නේ නම් (දේපල නිර්වචනය කර නොමැති නම්, මෙම දේපල ක්‍රියාත්මක වන අවස්ථාවේදී, ඉදිකිරීම් අවශ්‍යතාවයේ ("මගේ-පැකේජය") ක්‍රියාත්මක වන අවස්ථාවේදී කැඳවනු ලැබේ. එය මූල මූලාකෘතියෙන් ලබා ගනී). "shell", "exports" සහ "env" ගුණාංග සමානව ආදේශ කළ හැක: rootProto = Object.prototype ඉඩ දෙන්න; rootProto ["අපනයන"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // ප්‍රේරක ඇමතුම් අවශ්‍ය ("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "node"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // ප්‍රේරක ඇමතුම් අවශ්‍ය ("බයිට්");

පර්යේෂකයන් විසින් වැඩිම පරායත්තතා සංඛ්‍යාවක් සහිත NPM පැකේජ 10ක් විශ්ලේෂණය කළ අතර ඉන් 1958කට package.json හි ප්‍රධාන දේපලක් නොමැති බවත්, 4420ක් ඔවුන්ගේ අවශ්‍යතා ප්‍රකාශයන්හි සාපේක්ෂ මාර්ග භාවිතා කරන බවත්, 355 සෘජුවම විධාන ආදේශන API භාවිතා කරන බවත් සොයා ගත්හ.

ක්‍රියාකාරී උදාහරණයක් වන්නේ evalFunctions දේපල අභිබවා යන Parse Server පසුපෙළට පහර දීම සඳහා වන සූරාකෑමකි. එවැනි දුර්වලතා හඳුනා ගැනීම සරල කිරීම සඳහා, ස්ථිතික සහ ගතික විශ්ලේෂණ ක්‍රම ඒකාබද්ධ කරන මෙවලම් කට්ටලයක් නිර්මාණය කර ඇත. Node.js පරීක්ෂා කිරීමේදී, ප්‍රහාරකයාගේ කේතය ක්‍රියාත්මක කිරීමට තුඩු දෙන ප්‍රහාර සංවිධානය කිරීමට භාවිතා කළ හැකි උපකරණ 11ක් හඳුනා ගන්නා ලදී. Parse Server ට අමතරව, NPM CLI හි සූරාකෑමට ලක්විය හැකි දුර්වලතා දෙකක් ද හඳුනා ගන්නා ලදී.

මූලාශ්රය: opennet.ru

අදහස් එක් කරන්න