Con una recente ricerca, Vsevolod Kokorin (Slonser) ha dimostrato che le vulnerabilità note come Stored Self‑XSS – spesso considerate di scarso impatto perché sfruttabili solo nell’account attaccante – possono invece evolvere in Stored XSS reali, sfruttando tecnologie emergenti come gli iframe credentialless (Make Self-XSS Great Again).
Il dilemma classico
- Lo script XSS va eseguito sull’account dell’attaccante, altrimenti non ha privilegi utili.
- Ma, una volta loggati come attaccante, non si può più rubare la sessione della vittima.
La svolta degli iframe credentialless
Grazie all’attributo credentialless
, un iframe carica la pagina della vittima senza accedere ai cookie o allo storage associati – pur mantenendo lo stesso origin. Questo significa avere due contesti distinti ma manipolabili:
- Un iframe normale che carica
victim.domain
con cookie attivi. - Un iframe
credentialless
che carica lo stesso dominio senza credenziali.
Ecco la consegna: ambienti separati, stesso origin.
Da Self‑XSS a Stored XSS: lo scenario pratico
1. Iniezione e Self-XSS
Un payload XSS (es. in un campo username non sanitizzato) viene salvato nella dashboard/victim. Questo è il classico Stored Self‑XSS, eseguibile solo da chi ha accesso all’account.
2. Login CSRF verso l’attaccante
Grazie a un form CSRF sul login:
<form action="http://victim/login" method="POST">
<input name="username" value="attacker_username<img…>" hidden>
<input name="password" value="Super_s@fe_pwd" hidden>
<script>document.forms[0].submit();</script>
</form>
l’attaccante induce la vittima (contenuta in un iframe credentialless) a eseguire il login con l’account dell’attaccante stesso.
3. Sincronizzazione dei contesti
Utilizzando due iframe (credentialless
e “normale”), entrambi con lo stesso origin, il codice eseguito nell’iframe malicious può accedere ai cookie dell’iframe victim:
alert(window.top[1].document.cookie);
A quel punto si ottiene session cookie e si può eseguire codice arbitrario sul contesto della vittima.
Varianti: CAPTCHA, Clickjacking e fetchLater
- Self‑XSS + CSRF + CAPTCHA
Si può automatizzare la raccolta del token con un WebSocket tra client e server dell’attaccante per completare il login di vittima-attaccante. - Self‑XSS + Clickjacking
Se non esiste CSRF, si può usare un overlay per incentivare l’utente a inserire credenziali dell’attaccante in realtà dirette al form di login del victim. - **X‑Frame‑Options: Deny? No problem. fetchLater!**
L’APIfetchLater()
(marzo 2025) permette di schedulare richieste in background, anche dopo la chiusura del tab.
Con essa, basta creare richieste forgiate verso l’endpoint/change_rights
e lasciarle partire quando la vittima tornerà autenticata.
Conclusioni e impatto
- Stored Self‑XSS non è più “di serie B”: con i moderni browser può diventare Stored XSS completo.
- Le strategie combinate (iframe credentialless, CSRF login, fetchLater) aprono nuovi scenari d’attacco con minima interazione utente.
- Implicazioni immediate per bug bounty e triage: una segnalazione spontanea di Self‑XSS dovrebbe far scattare controlli su login CSRF, CAPTCHA e supporto fetchLater.
Raccomandazioni per mitigare
- Bloccare gli iframe non autorizzati con
Content-Security-Policy: frame-ancestors
. - Inserire CSRF token su tutti i form di login/privilegi elevati.
- Verificare e limitare l’uso di fetchLater, anche disabilitarla su strumenti sensibili.
- Effettuare penetration test mirati su Stored Self‑XSS: adesso hanno potenziale reale.
Un doveroso importante ringraziamento a Slonser per aver alzato l’asticella e reso più chiara la reale pericolosità di vecchie vulnerabilità rivisitate con nuove tecnologie browser.