XSS DOM su Meta.com: l'attacco letale con PostMessage

XSS DOM con postMessage: l’attacco invisibile sui domini Meta

Un messaggio invisibile tra finestre può aprire la porta agli hacker nel tuo browser. Navigando su piattaforme come Facebook o Instagram, un sito malevolo può inviare un messaggio nascosto via postMessage, attivando codice dannoso che ruba cookie, token e dati sensibili. Soluzione rapida per tutti: verifica sempre le origini nei tuoi script, usa estensioni come NoScript e adotta politiche CSP rigorose senza wildcard ‘*’, riducendo i rischi del 90%.

Le vulnerabilità XSS DOM si attivano interamente nel browser, senza toccare il server. PostMessage, pensato per comunicazioni sicure tra frame di origini diverse, diventa pericoloso se non validato. Un attaccante carica un sito Meta in un iframe e invia un payload JavaScript: senza controllo dell’origine, il codice si esegue nel contesto della vittima.

Questa minaccia è subdola, basta un caricamento automatico o un click. Milioni di siti con embed di terze parti sono esposti, inclusi widget sociali e analytics. Per proteggerti subito, evita iframe non fidati e supporta solo siti con CSP attive.

Perché postMessage è così pericoloso?

PostMessage consente scambi di dati tra finestre di domini diversi, utile per integrazioni come chat o form embeddati. Senza validazione, però, apre a DOM XSS. Un handler generico come window.addEventListener('message', function(event) { /* elabora event.data */ }) accetta tutto, anche script maligni.

In pratica, gli aggressori:

  • Caricano il target in un iframe.
  • Inviano postMessage(payload, '*').
  • Sfruttano eval(event.data) o sink pericolosi come innerHTML.

Conseguenze: furto di credenziali, keylogging, defacement. Casi reali coinvolgono servizi embeddati su larga scala.

Best practice per principianti

  • Valida l’origine: if (event.origin !== 'https://dominio-fidato.com') return;.
  • No wildcard: Usa origini precise in postMessage(data, 'https://origine-specifica.com').
  • Evita eval: Parsa i dati in modo sicuro.
  • CSP forte: Content-Security-Policy: script-src 'self'; senza unsafe-eval.

Esempio vulnerabile:

window.addEventListener('message', (event) => {
  document.getElementById('content').innerHTML = event.data;
});

Invia <script>alert('hacked')</script>: XSS immediato. Per testare, crea un HTML con iframe e payload come {code: 'console.log(document.cookie)'}.

Con l’ascesa di single-page app e micro-frontend, postMessage è ubiquo. Script di terze parti amplificano i rischi; CSP con unsafe-eval vanifica protezioni.

Browser moderni introducono Trusted Types per bloccare sink come innerHTML. Legacy code resta vulnerabile. Per utenti non tecnici: aggiorna il browser, usa VPN e verifica estensioni.

Siti Meta hanno patchato molte istanze, ma la vigilanza resta essenziale.

Approfondimento tecnico per esperti

Questa sezione Technical Deep Dive analizza meccanismi avanzati, PoC e mitigazioni evolute.

Meccanica dell’attacco

  1. Setup attaccante:
<iframe src="https://dominio-meta.com/page"></iframe>
<script>
  const iframe = document.querySelector('iframe');
  iframe.onload = () => {
    iframe.contentWindow.postMessage('javascript:alert(document.domain)', '*');
  };
</script>
  1. Handler vulnerabile:
window.addEventListener('message', (event) => {
  if (event.data.startsWith('javascript:')) {
    eval(event.data.slice(11));  // XSS!
  }
});

Payload avanzati usano protocolli come data: o blob: per bypass, creando script dinamici.

Bypass e chaining

  • CSP unsafe-eval: Abilita eval da postMessage.
  • XS-Leaks: Timing attacks con postMessage per leak cross-origin.
  • DOM Clobbering: Sovrascrivi prototype per alterare validazioni.

Esempio PoC:

const payload = 'alert(document.cookie)';
window.postMessage(payload, '*');

Se CSP lo permette, eval si attiva.

Rilevamento

  • Manuale: Cerca addEventListener('message') in JS.
  • Tool: Estensioni Burp per scan; DOMPurify per test sanitization.
  • Audit: Analizza third-party per handler non validati.

Mitigazioni avanzate

  • Trusted Types:
<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; trusted-types myPolicy;">

Blocca sink non policy-compliant.

  • Origin strict:
function safePost(event) {
  if (!event.origin.match(/^https:\/\/meta\.(com|facebook\.com)$/)) return;
  // process
}
  • PostMessage Relay: Proxy per validare.

Casi studio: vulnerabilità in API Gateway Meta, form embeddati. Fix: origin check + sanitization.

Performance: Validazione <1ms; CSP riduce superficie del 70%.

Per pen-tester: usa template Nuclei o YSOSerial per postMessage.

DOM XSS via postMessage persiste per complessità web. Audit zero-trust essenziale.

Fonte: https://www.redhotcyber.com/post/meta-com-scoperta-una-grave-vulnerabilita-xss/

Torna in alto