Passa a:
Brute force protection: l'autenticazione che non cede

Brute force protection: l'autenticazione che non cede

Gli attacchi brute force non si basano sull’ingegno ma sulla ripetizione. Un’automazione prova sistematicamente combinazioni di credenziali una dopo l’altra finché non trova quella giusta. Non c’è bisogno di intercettare il traffico di rete né di sfruttare una vulnerabilità complessa nel codice applicativo. L’unica cosa che serve è un form di login che risponde e tempo a disposizione. Per questo motivo la protezione contro questa categoria di attacchi è considerata un requisito di base nella stragrande maggioranza degli standard di sicurezza moderni, tra cui la ISO 27001, e rappresenta uno dei controlli più facili da trascurare quando l’attenzione del team è concentrata sulle funzionalità.

Il meccanismo dell’attacco

Un attacco brute force classico tenta ogni combinazione possibile di caratteri fino a trovare la password corretta. Nella pratica questa variante è raramente usata su sistemi esposti perché richiederebbe un tempo computazionale proibitivo. Ciò che compare frequentemente nei log di produzione è piuttosto un attacco a dizionario, in cui l’automazione prova sequenzialmente le password più comuni, quelle trapelate in precedenti breach o ricavate da informazioni pubbliche sull’utente bersaglio. La variante più subdola è la credential stuffing: si prendono le coppie email e password provenienti da un database compromesso di un altro servizio e le si verifica sistematicamente su quello che si intende attaccare. Questo funziona perché molti utenti riusano le stesse credenziali su servizi diversi, e l’attaccante lo sa bene.

I meccanismi di difesa

La prima linea di difesa è il rate limiting. Limitare il numero di tentativi di login consentiti in un determinato intervallo di tempo da uno stesso indirizzo IP riduce drasticamente la velocità con cui un attaccante può operare. La soglia va calibrata con attenzione perché troppo permissiva rende la protezione inefficace, troppo restrittiva rischia di bloccare utenti legittimi in situazioni di mobilità o dietro proxy aziendali. Una strategia comune è l’introduzione di un ritardo progressivo tra i tentativi falliti, il cosiddetto exponential backoff, che rende il processo iterativo sempre più lento senza creare una barriera assoluta.

Esempio di brute force attack

Il blocco temporaneo dell’account dopo un certo numero di tentativi falliti è un altro strumento consolidato, ma va gestito con consapevolezza perché introduce un vettore secondario: un attaccante che conosce gli username degli utenti potrebbe deliberatamente innescare i blocchi per causare una negazione del servizio distribuita. Per questo motivo molti sistemi affiancano al blocco per account un blocco per IP con soglie differenziate e procedure di sblocco che non possano essere automatizzate. I CAPTCHA, pur imperfetti e spesso frustranti per l’utente, aggiungono un ulteriore livello di attrito che rende antieconomica l’esecuzione automatica su larga scala.

Token, sessioni e autenticazione multifattore

La protezione più robusta contro il brute force non è tecnica ma architetturale. Un sistema che richiede un secondo fattore di autenticazione, che sia un codice temporaneo su un’app dedicata o una notifica push, rende inutile qualunque attacco sulle credenziali perché la conoscenza della password da sola non è sufficiente per completare l’accesso. L’autenticazione multifattore non elimina la necessità di proteggere il form di login, ma riduce in modo radicale il danno potenziale nel caso in cui le credenziali siano effettivamente compromesse.

La gestione dei token e delle sessioni è un’area spesso trascurata nella valutazione della superficie d’attacco. Token con scadenza breve, meccanismi di revoca esplicita e invalidazione automatica delle sessioni inattive riducono la finestra temporale in cui un token rubato può essere riutilizzato. Nel contesto di API esposte, l’uso di meccanismi di firma delle richieste garantisce che anche un token intercettato non possa essere replicato senza che la firma risulti invalida.

Esempio di two factor authentication

Il ruolo del logging nella risposta agli incidenti

Un sistema di autenticazione che respinge gli attacchi senza registrare ciò che accade è cieco di fronte alle minacce in evoluzione. Il logging granulare dei tentativi di login falliti, completo di timestamp, indirizzo IP, user agent e account bersaglio, non serve solo a soddisfare requisiti formali di conformità ma è il materiale grezzo su cui si costruisce la risposta agli incidenti. Senza di esso è impossibile stabilire se un accesso avvenuto in un dato momento fosse legittimo o il risultato di un attacco riuscito dopo centinaia di tentativi falliti nelle ore precedenti.

La correlazione di questi eventi nel tempo è ciò che permette di distinguere un utente smemorato che ha dimenticato la password da un’automazione che sta testando diecimila combinazioni nell’arco di un’ora. I sistemi di alerting devono essere configurati per rilevare anomalie di volume e pattern, non solo soglie assolute, perché un attacco distribuito su più indirizzi IP può aggirare facilmente una regola che conta i fallimenti per singola sorgente.

