jueves, 15 de agosto de 2013

Solucionada la fijación de sesiones en PHP

PHP ha solucionado un error relacionado con el tratamiento de las sesiones que llevaba varios años sin corregir. Concretamente, el módulo de gestión de sesiones no validaba correctamente los ID de sesión generados aceptando aquellos que incluso no estaban inicializados. Es decir, valores asignados pero no generados por la aplicación.

Este error permitía ataques de fijación de sesión ("Session fixation"). Este tipo de ataque consiste en la imposición de un token de sesión, conocido por el atacante, a una víctima a la que se le induce a iniciar una sesión en la aplicación web vulnerable.

Pongamos un ejemplo: una aplicación web que exhibe el valor del token en la URL y este sea usado para identificar la sesión:

Según el funcionamiento (inseguro en cualquier forma) de la aplicación, el atacante establecerá una sesión válida y copiará su token. Elaborará un enlace como el mostrado anteriormente y mediante ingeniería social enviará el enlace a la víctima. Si la víctima inicia sesión con ese enlace, la aplicación asignará el mismo token a su sesión permitiendo al atacante acceder a la sesión del usuario ya que conoce de antemano el valor del token de sesión.

Otro esquema de funcionamiento, incluso más débil, consiste en que el atacante ni siquiera tiene que molestarse en generar una sesión sino que le basta con asignar un valor aleatorio.

Hasta ahora los programadores de aplicaciones web en PHP usaban sus propios mecanismos para erradicar este tipo de ataques usando patrones conocidos de programación defensiva. Pero aquellas aplicaciones carentes de estos mecanismos seguían (y siguen) siendo vulnerables a este tipo de ataques.

Otro problema adicional es la duplicación de tokens de sesión. PHP no controla que existan dos tokens de sesión iguales generados previamente por la aplicación. Aunque estadísticamente la probabilidad es pequeña podría ser un elemento a tener en cuenta en sitios con una gran cantidad de usuarios concurrentes.

A partir de la próxima versión 5.5.2 de PHP se incluirá el parche (https://gist.github.com/yohgaki/1379668) para establecer el control estricto de sesiones.

El parche incluye la adopción de funciones para validar el token de sesión, control estricto de sesiones por defecto en la configuración (php.ini) y mensajes de advertencia cuando se usa la función 'session_id'.

Curiosamente la funcionalidad añadida por el parche hace que PHP sea vulnerable a un tipo específico de denegación de servicio si el atacante consigue establecer una cookie de solo lectura en el navegador de la víctima.

El parche original pertenece a Stephan Esser, conocido investigador de seguridad con numerosos reportes de vulnerabilidades sobre PHP entre otros muchos trabajos. La vulnerabilidad tiene asignado el CVE-2011-4718.

Más información:

Request for Comments: Strict Sessions

projects / php-src.git / commit



David García
Twitter: @dgn1729


2 comentarios:

  1. Respuestas
    1. ¿Qué tiene que ver el tocino con la velocidad? No es posible establecer una relación causal entre la disponibilidad del código fuente y la agilidad a la hora de detectar y resolver un problema de seguridad. Primero hay que averiguar qué está mal y por qué, y después saber cómo arreglarlo de la forma menos traumática posible, y eso no es una habilidad al alcance de todo el mundo.

      Eliminar