La computación distribuida trata sobre el tiempo y el estado. Es decir, para que más de un componente se comunique, debe compartir el estado, y todo esto requiere tiempo.
La mayoría de programadores antropomorfizan su trabajo. Piensan en un único puesto de control que lleva a cabo todo el programa de igual forma que harían ellos si tuviesen que realizar la tarea ellos mismos. Sin embargo, los equipos modernos cambian entre tareas con gran rapidez y, en una CPU múltiple con varios núcleos, o en los sistemas distribuidos, dos eventos pueden llevarse a cabo a la vez exactamente. Estos defectos hacen que sea urgente que se unan posturas entre el modelo de los programadores sobre cómo un programa se ejecuta y lo que sucede en la realidad. Dichos defectos están relacionados con interacciones inesperadas entre los puestos, los procesos, el tiempo y la información. Estas interacciones se producen a través del estado compartido: semáforos, variables, el sistema de archivos y, básicamente, cualquier cosa que pueda guardar información.
Session Fixation
1. Una aplicación web autentica a un usuario sin invalidar antes la sesión existente, por lo que se sigue usando la sesión que ya está asociada al usuario.
2. Un atacante puede forzar un identificador de sesión conocido en un usuario para que, una vez que este se autentique, el atacante tenga acceso a la sesión autenticada.
En la explotación genérica de las vulnerabilidades de fijación de sesión, un atacante crea una nueva sesión en una aplicación web y registra el identificador de sesión asociado. A continuación, el atacante hace que la víctima se autentique en el servidor con ese identificador de sesión, con lo que el atacante obtiene acceso a la cuenta del usuario a través de la sesión activa.
Algunos marcos de trabajo, como Spring Security, invalidan automáticamente las sesiones existentes cuando se crea una nueva. Es posible deshabilitar este comportamiento y dejar la aplicación vulnerable a este tipo de ataque.
Ejemplo 1: El siguiente ejemplo muestra un fragmento de código de una aplicación protegida con Spring Security donde se ha deshabilitado la protección contra fijación de sesión.
<http auto-config="true">
...
<session-management session-fixation-protection="none"/>
</http>
Incluso en una aplicación vulnerable, el éxito del ataque específico descrito aquí depende de que varios factores favorezcan al atacante: el acceso a un terminal público no supervisado, la capacidad de mantener activa la sesión comprometida y la presencia de una víctima interesada en iniciar sesión en la aplicación vulnerable del terminal público. En la mayoría de los casos, se pueden superar los dos primeros desafíos si se dedica suficiente tiempo a esta tarea. También es factible buscar una víctima que utilice un terminal público y que esté interesada en iniciar sesión en una aplicación vulnerable, siempre que el sitio sea razonablemente popular. Cuanto menos conocido sea el sitio, menos probabilidades habrá de encontrar una víctima interesada que utilice un terminal público y menos posibilidades de éxito del vector de ataque descrito anteriormente.
El mayor desafío al que se enfrenta un usuario malintencionado al explotar vulnerabilidades de fijación de sesión es inducir a la víctima a que se autentique en la aplicación vulnerable con el identificador de sesión que conoce el usuario malintencionado. En el
Example 1
, el atacante logra esto mediante un método directo obvio que no resulta adecuado para ataques donde los sitios web son menos populares. Sin embargo, no hay que bajar la guardia, ya que los atacantes disponen de muchas herramientas para eludir las limitaciones de este vector de ataque. La técnica más habitual que utilizan los atacantes consiste en aprovechar las vulnerabilidades Cross-Site Scripting o de división de respuestas HTTP en el sitio de destino [1]. Al engañar a la víctima para que envíe una solicitud malintencionada a una aplicación vulnerable que muestra JavaScript u otro código en su explorador, el atacante puede crear una cookie que provocará que la víctima vuelva a utilizar el identificador de sesión controlado por el atacante.Conviene destacar que las cookies a menudo están vinculadas al dominio de nivel superior asociado a una determinada URL. Si varias aplicaciones residen en el mismo dominio de nivel superior, por ejemplo,
bank.example.com
y recipes.example.com
, una vulnerabilidad en una aplicación puede permitir que un atacante establezca una cookie con un identificador de sesión fijo, que se utilizará en todas las interacciones con cualquier aplicación que se encuentre en el dominio example.com
[2].Otros vectores de ataque pueden ser el envenenamiento de DNS y los ataques relacionados basados en la red en los que el atacante redirecciona una solicitud de estado válido para hacer que el usuario visite un sitio malintencionado. Normalmente, los ataques basados en la red conllevan una presencia física en la red de la víctima, además del control de un equipo comprometido en la red, lo que complica aún más la explotación remota. No obstante, no se puede subestimar su importancia. Los mecanismos de administración de sesión menos seguros, como la implementación predeterminada en Apache Tomcat, permiten que los identificadores de sesión normalmente esperados en una cookie se especifiquen también en la URL. Esto permite que un atacante haga que una víctima use un identificador de sesión fijo simplemente mediante el envío por correo electrónico de una URL malintencionada.
1. Una aplicación web autentica a un usuario sin invalidar antes la sesión existente, por lo que se sigue usando la sesión que ya está asociada al usuario.
2. Un atacante puede forzar un identificador de sesión conocido en un usuario para que, una vez que este se autentique, el atacante tenga acceso a la sesión autenticada.
En la explotación genérica de las vulnerabilidades de fijación de sesión, un atacante crea una nueva sesión en una aplicación web y registra el identificador de sesión asociado. A continuación, el atacante hace que la víctima se autentique en el servidor con ese identificador de sesión, con lo que el atacante obtiene acceso a la cuenta del usuario a través de la sesión activa.
Ejemplo 1: El siguiente código deshabilita el atributo
use_strict_mode
en las cookies de sesión.
ini_set("session.use_strict_mode", "0");