it-swarm.dev

Cosa fa effettivamente la variabile ALLOWED_HOSTS di Django?

Devo impostare ALLOWED_HOSTS nella mia Django ai nomi host che mi appartengono

... impedire a un utente malintenzionato di avvelenare le cache e reimpostare le e-mail di password con collegamenti a host dannosi inviando richieste con un'intestazione HTTP Host falsa, che è possibile anche in molte configurazioni di server Web apparentemente sicure.

Cosa significa veramente? Perché l'attaccante non dovrebbe semplicemente utilizzare l'intestazione host "corretta" e fare la stessa cosa per reimpostare la password di spam? "Cache avvelenate" suona anche come qualcosa che sarebbe tra Eva e Bob su cui non ho il controllo comunque ...

18
Nick T

Mi ci è voluto un po 'per scavare per trovarlo, ma ho trovato questo che sembra rispondere alla domanda:

https://www.djangoproject.com/weblog/2013/feb/19/security/#s-issue-Host-header-poisoning

Problema: avvelenamento dell'intestazione host

Diverse precedenti Django hanno tentato di risolvere i problemi persistenti con l'intestazione host HTTP. Django contiene codice - e alcune funzionalità fornite con Django stesso utilizza questo codice - per costruire un URL completo in base alla richiesta HTTP in entrata. A seconda della configurazione, utilizza l'intestazione Host e quindi un attaccante che può causare un Django per rispondere alle intestazioni host arbitrarie può causare Django generare e visualizzare agli utenti finali URL su domini arbitrari.

Precedenti iterazioni di questo problema (vedere CVE-2011-4139 e CVE-2012-4520) si sono concentrate sul rafforzamento dell'analisi di Django delle intestazioni dell'host, per eliminare vari mezzi con cui gli aggressori - utilizzando tecniche come coppie nome utente/password nel loro host inviato header - potrebbe sfruttare questo.

Alla fine, tuttavia, Django da solo non può garantire che un attaccante non sia in grado di sottomettersi, e causa Django ad accettare intestazioni Host arbitrarie. Garantire correttamente questo in un schierato Django richiede inoltre la configurazione del server Web e sia la configurazione che il livello di sicurezza raggiungibile variano a seconda del server utilizzato.

Alla luce di ciò, il metodo get_Host () di Django.http.HttpRequest ora convaliderà l'intestazione Host rispetto a una nuova impostazione, ALLOWED_HOSTS. Questa impostazione è un elenco di stringhe (per impostazione predefinita, un elenco vuoto) corrispondenti a valori accettabili per l'intestazione, con un certo supporto per i caratteri jolly.

Il codice che non utilizza get_Host () o Django che possono determinare il nome host corrente senza ricorrere alle intestazioni HTTP (ovvero quando il framework dei siti di Django è abilitato) non sarà interessato da questa modifica.

Poiché si tratta di un inasprimento/inasprimento di un problema precedente, non ha un nuovo numero CVE.

16
Catskul

James Kettle fornisce un buon resoconto su Pratici attacchi di intestazione host HTTP . Sono riassunti qui con una descrizione della strategia Django ALLOWED_HOSTS.

Vulnerabilità

Vettore di reimpostazione password

La vulnerabilità dell'email di reimpostazione della password a cui allude la documentazione è il risultato di Django e/o le sue applicazioni che utilizzano e si fidano del valore dell'host HTTP, fornito dal client (sembra una cattiva idea? Il valore Host viene copiato direttamente nelle e-mail di reimpostazione della password, fornendo un utile vettore di iniezione.

Avvelenamento da cache

La variazione di avvelenamento della cache si basa su questo comportamento e anche sulle differenze nel modo in cui l'intestazione host viene gestita dai server e dalle soluzioni di cache.

HTTP_SERVER vs HTTP ['Host']

Come descritto da Kettle, grazie a RFC2616, è possibile che i server compatibili utilizzino una discrepanza tra HTTP_SERVER e HTTP ['Host'] per fornire stringhe host arbitrarie.

Analisi dell'host

Sfruttando formati diversi e utilizzando caratteri speciali, un utente malintenzionato può causare l'interpretazione "maliziosa" di un host in contesti diversi. Questo è di nuovo un errore nell'applicazione che ha considerato attendibile la stringa host.

Soluzione Django

Come riassumono note sulla versione fornite da Catskul, la Django è che l'utente inserisca gli host consentiti direttamente nel codice del progetto. Proibendo qualsiasi altro host che 't match ALLOWED_HOSTS, il vettore di iniezione viene eliminato (un approccio "elenco bianco").

Questa è una soluzione ingombrante, come sottolinea James, ma è anche piuttosto efficace.

Tieni a mente

È possibile utilizzare i caratteri jolly nelle impostazioni di un progetto, nel qual caso questa funzione non aiuta a proteggere nulla.

Uno sviluppatore di applicazioni sicure eviterà di utilizzare il valore dell'host HTTP in modo significativo.

Riferimenti

Carlos Bueno, Cache Poisoning (2008)

10
jtpereyda