NodeJS - __proto__ & prototype Pollution
Vitu katika JavaScript
Vitu katika JavaScript ni msingi wa mkusanyo wa jozi za funguo-na-thamani, inayojulikana kama mali. Kipengele kinaweza kuundwa kwa kutumia Object.create
na null
kama hoja ili kutoa kiumbe tupu. Njia hii inaruhusu uundaji wa kiumbe bila mali zozote zilizorithiwa.
Functions na Darasa katika JavaScript
Katika JavaScript, darasa na kazi zina uhusiano wa karibu, na kazi mara nyingi zikitumika kama wajenzi wa darasa. Licha ya kutokuwepo kwa msaada wa darasa wa asili katika JavaScript, wajenzi wanaweza kujifanya kama tabia ya darasa.
Vielezo katika JavaScript
JavaScript inaruhusu mabadiliko, uongezaji, au kufutwa kwa sifa za vielezo wakati wa uendeshaji. Uwezo huu unawezesha upanuzi wa kazi za darasa kwa njia ya kudumu.
Kazi kama vile toString
na valueOf
zinaweza kubadilishwa ili kubadilisha tabia zao, ikionyesha asili inayoweza kubadilika ya mfumo wa vielezo wa JavaScript.
Urithi
Katika programu inayotegemea vielezo, mali/majukumu huerithiwa na vitu kutoka kwa darasa. Darasa hizi huanzishwa kwa kuongeza mali/majukumu kwa kipengee kingine cha darasa au kwa kipengee tupu.
Ni muhimu kufahamu kwamba wakati mali inapoongezwa kwa kipengee kinachofanya kama vielezo kwa vitu vingine (kama vile myPersonObj
), vitu vinavyorithi hupata ufikivu wa mali hii mpya. Hata hivyo, mali hii haionyeshwi moja kwa moja isipokuwa itaitwa wazi.
Uchafuzi wa __proto__
Kuchunguza Uchafuzi wa Vielezo katika JavaScript
Vitu vya JavaScript vinafafanuliwa na jozi za funguo-na-thamani na huerithi kutoka kwa vielezo vya Vitu vya JavaScript. Hii inamaanisha kubadilisha vielezo vya Kipengee kunaweza kuathiri vitu vyote katika mazingira.
Hebu tumie mfano tofauti kuonyesha:
Upatikanaji wa prototype ya Object unawezekana kupitia:
Kwa kuongeza mali kwa kigezo cha Object, kila kigezo cha JavaScript kitarithi mali hizi mpya:
uchafuzi wa prototype
Kwa hali ambapo matumizi ya __proto__
yanazuiliwa, kubadilisha kigezo cha kazi ni mbadala:
Hii inaathiri vitu vilivyoundwa kutoka kwa konstrukta wa Vehicle
, ikipewa mali za beep
, hasWheels
, honk
, na isElectric
.
Njia mbili za kuathiri vitu vya JavaScript kwa ujumla kupitia uchafuzi wa kielelezo ni pamoja na:
Kuchafua
Object.prototype
moja kwa moja:
Kuchafua prototype ya constructor kwa muundo unaotumiwa mara kwa mara:
Baada ya operesheni hizi, kila kitu cha JavaScript kinaweza kutekeleza njia za goodbye
na greet
.
Kuchafua vitu vingine
Kutoka darasa hadi Object.prototype
Katika hali ambapo unaweza kuchafua kitu maalum na unahitaji kufikia Object.prototype
unaweza kutafuta kwa kutumia kitu kama hiki:
Uchafuzi wa Elementi za Array
Tafadhali kumbuka kwamba unaweza kuchafua sifa za vitu katika JS, ikiwa una ufikiaji wa kuchafua array unaweza pia kuchafua thamani za array zinazopatikana kwa kutumia indeksi (kumbuka huwezi kubadilisha thamani, hivyo unahitaji kuchafua indeksi ambazo kwa namna fulani hutumiwa lakini hazijaandikwa).
Uchafuzi wa vipengele vya Html
Wakati wa kuzalisha kipengele cha HTML kupitia JS inawezekana kubadilisha sifa ya innerHTML
ili iandike msimbo wa HTML usio na mpangilio. Wazo na mfano kutoka kwenye andiko hili.
Mifano
Mfano wa Msingi
Uchafuzi wa prototype hutokea kutokana na kasoro katika programu inayoruhusu kuandika upya mali kwenye Object.prototype
. Hii inamaanisha kwamba tangu vitu vingi vinapata mali zao kutoka kwa Object.prototype
Mfano rahisi ni kuongeza thamani kwa mali isiyowekwa wazi ya kitu ambayo itachunguzwa, kama:
Ikiwa sifa admin
haipo inawezekana kutumia PP na kuweka kuwa Kweli kwa kitu kama:
Mbinu iliyopo nyuma ya hii inahusisha kubadilisha mali ili ikiwa muhusika ana udhibiti wa baadhi ya pembejeo fulani, wanaweza kubadilisha mfano wa vitu vyote katika programu. Udanganyifu huu kawaida unahusisha kuweka mali ya __proto__
, ambayo, katika JavaScript, inalinganishwa na kubadilisha moja kwa moja mfano wa kitu.
Mazingira ambayo shambulio hili linaweza kutekelezwa kwa ufanisi, kama ilivyoelezwa katika utafiti maalum, ni pamoja na:
Kufanya muunganisho wa kurejea.
Kutambua mali kulingana na njia.
Kuiga vitu.
Kigeuzi wa Kazi
Uchafuzi wa Proto hadi RCE
pagePrototype Pollution to RCEMizigo mingine:
Uchafuzi wa Proto wa upande wa Mteja hadi XSS
pageClient Side Prototype PollutionCVE-2019–11358: Shambulio la uchafuzi wa Proto kupitia jQuery $ .extend
Kwa maelezo zaidi angalia makala hii Katika jQuery, kazi ya $ .extend
inaweza kusababisha uchafuzi wa proto ikiwa kipengele cha kunakili kinafanyiwa kazi vibaya. Kazi hii mara nyingi hutumika kwa kunakili vitu au kufunga mali kutoka kwa kitu cha msingi. Walakini, wakati iliyopangwa vibaya, mali zilizokusudiwa kwa kitu kipya zinaweza kupewa proto badala yake. Kwa mfano:
Hii udhaifu, uliojulikana kama CVE-2019–11358, inaonyesha jinsi nakala ya kina inaweza kubadilisha kwa bahati mbaya kigezo, ikisababisha hatari za usalama, kama upatikanaji usioidhinishwa wa admin ikiwa mali kama isAdmin
zinachunguzwa bila uthibitisho sahihi wa uwepo.
CVE-2018–3721, CVE-2019–10744: Shambulio la uchafuzi wa kigezo kupitia lodash
Kwa maelezo zaidi angalia makala hii
Lodash ilikumbana na udhaifu sawa wa uchafuzi wa kigezo (CVE-2018–3721, CVE-2019–10744). Masuala haya yalitatuliwa katika toleo la 4.17.11.
Mafunzo mengine yenye CVEs
Zana za kugundua Uchafuzi wa Kigezo
Server-Side-Prototype-Pollution-Gadgets-Scanner: Kifaa cha Burp Suite kilichoundwa kugundua na kuchambua udhaifu wa uchafuzi wa kigezo upande wa seva katika maombi ya wavuti. Zana hii inasogeza mchakato wa kutambua maombi ili kutambua masuala ya uchafuzi wa kigezo yanayowezekana. Inatumia vifaa vilivyothibitishwa - njia za kutumia uchafuzi wa kigezo kutekeleza vitendo vichafu - ikilenga hasa maktaba za Node.js.
server-side-prototype-pollution: Kifaa hiki kinatambua udhaifu wa uchafuzi wa kigezo upande wa seva. Hutumia mbinu zilizoelezwa katika uchafuzi wa kigezo upande wa seva.
Uchafuzi wa Kigezo wa AST katika NodeJS
NodeJS inatumia sana Miti ya Muhtasari ya Sintaksia (AST) katika JavaScript kwa kazi kama injini za templeti na TypeScript. Sehemu hii inachunguza udhaifu unaohusiana na uchafuzi wa kigezo katika injini za templeti, haswa Handlebars na Pug.
Uchambuzi wa Udhaifu wa Handlebars
Injini ya templeti ya Handlebars inaweza kushambuliwa na uchafuzi wa kigezo. Udhaifu huu unatokea kutokana na kazi maalum ndani ya faili ya javascript-compiler.js
. Kwa mfano, kazi ya appendContent
, inaunganisha pendingContent
ikiwepo, wakati kazi ya pushSource
inarejesha pendingContent
kuwa undefined
baada ya kuongeza chanzo.
Mchakato wa Uchexploitation
Uchexploitation unatumia Mti wa Muhtasari wa Sintaksia (AST) uliotengenezwa na Handlebars, ukifuata hatua hizi:
Udanganyifu wa Parser: Kwanza, parser, kupitia kifungu cha
NumberLiteral
, inahakikisha kuwa thamani ni za nambari. Uchafuzi wa kigezo unaweza kuzunguka hili, kuruhusu uingizaji wa herufi zisizo za nambari.Kushughulikiwa na Compiler: Compiler inaweza kusindika AST Object au templeti ya herufi. Ikiwa
input.type
inalingana naProgram
, kuingizwa kwa awali hushughulikiwa, ambayo inaweza kuchexploit.Uingizaji wa Kanuni: Kupitia udanganyifu wa
Object.prototype
, mtu anaweza kuingiza kanuni za kupindukia kwenye kazi ya templeti, ambayo inaweza kusababisha utekelezaji wa kanuni za mbali.
Mfano unaoonyesha uchexploitation wa udhaifu wa Handlebars:
Hii kanuni inaonyesha jinsi mshambuliaji anaweza kuingiza kanuni ya kupendelea kwenye kigezo cha Handlebars.
Marejeleo ya Nje: Shida inayohusiana na uchafuzi wa prototype iligunduliwa kwenye maktaba ya 'flat', kama ilivyoelezwa hapa: Shida kwenye GitHub.
Marejeleo ya Nje: Shida inayohusiana na uchafuzi wa prototype kwenye maktaba ya 'flat'
Mfano wa shambulio la uchafuzi wa prototype kwa kutumia Python:
Upungufu wa Usalama wa Pug
Pug, injini nyingine ya templeti, inakabili hatari sawa ya uchafuzi wa prototype. Maelezo ya kina yanapatikana katika mjadala kuhusu Uingizaji wa AST katika Pug.
Mfano wa uchafuzi wa prototype katika Pug:
Hatua za Kuzuia
Ili kupunguza hatari ya uchafuzi wa prototype, mikakati iliyoorodheshwa hapa chini inaweza kutumika:
Usiobadilika wa Vitu:
Object.prototype
inaweza kufanywa isiyo badilika kwa kutumiaObject.freeze
.Uthibitishaji wa Kuingia: Vipimo vya JSON vinapaswa kuthibitishwa kwa uangalifu dhidi ya muundo wa programu.
Vitu Salama vya Kuchanganya: Matumizi hatari ya kazi za kuchanganya za kurudia zinapaswa kuepukwa.
Vitu Bila Prototype: Vitu bila mali za prototype zinaweza kuundwa kwa kutumia
Object.create(null)
.Matumizi ya Ramani: Badala ya
Object
,Map
inapaswa kutumika kuhifadhi jozi za funguo-malipo.Visasisho vya Maktaba: Visasisho vya usalama vinaweza kujumuishwa kwa kawaida kwa kusasisha maktaba mara kwa mara.
Zana za Linter na Uchambuzi Statis: Tumia zana kama ESLint na programu-jalizi sahihi kugundua na kuzuia udhaifu wa uchafuzi wa prototype.
Mapitio ya Msimbo: Tekeleza mapitio ya msimbo makini kugundua na kurekebisha hatari za uchafuzi wa prototype.
Mafunzo ya Usalama: Elimisha watengenezaji kuhusu hatari za uchafuzi wa prototype na mazoea bora ya kuandika msimbo salama.
Matumizi ya Maktaba kwa Tahadhari: Kuwa mwangalifu wakati wa kutumia maktaba za watu wa tatu. Thathmini msimamo wao wa usalama na pitia msimbo wao, hasa wale wanaobadilisha vitu.
Kinga ya Wakati wa Uendeshaji: Tumia mbinu za kinga za wakati wa uendeshaji kama vile kutumia pakiti za npm zilizolenga usalama ambazo zinaweza kugundua na kuzuia mashambulio ya uchafuzi wa prototype.
Marejeo
Last updated