La prospettiva ISO 27001

Il controllo A.9.4.4 della ISO 27001 richiede esplicitamente che i sistemi implementino misure per prevenire gli accessi non autorizzati attraverso tentativi ripetuti. Non prescrive implementazioni specifiche ma definisce l’obiettivo: il sistema deve rendere economicamente e operativamente impraticabile un attacco sistematico sulle credenziali. Questo si traduce nella necessità di documentare le scelte architetturali adottate, i parametri configurati e i criteri con cui sono stati stabiliti, in modo che possano essere valutati durante un audit.

Il controllo A.8.15, relativo al logging degli eventi, è complementare: senza una registrazione adeguata dei tentativi di accesso non è possibile dimostrare che la protezione è attiva né produrre evidenza forense in caso di incidente. Insieme, questi due controlli definiscono un perimetro di responsabilità che va dalla prevenzione al rilevamento, coprendolo in modo più completo di quanto farebbe ciascuno da solo.

Affrontare la protezione brute force come un problema di configurazione porta quasi sempre a soluzioni incomplete. La solidità di un sistema di autenticazione non deriva dall’attivare una funzionalità del framework ma dalla comprensione dei vettori di attacco reali, dalla calibrazione delle soglie in base al comportamento atteso degli utenti legittimi e dalla costruzione di una visibilità operativa che permetta di sapere, in tempo reale, se qualcosa di inatteso sta accadendo sul form di login.

Ranieri Vannozzi

L'autore

Ranieri Vannozzi

Sviluppatore e consulente software freelance

Scrivo codice dal 2008 e lavoro su sviluppo enterprise, architetture cloud-native e leadership tecnica. Su HeroHubs racconto quello che incontro ogni giorno nei progetti, tra codice, architetture e intelligenza artificiale.

Articolo scritto con il supporto dell'AI e rivisto dall'autore.

Post Correlati

Performant npm: il gestore di pacchetti che ripensa node_modules

Sviluppo

Settembre 2026

Performant npm: il gestore di pacchetti che ripensa node_modules

Performant npm non è soltanto un npm più veloce. Lo store globale con hard link e la struttura rigida di node_modules cambiano il modo in cui un progetto JavaScript dichiara e usa le proprie dipendenze.

Conventional Commits: il messaggio di commit come documento tecnico

Sviluppo

Giugno 2026

Conventional Commits: il messaggio di commit come documento tecnico

Scrivere i messaggi di commit in modo libero è una convenzione che si forma per inerzia. Conventional Commits la sostituisce con una struttura che genera valore automaticamente.

Perché ignorare il package-lock è un suicidio architettonico?

Sviluppo

Maggio 2026

Perché ignorare il package-lock è un suicidio architettonico?

Molti sviluppatori considerano il lock file un rumore di fondo nei commit. In realtà, è l'unica cosa che separa il tuo codice da un crash improvviso in produzione.

Biome: la toolchain moderna che semplifica lo sviluppo web

Sviluppo

Ottobre 2025

Biome: la toolchain moderna che semplifica lo sviluppo web

Scopri Biome: la toolchain unificata per linting, formatting e analisi del codice JavaScript/TypeScript. Vantaggi, integrazione e produttività per sviluppatori moderni.

Test Driven Development: un alleato silenzioso per gli eroi del software

Sviluppo

Ottobre 2025

Test Driven Development: un alleato silenzioso per gli eroi del software

Scopri il Test Driven Development (TDD): vantaggi, ciclo Red-Green-Refactor, esempi pratici e differenze con BDD per migliorare la qualità e la manutenibilità del software.

Astro: architettura a isole e rendering ibrido per contenuti performanti

Sviluppo

Ottobre 2025

Astro: architettura a isole e rendering ibrido per contenuti performanti

Guida ad Astro: framework moderno per siti statici e ibridi, architettura a isole, rendering server-first, SEO, performance e integrazione con React, Vue e Svelte.

Feature Flags: la chiave per rilasci sicuri, controllati e continui

Sviluppo

Ottobre 2025

Feature Flags: la chiave per rilasci sicuri, controllati e continui

Scopri come le feature flags rivoluzionano il rilascio software: gestione graduale delle funzionalità, rollback istantanei, test A/B e best practice per DevOps e CI/CD.

Hono: semplicità e potenza per applicazioni web moderne

Sviluppo

Settembre 2025

Hono: semplicità e potenza per applicazioni web moderne

Guida a Hono: framework web minimalista per JavaScript, vantaggi, esempi pratici e come costruire applicazioni moderne, leggere e performanti.

Pull e Merge Request: stessi obiettivi ma approcci diversi

Sviluppo

Settembre 2025

Pull e Merge Request: stessi obiettivi ma approcci diversi

Pull request vs merge request: differenze, vantaggi e best practice per la revisione del codice su GitHub e GitLab, con focus su DevOps e collaborazione nei team di sviluppo.