Perché utilizzare una whitelist per l’igienizzazione HTML?

Mi sono chiesto spesso: perché utilizzare una lista bianca anziché una lista nera quando si disinfetta l’input HTML?

Quanti trucchi HTML nascosti ci sono per aprire le vulnerabilità XSS? Ovviamente tag e frame di script non sono consentiti e una whitelist verrebbe utilizzata nei campi degli elementi HTML, ma perché non consentire la maggior parte di tutto?

Se lasci qualcosa fuori da una whitelist, allora rompi qualcosa che non era abbastanza importante per te da pensare in primo luogo.

Se lasci qualcosa da una lista nera, hai aperto un grosso buco di sicurezza.

Se i browser aggiungono nuove funzionalità, la tua lista nera diventa obsoleta.

Ho appena letto qualcosa a riguardo ieri. È nel manuale di feedparser .

Un frammento:

Più indago, più casi trovo dove Internet Explorer per Windows tratterà il codice apparentemente innocuo come codice e lo eseguirò allegramente. Questo è il motivo per cui Universal Feed Parser utilizza una whitelist e non una lista nera. Sono ragionevolmente sicuro che nessuno degli elementi o attributi presenti nella lista bianca sia un rischio per la sicurezza. Non sono affatto sicuro di elementi o attributi che non ho indagato esplicitamente. E non ho alcuna fiducia nella mia capacità di rilevare stringhe all’interno dei valori degli attributi che Internet Explorer per Windows considererà come codice eseguibile. Non tenterò di preservare “solo gli stili buoni”. Tutti gli stili sono spogliati.

C’è un serio rischio se si limitano a mettere in blacklist alcuni elementi e si dimentica uno importante. Quando autorizzi alcuni tag che sai essere sicuri, il rischio è minore nel lasciare qualcosa in cui possa essere abusato.

Anche se i tag script e i tag frame non sono consentiti, puoi comunque inserire qualsiasi tag come questo

mouse over this 

e molti browser funzionano.

Perché allora sei sicuro di non perdere nulla. Consentendo esplicitamente alcuni tag hai ovviamente più controllo su ciò che è permesso.

Le whitelist sono utilizzate nella maggior parte degli argomenti relativi alla sicurezza. Pensa ai firewall. La prima regola è bloccare qualsiasi traffico (in entrata) e quindi aprire solo le porte che dovrebbero essere aperte. Questo lo rende molto più sicuro.

Perché altri tag possono rompere il layout di una pagina. Immagina cosa accadrebbe se qualcuno inietta il tag

. tag è pericoloso.

Preferisco avere entrambi, lo chiamo approccio “Lista nera con lista bianca rilassata” :

  1. Crea una “Lista bianca” rilassata di tag e attributi.
  2. Crea una “Lista nera per la lista bianca”, qualsiasi tag / attributo nella lista nera DOVREBBE esistere nella Lista bianca che hai creato, altrimenti viene visualizzato un errore.

Questa lista nera funge da interruttore on-off per tag / attributi nella lista bianca rilassata.

Questo approccio “Lista nera con elenco bianco rilassato” semplifica notevolmente la configurazione del filtro di disinfezione.

Ad esempio, la White List può contenere tutti i tag e gli attributi html5. Mentre la Lista nera può contenere tag e attributi da escludere.

Quanto più permetti, più trucchi sono lasciati agli hacker intelligenti per iniettare un codice sgradevole nella tua pagina web. Ecco perché vuoi consentire il meno ansible.

Vedi la conferenza di Ruben van Vreeland How We Hacked LinkedIn e What Happened Next per una buona introduzione alle vulnerabilità XSS e perché vuoi che la tua whitelist sia la più rigorosa ansible!