BREACH Attack on HTTP Compression
Ataque BREACH en la compresión HTTP
Descripción
Esta vulnerabilidad indica que el servidor es susceptible a los ataques BREACH, los cuales explotan la compresión HTTP para extraer información confidencial de respuestas HTTPS cifradas midiendo los tamaños de las respuestas comprimidas.
BREACH (Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext) ocurre cuando los secretos (tokens CSRF, datos de sesión) y las entradas del usuario aparecen en la misma respuesta HTTP comprimida. Los algoritmos de compresión crean patrones detectables que revelan información sobre el secreto.
Cómo funciona:
- JavaScript malicioso realiza solicitudes al sitio de destino utilizando las cookies de la víctima
- El atacante inyecta suposiciones a través de parámetros de URL o datos de formulario
- Cuando la suposición coincide con parte de un secreto, la respuesta se comprime mejor (tamaño más pequeño)
- Midiendo el tamaño de las respuestas, el atacante extrae los secretos de forma incremental
Requisitos:
- Compresión HTTP habilitada (gzip/deflate)
- La entrada del usuario se refleja en los cuerpos de las respuestas HTTP
- Secretos en las mismas respuestas que las entradas del usuario
- Múltiples solicitudes permitidas
Escenario de ejemplo: Una aplicación web incluye un token CSRF en una respuesta JSON junto con los términos de búsqueda proporcionados por el usuario. Un atacante crea solicitudes con diferentes términos de búsqueda que coinciden parcialmente con el patrón del token CSRF, observando los tamaños de las respuestas comprimidas para extraer gradualmente el token completo.
El ataque puede extraer secretos con miles de solicitudes en menos de un minuto, lo que lleva al secuestro de sesión, la omisión de CSRF y la exposición de datos confidenciales.
Recomendación
Para mitigar los ataques BREACH, implemente las siguientes estrategias:
Mitigaciones principales:
-
Deshabilitar la compresión HTTP para páginas confidenciales: Desactive gzip/deflate para las respuestas que contienen secretos y comprima solo los recursos estáticos, no el contenido dinámico con secretos.
-
Separar los secretos de las entradas del usuario: Asegúrese de que los datos confidenciales nunca aparezcan en la misma respuesta HTTP que las entradas controladas por el usuario. Utilice endpoints separados para operaciones confidenciales que no repitan la entrada del usuario.
-
Aleatorizar los secretos por solicitud: Genere nuevos tokens CSRF con frecuencia y rote los identificadores de sesión regularmente para limitar la ventana de oportunidad de los atacantes.
Ejemplos de implementación:
# Deshabilitar la compresión para los endpoints confidenciales
location /api/csrf { gzip off; }
location /user/ { gzip off; }
# Flask: Deshabilitar el middleware de compresión
app.config['COMPRESS_MIMETYPES'] = []
# Django: Elimine GZipMiddleware de la configuración MIDDLEWARE
MIDDLEWARE = [
# ... otro middleware, pero NO:
# 'django.middleware.gzip.GZipMiddleware',
]
Defensas adicionales:
- Agregue relleno (padding) aleatorio a las respuestas que contienen secretos.
- Implemente la limitación de velocidad (10 solicitudes por minuto para los endpoints de entrada del usuario).
- Monitoree los patrones de solicitudes sospechosos que indican posibles ataques.
- Utilice métodos de protección CSRF mediante cookie de doble envío (double-submit cookie).
Enlaces
Estándares
- SOC2_CONTROLS:
- CC_6_7
- CC_7_1
- CCPA:
- CCPA_1798_150
- GDPR:
- ART_32
- PCI_STANDARDS:
- REQ_4_1
- REQ_6_5
- REQ_11_3
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213