Browser Extension Pentesting Methodology
Basic Information
Extensions za kivinjari zimeandikwa kwa JavaScript na zinapakiwa na kivinjari kwa nyuma. Ina DOM yake lakini inaweza kuingiliana na DOM za tovuti nyingine. Hii inamaanisha kwamba inaweza kuhatarisha usiri, uadilifu, na upatikanaji (CIA) wa tovuti nyingine.
Main Components
Muundo wa nyongeza unaonekana bora unapofikiriwa na unajumuisha vipengele vitatu. Hebu tuangalie kila kipengele kwa undani.
Content Scripts
Kila script ya maudhui ina ufikiaji wa moja kwa moja kwa DOM ya ukurasa mmoja wa wavuti na hivyo inakabiliwa na ingizo linaloweza kuwa na uharibifu. Hata hivyo, script ya maudhui haina ruhusa zaidi ya uwezo wa kutuma ujumbe kwa msingi wa nyongeza.
Extension Core
Msingi wa nyongeza unajumuisha ruhusa nyingi za nyongeza, lakini msingi wa nyongeza unaweza kuingiliana tu na maudhui ya wavuti kupitia XMLHttpRequest na scripts za maudhui. Pia, msingi wa nyongeza hauna ufikiaji wa moja kwa moja kwa mashine mwenyeji.
Native Binary
Nyongeza inaruhusu binary asilia ambayo inaweza kufikia mashine mwenyeji kwa ruhusa kamili ya mtumiaji. Binary asilia inaingiliana na msingi wa nyongeza kupitia Kiolesura cha Programu ya Plugin ya Netscape ya kawaida (NPAPI) inayotumiwa na Flash na nyongeza nyingine za kivinjari.
Boundaries
Ili kupata ruhusa kamili za mtumiaji, mshambuliaji lazima amshawishi nyongeza kupitisha ingizo la uharibifu kutoka kwa script ya maudhui hadi msingi wa nyongeza na kutoka kwa msingi wa nyongeza hadi binary asilia.
Kila kipengele cha nyongeza kimewekwa mbali na kingine kwa mipaka yenye ulinzi mkali. Kila kipengele kinakimbia katika mchakato tofauti wa mfumo wa uendeshaji. Scripts za maudhui na msingi wa nyongeza zinakimbia katika mchakato wa sandbox ambao haupatikani kwa huduma nyingi za mfumo wa uendeshaji.
Zaidi ya hayo, scripts za maudhui ziko mbali na kurasa zao za wavuti zinazohusiana kwa kukimbia katika heap tofauti ya JavaScript. Script ya maudhui na ukurasa wa wavuti zina ufikiaji wa DOM sawa ya msingi, lakini hizo mbili hazibadilishani viashiria vya JavaScript, kuzuia kuvuja kwa kazi za JavaScript.
manifest.json
manifest.json
Nyongeza ya Chrome ni tu folda ya ZIP yenye .crx file extension. Msingi wa nyongeza ni manifest.json
faili katika mzizi wa folda, ambayo inaelezea muundo, ruhusa, na chaguzi zingine za usanidi.
Example:
content_scripts
content_scripts
Content scripts zinapakiwa kila wakati mtumiaji anapohamia kwenye ukurasa unaolingana, katika kesi yetu ukurasa wowote unaolingana na https://example.com/*
na usiozingatia regex ya *://*/*/business*
. Zinatekelezwa kama vile scripts za ukurasa wenyewe na zina ufikiaji wa kiholela kwa Document Object Model (DOM) wa ukurasa.
Ili kujumuisha au kutengwa kwa URLs zaidi, pia inawezekana kutumia include_globs
na exclude_globs
.
Hii ni mfano wa skripti ya maudhui ambayo itaongeza kitufe cha maelezo kwenye ukurasa wakati API ya hifadhi inatumika kupata thamani ya message
kutoka kwenye hifadhi ya nyongeza.
Ujumbe unatumwa kwa kurasa za nyongeza na skripti ya maudhui wakati kitufe hiki kinapobonyezwa, kupitia matumizi ya runtime.sendMessage() API. Hii ni kutokana na kikomo cha skripti ya maudhui katika ufikiaji wa moja kwa moja wa APIs, ambapo storage
ni miongoni mwa visثi vichache. Kwa kazi zaidi ya visثi hivi, ujumbe unatumwa kwa kurasa za nyongeza ambazo skripti za maudhui zinaweza kuwasiliana nazo.
Kulingana na kivinjari, uwezo wa skripti za maudhui unaweza kutofautiana kidogo. Kwa kivinjari kinachotegemea Chromium, orodha ya uwezo inapatikana katika Chrome Developers documentation, na kwa Firefox, MDN inatumika kama chanzo kikuu. Pia ni muhimu kutambua kwamba skripti za maudhui zina uwezo wa kuwasiliana na skripti za nyuma, na kuwapa uwezo wa kutekeleza vitendo na kurudisha majibu.
Ili kuona na kufanyia kazi skripti za maudhui katika Chrome, menyu ya zana za maendeleo za Chrome inaweza kufikiwa kutoka Chaguo > Zana zaidi > Zana za maendeleo AU kwa kubonyeza Ctrl + Shift + I.
Baada ya zana za maendeleo kuonyeshwa, tab ya Chanzo inapaswa kubonyezwa, ikifuatiwa na tab ya Skripti za Maudhui. Hii inaruhusu kuangalia skripti za maudhui zinazotumika kutoka nyongeza mbalimbali na kuweka alama za kuvunja ili kufuatilia mtiririko wa utekelezaji.
Skripti za maudhui zilizowekwa
Kumbuka kwamba Skripti za Maudhui si lazima kwani pia inawezekana kudumu kuweka skripti na kuziweka kimaandishi kwenye kurasa za wavuti kupitia tabs.executeScript
. Hii kwa kweli inatoa udhibiti wa kina zaidi.
Ili kuweka skripti ya maudhui kimaandishi, nyongeza inahitaji kuwa na idhini za mwenyeji kwa ukurasa ambao skripti zitakazo wekwa. Idhini hizi zinaweza kupatikana kwa kuziomba ndani ya hati ya nyongeza au kwa msingi wa muda kupitia activeTab.
Mfano wa nyongeza inayotegemea activeTab
Ingiza faili la JS kwa kubonyeza:
Weka kazi kwa kubonyeza:
Mfano na ruhusa za skripti
Ili kujumuisha au kutengwa kwa URLs zaidi, pia inawezekana kutumia include_globs
na exclude_globs
.
Content Scripts run_at
run_at
Sehemu ya run_at
inasimamia wakati faili za JavaScript zinapoinjizwa kwenye ukurasa wa wavuti. Thamani inayopendekezwa na ya default ni "document_idle"
.
Thamani zinazowezekana ni:
document_idle
: Wakati wowote iwezekanavyodocument_start
: Baada ya faili zozote kutokacss
, lakini kabla ya DOM nyingine yoyote kujengwa au script nyingine yoyote kuendeshwa.document_end
: Mara moja baada ya DOM kukamilika, lakini kabla ya rasilimali ndogo kama picha na fremu kupakiwa.
Via manifest.json
manifest.json
Kupitia service-worker.js
background
background
Meseji zinazotumwa na scripts za maudhui zinapokelewa na background page, ambayo ina jukumu kuu katika kuratibu vipengele vya nyongeza. Kwa kuzingatia, background page inadumu wakati wa maisha ya nyongeza, ikifanya kazi kwa siri bila mwingiliano wa moja kwa moja na mtumiaji. Ina Document Object Model (DOM) yake mwenyewe, ikiruhusu mwingiliano tata na usimamizi wa hali.
Mambo Muhimu:
Jukumu la Background Page: Inafanya kazi kama kituo cha neva kwa nyongeza, kuhakikisha mawasiliano na uratibu kati ya sehemu mbalimbali za nyongeza.
Uendelevu: Ni kiumbe kilichopo kila wakati, kisichoonekana kwa mtumiaji lakini muhimu kwa utendaji wa nyongeza.
Uundaji Otomatiki: Ikiwa haijafafanuliwa wazi, kivinjari kitaunda kiotomatiki background page. Ukurasa huu ulioundwa kiotomatiki utajumuisha scripts zote za background zilizotajwa katika hati ya nyongeza, kuhakikisha uendeshaji usio na mshono wa kazi za background za nyongeza.
Urahisi unaotolewa na kivinjari katika kuunda kiotomatiki background page (wakati haijatangazwa wazi) unahakikisha kuwa scripts zote muhimu za background zimejumuishwa na zinafanya kazi, zikifanya mchakato wa kuweka nyongeza kuwa rahisi.
Mfano wa script ya background:
Inatumia runtime.onMessage API kusikiliza ujumbe. Wakati ujumbe wa "explain"
unapopokelewa, inatumia tabs API kufungua ukurasa katika tab mpya.
Ili kubaini makosa katika skripti ya nyuma unaweza kwenda kwenye maelezo ya nyongeza na kukagua huduma ya mfanyakazi, hii itafungua zana za maendeleo na skripti ya nyuma:
Kurasa za chaguo na nyingine
Nyongeza za kivinjari zinaweza kuwa na aina mbalimbali za kurasa:
Kurasa za hatua zinaonyeshwa katika orodha ya kushuka wakati ikoni ya nyongeza inabonyezwa.
Kurasa ambazo nyongeza it pakia katika tab mpya.
Kurasa za Chaguo: Ukurasa huu unaonyeshwa juu ya nyongeza wakati unabonyezwa. Katika hati ya awali Katika kesi yangu niliweza kufikia ukurasa huu katika
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
au kubonyeza:
Kumbuka kwamba kurasa hizi si za kudumu kama kurasa za nyuma kwani zinapakia maudhui kwa njia ya kidinamikali kulingana na mahitaji. Licha ya hili, zinashiriki uwezo fulani na ukurasa wa nyuma:
Mawasiliano na Skripti za Maudhui: Kama ilivyo kwa ukurasa wa nyuma, kurasa hizi zinaweza kupokea ujumbe kutoka kwa skripti za maudhui, kurahisisha mwingiliano ndani ya nyongeza.
Upatikanaji wa APIs za Maalum za Nyongeza: Kurasa hizi zinafurahia upatikanaji mpana wa APIs maalum za nyongeza, kulingana na ruhusa zilizofafanuliwa kwa nyongeza.
permissions
& host_permissions
permissions
& host_permissions
permissions
na host_permissions
ni entries kutoka manifest.json
ambazo zitaonyesha ni ruhusa zipi nyongeza za kivinjari zina (hifadhi, eneo...) na katika kurasa zipi za wavuti.
Kama nyongeza za kivinjari zinaweza kuwa na mamlaka makubwa, moja mbaya au moja iliyovunjwa inaweza kumruhusu mshambuliaji njia tofauti za kuiba taarifa nyeti na kupeleleza mtumiaji.
Angalia jinsi mipangilio hii inavyofanya kazi na jinsi inaweza kutumika vibaya katika:
BrowExt - permissions & host_permissionscontent_security_policy
content_security_policy
sera ya usalama wa maudhui inaweza kutangazwa pia ndani ya manifest.json
. Ikiwa kuna moja iliyofafanuliwa, inaweza kuwa hatari.
Mipangilio ya default kwa kurasa za nyongeza za kivinjari ni ya kukatisha tamaa:
Kwa maelezo zaidi kuhusu CSP na uwezekano wa kupita angalia:
Content Security Policy (CSP) Bypassweb_accessible_resources
web_accessible_resources
ili ukurasa wa wavuti uweze kufikia ukurasa wa Kiongezeo cha Kivinjari, ukurasa wa .html
kwa mfano, ukurasa huu unahitaji kutajwa katika uwanja wa web_accessible_resources
wa manifest.json
.
Kwa mfano:
Hizi kurasa zinapatikana katika URL kama:
Katika nyongeza za umma, extension-id inapatikana:
Hata hivyo, ikiwa parameter ya manifest.json
use_dynamic_url
inatumika, id hii inaweza kuwa ya dinamik.
Kumbuka kwamba hata kama ukurasa umeelezewa hapa, unaweza kuwa ulindwa dhidi ya ClickJacking kutokana na Content Security Policy. Hivyo unahitaji kuangalia pia (sehemu ya frame-ancestors) kabla ya kuthibitisha kuwa shambulio la ClickJacking linawezekana.
Kuruhusiwa kufikia kurasa hizi kunafanya kurasa hizi kuwa na uwezekano wa kuwa na udhaifu wa ClickJacking:
BrowExt - ClickJackingKuruhusu kurasa hizi kupakuliwa tu na nyongeza na si kwa URL za nasibu kunaweza kuzuia shambulio la ClickJacking.
Kumbuka kwamba kurasa kutoka web_accessible_resources
na kurasa nyingine za nyongeza pia zina uwezo wa kuwasiliana na scripts za nyuma. Hivyo ikiwa moja ya kurasa hizi ina udhaifu wa XSS inaweza kufungua udhaifu mkubwa zaidi.
Zaidi ya hayo, kumbuka kwamba unaweza kufungua tu kurasa zilizoonyeshwa katika web_accessible_resources
ndani ya iframes, lakini kutoka kwenye tab mpya inawezekana kufikia ukurasa wowote katika nyongeza ukijua extension ID. Hivyo, ikiwa XSS inapatikana ikitumia vigezo sawa, inaweza kutumika hata kama ukurasa haujawekwa katika web_accessible_resources
.
externally_connectable
externally_connectable
Kulingana na docs, mali ya "externally_connectable"
ya manifest inatangaza ni nyongeza zipi na kurasa za wavuti zipi zinaweza kuungana na nyongeza yako kupitia runtime.connect na runtime.sendMessage.
Ikiwa ufunguo wa
externally_connectable
haujaelezwa katika manifest ya nyongeza yako au umeelezwa kama"ids": ["*"]
, nyongeza zote zinaweza kuungana, lakini hakuna kurasa za wavuti zinaweza kuungana.Ikiwa IDs maalum zimeelezwa, kama katika
"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, tu programu hizo zinaweza kuungana.Ikiwa mifano imeelezwa, programu hizo za wavuti zitakuwa na uwezo wa kuungana:
Ikiwa imeelezwa kama tupu:
"externally_connectable": {}
, hakuna programu au wavuti itakayoweza kuungana.
Idadi ndogo ya nyongeza na URL zilizoorodheshwa hapa, uso wa shambulio utakuwa mdogo.
Ikiwa ukurasa wa wavuti unaotetereka kwa XSS au takeover umeonyeshwa katika externally_connectable
, mshambuliaji ataweza kutuma ujumbe moja kwa moja kwa skripti ya nyuma, akipita kabisa Skripti ya Maudhui na CSP yake.
Hivyo, hii ni kikosi cha kupita nguvu sana.
Zaidi ya hayo, ikiwa mteja ataweka nyongeza ya uongo, hata kama hairuhusiwi kuwasiliana na nyongeza inayotetereka, inaweza kuingiza data za XSS katika ukurasa wa wavuti ulio ruhusiwa au kutumia WebRequest
au DeclarativeNetRequest
APIs kudhibiti maombi kwenye kikoa kilicholengwa kubadilisha ombi la ukurasa kwa faili ya JavaScript. (Kumbuka kwamba CSP kwenye ukurasa ulio kwenye lengo inaweza kuzuia mashambulizi haya). Wazo hili linatokana na hiki andiko.
Muhtasari wa mawasiliano
Nyongeza <--> WebApp
Ili kuwasiliana kati ya skripti ya maudhui na ukurasa wa wavuti, ujumbe wa baada ya kawaida hutumiwa. Hivyo, katika programu ya wavuti mara nyingi utapata simu za kazi window.postMessage
na katika skripti ya maudhui wasikilizaji kama window.addEventListener
. Tafadhali kumbuka, hata hivyo, kwamba nyongeza inaweza pia kuwasiliana na programu ya wavuti ikituma Ujumbe wa Post (na hivyo wavuti inapaswa kuutarajia) au tu kufanya wavuti ipakue skripti mpya.
Ndani ya nyongeza
Kawaida kazi chrome.runtime.sendMessage
hutumiwa kutuma ujumbe ndani ya nyongeza (kawaida inashughulikiwa na skripti ya background
) na ili kupokea na kushughulikia inatangazwa msikilizaji akitumia chrome.runtime.onMessage.addListener
.
Pia inawezekana kutumia chrome.runtime.connect()
kuwa na muunganisho endelevu badala ya kutuma ujumbe mmoja mmoja, inawezekana kuitumia kutuma na kupokea ujumbe kama katika mfano ufuatao:
Last updated