.. | ||
browext-clickjacking.md | ||
browext-permissions-and-host_permissions.md | ||
browext-xss-example.md | ||
README.md |
Metodologija testiranja bezbednosti pregledačkih dodataka
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Pregledački dodaci su napisani u JavaScript-u i učitavaju se od strane pregledača u pozadini. Ima svoj DOM, ali može da interaguje sa DOM-om drugih sajtova. To znači da može ugroziti poverljivost, integritet i dostupnost (CIA) drugih sajtova.
Glavne komponente
Dizajn pregledačkih dodataka izgleda najbolje kada se vizualizuje i sastoji se od tri komponente. Pogledajmo svaku komponentu detaljnije.
Content Scripts
Svaki content script ima direktni pristup DOM-u jedne veb stranice i time je izložen potencijalno zlonamernom unosu. Međutim, content script nema dozvole osim mogućnosti slanja poruka jezgru dodatka.
Jezgro dodatka
Jezgro dodatka sadrži većinu privilegija/pristupa dodatka, ali jezgro dodatka može samo da komunicira sa veb sadržajem putem XMLHttpRequest i content scriptova. Takođe, jezgro dodatka nema direktni pristup host mašini.
Nativni binarni fajl
Dodatak omogućava upotrebu nativnog binarnog fajla koji može pristupiti host mašini sa punim privilegijama korisnika. Nativni binarni fajl komunicira sa jezgrom dodatka putem standardnog Netscape Plugin Application Programming Interface (NPAPI) koji se koristi za Flash i druge pregledačke dodatke.
Granice
{% hint style="danger" %} Da bi dobio puna ovlašćenja korisnika, napadač mora ubediti dodatak da prosledi zlonameran unos iz content scripta jezgru dodatka i iz jezgra dodatka nativnom binarnom fajlu. {% endhint %}
Svaka komponenta dodatka je odvojena jedna od druge jakim zaštitnim granicama. Svaka komponenta se izvršava u odvojenom operativnom sistemu. Content scriptovi i jezgra dodatka se izvršavaju u peskovitim procesima koji nisu dostupni većini usluga operativnog sistema.
Osim toga, content scriptovi se odvajaju od svojih povezanih veb stranica izvršavanjem u odvojenoj JavaScript memoriji. Content script i veb stranica imaju pristup istom osnovnom DOM-u, ali se dve komponente nikada ne razmenjuju JavaScript pokazivače, čime se sprečava curenje JavaScript funkcionalnosti.
manifest.json
Chrome dodatak je samo ZIP folder sa .crx ekstenzijom fajla. Jezgro dodatka je manifest.json
fajl koji se nalazi u korenu foldera i koji definiše izgled, dozvole i druge konfiguracione opcije.
Primer:
{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}
content_scripts
Content skripte se učitavaju svaki put kada korisnik navigira na odgovarajuću stranicu, u našem slučaju bilo koju stranicu koja odgovara izrazu https://example.com/*
i ne odgovara regularnom izrazu *://*/*/business*
. Oni se izvršavaju kao skripte same stranice i imaju proizvoljan pristup Document Object Model (DOM) stranice.
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
Da biste uključili ili isključili više URL-ova, takođe je moguće koristiti include_globs
i exclude_globs
.
Ovo je primer skripte sadržaja koja će dodati dugme za objašnjenje na stranici kada API za skladištenje koristi se za dobijanje vrednosti message
iz skladišta proširenja.
chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});
Kada se klikne na dugme, poruka se šalje stranicama ekstenzije putem skripte sadržaja, korišćenjem runtime.sendMessage() API-ja. Ovo je zbog ograničenja skripte sadržaja u direktnom pristupu API-ima, pri čemu je storage
među retkim izuzecima. Za funkcionalnosti izvan ovih izuzetaka, poruke se šalju stranicama ekstenzije sa kojima skripte sadržaja mogu komunicirati.
{% hint style="warning" %}
Zavisno od pregledača, mogućnosti skripte sadržaja mogu se malo razlikovati. Za pregledače zasnovane na Chromiumu, lista mogućnosti je dostupna u Chrome Developers dokumentaciji, a za Firefox, MDN služi kao primarni izvor.
Takođe je važno napomenuti da skripte sadržaja imaju mogućnost komunikacije sa pozadinskim skriptama, omogućavajući im da izvrše radnje i prenesu odgovore nazad.
{% endhint %}
Za pregledanje i otklanjanje grešaka u skriptama sadržaja u Chromeu, meni za razvojne alate može se pristupiti putem Opcije > Više alata > Razvojni alati ILI pritiskom na Ctrl + Shift + I.
Kada se prikažu razvojni alati, treba kliknuti na Kartica izvora, a zatim na Kartica skripti sadržaja. To omogućava posmatranje pokrenutih skripti sadržaja iz različitih ekstenzija i postavljanje tačaka prekida kako bi se pratilo izvršavanje.
Ubačene skripte sadržaja
{% hint style="success" %}
Imajte na umu da skripte sadržaja nisu obavezne, jer je takođe moguće dinamički ubaciti skripte i programski ih ubaciti na veb stranice putem tabs.executeScript
. Ovo zapravo pruža više granularne kontrole.
{% endhint %}
Za programsko ubacivanje skripte sadržaja, ekstenzija mora imati dozvole za host za stranicu u koju će skripte biti ubačene. Ove dozvole mogu se obezbediti ili zahtevanjem u manifestu ekstenzije ili privremeno putem activeTab.
Primer ekstenzije zasnovane na activeTab-u
{% code title="manifest.json" %}
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
{% endcode %}
- Ubacivanje JS fajla na klik:
// content-script.js
document.body.style.backgroundColor = "orange";
//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
- Ubacivanje funkcije na klik:
//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});
Primer sa dozvolama za skriptovanje
In order to test the security of a browser extension, it is important to understand the permissions granted to the extension. One common permission is the ability to execute scripts on web pages. This permission allows the extension to interact with the content of the web page and potentially perform malicious actions.
Da biste testirali sigurnost browser ekstenzije, važno je razumeti dozvole koje su dodeljene ekstenziji. Jedna od uobičajenih dozvola je mogućnost izvršavanja skripti na veb stranicama. Ova dozvola omogućava ekstenziji da interaguje sa sadržajem veb stranice i potencijalno izvršava zlonamerne radnje.
To test the scripting permissions of a browser extension, follow these steps:
Da biste testirali dozvole za skriptovanje browser ekstenzije, pratite ove korake:
-
Install the browser extension on your testing environment.
Instalirajte browser ekstenziju na vašem testnom okruženju.
-
Open a web page that allows user-generated content or has a form input field.
Otvorite veb stranicu koja omogućava korisnički generisani sadržaj ili ima polje za unos forme.
-
Right-click on the web page and select "Inspect" or "Inspect Element" to open the browser developer tools.
Desnim klikom na veb stranicu izaberite "Inspect" ili "Inspect Element" da biste otvorili alatke za razvoj browsera.
-
In the developer tools, navigate to the "Console" tab.
U alatkama za razvoj, pređite na karticu "Console".
-
Type
document.body.contentEditable = true
in the console and press Enter.Ukucajte
document.body.contentEditable = true
u konzolu i pritisnite Enter. -
Now, you can edit the content of the web page by clicking on it and making changes.
Sada možete izmeniti sadržaj veb stranice tako što ćete na nju kliknuti i napraviti promene.
By enabling the contentEditable
property of the web page's body element, you gain the ability to modify the content of the page. This demonstrates the scripting permissions of the browser extension.
Omogućavanjem contentEditable
svojstva elementa body veb stranice, dobijate mogućnost da izmenite sadržaj stranice. Ovo demonstrira dozvole za skriptovanje browser ekstenzije.
// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);
// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
Da biste uključili ili isključili više URL-ova, takođe je moguće koristiti include_globs
i exclude_globs
.
Skripte sadržaja run_at
Polje run_at
kontroliše kada se JavaScript fajlovi ubacuju u veb stranicu. Preferirana i podrazumevana vrednost je "document_idle"
.
Moguće vrednosti su:
document_idle
: Kada god je mogućedocument_start
: Nakon svih fajlova izcss
, ali pre konstrukcije bilo kog drugog DOM-a ili pokretanja bilo kog drugog skripta.document_end
: Neposredno nakon završetka DOM-a, ali pre učitavanja podresursa poput slika i frejmova.
Putem manifest.json
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}
Preko service-worker.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);
pozadina
Poruke poslate od strane sadržajnih skripti se primaju od strane pozadinske stranice, koja ima centralnu ulogu u koordinaciji komponenti proširenja. Posebno, pozadinska stranica ostaje aktivna tokom trajanja proširenja, neprimetno funkcionišući bez direktnog korisničkog interakcije. Ona poseduje svoj Document Object Model (DOM), omogućavajući kompleksne interakcije i upravljanje stanjem.
Ključne tačke:
- Uloga pozadinske stranice: Deluje kao nervni centar proširenja, obezbeđujući komunikaciju i koordinaciju između različitih delova proširenja.
- Postojanost: Ona je stalno prisutna entitet, nevidljiva korisniku ali integralna za funkcionalnost proširenja.
- Automatsko generisanje: Ako nije eksplicitno definisana, pregledač će automatski kreirati pozadinsku stranicu. Ova automatski generisana stranica će uključiti sve pozadinske skripte navedene u manifestu proširenja, obezbeđujući besprekorno funkcionisanje pozadinskih zadataka proširenja.
{% hint style="success" %} Praktičnost koju pregledač pruža automatskim generisanjem pozadinske stranice (kada nije eksplicitno deklarisana) obezbeđuje da su sve neophodne pozadinske skripte integrisane i operativne, pojednostavljujući proces podešavanja proširenja. {% endhint %}
Primer pozadinske skripte:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
Koristi runtime.onMessage API da bi osluškivao poruke. Kada primi poruku "explain", koristi tabs API da otvori stranicu u novom tabu.
Da biste debagovali pozadinski skript, možete otići na detalje proširenja i inspekciju servisnog radnika, što će otvoriti alate za razvoj sa pozadinskim skriptom:
Stranice opcija i ostalo
Browser proširenja mogu sadržavati različite vrste stranica:
- Stranice akcija se prikazuju u padajućem meniju kada se klikne ikona proširenja.
- Stranice koje proširenje će učitati u novom tabu.
- Stranice opcija: Ova stranica se prikazuje iznad proširenja kada se klikne. U prethodnom manifestu, u mom slučaju, mogao sam pristupiti ovoj stranici na
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
ili klikom na:
Imajte na umu da ove stranice nisu trajne kao pozadinske stranice jer dinamički učitavaju sadržaj po potrebi. Ipak, deljenje određenih mogućnosti sa pozadinskom stranicom:
- Komunikacija sa skriptama sadržaja: Slično kao pozadinska stranica, ove stranice mogu primati poruke od skripti sadržaja, olakšavajući interakciju unutar proširenja.
- Pristup API-ju specifičnom za proširenje: Ove stranice imaju sveobuhvatan pristup API-ju specifičnom za proširenje, u skladu sa dozvolama definisanim za proširenje.
permissions
i host_permissions
permissions
i host_permissions
su unosi iz manifest.json
koji će ukazivati na koje dozvole browser proširenje ima (skladište, lokacija...) i na kojim veb stranicama.
Kako browser proširenja mogu biti tako privilegovana, zlonamerno proširenje ili proširenje koje je kompromitovano može omogućiti napadaču različite načine za krađu osetljivih informacija i špijuniranje korisnika.
Pogledajte kako ove postavke funkcionišu i kako mogu biti zloupotrebljene u:
{% content-ref url="browext-permissions-and-host_permissions.md" %} browext-permissions-and-host_permissions.md {% endcontent-ref %}
content_security_policy
Politika bezbednosti sadržaja se takođe može deklarisati unutar manifest.json
. Ako je definisana, može biti ranjiva.
Podrazumevana postavka za stranice browser proširenja je prilično restriktivna:
script-src 'self'; object-src 'self';
Za više informacija o CSP i mogućim zaobilaznicama pogledajte:
{% content-ref url="../content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}
web_accessible_resources
da bi veb stranica mogla pristupiti stranici Browser Extension-a, na primer .html
stranici, ova stranica mora biti navedena u polju web_accessible_resources
u manifest.json
fajlu.
Na primer:
{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}
Ove stranice su dostupne na URL-u kao:
chrome-extension://<extension-id>/message.html
U javnim ekstenzijama id ekstenzije je dostupno:
Međutim, ako se koristi parametar use_dynamic_url
u manifest.json
datoteci, ovo id može biti dinamičko.
Dozvoljavanje pristupa ovim stranicama čini ih potencijalno ranjivim na ClickJacking:
{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}
{% hint style="success" %} Dozvoljavanje učitavanja ovih stranica samo od strane ekstenzije, a ne od nasumičnih URL-ova, može sprečiti napade ClickJacking-a. {% endhint %}
externally_connectable
Prema dokumentaciji, manifest svojstvo "externally_connectable"
deklariše koje ekstenzije i web stranice mogu se povezati sa vašom ekstenzijom putem runtime.connect i runtime.sendMessage.
- Ako ključ
externally_connectable
nije deklarisan u manifestu vaše ekstenzije ili je deklarisan kao"ids": ["*"]
, sve ekstenzije mogu se povezati, ali nijedna web stranica ne može. - Ako su navedeni specifični ID-ovi, kao u
"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, samo te aplikacije mogu se povezati. - Ako su navedeni poklapanja (matches), te web aplikacije će moći da se povežu:
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
- Ako je navedeno kao prazno:
"externally_connectable": {}
, nijedna aplikacija ili veb stranica neće moći da se poveže.
Što je manje ekstenzija i URL-ova navedeno ovde, to će površina napada biti manja.
{% hint style="danger" %}
Ako je veb stranica koja je ranjiva na XSS ili preuzimanje navedena u externally_connectable
, napadač će moći da šalje poruke direktno skripti pozadine, potpuno zaobilazeći Content Script i njegov CSP.
Ovo je veoma moćan način zaobilaženja. {% endhint %}
Komunikacija između veba ↔︎ Content Script
Okruženja u kojima rade content script-ovi i u kojima postoje stranice domaćini su odvojena jedna od druge, što osigurava izolaciju. Uprkos ovoj izolaciji, oba imaju mogućnost da komuniciraju sa Document Object Model (DOM) stranice, koji je zajednički resurs. Da bi stranica domaćin mogla da komunicira sa content script-om, ili indirektno sa ekstenzijom preko content script-a, potrebno je koristiti DOM koji je dostupan obema stranama kao kanal komunikacije.
Slanje poruka
{% code title="content-script.js" %}
var port = chrome.runtime.connect();
window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
port.postMessage(event.data.text);
}
}, false);
{% code title="primer.js" %}
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);
{% endcode %}
Sigurna komunikacija putem Post Message-a treba da proveri autentičnost primljene poruke, to se može uraditi proverom:
event.isTrusted
: Ovo je tačno samo ako je događaj pokrenut korisničkom akcijom- Skripta sadržaja može očekivati poruku samo ako korisnik izvrši određenu akciju
- Izvorni domen: može se očekivati poruka samo od liste dozvoljenih domena.
- Ako se koristi regex, treba biti veoma oprezan
- Izvor:
received_message.source !== window
se može koristiti da se proveri da li je poruka iz istog prozora gde Skripta sadržaja sluša.
Prethodne provere, čak i ako su izvršene, mogu biti ranjive, pa proverite na sledećoj stranici potencijalne zaobilaženja Post Message-a:
{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}
Iframe
Još jedan mogući način komunikacije može biti putem URL-ova Iframe-a, primer možete pronaći u:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
DOM
Ovo nije "tačno" način komunikacije, ali veb i skripta sadržaja će imati pristup DOM-u veba. Dakle, ako skripta sadržaja čita neke informacije iz njega, verujući DOM-u veba, veb može izmeniti te podatke (jer vebu ne treba verovati, ili jer je veb ranjiv na XSS) i ugroziti Skriptu sadržaja.
Takođe možete pronaći primer DOM baziranog XSS-a za ugrožavanje proširenja pregledača u:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
Osetljive informacije u memoriji/kodu
Ako Proširenje pregledača čuva osetljive informacije unutar svoje memorije, to može biti izvučeno (posebno na Windows mašinama) i pretraženo u potrazi za tim informacijama.
Stoga, memorija Proširenja pregledača ne bi trebala biti smatrana sigurnom i osetljive informacije kao što su akreditivi ili mnemoničke fraze ne bi trebale biti čuvane.
Naravno, ne stavljajte osetljive informacije u kod, jer će biti javno dostupne.
Komunikacija između Skripte sadržaja ↔︎ Pozadinske skripte
Skripta sadržaja može koristiti funkcije runtime.sendMessage() ili tabs.sendMessage() da pošalje jednokratnu JSON-serializable poruku.
Za rukovanje odgovorom, koristite vraćeni Promise. Ipak, radi kompatibilnosti unazad, i dalje možete proslediti callback kao poslednji argument.
Slanje zahteva iz skripte sadržaja izgleda ovako:
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
Slanje zahteva iz ekstenzije (obično iz pozadinskog skripta) Može se koristiti Content skript funkcije, samo je potrebno specificirati na koju karticu ga poslati. Primer kako poslati poruku content skriptu na izabranoj kartici:
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
Na primajućoj strani, trebate postaviti runtime.onMessage slušač događaja da biste obradili poruku. Ovo izgleda isto iz sadržajnog skripta ili stranice proširenja.
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);
U prikazanom primeru, sendResponse()
je izvršen sinhrono. Da biste izmenili onMessage
događajni rukovalac za asinhrono izvršavanje sendResponse()
, neophodno je uključiti return true;
.
Važno je napomenuti da u scenarijima gde je više stranica postavljeno da primaju onMessage
događaje, prva stranica koja izvrši sendResponse()
za određeni događaj će biti jedina koja može efikasno dostaviti odgovor. Svi naknadni odgovori na isti događaj neće biti uzeti u obzir.
Prilikom kreiranja novih ekstenzija, trebalo bi koristiti promisi umesto povratnih poziva. Što se tiče korišćenja povratnih poziva, funkcija sendResponse()
se smatra validnom samo ako se izvršava direktno unutar sinhronog konteksta ili ako rukovalac događaja ukazuje na asinhronu operaciju vraćanjem true
. Ukoliko nijedan rukovalac ne vrati true
ili ako se funkcija sendResponse()
ukloni iz memorije (garbage-collected), podrazumevano će biti pokrenut povratni poziv povezan sa funkcijom sendMessage()
.
Učitavanje ekstenzije u pregledaču
- Preuzmite Browser Extension i raspakujte ga
- Idite na
chrome://extensions/
i omogućiteDeveloper Mode
(Režim za razvoj) - Kliknite na dugme
Load unpacked
(Učitaj raspakovano)
U Firefox-u idite na about:debugging#/runtime/this-firefox
i kliknite na dugme Load Temporary Add-on
(Učitaj privremeni dodatak).
Dobijanje izvornog koda sa prodavnice
Izvorni kod Chrome ekstenzije može se dobiti na različite načine. U nastavku su detaljno objašnjene i date instrukcije za svaku opciju.
Preuzimanje ekstenzije kao ZIP putem komandne linije
Izvorni kod Chrome ekstenzije može se preuzeti kao ZIP fajl koristeći komandnu liniju. To uključuje korišćenje curl
-a za preuzimanje ZIP fajla sa određene URL adrese, a zatim izdvajanje sadržaja ZIP fajla u određeni direktorijum. Evo koraka:
- Zamenite
"extension_id"
sa stvarnim ID-em ekstenzije. - Izvršite sledeće komande:
extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
Koristite veb sajt CRX Viewer
Koristite CRX Viewer ekstenziju
Još jedan praktičan način je korišćenje Chrome Extension Source Viewer-a, koji je open-source projekat. Može se instalirati sa Chrome Web Store. Izvorni kod viewer-a je dostupan u njegovom GitHub repozitorijumu.
Pregledajte izvor lokalno instalirane ekstenzije
Lokalno instalirane Chrome ekstenzije takođe mogu biti pregledane. Evo kako:
- Pristupite Chrome lokalnom profil direktorijumu tako što ćete posetiti
chrome://version/
i pronaći polje "Profile Path". - Idite na podfolder
Extensions/
unutar profil direktorijuma. - Ovaj folder sadrži sve instalirane ekstenzije, obično sa njihovim izvornim kodom u čitljivom formatu.
Da biste identifikovali ekstenzije, možete mapirati njihove ID-jeve na imena:
- Omogućite Developer Mode na stranici
about:extensions
da biste videli ID-jeve svake ekstenzije. - U okviru svakog foldera ekstenzije, fajl
manifest.json
sadrži čitljivo poljename
, što vam pomaže da identifikujete ekstenziju.
Koristite Arhiver ili Unpacker fajlova
Idite na Chrome Web Store i preuzmite ekstenziju. Fajl će imati ekstenziju .crx
.
Promenite ekstenziju fajla iz .crx
u .zip
.
Koristite bilo koji arhiver fajlova (kao što su WinRAR, 7-Zip, itd.) da biste izvukli sadržaj ZIP fajla.
Koristite Developer Mode u Chrome-u
Otvorite Chrome i idite na chrome://extensions/
.
Omogućite "Developer mode" u gornjem desnom uglu.
Kliknite na "Load unpacked extension...".
Navigirajte do direktorijuma vaše ekstenzije.
Ovo ne preuzima izvorni kod, ali je korisno za pregledanje i izmenu koda već preuzete ili razvijene ekstenzije.
Lista za proveru bezbednosti
Iako Browser ekstenzije imaju ograničenu površinu napada, neke od njih mogu sadržati ranjivosti ili potencijalna poboljšanja učvršćivanja. Sledeće su najčešće:
- Ograničite što je više moguće zahtevane
permissions
- Ograničite što je više moguće
host_permissions
- Koristite jaku
content_security_policy
- Ograničite što je više moguće
externally_connectable
, ako nije potrebno i moguće, ne ostavljajte ga po defaultu, specificirajte{}
- Ako je ovde naveden URL koji je ranjiv na XSS ili preuzimanje kontrole, napadač će moći da šalje poruke direktno background skriptama. Veoma moćan zaobilazak.
- Ograničite što je više moguće
web_accessible_resources
, čak i prazno ako je moguće. - Ako
web_accessible_resources
nije prazno, proverite ClickJacking - Ako se vrši bilo kakva komunikacija između ekstenzije i veb stranice, proverite da li postoje ranjivosti na XSS koje su izazvane tom komunikacijom.
- Ako se koriste Post poruke, proverite Post Message ranjivosti.
- Ako Content Script pristupa detaljima DOM-a, proverite da li oni ne uvode XSS ako ih veb stranica menja
- Posebno obratite pažnju ako je ova komunikacija takođe uključena u komunikaciju Content Script -> Background skripta
- Osetljive informacije ne bi trebalo da budu smeštene unutar koda Browser ekstenzije
- Osetljive informacije ne bi trebalo da budu smeštene unutar memorije Browser ekstenzije
Alati
Tarnish
- Preuzima bilo koju Chrome ekstenziju sa datog Chrome webstore linka.
- manifest.json preglednik: jednostavno prikazuje JSON-oblikovanu verziju manifesta ekstenzije.
- Analiza otiska prsta: Detekcija web_accessible_resources i automatsko generisanje JavaScripta za otiskivanje Chrome ekstenzija.
- Analiza potencijalnog Clickjacking-a: Detekcija HTML stranica ekstenzije sa postavljenom direktivom web_accessible_resources. Ove stranice su potencijalno ranjive na clickjacking u zavisnosti od svrhe stranica.
- Preglednik upozorenja o dozvolama: prikazuje listu svih upozorenja o dozvolama u Chrome-u koja će biti prikazana prilikom pokušaja korisnika da instalira ekstenziju.
- Opasne funkcije: prikazuje lokaciju opasnih funkcija koje bi mogle biti iskorišćene od strane napadača (npr. funkcije poput innerHTML, chrome.tabs.executeScript).
- Ulazne tačke: prikazuje gde ekstenzija prima korisničke/spoljne ulazne podatke. Ovo je korisno za razumevanje površine ekstenzije i traženje potencijalnih tačaka za slanje zlonamerno kreiranih podataka ekstenziji.
- Oba skenera, Opasne funkcije i Ulazne tačke, imaju sledeće za generisana upozorenja:
- Relevantan isečak koda i linija koja je izazvala upozorenje.
- Opis problema.
- Dugme "Prikaži fajl" za pregled celog izvornog fajla koji sadrži kod.
- Putanja upozorenog fajla.
- Potpuna Chrome ekstenzija URI upozorenog fajla.
- Vrsta fajla, kao što je Background Page skripta, Content Script, Browser Action, itd.
- Ako je ranjiva linija u JavaScript fajlu, putanje svih stranica gde je uključena, kao i status web_accessible_resource tih stranica.
- Analizator i provera Content Security Policy (CSP): Ovo će ukazati na slabosti u CSP vaše ekstenzije i takođe će osvetliti moguće načine zaobilaženja CSP-a zbog belih lista CDN-ova, itd.
- Poznate ranjive biblioteke: Ovo koristi Retire.js da proveri da li se koristi neka poznata ranjiva JavaScript
- Ako želite da vidite svoju kompaniju reklamiranu u HackTricks-u ili preuzmete HackTricks u PDF formatu, pogledajte PLANOVE PRETPLATE!
- Nabavite zvanični PEASS & HackTricks suveniri
- Otkrijte Porodicu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.