ஜாவாஸ்கிரிப்ட் ஆப்ஜெக்ட் புரோட்டோடைப்களை கையாளுவதன் மூலம் Node.js மீது தாக்குதல்

தகவல் பாதுகாப்புக்கான ஹெல்ம்ஹோல்ட்ஸ் மையம் (CISPA) மற்றும் ராயல் இன்ஸ்டிடியூட் ஆப் டெக்னாலஜி (ஸ்வீடன்) ஆகியவற்றின் ஆராய்ச்சியாளர்கள், Node.js இயங்குதளம் மற்றும் அதன் அடிப்படையில் பிரபலமான பயன்பாடுகளில் தாக்குதல்களை உருவாக்க ஜாவாஸ்கிரிப்ட் ப்ரோடோடைப் மாசு நுட்பத்தின் பொருந்தக்கூடிய தன்மையை ஆய்வு செய்தனர்.

முன்மாதிரி மாசுபடுத்தும் முறை ஜாவாஸ்கிரிப்ட் மொழியின் அம்சத்தைப் பயன்படுத்துகிறது, இது எந்தவொரு பொருளின் மூல முன்மாதிரிக்கும் புதிய பண்புகளைச் சேர்க்க உங்களை அனுமதிக்கிறது. பயன்பாடுகளில் குறியீடு தொகுதிகள் (கேட்ஜெட்டுகள்) இருக்கலாம், அதன் செயல்பாடு மாற்று சொத்தால் பாதிக்கப்படுகிறது; எடுத்துக்காட்டாக, குறியீட்டில் 'const cmd = options.cmd || "/bin/sh"', தாக்குபவர் ரூட் முன்மாதிரியில் "cmd" சொத்தை மாற்றினால், அதன் தர்க்கம் மாற்றப்படும்.

ஒரு வெற்றிகரமான தாக்குதலுக்கு, ஆப்ஜெக்ட்டின் ரூட் ப்ரோடோடைப்பில் புதிய சொத்தை உருவாக்க, வெளிப்புறத் தரவைப் பயன்படுத்த முடியும், மேலும் அந்தச் செயலாக்கம் மாற்றியமைக்கப்பட்ட சொத்தைப் பொறுத்து கேஜெட்டை எதிர்கொள்கிறது. Node.js இல் "__proto__" மற்றும் "கன்ஸ்ட்ரக்டர்" சேவை பண்புகளை செயலாக்குவதன் மூலம் முன்மாதிரியை மாற்றுவது நிறைவேற்றப்படுகிறது. "__proto__" பண்பு பொருளின் வகுப்பின் முன்மாதிரியை வழங்குகிறது, மேலும் "கட்டமைப்பாளர்" பண்பு பொருளை உருவாக்கப் பயன்படுத்தப்படும் செயல்பாட்டை வழங்குகிறது.

பயன்பாட்டுக் குறியீட்டில் “obj[a][b] = மதிப்பு” மற்றும் மதிப்புகள் வெளிப்புறத் தரவிலிருந்து அமைக்கப்பட்டிருந்தால், தாக்குபவர் “__proto__” மதிப்பிற்கு “a” ஐ அமைத்து, அவர்களின் சொந்த சொத்தை நிறுவ முடியும். பொருளின் மூல முன்மாதிரியில் "b" என்ற பெயர் மற்றும் மதிப்பு "மதிப்பு" உடன் (obj.__proto__.b = மதிப்பு;), மற்றும் முன்மாதிரியில் அமைக்கப்பட்ட சொத்து எல்லா பொருட்களிலும் தெரியும். இதேபோல், குறியீட்டில் “obj[a][b][c] = value” போன்ற வெளிப்பாடுகள் இருந்தால், “a” ஐ “கன்ஸ்ட்ரக்டர்” மதிப்பிலும், “b” ஐ “prototype” ஆகவும் அமைப்பதன் மூலம், உங்களால் முடியும் "c" என்ற பெயருடனும் "மதிப்பு" மதிப்புடனும் ஒரு புதிய சொத்தை வரையறுக்கவும்.

முன்மாதிரியை மாற்றுவதற்கான எடுத்துக்காட்டு: const o1 = {}; const o2 = புதிய பொருள்(); o1.__proto__.x = 42; // ரூட் முன்மாதிரி console.log (o2.x) இல் "x" சொத்தை உருவாக்கவும்; // மற்றொரு பொருளில் இருந்து “x” பண்புகளை அணுகவும் // ரூட் முன்மாதிரியானது ஆப்ஜெக்ட் o42 மூலம் மாற்றப்பட்டதால், வெளியீடு 1 ஆக இருக்கும், இது ஆப்ஜெக்ட் o2 இல் பயன்படுத்தப்படுகிறது.

பாதிக்கப்படக்கூடிய குறியீட்டின் எடுத்துக்காட்டு: செயல்பாடு 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() க்கு அழைப்பின் போது பயன்பாட்டை செயலிழக்கச் செய்யலாம்.

"முதன்மை", "ஷெல்", "ஏற்றுமதிகள்", "சூழல் நீட்டிப்புகள்" மற்றும் "என்வி" பண்புகளை உருவாக்குதல் ஆகியவை தாக்குபவர் குறியீட்டை செயல்படுத்த வழிவகுக்கும் சூழ்நிலைகளின் எடுத்துக்காட்டுகள். எடுத்துக்காட்டாக, தாக்குபவர் ஒரு பொருளின் மூல முன்மாதிரியில் "முக்கிய" சொத்தை உருவாக்கி, அதில் தனது ஸ்கிரிப்ட்டுக்கான பாதையை எழுதலாம் (Object.prototype.main = "./../../pwned.js") மற்றும் உள்ளடக்கப்பட்ட தொகுப்பு, pack.json இல் உள்ள "முக்கிய" சொத்தை வெளிப்படையாக வரையறுக்கவில்லை என்றால், ("my-package") கன்ஸ்ட்ரக்ட் தேவையின் ("my-package") குறியீட்டில் இந்த சொத்து செயல்படுத்தப்படும் போது அழைக்கப்படும் (சொத்து வரையறுக்கப்படவில்லை என்றால், இது ரூட் முன்மாதிரியிலிருந்து பெறப்படும்). "shell", "exports" மற்றும் "env" பண்புகளை இதேபோல் மாற்றலாம்: 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 சொத்தை மீறும் பார்ஸ் சர்வர் பின்தளத்தை தாக்குவதற்கான ஒரு சுரண்டல் ஒரு வேலை உதாரணம். இத்தகைய பாதிப்புகளை அடையாளம் காண்பதை எளிதாக்க, நிலையான மற்றும் மாறும் பகுப்பாய்வு முறைகளை ஒருங்கிணைக்கும் கருவித்தொகுப்பு உருவாக்கப்பட்டுள்ளது. Node.js இன் சோதனையின் போது, ​​11 கேஜெட்டுகள் அடையாளம் காணப்பட்டன, அவை தாக்குபவர்களின் குறியீட்டை செயல்படுத்த வழிவகுக்கும் தாக்குதல்களை ஒழுங்கமைக்கப் பயன்படும். பார்ஸ் சேவையகத்துடன் கூடுதலாக, NPM CLI இல் இரண்டு சுரண்டக்கூடிய பாதிப்புகளும் அடையாளம் காணப்பட்டன.

ஆதாரம்: opennet.ru

கருத்தைச் சேர்