Documentos de Académico
Documentos de Profesional
Documentos de Cultura
HTTP es un protocolo sin estado ( RFC2616 sección 5), donde cada par de
solicitud y respuesta es independiente de otras interacciones web. Por lo tanto,
para introducir el concepto de sesión, es necesario implementar capacidades
de administración de sesión que vinculen tanto los módulos de autenticación
como de control de acceso (o autorización) comúnmente disponibles en
aplicaciones web:
Propiedades de ID de sesión
Para mantener el estado autenticado y rastrear el progreso de los usuarios
dentro de la aplicación web, las aplicaciones proporcionan a los usuarios
un identificador de sesión (ID de sesión o token) que se asigna en el
momento de la creación de la sesión, y que el usuario y la aplicación web
comparten e intercambian. durante la sesión (se envía en cada solicitud
HTTP). La ID de sesión es un name=valuepar.
Con el objetivo de implementar ID de sesión segura, la generación de
identificadores (ID o tokens) debe cumplir con las siguientes propiedades.
Longitud de ID de sesión
La ID de la sesión debe ser lo suficientemente larga como para evitar ataques
de fuerza bruta, donde un atacante puede recorrer todo el rango de valores de
ID y verificar la existencia de sesiones válidas.
La longitud del ID de la sesión debe ser al menos 128 bits (16 bytes).
NOTA :
La longitud de ID de sesión de 128 bits se proporciona como referencia en función de
los supuestos hechos en la siguiente sección Entropía de ID de sesión . Sin embargo,
este número no debe considerarse como un valor mínimo absoluto, ya que otros
factores de implementación pueden influir en su solidez.
Por ejemplo, hay implementaciones bien conocidas, como los identificadores de
sesión de Microsoft ASP.NET : " El identificador de sesión de ASP .NET es un número
generado aleatoriamente codificado en una cadena de 24 caracteres que consiste en
caracteres en minúscula de la a a la z y números del 0 a 5 ".
Puede proporcionar una entropía efectiva muy buena y, como resultado, puede
considerarse el tiempo suficiente para evitar adivinanzas o ataques de fuerza bruta.
Entropía de ID de sesión
El ID de la sesión debe ser impredecible (lo suficientemente aleatorio) para
evitar ataques de adivinanzas, donde un atacante puede adivinar o predecir el
ID de una sesión válida a través de técnicas de análisis estadístico. Para este
propósito, se debe utilizar un buen PRNG (generador de números
pseudoaleatorios).
El valor de ID de sesión debe proporcionar al menos una 64 bitsentropía (si
se utiliza un buen PRNG, se estima que este valor es la mitad de la longitud
de la ID de sesión).
NOTA :
Implementación de gestión de
sesiones
La implementación de gestión de sesión define el mecanismo de intercambio
que se utilizará entre el usuario y la aplicación web para compartir e
intercambiar continuamente la ID de sesión. Existen múltiples mecanismos
disponibles en HTTP para mantener el estado de la sesión dentro de las
aplicaciones web, como cookies (encabezado HTTP estándar), parámetros de
URL (reescritura de URL - RFC2396 ), argumentos de URL en solicitudes
GET, argumentos del cuerpo en solicitudes POST, como campos de formulario
ocultos (Formularios HTML) o encabezados HTTP propietarios.
Sin embargo, tenga en cuenta que estos marcos también han presentado
vulnerabilidades y debilidades en el pasado, por lo que siempre se recomienda
utilizar la última versión disponible, que potencialmente corrige todas las
vulnerabilidades conocidas, así como revisar y cambiar la configuración
predeterminada para mejorar su seguridad siguiendo las recomendaciones
descritas a lo largo de este documento.
Mecanismos de intercambio de ID de
sesión usados versus aceptados
Una aplicación web debe hacer uso de cookies para la gestión del intercambio
de ID de sesión. Si un usuario envía un ID de sesión a través de un mecanismo
de intercambio diferente, como un parámetro de URL, la aplicación web debe
evitar aceptarlo como parte de una estrategia defensiva para detener la fijación
de la sesión.
NOTA :
Galletas
El mecanismo de intercambio de ID de sesión basado en cookies proporciona
múltiples características de seguridad en forma de atributos de cookies que
pueden usarse para proteger el intercambio de la ID de sesión:
Atributo seguro
El Secureatributo cookie indica a los navegadores web que solo envíen la
cookie a través de una conexión cifrada HTTPS (SSL / TLS). Este mecanismo
de protección de sesión es obligatorio para evitar la divulgación de la ID de
sesión a través de ataques MitM (Man-in-the-Middle). Asegura que un atacante
no pueda simplemente capturar la ID de sesión del tráfico del navegador web.
Obligar a la aplicación web a usar solo HTTPS para su comunicación (incluso
cuando el puerto TCP / 80, HTTP, está cerrado en el host de la aplicación web)
no protege contra la divulgación de ID de sesión si la Securecookie no se ha
configurado; el navegador web puede ser engañado para revelar la ID de
sesión a través de una conexión HTTP sin cifrar. El atacante puede interceptar
y manipular el tráfico de usuarios de la víctima e inyectar una referencia HTTP
sin cifrar a la aplicación web que obligará al navegador web a enviar la ID de
la sesión de forma clara.
Atributo HttpOnly
El HttpOnlyatributo de cookie indica a los navegadores web que no deben
permitir que los scripts (por ejemplo, JavaScript o VBscript) tengan acceso a
las cookies a través del objeto DOM document.cookie. Esta protección de ID
de sesión es obligatoria para evitar el robo de ID de sesión a través de ataques
XSS.
Atributo SameSite
SameSite permite que un servidor defina un atributo de cookie, lo que hace
imposible que el navegador envíe esta cookie junto con las solicitudes entre
sitios. El objetivo principal es mitigar el riesgo de fuga de información de origen
cruzado, y proporciona cierta protección contra ataques de falsificación de
solicitudes entre sitios.
La API localStorage
Alcance
localStorage Se puede acceder a los datos almacenados utilizando la API
mediante páginas que se cargan desde el mismo origen, que se define como
el esquema ( https:\\), host ( example.com), puerto ( 443) y dominio / reino
( example.com). Esto proporciona un acceso similar a estos datos como se
lograría al usar el secureindicador en una cookie, lo que significa que los datos
almacenados httpsno se pueden recuperar a través de http. Debido al posible
acceso simultáneo desde ventanas / subprocesos separados, los datos
almacenados utilizando localStoragepueden ser susceptibles a problemas de
acceso compartido (como condiciones de carrera) y deben considerarse sin
bloqueo ( especificación API de almacenamiento web ).
Duración
Los datos almacenados utilizando la localStorageAPI se conservan en las
sesiones de navegación, lo que extiende el período de tiempo en el que puede
ser accesible para otros usuarios del sistema.
Caso de uso
WHATWG sugiere el uso de localStoragedatos a los que se debe acceder a
través de ventanas o pestañas, a través de múltiples sesiones, y donde
grandes volúmenes de datos (de varios megabytes) pueden necesitar ser
almacenados por razones de rendimiento.
La API sessionStorage
Alcance
La sessionStorageAPI almacena datos dentro del contexto de la ventana desde
la que se llamó, lo que significa que la pestaña 1 no puede acceder a los datos
almacenados desde la pestaña 2. Además, al igual que la localStorageAPI,
las sessionStoragepáginas que se cargan desde el mismo origen pueden
acceder a los datos almacenados utilizando la API. , que se define como el
esquema ( https:\\), host ( example.com), puerto ( 443) y dominio / reino
( example.com). Esto proporciona un acceso similar a estos datos como se
lograría al usar el secureindicador en una cookie, lo que significa que los datos
almacenados httpsno se pueden recuperar a través de http.
Duración
La sessionStorageAPI solo almacena datos durante la sesión de navegación
actual. Una vez que se cierra la pestaña, esos datos ya no se pueden
recuperar. Esto no necesariamente impide el acceso, si una pestaña del
navegador se reutiliza o se deja abierta. Los datos también pueden persistir
en la memoria hasta un evento de recolección de basura.
Acceso sin conexión
Los estándares no requieren que los sessionStoragedatos se cifren en reposo,
lo que significa que es posible acceder directamente a estos datos desde el
disco.
Caso de uso
WHATWG sugiere el uso de sessionStoragedatos relevantes para una instancia
de un flujo de trabajo, como los detalles para la reserva de un ticket, pero
donde se podrían realizar múltiples flujos de trabajo en otras pestañas al
mismo tiempo. La naturaleza vinculada a la ventana / pestaña evitará que los
datos se filtren entre flujos de trabajo en pestañas separadas.
Riesgos de seguridad
En general, los datos seguros o confidenciales no deben almacenarse de
forma persistente en los almacenes de datos del navegador, ya que esto puede
permitir la filtración de información en sistemas compartidos. Debido a que los
mecanismos de almacenamiento web son API, esto también permite el acceso
desde los scripts inyectados, lo que lo hace menos seguro que las cookies con
el httponlyindicador aplicado. Si bien se podría defender el almacenamiento
de datos específicos del flujo de trabajo sessionStoragepara su uso en esa
pestaña / ventana específica en las recargas, las API de almacenamiento web
deben tratarse como un almacenamiento inseguro. Debido a esto, si una
solución de negocio requiere el uso de la localStorageosessionStoragePara
almacenar datos confidenciales, dicha solución debería cifrar los datos y
aplicar protecciones de reproducción. Debido a la posibilidad de acceder a las
API de almacenamiento web a través de un ataque XSS, los identificadores de
sesión deben almacenarse utilizando cookies no persistentes, con los
indicadores apropiados para proteger contra el acceso
inseguro ( Secure), XSS ( HttpOnly) y problemas CSRF ( SameSite).
Referencias
API de almacenamiento web
API LocalStorage
API de SessionStorage
WHATWG Especificaciones de almacenamiento web
Los tokens de sesión deben ser manejados por el servidor web si es posible o
generarse a través de un generador de números aleatorios criptográficamente
seguro.
Es muy común que las aplicaciones web establezcan una autenticación previa
de cookies de usuario a través de HTTP para realizar un seguimiento de
usuarios no autenticados (o anónimos). Una vez que el usuario se autentica
en la aplicación web, se establece una nueva cookie segura posterior a la
autenticación a través de HTTPS, y se establece un enlace entre ambas
cookies y la sesión del usuario. Si la aplicación web no verifica ambas cookies
para las sesiones autenticadas, un atacante puede hacer uso de la cookie no
protegida previa a la autenticación para obtener acceso a la sesión del usuario
autenticado (ver aquí y aquí ).
Las aplicaciones web deben tratar de evitar el mismo nombre de cookie para
diferentes rutas o ámbitos de dominio dentro de la misma aplicación web, ya
que esto aumenta la complejidad de la solución y potencialmente introduce
problemas de alcance.
Caducidad de la sesión
Para minimizar el período de tiempo que un atacante puede lanzar ataques
sobre sesiones activas y secuestrarlos, es obligatorio establecer tiempos de
espera de vencimiento para cada sesión, estableciendo la cantidad de tiempo
que una sesión permanecerá activa. El vencimiento de sesión insuficiente por
parte de la aplicación web aumenta la exposición de otros ataques basados
en sesión, ya que para que el atacante pueda reutilizar una ID de sesión válida
y secuestrar la sesión asociada, aún debe estar activa.
Cuando una sesión caduca, la aplicación web debe tomar acciones activas
para invalidar la sesión en ambos lados, cliente y servidor. Este último es el
más relevante y obligatorio desde una perspectiva de seguridad.
Los detalles del registro pueden incluir una marca de tiempo, una dirección IP
de origen, un recurso de destino web solicitado (e involucrado en una
operación de sesión), encabezados HTTP (incluido el Agente de usuario y
Referer), parámetros GET y POST, códigos y mensajes de error, nombre de
usuario (o ID de usuario), más la ID de sesión (cookies, URL, GET, POST ...).
Los datos confidenciales como la ID de sesión no deben incluirse en los
registros para proteger los registros de sesión contra la divulgación local o
remota de ID de sesión o el acceso no autorizado. Sin embargo, se debe iniciar
sesión en algún tipo de información específica de la sesión para correlacionar
las entradas de registro con sesiones específicas. Se recomienda registrar un
hash salado de la ID de sesión en lugar de la ID de sesión en sí para permitir
la correlación de registro específica de sesión sin exponer la ID de sesión.