Top 10 2007-Autenticación y Gestión de Sesiones Disfuncional

La autenticación adecuada y la gestión de sesiones son críticas en la seguridad de las aplicaciones Web. Deficiencias en estas áreas, con mucha frecuencia implican fallas en la protección de credenciales y testigos (tokens) de sesión a través de su ciclo de vida. Estos defectos pueden conducir a un robo de usuarios ó cuentas de administración, sabotaje de los controles de autorización y registro, causando violaciones a la privacidad.

Entornos Afectados
Todos los entornos de trabajo Web son vulnerables a fallas de autenticación y gestión de sesiones.

Vulnerabilidad
Las deficiencias en el mecanismo principal de autenticación no son raras, pero con mayor frecuencia se presentan a través de las funciones auxiliares de autenticación como el cierre de sesión, gestión de contraseñas, expiración de sesión, recuérdame, pregunta secreta y actualización de cuenta.

Verificando la seguridad
El objetivo es verificar que la aplicación autentica correctamente al usuario y protege adecuadamente las identidades y sus credenciales asociadas.

Enfoques automatizados: Con herramientas de escaneo de vulnerabilidades es muy difícil detectar vulnerabilidades en esquemas personalizados de autenticación y gestión de sesiones. No es probable que herramientas de análisis estático detecten problemas de autenticación y gestión de sesiones en código personalizado.

Enfoques manuales: El testeo y la verificación de código, sobre todo en combinación, son bastante eficaces para verificar que la autenticación, gestión de sesiones y las funciones auxiliares hayan sido implementadas correctamente.

Protección
La autenticación se basa en la comunicación segura y el almacenamiento de las credenciales. En primer lugar se debe asegurar que SSL es la única opción para todas las partes autenticadas de la aplicación (véase A9 - Comunicaciones inseguras) y que todas las credenciales se almacenen en "hashes" o de forma cifrada (Véase A8 - Almacenamiento criptográfico inseguro).

La prevención de defectos de autenticación lleva una planificación cuidadosa. Entre las consideraciones más importantes están las siguientes:


 * Solo use los mecanismos de gestión de sesiones incorporadas. No escriba o use manejadores de sesión secundarios bajo ninguna circunstancia.
 * No acepte identificadores de sesiones nuevas, preestablecidas ó no validas de la URL o en la petición. Esto es llamado "Ataque de fijación de sesión".
 * Limitar o eliminar el código en cookies personalizadas para propósitos de autenticación y gestión de sesiones, tales como la funcionalidad "recuérdame" o autenticación única hecha a la medida. Esto no aplica a soluciones robustas, bien demostrados SSO o soluciones de autenticación unificados.
 * Usar un solo mecanismo de autenticación con la fuerza y número de factores apropiados. Asegúrese de que este mecanismo no es fácilmente objeto de suplantación o ataques de reenvío. No haga este mecanismo tan complejo, que pueda ser propenso a un ataque por eso mismo.
 * No permita que el proceso de autenticación inicie desde una página no cifrada. Siempre deberá inicia el proceso de acceso desde una segunda página cifrada, con un nuevo testigo (token) para prevenir el robo de credenciales o sesión, ataques de "phishing" y fijación de sesión.
 * Considere generar una nueva sesión al término de una autenticación exitosa o cambio en el nivel de privilegios.
 * Asegúrese de que cada página tiene un enlace para cerrar la sesión. Al cerrar la sesión se deben destruir todas las sesiones del lado del servidor y las cookies del lado del cliente. Considere el factor humano: No pedir confirmación a los usuarios, el resultado final será que el usuario cierre las pestañas o ventana en lugar de que la sesión sea cerrada con éxito.
 * Utilice un periodo de tiempo que automáticamente cierre la sesión inactiva, dependiendo del valor de los datos protegidos (mientras más corto es mejor).
 * Utilice únicamente funciones auxiliares de autenticación fuerte (preguntas y respuestas, restablecimiento de contraseñas) ya que estas son credenciales de la misma forma que el nombre de usuario, contraseñas o testigos también son credenciales. Aplique funciones de un solo sentido a las respuestas, para prevenir ataques de divulgación.
 * No exponga ningún identificador de sesión ó cualquier porción de credenciales validas en URLs o bitácoras (no sobrescribir las sesiones ó almacenar las contraseñas de los usuarios en archivos de bitácoras).
 * Compruebe la contraseña anterior cuando el usuario cambie a una nueva contraseña.
 * '''No confíe en credenciales falsificables como la única forma de autenticación, tales como direcciones IP o máscaras con rangos de direcciones, DNS o resolución inversa de DNS, cabeceras de referenciao similares.
 * Tenga cuidado de enviar secretos a direcciones de correo electrónico registradas''' (ver RSNAKE01 en las referencias) como mecanismo para restablecer contraseñas. Use números aleatorios limitados en tiempo para restaurar el acceso y enviar seguimientos por correo electrónico tan pronto como la contraseña haya sido restaurada. Tenga cuidado de permitir a los usuarios registrados cambiar su dirección de correo electrónico - enviar un mensaje a la cuenta de correo electrónico previa, antes de realizar el cambio.

Ejemplos

 * http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-6145
 * http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-6229
 * http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-6528

Artículos Relacionados

 * Guía de Autentificación
 * Probando la Autentificación
 * Revisando código por autentificación

Referencias

 * CWE: CWE-287 (Authentication Issues), CWE-522 (Insufficiently Protected Credentials), CWE-311 (Reflection attack in an authentication protocol), others.
 * WASC Threat Classification: http://www.webappsec.org/projects/threat/classes/insufficient_authentication.shtmlhttp://www.webappsec.org/projects/threat/classes/credential_session_prediction.shtmlhttp://www.webappsec.org/projects/threat/classes/session_fixation.shtml
 * OWASP Guide, http://www.owasp.org/index.php/Guide_to_Authentication
 * OWASP Code Review Guide, http://www.owasp.org/index.php/Reviewing_Code_for_Authentication
 * OWASP Testing Guide, http://www.owasp.org/index.php/Testing_for_authentication
 * RSNAKE01 - http://ha.ckers.org/blog/20070122/ip-trust-relationships-xss-and-you