
Enumeración de nombres de usuario mediante canal lateral de temporización de autenticación en PaperCut NG
| Campo | Detalles |
|---|---|
| ID CVE | CVE-2026-8794 |
| Producto | PaperCut NG |
| Versión afectada | 25.0.11 (Build 75758) y anteriores |
| CWE | CWE-208 — Discrepancia temporal observable |
| Puntuación CVSS | 3.7 (Baja) — independiente; aumenta cuando se encadena con CVE-2026-8793 |
| Investigador | Vivien LEBAS (@Hazaz) |
| Notificado | Mayo de 2026 |
| Estado | Parcheado — PaperCut NG 26.0.3 |
El punto final de autenticación de PaperCut NG presenta una discrepancia temporal medible entre los intentos de inicio de sesión contra cuentas existentes y no existentes. Esta discrepancia — causada porque el hash de contraseña bcrypt solo se ejecuta cuando se encuentra una cuenta coincidente — permite a un atacante no autenticado determinar de forma fiable si un nombre de usuario determinado existe en el sistema midiendo los tiempos de respuesta HTTP.
Cuando se combina con CVE-2026-8793 (ausencia de protección contra fuerza bruta), esta vulnerabilidad permite una cadena de ataque completa de compromiso de credenciales: primero enumerar nombres de usuario válidos y, después, realizar adivinación ilimitada de contraseñas dirigida sin riesgo de bloqueo.
La discrepancia temporal se origina en un patrón de implementación clásico: la aplicación solo invoca la comparación bcrypt cuando se encuentra en la base de datos una cuenta que coincida con el nombre de usuario enviado. Para cuentas inexistentes, la rutina de autenticación termina antes — antes de que se llame a bcrypt — lo que resulta en un tiempo de respuesta mediblemente más corto.
Nombre de usuario válido: Búsqueda en BD (encontrado) → comparación bcrypt → respuesta de error ~2,1 s de media
Nombre de usuario inválido: Búsqueda en BD (no encontrado) → respuesta de error inmediata ~0,2 s de media
Este patrón está bien documentado (ver CWE-208). La remediación estándar es realizar una comparación bcrypt ficticia incluso cuando la cuenta no existe, igualando los tiempos de respuesta en ambas rutas de código.
Se realizaron intentos de autenticación contra el punto final de inicio de sesión de PaperCut NG en condiciones controladas:
curl con --write-out "%{time_total}", contraseña intencionalmente incorrecta en todos los casos| Condición | Mín (s) | Máx (s) | Media (s) | Desv. estándar |
|---|---|---|---|---|
Cuenta existente (admin) | 2,08 | 2,19 | 2,13 | 0,031 |
Cuenta inexistente (zz_doesnotexist_zz) | 0,18 | 0,24 | 0,21 | 0,018 |
| Diferencia | ~1,92 s |
Las dos distribuciones muestran cero solapamiento, lo que hace que la enumeración sea fiable incluso con una fluctuación de red moderada.
# Mide el tiempo de respuesta para una cuenta existente (contraseña incorrecta)
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"
# Salida: ~2.1s
# Mide el tiempo de respuesta para una cuenta inexistente
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"
# Salida: ~0.2s
Un tiempo de respuesta significativamente superior a ~0,5 s indica de forma fiable un nombre de usuario válido. Un script sencillo puede automatizar la enumeración contra una lista de palabras con patrones comunes de nombres corporativos (firstname.lastname, flastname, etc.).
Este hallazgo tiene mayor impacto cuando se utiliza como primer paso de un ataque en dos etapas:
Paso 1 (CVE-2026-8794, este hallazgo) — Construir una lista de nombres de cuenta válidos de PaperCut NG midiendo los tiempos de respuesta de autenticación. En entornos corporativos, una lista de palabras corta con combinaciones de firstname.lastname derivadas de fuentes públicas (LinkedIn, sitio web de la empresa, firmas de correo electrónico) suele ser suficiente.
Paso 2 (CVE-2026-8793) — Enviar intentos ilimitados de contraseña contra cuentas válidas confirmadas. La ausencia de limitación de velocidad o bloqueo significa que cualquier ataque de relleno de credenciales o rociado de contraseñas puede realizarse completamente en línea a máxima velocidad.
Un atacante no autenticado con acceso de red al TCP/9191 puede:
En despliegues corporativos típicos, los nombres de usuario de PaperCut reflejan las cuentas de Active Directory. Un nombre de usuario válido confirmado de PaperCut es, por tanto, también un nombre de cuenta de dominio válido confirmado, lo que amplifica el valor de reconocimiento más allá del propio PaperCut.
Para administradores (mitigaciones provisionales):
Para el proveedor:
Realizar una comparación bcrypt ficticia en tiempo constante cuando el nombre de usuario enviado no coincida con ninguna cuenta, asegurando que los tiempos de respuesta se igualen independientemente de si la cuenta existe:
# Pseudocódigo — patrón de autenticación en tiempo constante
user = db.find_user(username)
if user:
valid = bcrypt.verify(password, user.password_hash)
else:
bcrypt.verify(password, DUMMY_HASH) # se ejecuta siempre; se descarta el resultado
valid = False
Este es un patrón bien establecido para mitigar CWE-208 en flujos de autenticación.
| Fecha | Evento |
|---|---|
| 9 de mayo de 2026 | Informe inicial enviado al equipo de seguridad de PaperCut |
| 10 de mayo de 2026 | Acuse de recibo recibido |
| Mayo de 2026 | CVE-2026-8794 asignado por PaperCut (CNA) |
| Agosto de 2026 | Parche publicado — PaperCut NG 26.0.3 |
| Agosto de 2026 | Divulgación pública coordinada con el proveedor |
Divulgado de acuerdo con los principios de divulgación responsable. Los detalles técnicos completos se compartieron con el equipo de seguridad de PaperCut antes de la publicación pública.
Investigador: Vivien LEBAS — @Hazaz