JavaScript ఆబ్జెక్ట్ ప్రోటోటైప్‌ల మానిప్యులేషన్ ద్వారా Node.jsపై దాడి

హెల్మ్‌హోల్ట్జ్ సెంటర్ ఫర్ ఇన్ఫర్మేషన్ సెక్యూరిటీ (CISPA) మరియు రాయల్ ఇన్‌స్టిట్యూట్ ఆఫ్ టెక్నాలజీ (స్వీడన్) పరిశోధకులు Node.js ప్లాట్‌ఫారమ్ మరియు దాని ఆధారంగా ప్రసిద్ధ అప్లికేషన్‌లపై దాడులను సృష్టించేందుకు జావాస్క్రిప్ట్ ప్రోటోటైప్ పొల్యూషన్ టెక్నిక్ యొక్క అన్వయాన్ని విశ్లేషించారు, ఇది కోడ్ అమలుకు దారితీసింది.

ప్రోటోటైప్ కాలుష్యం చేసే పద్ధతి జావాస్క్రిప్ట్ భాష యొక్క లక్షణాన్ని ఉపయోగిస్తుంది, ఇది ఏదైనా వస్తువు యొక్క మూల నమూనాకు కొత్త లక్షణాలను జోడించడానికి మిమ్మల్ని అనుమతిస్తుంది. అప్లికేషన్‌లు కోడ్ బ్లాక్‌లను (గాడ్జెట్‌లు) కలిగి ఉండవచ్చు, దీని ఆపరేషన్ ప్రత్యామ్నాయ ఆస్తి ద్వారా ప్రభావితమవుతుంది; ఉదాహరణకు, కోడ్ 'const cmd = options.cmd || వంటి నిర్మాణాన్ని కలిగి ఉండవచ్చు. "/bin/sh"', దాడి చేసే వ్యక్తి రూట్ ప్రోటోటైప్‌లో “cmd” లక్షణాన్ని భర్తీ చేయగలిగితే దాని తర్కం మార్చబడుతుంది.

విజయవంతమైన దాడికి ఆబ్జెక్ట్ యొక్క రూట్ ప్రోటోటైప్‌లో కొత్త ప్రాపర్టీని సృష్టించడానికి అప్లికేషన్ బాహ్య డేటాను ఉపయోగించాల్సి ఉంటుంది మరియు ఆ ఎగ్జిక్యూషన్ సవరించిన ప్రాపర్టీపై ఆధారపడి ఉండే గాడ్జెట్‌ను ఎదుర్కొంటుంది. Node.jsలో “__ప్రోటో__” మరియు “కన్‌స్ట్రక్టర్” సర్వీస్ ప్రాపర్టీలను ప్రాసెస్ చేయడం ద్వారా ప్రోటోటైప్‌ను మార్చడం జరుగుతుంది. "__proto__" లక్షణం వస్తువు యొక్క తరగతి యొక్క నమూనాను అందిస్తుంది మరియు "కన్‌స్ట్రక్టర్" లక్షణం ఆబ్జెక్ట్‌ను సృష్టించడానికి ఉపయోగించిన ఫంక్షన్‌ను అందిస్తుంది.

అప్లికేషన్ కోడ్‌లో “obj[a][b] = value” అనే అసైన్‌మెంట్ ఉండి, విలువలు బాహ్య డేటా నుండి సెట్ చేయబడితే, దాడి చేసే వ్యక్తి “a”ని “__proto__” విలువకు సెట్ చేసి, వారి స్వంత ఆస్తిని ఇన్‌స్టాలేషన్‌ను సాధించవచ్చు. ఆబ్జెక్ట్ యొక్క మూల నమూనాలో "b" పేరు మరియు విలువ "విలువ" (obj.__proto__.b = విలువ;), మరియు ప్రోటోటైప్‌లో సెట్ చేయబడిన ఆస్తి అన్ని వస్తువులలో కనిపిస్తుంది. అదేవిధంగా, కోడ్‌లో “obj[a][b][c] = value” వంటి వ్యక్తీకరణలు ఉంటే, “కన్‌స్ట్రక్టర్” విలువకు “a”ని సెట్ చేయడం ద్వారా మరియు ఇప్పటికే ఉన్న అన్ని ఆబ్జెక్ట్‌లలో “b”ని “ప్రోటోటైప్”కి సెట్ చేయడం ద్వారా, మీరు చేయవచ్చు "c" పేరు మరియు "విలువ" విలువతో కొత్త ఆస్తిని నిర్వచించండి.

