
Enumerazione degli Username tramite Side-Channel sui Tempi di Autenticazione in PaperCut NG
| Campo | Dettagli |
|---|---|
| ID CVE | CVE-2026-8794 |
| Prodotto | PaperCut NG |
| Versione interessata | 25.0.11 (Build 75758) e precedenti |
| CWE | CWE-208 — Discrepanza di Temporizzazione Osservabile |
| Punteggio CVSS | 3.7 (Basso) — autonomo; aumenta se combinato con CVE-2026-8793 |
| Ricercatore | Vivien LEBAS (@Hazaz) |
| Segnalazione | Maggio 2026 |
| Stato | Corretto — PaperCut NG 26.0.3 |
L'endpoint di autenticazione di PaperCut NG presenta una discrepanza di temporizzazione misurabile tra i tentativi di accesso effettuati con account esistenti e quelli con account inesistenti. Questa discrepanza — causata dal fatto che l'hashing bcrypt della password viene eseguito solo quando viene trovato un account corrispondente — consente a un attaccante non autenticato di determinare in modo affidabile se un determinato username esiste nel sistema, misurando i tempi di risposta HTTP.
Se combinata con CVE-2026-8793 (assenza di protezione contro la forza bruta), questa vulnerabilità consente una catena di attacco completa per il compromesso delle credenziali: enumerare prima gli username validi, quindi eseguire tentativi illimitati di indovinare le password senza alcun rischio di blocco dell'account.
La discrepanza di temporizzazione deriva da un classico pattern implementativo: l'applicazione richiama il confronto bcrypt solo quando nel database viene trovato un account corrispondente allo username inserito. Per gli account inesistenti, la routine di autenticazione termina in anticipo — prima che bcrypt venga chiamato — con un tempo di risposta conseguentemente più breve e misurabile.
Username valido: ricerca DB (trovato) → confronto bcrypt → risposta di errore ~2,1s media
Username non valido: ricerca DB (non trovato) → risposta di errore immediata ~0,2s media
Questo pattern è ben documentato (vedi CWE-208). La soluzione standard consiste nell'eseguire un confronto bcrypt fittizio anche quando l'account non esiste, uniformando i tempi di risposta su entrambi i percorsi di codice.
Sono stati effettuati tentativi di autenticazione contro l'endpoint di login di PaperCut NG in condizioni controllate:
curl con --write-out "%{time_total}", password volutamente errata in tutti i casiLe due distribuzioni mostrano zero sovrapposizioni, rendendo l'enumerazione affidabile anche con un jitter di rete moderato.
# Misurare il tempo di risposta per un account esistente (password errata)
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "http://<target>:9191/app" \
-H "Origin: http://<target>:9191" \
--data "service=direct/1/Home/%24Form&inputUsername=admin&inputPassword=wrongpassword"
# Output: ~2.1s
# Misurare il tempo di risposta per un account inesistente
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "http://<target>:9191/app" \
-H "Origin: http://<target>:9191" \
--data "service=direct/1/Home/%24Form&inputUsername=zz_doesnotexist_zz&inputPassword=wrongpassword"
# Output: ~0.2s
Un tempo di risposta significativamente superiore a ~0,5s indica in modo affidabile uno username valido. Un semplice script può automatizzare l'enumerazione contro una wordlist di comuni pattern di denominazione aziendale (firstname.lastname, flastname, ecc.).
Questa scoperta ha il massimo impatto quando viene utilizzata come primo passo di un attacco in due fasi:
Passo 1 (CVE-2026-8794, questa scoperta) — Costruire un elenco di nomi account validi di PaperCut NG misurando i tempi di risposta dell'autenticazione. In ambienti aziendali, una breve wordlist di combinazioni firstname.lastname derivata da fonti pubbliche (LinkedIn, sito web aziendale, firme delle email) è spesso sufficiente.
Passo 2 (CVE-2026-8793) — Inviare tentativi illimitati di password contro account validi confermati. L'assenza di rate-limiting o blocco account fa sì che qualsiasi attacco di credential stuffing o password spraying possa essere condotto interamente online a piena velocità.
Un attaccante non autenticato con accesso di rete a TCP/9191 può:
Nelle tipiche implementazioni aziendali, gli username di PaperCut rispecchiano gli account di Active Directory. Uno username PaperCut valido e confermato è quindi anche un nome account di dominio valido e confermato, amplificando il valore di ricognizione oltre il solo PaperCut.
Per gli amministratori (mitigazioni provvisorie):
Per il fornitore:
Eseguire un confronto bcrypt fittizio a tempo costante quando lo username inserito non corrisponde ad alcun account, garantendo che i tempi di risposta siano uniformati indipendentemente dall'esistenza dell'account:
# Pseudocodice — pattern di autenticazione a tempo costante
user = db.find_user(username)
if user:
valid = bcrypt.verify(password, user.password_hash)
else:
bcrypt.verify(password, DUMMY_HASH) # sempre eseguito, risultato scartato
valid = False
Questo è un pattern consolidato per mitigare CWE-208 nei flussi di autenticazione.
| Data | Evento |
|---|---|
| 9 maggio 2026 | Segnalazione iniziale inviata al PaperCut Security Team |
Divulgazione effettuata in conformità con i principi di responsible disclosure. I dettagli tecnici completi sono stati condivisi con il PaperCut Security Team prima della pubblicazione.
Ricercatore: Vivien LEBAS — @Hazaz
| Condizione | Min (s) | Max (s) | Media (s) | Dev. Std |
|---|
Account esistente (admin) | 2.08 | 2.19 | 2.13 | 0.031 |
Account inesistente (zz_doesnotexist_zz) | 0.18 | 0.24 | 0.21 | 0.018 |
| Differenza | ~1,92s |
| 10 maggio 2026 |
| Ricevuta conferma di ricezione |
| Maggio 2026 | CVE-2026-8794 assegnato da PaperCut (CNA) |
| Agosto 2026 | Patch rilasciata — PaperCut NG 26.0.3 |
| Agosto 2026 | Divulgazione pubblica coordinata con il fornitore |