Mitigating Login CSRF su siti Web di terze parti

3

Sto lavorando a un progetto che richiede di avere una funzionalità di registrazione / accesso esposta ai partner che gestiscono il proprio sito web. Per alcuni di questi siti Web riutilizzano il nostro back-end e cambiano semplicemente lo stile css, ma altri sono completamente autonomi: per questo motivo si è pensato di preparare un modulo di accesso statico che sarebbe stato fornito ai partner, il che avrebbe innescato un POST richiesta ai nostri server.

(a seconda degli argomenti nel modulo, terremo traccia di quale partner ci ha portato quali utenti, che a quanto pare coprono le esigenze aziendali di analisi)

Al momento manca la protezione CSRF su alcuni endpoint, come quella di accesso. Quando ho chiesto di esaminarlo, mi sono reso conto che con un modulo statico non saremmo in grado di aggiungere i token CSRF.

Sembra essere un problema minore, ma sarebbe bello proteggere i nostri utenti dal login CSRF. Per questo motivo ho pensato a 2 alternative:

  • aggiungi un passaggio di conferma prima di accedere all'utente quando viene rilevato un conflitto nel cookie di sessione (escluso a causa delle modifiche nel flusso logico perché la gestione della sessione sia troppo invasiva)
  • invece di un modulo statico, lascia che i nostri partner utilizzino un iframe che conterrà il nostro modulo di accesso, con protezione CSRF e tutto. Ciò richiederebbe di rilassare il X-FRAME-OPTIONS specificamente per la pagina che visualizzerà questo modulo di accesso

C'è una soluzione migliore? Non penso che il clickjacking sul nostro modulo di login debba essere davvero un problema (e il clickjacking è normalmente usato per fare quello che altrimenti sarebbe banalmente ottenuto con un CSRF, penso ... quindi aggiustare quest'ultimo sembra avere una priorità più alta)

    
posta berdario 24.03.2016 - 09:45
fonte

3 risposte

1

È possibile controllare l'intestazione Referrer. Questo è spesso raccomandato contro quando ci sono alternative migliori, ma per quanto ne so non è una tecnica particolarmente cattiva e raccomandabile solo perché alcuni utenti tolgono l'intestazione per motivi di privacy, e storicamente alcuni popolari plugin per browser avevano vulnerabilità che permettevano l'intestazione Referrer da manipolare.

(Penso che gli iframe siano la soluzione migliore qui se li si può usare. Click-jacking contro un modulo di login non sembra una preoccupazione realistica. Seconda soluzione migliore, usando qualche javascript per fare una richiesta AJAX contro il tuo dominio per soluzione di berdario magari con un fallback Referer-header-check per i browser che non supportano le richieste di origine incrociata.)

    
risposta data 25.03.2016 - 23:40
fonte
1

Mi sono reso conto che esiste un'altra soluzione possibile:

Crea un endpoint che restituirà un token CSRF, restituisce un'intestazione Access-Control-Allow-Origin che concederà l'accesso esclusivamente ai domini dei nostri partner e aggiungerà qualche javascript che recupererà questo token e modificherà il modulo (altrimenti statico) aggiungendolo come campo nascosto.

Ciò eliminerebbe la necessità di utilizzare iframe, ma penso che la sicurezza sia una soluzione inferiore: più domini dei partner verranno aggiunti, maggiore è il rischio che un giorno uno di questi scompaia, ci dimenticheremo di rimuovere dall'intestazione e il nome del dominio sarà accovacciato ... potenzialmente esponendo TUTTI i nostri endpoint agli attacchi CSRF di nuovo. (rispetto al rischio di clickjacking insignificante solo nel modulo di accesso).

    
risposta data 25.03.2016 - 22:40
fonte
0

Penso che sia necessario implementare una delle best practice per l'accesso, limitare il numero di tentativi di accesso (ad esempio, 5 tentativi), dopo di che è necessario bloccare l'account per alcuni minuti (ad esempio, 30 minuti). Penso che sia una buona soluzione, perché puoi controllare i tentativi di automazione (bruce force attack) in modo semplice.

    
risposta data 24.03.2016 - 22:09
fonte

Leggi altre domande sui tag