ప్రోటోటైప్‌ను మార్చడానికి ఉదాహరణ: const o1 = {}; const o2 = కొత్త ఆబ్జెక్ట్(); o1.__proto__.x = 42; // రూట్ ప్రోటోటైప్ console.log (o2.x)లో “x” ప్రాపర్టీని సృష్టించండి; // మరొక ఆబ్జెక్ట్ నుండి ప్రాపర్టీ “x”ని యాక్సెస్ చేయండి // అవుట్‌పుట్ 42 అవుతుంది, ఎందుకంటే రూట్ ప్రోటోటైప్ ఆబ్జెక్ట్ o1 ద్వారా మార్చబడింది, ఇది ఆబ్జెక్ట్ o2లో కూడా ఉపయోగించబడుతుంది

హాని కలిగించే కోడ్ యొక్క ఉదాహరణ: ఫంక్షన్ ఎంట్రీపాయింట్ (arg1, arg2, arg3){const obj = {}; const p = obj[arg1]; p[arg2] = arg3; తిరిగి p; }

ఎంట్రీపాయింట్ ఫంక్షన్ ఆర్గ్యుమెంట్‌లు ఇన్‌పుట్ డేటా నుండి ఏర్పడినట్లయితే, దాడి చేసే వ్యక్తి “__proto__” విలువను arg1కి పంపవచ్చు మరియు రూట్ ప్రోటోటైప్‌లో ఏదైనా పేరుతో ఆస్తిని సృష్టించవచ్చు. మీరు arg2 విలువ "toString" మరియు arg3 విలువ 1ని పాస్ చేస్తే, మీరు "toString" లక్షణాన్ని (Object.prototype.toString=1) నిర్వచించవచ్చు మరియు toString()కి కాల్ చేస్తున్నప్పుడు అప్లికేషన్‌ను క్రాష్ చేయవచ్చు.

అటాకర్ కోడ్ అమలుకు దారితీసే పరిస్థితుల ఉదాహరణలు "ప్రధాన", "షెల్", "ఎగుమతులు", "సందర్భ పొడిగింపులు" మరియు "env" లక్షణాలను సృష్టించడం. ఉదాహరణకు, దాడి చేసే వ్యక్తి ఆబ్జెక్ట్ యొక్క రూట్ ప్రోటోటైప్‌లో “ప్రధాన” లక్షణాన్ని సృష్టించవచ్చు, దానిలో అతని స్క్రిప్ట్‌కు మార్గాన్ని వ్రాయవచ్చు (Object.prototype.main = “./../../pwned.js”) మరియు ఈ ఆస్తిని అమలు చేసే సమయంలో నిర్మాణ అవసరం("నా-ప్యాకేజీ") కోడ్‌లో పిలవబడుతుంది, చేర్చబడిన ప్యాకేజీ ప్యాకేజీ.jsonలో "ప్రధాన" లక్షణాన్ని స్పష్టంగా నిర్వచించకపోతే (ఆస్తి నిర్వచించబడకపోతే, ఇది రూట్ ప్రోటోటైప్ నుండి పొందబడుతుంది). “షెల్”, “ఎగుమతులు” మరియు “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 ప్యాకేజీ.jsonలో ప్రధాన ఆస్తిని కలిగి లేవని, 4420 మంది తమ అవసరమైన స్టేట్‌మెంట్‌లలో సంబంధిత మార్గాలను ఉపయోగిస్తున్నారని మరియు 355 నేరుగా కమాండ్ ప్రత్యామ్నాయ APIని ఉపయోగిస్తున్నారని కనుగొన్నారు.

evalFunctions ప్రాపర్టీని ఓవర్‌రైడ్ చేసే పార్స్ సర్వర్ బ్యాకెండ్‌పై దాడి చేయడం కోసం ఒక పని చేసే ఉదాహరణ. అటువంటి దుర్బలత్వాల గుర్తింపును సులభతరం చేయడానికి, స్టాటిక్ మరియు డైనమిక్ విశ్లేషణ పద్ధతులను మిళితం చేసే టూల్‌కిట్ అభివృద్ధి చేయబడింది. Node.js పరీక్ష సమయంలో, దాడి చేసేవారి కోడ్‌ని అమలు చేయడానికి దారితీసే దాడులను నిర్వహించడానికి ఉపయోగించే 11 గాడ్జెట్‌లు గుర్తించబడ్డాయి. పార్స్ సర్వర్‌తో పాటు, ఎన్‌పిఎమ్ సిఎల్‌ఐలో రెండు దుర్వినియోగమైన దుర్బలత్వాలు కూడా గుర్తించబడ్డాయి.

మూలం: opennet.ru

ఒక వ్యాఖ్యను జోడించండి