Redirect tramite CSS: esecuzione e reindirizzamento senza tag script
L'analisi dell'exploit del marzo 2009: sfruttare XML Binding Language (XBL) in Firefox e HTML Components (HTC) in Internet Explorer per eseguire codice tramite fogli di stile.
1. Eseguire codice senza tag script: l'evasione via CSS
Nel marzo 2009 pubblicai una tecnica non convenzionale per eseguire un redirect automatico di pagina senza inserire alcun tag <script> visibile all'interno del markup HTML.
Il quesito dell'epoca era semplice: è possibile far eseguire codice JavaScript a un browser agendo esclusivamente tramite le proprietà di un foglio di stile?
La risposta era affermativa, e si basava su due tecnologie proprietarie supportate dai due principali browser dell'epoca (Mozilla Firefox e Microsoft Internet Explorer), che insieme coprivano la quasi totalità degli utenti web mondiali.
2. L'implementazione tecnica: il codice originale
L'architettura del redirect si articolava in tre file distinti:
Nel file principale index.html, la pagina dichiarava un blocco di stile apparentemente innocuo:
<style>
body {
behavior: url("./redirect.htc");
-moz-binding: url('./redirect.xml#redirect');
}
</style>Per i visitatori con Mozilla Firefox, la proprietà proprietaria -moz-binding invocava il file redirect.xml (scritto in XBL, XML Binding Language), che agganciava un costruttore JavaScript all'evento di caricamento:
<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml">
<binding id="redirect" applyauthorstyles="false">
<implementation>
<constructor>
window.addEventListener('load', function() {
location.href = 'https://kerouac3001.com';
}, false);
</constructor>
</implementation>
</binding>
</bindings>Per gli utenti con Internet Explorer, la proprietà behavior richiamava il file redirect.htc (HTML Component), eseguendo il reindirizzamento al verificarsi dell'evento di sistema ondocumentready:
<attach event="ondocumentready" handler="redirect" />
<script language="JScript">
function redirect() {
window.document.location.href = 'https://kerouac3001.com';
}
</script>3. Perché ingannava i crawler e come è stata blindata la sicurezza
Questa tecnica risultava particolarmente efficace nell'elusione dei controlli antispam:
- Gli spider dell'epoca cercavano redirect nei meta tag (
<meta http-equiv="refresh">), nei blocchi<script>convenzionali o negli header HTTP301/302. - I fogli di stile venivano considerati mere istruzioni di presentazione visiva: quasi nessun crawler scaricava ed eseguiva i file ausiliari XML/HTC referenziati all'interno delle proprietà CSS.
Nel web moderno, entrambe le tecnologie sono state totalmente eradicate: XBL è stato deprecato e rimosso dal motore Gecko di Mozilla, e HTC è scomparso con il pensionamento di Internet Explorer. La sicurezza moderna è presidiata da rigide policy Content Security Policy (CSP), che impediscono l'esecuzione di script non autorizzati e bloccano l'associazione di comportamenti esterni ai selettori CSS.