Come convincere il compagno di squadra a utilizzare una whitelist?

7

Contesto

Nel nostro team di sviluppo, dobbiamo costruire un componente. Questo componente è uno lato client completo scritto in Javascript.

Un'applicazione web client che desideri incorporare questo componente lo chiamerà come di seguito:

<iframe id="fullScreenIframe" src="http://my-server.com/component?param1=val1&param2=..."></iframe>

Ilproblema

Unodeiparametriaccettatidalcomponenterendenervosialcunidinoi.Ilparametrooriginvieneutilizzatopergenerareuncollegamentoperriportarel'utenteall'applicazioneWebclient.

Eccocomeilcomponentegestiscequestoparametro:

$(document).ready(function(){varorigin=urlParameters["origin"];// Dynamically built from the current document url

    if(origin != undefined){
        // The link to take the user back...
        $("#welcomePage").attr("href",origin);

        // Another link in the breadcrumb using the same 'origin' parameter
        $("#simulationPage").attr("href", "index.html"+"?origin="+origin);
    }

    // ...
}

Ciò che gli abbiamo già detto

  • Sito web di phishing

Anche se il parametro origin viene passato a jQuery, qualsiasi sito Web può essere utilizzato in una truffa di phishing. Un utente può essere invitato a (ri) inserire le proprie credenziali pensando di trovarsi su un sito reale. Il buco qui sarà il componente.

  • Lista bianca con valori validi

I valori validi di origin possono essere archiviati in remoto in una whitelist. Il componente controllerebbe la whitelist prima di generare il collegamento. Un collegamento predefinito può essere generato se viene trovato un valore imprevisto.

Questi due argomenti non lo convincono. Vuole essere dimostrato che il parametro origin può essere un buco di sicurezza. Quindi ragazzi, cosa gli direste?

A proposito, sto cercando un buon PoC che mostri la debolezza del parametro origin .

    
posta Stephan 03.12.2015 - 16:06
fonte

3 risposte

0

Finalmente, ho trovato un PoC per un attacco XSS. Il componente è vulnerabile quando viene chiamato come di seguito:

http://my-server.com/component?origin=javascript:alert%28%27Hello%20world!%27%29

Dimostra che uno script dannoso può potenzialmente essere eseguito quando l'utente fa clic sul link generato dal componente.

Finalmente il nostro compagno di squadra ha accettato di rafforzare il componente.

Invece di una lista bianca, ha scelto di verificare che il valore origin sia un URL valido.

    
risposta data 04.12.2015 - 14:58
fonte
3

Finché ti affidi alle informazioni degli utenti in arrivo, non sarai mai completamente protetto / sicuro. Qualsiasi cosa può essere falsificata, alterata, modificata; e, successivamente, il tuo componente è ora compromesso.

Se vuoi seguire la strada della fidelizzazione di alcuni , avrebbe senso inserire nella whitelist. Tuttavia, fare un passo avanti potrebbe essere più ideale: emetti token anziché specificare domini (pensa a come Google Analytics utilizza un numero UA-XXX su mysite.com). Spingere l'amministrazione sul proprio web admin e la possibilità di domini difettosi / vulnerabilità della sicurezza è ora la loro responsabilità.

Per elaborare ulteriormente ciò a cui mi riferisco, invece di avere una whitelist, configura un database di token:

tokens
id       # Primary Key
token    # Unique generated token

Quindi, avere una relazione 1: * in cui è possibile definire origini valide per quella chiave:

origins
id       # Primary key
token_id # Forieign Key, tokens.id
origin   # origin (e.g. google.com)

Quindi crea un token per un cliente specifico (chiunque includa il tuo componente nella sua pagina). Ad esempio, supponiamo di avere il token abc123def456 :

<iframe src="http://server.com/component?key=abc123def456"></iframe>

Qui,iltuocomponenteeseguiràunaricercasullatoservercontrolatuatabellatokenseconvalida.Puoiancheaggiungereulterioricontrollicontrol'intestazioneReferer,maquestodipendedate(elarealizzazionediRefererpotrebbecomunqueesserefalsificata).Ilvalorepredefinitodibahviorsarebbeadeny*,quindidovrestimostrareunapaginachedice"Nessuna origine specificata, per favore configura" (o qualcosa del genere).

Successivamente, accedono alla pagina di amministrazione e aggiungono "abc.com". Ora, il widget diventa:

<iframe src="http://server.com/component?key=abc123def456&origin=abc.com"></iframe>

Ora, lato server, stai convalidando la chiave insieme all'origine (contro la tua whitelist compilata nella tabella origins (associata a quella chiave). Se un hacker dovesse tentare di usarlo (o modificarlo) l'origine (rispetto alla chiave) rimbalzerebbe e mostrerebbe una pagina di errore.

Se decidono di non specificare l'origine, puoi anche configurare un'origine predefinita in modo che ogni volta che includi solo /component?key=abc123def456 , si assuma l'origine predefinita.

O qualcosa del genere

    
risposta data 03.12.2015 - 17:49
fonte
2

Quando sento parlare di whitelist, mi riporta alla storia dei firewall.

Quando i firewall venivano utilizzati per la prima volta, utilizzavano un "accetta tutto per impostazione predefinita eccetto ciò che è nella lista nera". Ciò ha creato MOLTI problemi per i primi firewall e amministratori sys dal momento che dovevano mantenere proattivamente le minacce e aggiungerle alla lista nera.

Quando l'industria ha realizzato il problema e passato al sistema attuale di "bloccare tutto per impostazione predefinita tranne quello che è autorizzato nella whitelist", questo ha drasticamente ridotto il panorama delle minacce e la pressione sui team di amministrazione di sys.

Usa questa analogia di fronte a questo di nuovo. Questo dovrebbe convincere la maggior parte delle persone.

    
risposta data 07.12.2015 - 14:01
fonte

Leggi altre domande sui tag