El jardín HTTP
HTTP Garden es una colección de servidores HTTP y proxies configurados para ser componibles, junto con scripts para interactuar con ellos de una manera que facilita mucho la búsqueda de vulnerabilidades. Para ver algunas demostraciones interesantes de las vulnerabilidades que puede encontrar con HTTP Garden, consulte nuestra charla ShmooCon 2024.
Expresiones de gratitud
Nos gustaría agradecer a nuestros amigos de Galois, Trail of Bits, Narf Industries y Dartmouth College por hacer posible este proyecto.
Este material se basa en el trabajo respaldado por la Agencia de Proyectos de Investigación Avanzada de Defensa (DARPA) bajo el número de contrato HR0011-19-C-0076.
Empezando
Dependencias
- HTTP Garden se ejecuta en Linux x86_64 y no se ha probado en otras plataformas.
- Los servidores de destino se crean y ejecutan en contenedores Docker, por lo que necesitará Docker.
- También necesitarás los siguientes paquetes de Python, que puedes obtener de PyPI (es decir, con
pip
) o del administrador de paquetes de tu sistema:
-
docker
- Para interactuar con Docker
-
pyyaml
-
tqdm
Si está instalando paquetes de Python con el administrador de paquetes de su sistema, tenga en cuenta que es posible que los nombres de los paquetes deban tener el prefijo py3-
, python3-
o python-
, según el sistema.
- También recomiendo encarecidamente instalar rlwrap desde su administrador de paquetes, porque hace que la respuesta de Garden sea mucho más divertida.
Edificio
- Construya la imagen base:
docker build ./images/http-garden-soil -t http-garden-soil
Esta imagen contiene algunas utilidades básicas, además de un AFL++ bifurcado que facilita la recopilación de cobertura de los procesos sin eliminarlos.
- Cree algunos servidores HTTP y proxies:
docker compose build gunicorn hyper nginx haproxy nginx_proxy
Por supuesto, hay muchos más objetivos en el jardín HTTP que los que acabamos de crear. Lo que pasa es que construirlos todos lleva mucho tiempo. ¡Incluso construir estos pocos te llevará unos minutos!
Correr
- Inicie algunos servidores y proxies:
docker compose up gunicorn hyper nginx haproxy nginx_proxy
rlwrap python3 tools/repl.py
- Filtre una solicitud GET básica a través de HAProxy, luego a través de un proxy inverso de Nginx, luego envíe el resultado a los servidores de origen Gunicorn, Hyper y Nginx y muestre si sus interpretaciones coinciden:
garden> payload 'GET / HTTP/1.1rnHost: whateverrnrn' # Set the payload
garden> transduce haproxy nginx_proxy # Run the payload through the reverse proxies
[1]: 'GET / HTTP/1.1rnHost: whateverrnrn'
haproxy
[2]: 'GET / HTTP/1.1rnhost: whateverrnrn'
nginx_proxy
[3]: 'GET / HTTP/1.1rnHost: echornConnection: closernrn'
garden> servers gunicorn hyper nginx # Select the servers
garden> grid # Show their interpretations
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ ✓
hyper | ✓ ✓
nginx | ✓
Parece que todos están de acuerdo. Probemos una carga útil más interesante:
garden> payload 'POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0nrn'
garden> grid
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ X
hyper | ✓ X
nginx | ✓
¡Hay una discrepancia! Esto se debe a que Nginx admite n
como una línea que termina en líneas fragmentadas, pero Hyper y Gunicorn no. Nginx técnicamente está violando RFC 9112 aquí, pero el impacto probablemente sea mínimo.
Diseño del directorio
images
El directorio images
contiene un subdirectorio para cada servidor HTTP y transductor en Garden. Cada objetivo obtiene su propia imagen de Docker. Todos los programas se crean desde el código fuente cuando es posible. Para que podamos crear fácilmente múltiples versiones de cada objetivo, todos los objetivos se parametrizan con una URL del repositorio ( APP_REPO
), un nombre de rama ( APP_BRANCH
) y un hash de confirmación ( APP_VERSION
).
tools
El directorio tools
contiene los scripts que se utilizan para interactuar con los servidores. En su interior encontrarás
-
diagnose_anomalies.py
: un script para enumerar peculiaridades benignas del análisis HTTP en los sistemas bajo prueba que se ignorarán durante la fuzzing. -
repl.py
: la interfaz de usuario principal de HTTP Garden, -
update.py
: un script que actualiza los hashes de confirmación en docker-compose.yml
, - ...y algunos scripts más que no están orientados al usuario.
Objetivos
Servidores HTTP
Nombre | ¿Se ejecuta localmente? | ¿Cobertura cobrada? |
---|
aiohttp | Sí | Sí |
apache_httpd | Sí | Sí |
apache_tomcat | Sí | No |
puro | Sí | Sí |
cpp_httplib | Sí | No |
dardo_stdlib | Sí | No |
eclipse_grizzly | Sí | No |
eclipse_embarcadero | Sí | No |
http rápido | Sí | No |
go_stdlib | Sí | No |
gunicornio | Sí | Sí |
h2o | Sí | Sí |
haproxy_fcgi | Sí | No |
hiper | Sí | No |
hipercorn | Sí | Sí |
ktor | Sí | No |
liberal | Sí | No |
libmicrohttpd | Sí | No |
sopa de biblioteca | Sí | No |
luztpd | Sí | Sí |
mangosta | Sí | Sí |
netty | Sí | No |
nginx | Sí | Sí |
nodo_stdlib | Sí | No |
velocidad openlite | Sí | No |
openwrt_uhttpd | Sí | Sí |
php_stdlib | Sí | No |
phusion_pasajero | Sí | No |
protocolo_http1 | Sí | No |
puma | Sí | No |
charla de servicio | Sí | No |
tornado | Sí | No |
retorcido | Sí | No |
unicornio | Sí | No |
uvicornio | Sí | Sí |
camarera | Sí | Sí |
webrick | Sí | No |
es | No | No |
openbsd_httpd | No | No |
Transductores HTTP
Nombre | ¿Se ejecuta localmente? |
---|
apache_httpd_proxy | Sí |
servidor_apache_traffic | Sí |
go_stdlib_proxy | Sí |
h2o_proxy | Sí |
haproxy | Sí |
haproxy_invalid | Sí |
luztpd_proxy | Sí |
nghttpx | Sí |
nginx_proxy | Sí |
openlitespeed_proxy | Sí |
píngora | Sí |
libra | Sí |
calamar | Sí |
barniz | Sí |
akamai | No |
awselb_classic | No |
aplicación_awselb | No |
aws_cloudfront | No |
llamarada de nube | No |
rápidamente | No |
google_classic | No |
google_global | No |
iis_proxy | No |
openbsd_relayd | No |
Insectos
Estos son los errores que hemos encontrado al utilizar HTTP Garden. Si encuentra algunos propios, envíe un PR para agregarlos a esta lista. Cada error se describe con los siguientes campos:
- Caso de uso: el tipo de ataque que un atacante puede ejecutar con este error
- Requisitos: opciones de configuración requeridas u otros servidores para poder aprovechar este error.
- Riesgo: Ninguno|Bajo|Medio|Alto, seguido de una breve explicación.
- Ninguno: es probable que el error no sea explotable.
- Bajo: el error podría ser explotable, pero requiere una configuración realmente extraña o dependería de un proxy que se comporta de una manera que nunca he visto.
- Medio: Es probable que el error sea explotable, pero solo tiene un impacto moderado o requiere una combinación poco probable de servidor/transductor.
- Alto: el error se puede explotar en configuraciones comunes y combinaciones de servidor/transductor.
- Carga útil: una carga útil de ejemplo que desencadena el error
- Programas afectados: una lista de servidores en los que está presente este error, junto con cronogramas de informes y parches. Dado que algunos errores de implementación son comunes, esto evita que abarroten la lista :)
Errores del servidor
Estos son errores en la forma en que los servidores aceptan e interpretan las solicitudes.
- El constructor Python
int
se utiliza para analizar tamaños de fragmentos, por lo que 0x
, _
, +
y -
se malinterpretan.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que interprete los tamaños de fragmentos como su prefijo válido más largo, pero los reenvíe tal cual.
- Riesgo: Medio. Ver error del transductor 7.
- Carga útil:
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0_2ernrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programas afectados:
- AIOHTTP:
- 1 de agosto de 2023: informado a través del aviso de seguridad de GH.
- 7 de octubre de 2023: solucionado en la versión 3.8.6.
- Gunicornio:
- 1 de agosto de 2023: informado a través de la edición de GH.
- 25 de diciembre de 2023: corregido en el compromiso.
- Tornado:
- 2 de agosto de 2023: informado a través del aviso de seguridad de GH.
- 10 de agosto de 2023: corregido en la confirmación.
-
x00
, r
o n
están permitidos incorrectamente en los valores del encabezado.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía estos bytes en valores de encabezado, o acepta y reenvía
n
como terminador de línea de encabezado. - Riesgo: Alto. Consulte los errores del transductor 10, 12 y 16.
- Carga útil:
GET / HTTP/1.1rnHost: arnHeader: vnx00raluernrn
- Programas afectados:
- AIOHTTP:
- 1 de agosto de 2023: informado a través del aviso de seguridad de GH.
- 7 de octubre de 2023: solucionado en la versión 3.8.6.
- Gunicornio:
- 31 de enero de 2024: informado mediante edición de GH.
- 31 de enero de 2024: permanece sin corregir.
- Tornado:
- 11 de agosto de 2023: informado a través de la edición de GH.
- 31 de enero de 2024: permanece sin corregir.
- Los espacios en blanco se eliminan incorrectamente de los extremos de los nombres de los encabezados.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que considere los espacios en blanco antes de
:
como parte del nombre del encabezado. - Riesgo: Bajo. No conozco ningún transductor vulnerable, pero James Kettle dice que al menos existe uno.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnContent-Length : 34rnrnGET / HTTP/1.1rnHost: whateverrnrn
- Programas afectados:
- AIOHTTP:
- 2 de agosto de 2023: informado a través del aviso de seguridad de GH.
- 7 de octubre de 2023: solucionado en la versión 3.8.6.
- puro:
- 4 de febrero de 2024: informado a través de la edición de GH.
- 4 de febrero de 2024: permanece sin corregir.
- OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- 14 de agosto de 2023: Asignado CVE-2023-40518.
- Los espacios en blanco se eliminan incorrectamente del principio del primer nombre del encabezado.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que considere los espacios en blanco al principio del primer nombre del encabezado como parte del nombre del encabezado.
- Riesgo: Bajo. No conozco ningún transductor vulnerable.
- Carga útil:
GET / HTTP/1.1rntContent-Length: 1rnrnX
- Programas afectados:
- AIOHTTP:
- 20 de agosto de 2023: informado a través del comentario de aviso de seguridad de GH.
- 7 de octubre de 2023: solucionado en la versión 3.8.6.
- Las versiones HTTP se interpretan como su prefijo válido más largo.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno
- Carga útil:
GET /test HTTP/1.32rnrn
- Programas afectados:
- AIOHTTP:
- 14 de octubre de 2023: Informado vía edición de GH y PR.
- 15 de octubre de 2023: corregido en la confirmación.
- Los métodos HTTP se interpretan como su prefijo válido más largo.
- Caso de uso: derivación de ACL
- Requisitos: un transductor que reenvía nombres de métodos no válidos tal como están.
- Riesgo: Medio. Se omitió la explicación porque aún no se han informado los errores correspondientes.
- Carga útil:
G=":<>(e),[T];?" /get HTTP/1.1rnrn
- Programas afectados:
- AIOHTTP:
- 14 de octubre de 2023: Informado vía edición de GH y PR.
- 15 de octubre de 2023: corregido en la confirmación.
- Los URI no están validados en absoluto.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno
- Carga útil:
GET ! HTTP/1.1rnrn
- Programas afectados:
- AIOHTTP:
- 16 de octubre de 2023: informado mediante edición de GH.
- 16 de octubre de 2023: Fijo en PR.
- Algunos bytes que no son ASCII se permiten incorrectamente en los nombres de encabezado.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno
- Carga útil:
GET / HTTP/1.1rnxefoo: barrnrn
- Programas afectados:
- AIOHTTP:
- 17 de octubre de 2023: Reportado vía PR.
- 18 de octubre de 2023: solucionado mediante la fusión del PR anterior.
- Dafne:
- 4 de febrero de 2024: informado a través de la edición de GH.
- 10 de febrero de 2024: corregido en la confirmación.
- Mangosta:
- 13 de octubre de 2023: informado mediante edición de GH.
- 5 de diciembre de 2023: corregido en el compromiso.
-
n
se permite como espacio en blanco de separación en una línea de solicitud.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía solicitudes HTTP/0.9 con
n
desnudo tal como está y reutiliza la conexión subyacente. - Riesgo: Bajo. No conozco ningún transductor vulnerable.
- Carga útil:
GET /nHTTP/1.1rnrn
- Programas afectados:
- AIOHTTP:
- 17 de octubre de 2023: Reportado vía PR.
- 18 de octubre de 2023: solucionado mediante fusión.
- El constructor Python
int
se utiliza para analizar valores Content-Length
, por lo que _
, +
y -
se malinterpretan.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que interprete los valores
Content-Length
como su prefijo válido más largo, pero que los reenvíe tal cual. - Riesgo: Bajo. No conozco ningún transductor vulnerable, pero Matt Grenfeldt dice que al menos existe uno.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: +1_0rnrn0123456789
- Programas afectados:
- AIOHTTP:
- 1 de agosto de 2023: informado a través del aviso de seguridad de GH.
- 7 de octubre de 2023: solucionado en la versión 3.8.6.
- Servidor http.CPython:
- 2 de abril de 2023: informado a través de la edición de GH.
- 2 de abril de 2023: corregido en la confirmación.
- Tornado:
- 2 de agosto de 2023: informado a través del aviso de seguridad de GH.
- 10 de agosto de 2023: corregido en la confirmación.
- Trabajo:
- 1 de junio de 2023: informado a través de la edición de GH.
- 7 de junio de 2023: solucionado en la confirmación 88c5c78.
- Solicitudes que contienen múltiples
Transfer-Encoding: chunked
se aceptan y se tratan como si no tuvieran cuerpo de mensaje.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía solicitudes que contienen múltiples encabezados
Transfer-Encoding
. - Riesgo: Alto. Ver error del transductor 28.
- Carga útil:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnTransfer-Encoding: chunkedrnrn1rnZrn0rnrn
- Programas afectados:
- Tornado:
- 7 de octubre de 2023: informado a través del aviso de seguridad de GH.
- 6 de junio de 2024: solucionado en la publicación del aviso de seguridad.
-
xa0
y x85
se eliminan del principio y del final de los valores del encabezado.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía valores
Transfer-Encoding
desconocidos y los trata como distintos de chunked
. - Riesgo: Medio. Ver error del transductor 18.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: xa0chunkedxa0rnrn0rnrn
- Programas afectados:
- Tornado:
- 4 de febrero de 2024: informado a través del comentario de aviso de seguridad de GH.
- 4 de febrero de 2024: permanece sin corregir.
-
r
se trata como un terminador de línea en las líneas del campo de encabezado.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvíe
r
en los nombres de los encabezados. - Riesgo: Alto. Ver error 10 del transductor.
- Carga útil:
GET / HTTP/1.1rnVisible: :/rSmuggled: :)rnrn
- Programas afectados:
- Servidor http.CPython:
- 31 de enero de 2024: informado mediante edición de GH.
- 31 de enero de 2024: permanece sin corregir.
- Mangosta:
- 7 de julio de 2023: informado a través de la edición de GH.
- 9 de julio de 2023: corregido en la confirmación 6957c37.
- Los caracteres ASCII no permitidos se permiten incorrectamente en los nombres de encabezado.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno
- Carga útil:
GET / HTTP/1.1rnx00x01x02x03x04x05x06x07x08tx0bx0cx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1f "(),/;<=>?@[/]{}: whateverrnrn
- Programas afectados:
- Dafne:
- 4 de febrero de 2024: informado a través de la edición de GH.
- 10 de febrero de 2024: corregido en la confirmación.
- Mangosta:
- 13 de octubre de 2023: informado mediante edición de GH.
- 5 de diciembre de 2023: corregido en el compromiso.
- Tornado:
- 11 de agosto de 2023: informado a través de la edición de GH.
- 31 de enero de 2024: permanece sin corregir. OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- Las versiones HTTP no están validadas.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno
- Carga útil:
GET / HTTP/rr1.1rnrn
- Programas afectados:
- HTTP rápido:
- 4 de febrero de 2024: informado a través de la edición de GH.
- 11 de febrero de 2024: solucionado en confirmación.
- Los valores
Content-Length
vacíos se tratan como si fueran 0
.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que interprete los valores vacíos
Content-Length
como algo distinto de 0. - Riesgo: Bajo. No conozco ningún transductor de este tipo.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnContent-Length: rnrn
- Programas afectados:
- Ir a red/http:
- 31 de julio de 2023: informado a través de la edición de GH
- 11 de agosto de 2023: corregido en la confirmación.
- Lighttpd:
- 1 de agosto de 2023: informado a través del rastreador de problemas.
- 3 de agosto de 2023: solucionado en confirmación.
- OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- Los tamaños de fragmentos vacíos se tratan como si fueran
0
.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que acepte y reenvíe
rn
s adicionales entre fragmentos. - Riesgo: Bajo. No conozco ningún transductor de este tipo.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrnrnrn
- Programas afectados:
- Ir a red/http:
- 2 de diciembre de 2023: informado mediante edición de GH.
- 4 de enero de 2024: corregido en la confirmación.
- Hiper:
- 1 de diciembre de 2023: Reportado vía correo electrónico.
- 18 de diciembre de 2023: solucionado en confirmación.
- Mangosta:
- 3 de enero de 2024: informado a través de la edición de GH.
- 3 de enero de 2024: Fijo en PR.
- Los nombres de encabezado vacíos se aceptan por error.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que acepte y reenvíe
rn:rn
y lo trate como el final del bloque de encabezado. - Riesgo: Bajo. No conozco ningún transductor de este tipo.
- Carga útil:
GET / HTTP/1.1rn: ignoredrnHost: whateverrnrn
- Programas afectados:
- Ir a red/http:
- 24 de enero de 2024: informado mediante edición de GH.
- 30 de enero de 2024: corregido en la confirmación.
- Gunicornio:
- 4 de diciembre de 2023: informado mediante edición de GH.
- 25 de diciembre de 2023: corregido en el compromiso.
- Nodo.js:
- 13 de octubre de 2023: informado mediante edición de GH.
- 17 de octubre de 2023: corregido en la confirmación.
- Tornado:
- 13 de octubre de 2023: informado a través del comentario del problema de GH.
- 15 de octubre de 2023: permanece sin corregir.
- Todas las secuencias de espacios en blanco que no son
rn
se eliminan del comienzo de los valores del encabezado (después :
:).
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que acepte y reenvíe
n
terminaciones de línea desnudas en líneas de campo. - Riesgo: Medio. Ver error 16 del transductor.
- Carga útil:
GET / HTTP/1.1rnHost: arnUseless:nnGET / HTTP/1.1rnrn
- Programas afectados:
- Gunicornio:
- 2 de junio de 2023: Reportado vía correo electrónico.
- 31 de enero de 2024: informado mediante edición de GH.
- 31 de enero de 2024: permanece sin corregir.
-
xa0
y x85
bytes se eliminan de los extremos de los nombres de encabezado, antes de :
.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que acepte y reenvíe
xa0
o x85
en nombres de encabezado. - Riesgo: Medio. Ver error del transductor 6.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Lengthx85: 10rnrn0123456789
- Programas afectados:
- Gunicornio:
- 27 de junio de 2023: Reportado vía correo electrónico.
- 25 de diciembre de 2023: corregido en el compromiso.
-
,chunked
se trata como una codificación distinta de chunked
.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía el valor
Transfer-Encoding
,chunked
tal como está, y lo interpreta como equivalente a chunked
. - Riesgo: Alto. Ver error del transductor 9.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnrn0rnrn
- Programas afectados:
- Gunicornio:
- 6 de noviembre de 2023: informado mediante edición de GH.
- 25 de diciembre de 2023: corregido en el compromiso.
- Mangosta:
- 6 de noviembre de 2023: informado mediante edición de GH.
- 1 de diciembre de 2023: corregido en el compromiso.
- Pasajero:
- 6 de noviembre de 2023: Reportado vía correo electrónico.
- 22 de enero de 2024: solucionado en la versión.
- Los tamaños de fragmentos no válidos se interpretan como su prefijo válido más largo.
- Caso de uso: Solicitar contrabando
- Requisitos: Un transductor que acepte y reenvíe tamaños de fragmentos con prefijos no válidos (por ejemplo, con prefijo
0x
). - Riesgo: Alto. Vea los errores del transductor 2 y 19.
- Carga útil:
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0_2ernrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programas afectados:
- H2O:
- 1 de agosto de 2023: Reportado vía correo electrónico.
- 12 de diciembre de 2023: Fijo en PR.
- OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- WEBrick:
- 9 de noviembre de 2023: informado a través de la edición de GH.
- 3 de febrero de 2024: Fijo en PR.
- Se aceptan solicitudes con múltiples encabezados
Content-Length
en conflicto, priorizando el primero.
- Caso de uso: Solicitar contrabando
- Requisitos: Un transductor que acepte y reenvíe solicitudes con 2 encabezados
Content-Length
, priorizando el último. - Riesgo: Medio. Ver error del transductor 22.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: 1rnContent-Length: 0rnrnZ
- Programas afectados:
- H2O:
- 30 de noviembre de 2023: Reportado vía correo electrónico.
- 10 de julio de 2024: informado a través de la edición de GH.
- 10 de julio de 2024: permanece sin corregir.
- OpenLiteVelocidad:
- 26 de junio de 2024: informado mediante edición de GH.
- 10 de julio de 2024: permanece sin corregir.
- Desbordamiento de enteros de 8 bits en números de versión HTTP.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno
- Carga útil:
GET / HTTP/4294967295.255rnrn
- Programas afectados:
- Liberal:
- 17 de enero de 2024: PR enviado.
- 18 de enero de 2024: solucionado en fusión.
- Los tamaños de fragmentos se analizan utilizando
strtoll(,,16)
, por lo que los prefijos 0x
, +
y -
se aceptan erróneamente.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que interprete los tamaños de fragmentos como su prefijo válido más largo, pero que los reenvíe tal cual.
- Riesgo: Medio. Ver error del transductor 2.
- Carga útil:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrn
- Programas afectados:
- Liberal:
- 18 de enero de 2024: PR enviado.
- 18 de febrero de 2024: solucionado en fusión.
- OpenLiteVelocidad:
- 2 de agosto de 2023: Reportado vía correo electrónico.
- 11 de agosto de 2023: corregido en OLS 1.7.18.
- Se pueden utilizar encabezados
Content-Length
negativos para forzar al servidor a entrar en un bucle infinito de ocupación.
- Caso de uso: DoS
- Requisitos: Ninguno.
- Riesgo: Alto. Este error es trivial de explotar.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: -48rnrn
- Programas afectados:
- Mangosta:
- 27 de abril de 2023: Reportado vía correo electrónico.
- 16-18 de mayo de 2023: corregido en las confirmaciones 4663090, 926959a y 2669991.
- Asignado CVE-2023-34188.
- El bloque de encabezado HTTP se trunca al recibir un encabezado sin nombre ni valor.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía nombres de encabezados vacíos.
- Riesgo: Medio. Ver bonificación error 2.
- Carga útil:
GET / HTTP/1.1rn:rnI: am chopped offrnrn
- Programas afectados:
- Mangosta:
- 26 de junio de 2023: informado mediante edición de GH.
- 29 de junio de 2023: corregido en la confirmación 415bbf2.
- Los nombres de los encabezados se pueden separar de los valores únicamente mediante el espacio; no
:
requerido.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía líneas de encabezado que no contienen
:
. - Riesgo: Medio. Ver error del transductor 14.
- Carga útil:
GET / HTTP/1.1rnContent-Length 10rnrn0123456789
- Programas afectados:
- Mangosta:
- 7 de julio de 2023: informado a través de la edición de GH.
- 7 de julio de 2023: corregido en la confirmación 5dff282.
- Los encabezados
Content-Length
no válidos se interpretan como equivalentes a su prefijo válido más largo.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía valores
Content-Length
con prefijos no válidos (por ejemplo, 0x
o +
). - Riesgo: Alto. Ver error del transductor 1.
- Carga útil:
GET / HTTP/1.1rnContent-Length: 1ZrnrnZ
- Programas afectados:
- Mangosta:
- 31 de julio de 2023: informado a través de la edición de GH
- 17 de agosto de 2023: corregido en la confirmación.
- OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- El bloque de encabezado puede terminar incorrectamente en
rnrX
, donde X
puede ser cualquier byte.
- Caso de uso: ???
- Requisitos: un transductor que reenvía nombres de encabezado que comienzan con
r
o permite r
como espacio en blanco de inicio de línea plegado de línea. - Riesgo: Bajo. No conozco tal transductor.
- Carga útil:
GET / HTTP/1.1rnHost: arnrZGET /evil: HTTP/1.1rnHost: arnrn
- Programas afectados:
- Nodo.js:
- 7 de julio de 2023: informado a través del informe HackerOne.
- 31 de julio de 2023: solucionado en la confirmación de llhttp.
- 16 de septiembre de 2023: solucionado en la confirmación del nodo.
- Las líneas fragmentadas terminan incorrectamente en
rX
, donde X
puede ser cualquier byte.
- Caso de uso: Solicitar contrabando.
- Requisitos: un transductor que reenvía
r
dentro del espacio en blanco opcional en un fragmento de extensión. - Riesgo: Alto. Ver error del transductor 3.
- Carga útil:
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn5rr;ABCDrn34rnErn0rnrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programas afectados:
- Nodo.js:
- 9 de julio de 2023: informado a través del comentario de HackerOne.
- 31 de julio de 2023: solucionado en la confirmación de llhttp.
- 16 de septiembre de 2023: solucionado en la confirmación del nodo.
- Los encabezados
Content-Length
se interpretan con strtoll(,,0)
, por lo que los encabezados 0
, +
, -
y 0x
se malinterpretan.
- Caso de uso: Solicitar contrabando
- Requisitos: Un transductor que reenvíe
0
s adelantados en valores Content-Length
, lo cual está permitido por el estándar. - Riesgo: Alto. Esto se puede explotar contra transductores que cumplen con los estándares.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnContent-Length: 010rnrn01234567
- Programas afectados:
- OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- Se aceptan solicitudes con múltiples encabezados
Content-Length
en conflicto, priorizando el último.
- Caso de uso: Solicitar contrabando
- Requisitos: Un transductor que acepte y reenvíe solicitudes con 2 encabezados
Content-Length
, priorizando el primero. - Riesgo: Bajo. No conozco ningún transductor de este tipo, pero la existencia de uno parece muy probable.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: 0rnContent-Length: 1rnrnZ
- Programas afectados:
- HTTP rápido:
- 4 de febrero de 2024: Reportado vía correo electrónico.
- 11 de febrero de 2024: solucionado en confirmación.
-
r
está permitido en los valores del encabezado.
- Caso de uso: ???
- Requisitos: un transductor que malinterprete y reenvíe
r
en los valores del encabezado. - Riesgo: Bajo. No conozco ningún transductor de este tipo.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnHeader: varluernrn
- Programas afectados:
- OpenLiteVelocidad:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 10 de agosto de 2023: corregido en OLS 1.7.18.
- Los valores del encabezado se truncan en
x00
.
- Caso de uso: derivación de ACL
- Requisitos: un transductor que reenvía
x00
en valores de encabezado. - Riesgo: Medio. Ver error del transductor 12.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTest: testx00THESE BYTES GET DROPPEDrnConnection: closernrn
- Programas afectados:
- OpenLiteVelocidad:
- 3 de noviembre de 2023: Reportado vía correo electrónico.
- 10 de julio de 2024: fijado en o antes de esta fecha.
- Liberal:
- 29 de enero de 2024: informado a través del aviso de seguridad de GH.
- 31 de enero de 2024: permanece sin corregir.
- Los retornos de carro se reenvían dentro del espacio en blanco opcional que sigue al punto y coma en una extensión de fragmento.
- Caso de uso: Solicitar contrabando
- Requisitos: un servidor que trate
rr
como equivalente a rn
en esta ubicación. - Riesgo: Alto. Consulte el error 31 del servidor.
- Carga útil:
POST /abc HTTP/1.1rnTransfer-Encoding: chunkedrnHost: h2o.http-garden.usrnrn41;a=brrXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrn0rnrnGET /bad_path/pwned HTTP/1.1rnHost: arnContent-Length: 412rnrn0rnrnGET /def HTTP/1.1rnHost: h2o.http-garden.usrnrn
- Programas afectados:
- CDN de Akamai:
- 3 de diciembre de 2023: Reportado vía correo electrónico.
- 10 de julio de 2024: fijado en esta fecha o antes.
- Los nombres de los encabezados pueden continuar a lo largo de las líneas.
- Caso de uso: solicitar contrabando.
- Requisitos: un transductor que reenvía líneas de encabezado que no contienen
:
. - Riesgo: Medio. Ver error del transductor 14.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-rnEncoding: chunkedrnContent-Length: 5rnrn0rnrn
- Programas afectados:
- Pasajero:
- 6 de noviembre de 2023: Reportado vía correo electrónico.
- 22 de enero de 2024: solucionado en la versión.
-
Content-Length
vacío en las solicitudes se interpreta como "lectura hasta que se agote el tiempo de espera".
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que acepte y reenvíe valores de encabezado
Content-Length
vacíos y los trate como equivalentes a 0. - Riesgo: Medio. Consulte los errores del transductor 5 y 11.
- Carga útil:
GET / HTTP/1.1rnHost: localhostrnContent-Length: rnrnGET / HTTP/1.1rnHost: localhostrnrn
- Programas afectados:
- Puma:
- 16 de junio de 2023: Reportado vía correo electrónico.
- 17 de agosto de 2023: solucionado en Puma 6.3.1 y 5.6.7. Ver aviso.
- Los cuerpos de mensajes fragmentados terminan en
rnXX
, donde XX
pueden ser dos bytes cualesquiera.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que conserve los campos finales y no agregue espacios en blanco entre
:
y el valor dentro de los campos finales. (ATS es uno de esos servidores) - Riesgo: Alto. Los requisitos para explotar este error no requieren que el transductor viole los estándares.
- Carga útil:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrn0rnX:POST / HTTP/1.1rnrn
- Programas afectados:
- Puma:
- 31 de julio de 2023: Reportado vía correo electrónico.
- 17 de agosto de 2023: solucionado en Puma 6.3.1 y 5.6.7. Ver aviso.
- Asignado CVE-2023-40175.
- Los métodos y versiones HTTP no están validados.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno.
- Carga útil:
x00 / HTTP/............0596.7407.rnrn
- Programas afectados:
- Camarera:
- 17 de octubre de 2023: PR enviado.
- 4 de febrero de 2024: Corregido en fusión de PR.
-
xa0
y x85
se eliminan de los principios y finales de los valores del encabezado, excepto el encabezado Transfer-Encoding
.
- Caso de uso: omisión de ACL de valor de encabezado
- Requisitos: un transductor que acepte y reenvíe
xa0
y x85
en su lugar. - Riesgo: Medio. El estándar permite a los transductores reenviar texto obscurecido en los valores del encabezado.
- Carga útil:
GET /login HTTP/1.1rnHost: arnUser: x85adminxa0rnrn
- Programas afectados:
- Camarera:
- 4 de febrero de 2024: informado a través de la edición de GH.
- 4 de febrero de 2024: solucionado en confirmación.
- Los valores
Content-Length
vacíos se interpretan como equivalentes a 0
y se les da prioridad sobre cualquier valor Content-Length
posterior.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvía valores
Content-Length
vacíos antes que los que no están vacíos e interpreta los que no están vacíos. - Riesgo: Alto. Ver error del transductor 11.
- Carga útil:
GET / HTTP/1.1rnContent-Length: rnContent-Length: 43rnrnPOST /evil HTTP/1.1rnContent-Length: 18rnrnGET / HTTP/1.1rnrn
- Programas afectados:
- WEBrick:
- 14 de agosto de 2023: informado a través de la edición de GH.
- 15 de agosto de 2023: Corregido en PR.
-
x00
se elimina de los extremos de los valores del encabezado.
- Caso de uso: derivación de ACL
- Requisitos: un transductor que reenvía
x00
en valores de encabezado. - Riesgo: Medio. Ver error del transductor 12.
- Carga útil:
GET / HTTP/1.1rnEvil: evilx00rnrn
- Programas afectados:
- WEBrick:
- 30 de noviembre de 2023: informado mediante edición de GH.
- 3 de febrero de 2024: Fijo en PR.
- Todas las codificaciones de transferencia desconocidas se tratan como equivalentes a
chunked
.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que reenvíe codificaciones de transferencia distintas de las
identity
y chunked
. Esto está permitido por la norma. - Riesgo: Alto. Esto permite el contrabando de solicitudes contra algunos transductores que cumplen con los estándares.
- Carga útil:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: bleghrnrn1rnZrn0rnrn
- Programas afectados:
- HTTP rápido:
- 4 de febrero de 2024: Reportado vía correo electrónico.
- 11 de febrero de 2024: solucionado en confirmación.
- Las conexiones se cierran prematuramente cuando se canaliza una solicitud no válida después de una solicitud válida.
- Caso de uso: ???
- Requisitos: Ninguno.
- Riesgo: Ninguno.
- Carga útil:
GET / HTTP/1.1rnConnection: closernrnInvalidrnrn
- Programas afectados:
- Mangosta:
- 29 de enero de 2024: informado mediante edición de GH.
- 13 de febrero de 2024: solucionado en confirmación.
- Uvicornio:
- 29 de enero de 2024: informado a través del comentario de discusión de GH.
- 6 de febrero de 2024: solucionado inadvertidamente en la confirmación.
- Los bytes mayores que
x80
se eliminan del principio y del final de los valores del encabezado.
- Caso de uso: multitud de problemas.
- Requisitos: un transductor que reenvía encabezados de host que contengan bytes mayores que
x80
. - Riesgo: Medio.
- Carga útil:
POST / HTTP/1.1rnHost: xffaxffrnTransfer-Encoding: xffchunkedxffrnrn1rnZrn0rnrn
- Programas afectados:
- Bollo:
- 13 de febrero de 2024: informado mediante edición de GH.
- 13 de febrero de 2024: permanece sin corregir.
- Cuando se recibe un fragmento no válido, la conexión no se cierra y el inicio del siguiente mensaje se coloca después del primer
rn
que sigue al fragmento no válido.
- Caso de uso: envenenamiento de la cola de respuestas.
- Requisitos: un transductor que reenvíe fragmentos no válidos.
- Riesgo: Medio.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrnINVALID!!!rnGET / HTTP/1.1rnHost: whateverrnrn
- Programas afectados:
- puro:
- 14 de febrero de 2024: informado mediante edición de GH.
- 14 de febrero de 2024: permanece sin corregir.
- Las solicitudes canalizadas en el búfer de solicitud inicial se interpretan como el cuerpo del mensaje de la primera solicitud en el búfer, incluso si tiene un encabezado
Content-Length: 0
.
- Caso de uso: Solicitar contrabando
- Requisitos: un transductor que no cambie los límites de los elementos de la corriente entrante.
- Riesgo: Bajo. No conozco ningún transductor de este tipo.
- Carga útil:
POST / HTTP/1.1rnContent-Length: 0rnConnection:keep-alivernHost: arnid: 0rnrnPOST / HTTP/1.1rnHost: arnid: 1rnContent-Length: 34rnrn
GET / HTTP/1.1rnHost: arnid: 2rnrn
- Programas afectados:
- Puma:
- 2 de febrero de 2024: Reportado vía correo electrónico.
- 2 de febrero de 2024: corregido en la confirmación.
Errores del transductor
Estos son errores en la forma en que los transductores interpretan, normalizan y reenvían solicitudes.
- Los valores
Content-Length
con prefijo 0x
se aceptan y reenvían incorrectamente, sin validación del cuerpo del mensaje.
- Caso de uso: Solicitar contrabando
- Requisitos: un servidor que interprete
Content-Length
como su prefijo válido más largo o que interprete Content-Length
con el prefijo 0x
. - Riesgo: Medio. Consulte los errores de servidor 10, 29 y 32.
- Carga útil:
POST / HTTP/1.1rnHost: akamai.my-domain.coolrnContent-Length: 0x10rnrnZ
- Programas afectados:
- CDN de Akamai:
- 7 de septiembre de 2023: Reportado vía correo electrónico.
- 27 de noviembre de 2023: Notificación de la solución por correo electrónico.
- Los valores de tamaño de fragmento no válidos se aceptan y reenvían incorrectamente.
- Caso de uso: Solicitar contrabando
- Requisitos: un servidor backend HTTP/1.1
- Riesgo: Alto. Este error era aprovechable para el contrabando de solicitudes contra servidores arbitrarios.
- Carga útil:
POST / HTTP/1.1rnHost: akamai.my-domain.coolrnTransfer-Encoding: chunkedrnrnZrnZZrnZZZrnrn
- Programas afectados:
- CDN de Akamai:
- 7 de septiembre de 2023: Reportado vía correo electrónico.
- 27 de noviembre de 2023: Notificación de la solución por correo electrónico.
-
r
se permite incorrectamente en espacios en blanco de fragmentos de extensión antes de ;
.
- Caso de uso: Solicitar contrabando
- Requisitos: Un servidor que malinterprete
r
en esta ubicación. - Riesgo: Alto. Consulte el error 31 del servidor.
- Carga útil:
POST / HTTP/1.1rnHost: server.my-domain.coolrnTransfer-Encoding: chunkedrnrn2rr;arn02rn41rn0rnrnGET /bad_path/pwned HTTP/1.1rnHost: arnContent-Length: 430rnrn0rnrnGET / HTTP/1.1rnHost: server.my-domain.coolrnrn
- Programas afectados:
- CDN de Akamai:
- 7 de septiembre de 2023: Reportado vía correo electrónico.
- 27 de noviembre de 2023: Notificación de la solución por correo electrónico.
- Servidor de tráfico Apache:
- 20 de septiembre de 2023: informado mediante edición de GH.
- 13 de febrero de 2024: Fijo en PR.
- Balanceador de carga de aplicaciones de Google Cloud Classic:
- 13 de septiembre de 2023: informado a través de Google IssueTracker.
- 30 de enero de 2024: fijado en o antes de esta fecha.
- Los mensajes que contienen fragmentos no válidos se reenvían sin sus cuerpos.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: Ninguno.
- Carga útil:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn1r0n
- Programas afectados:
- Libra:
- 13 de junio de 2024: informado mediante edición de GH.
- 14 de junio de 2024: corregido en la confirmación.
- Los encabezados
Content-Length
vacíos se reenvían incorrectamente.
- Caso de uso: Solicitar contrabando
- Requisitos: un servidor que interprete los valores vacíos
Content-Length
como algo distinto de 0 - Riesgo: Medio. Consulte el error 38 del servidor.
- Carga útil:
GET / HTTP/1.1rnhost: whateverrncontent-length: rnrn
- Programas afectados:
- Servidor de tráfico Apache:
- 2 de agosto de 2023: informado a través de la edición de GH.
- 6 de agosto de 2023: arreglado vía PR.
- Los bytes no permitidos se aceptan y reenvían dentro de los nombres de los encabezados.
- Caso de uso: Solicitar contrabando
- Requisitos: un servidor que malinterprete estos bytes no válidos dentro de los nombres de los encabezados.
- Riesgo: Medio. Consulte el error 41 del servidor.
- Carga útil:
GET / HTTP/1.1rnHost: fanoutrnHeaderx85: valuernrn
- Programas afectados:
- Servidor de tráfico Apache:
- 29 de junio de 2023: Reportado vía correo electrónico.
- 18 de septiembre de 2023: informado mediante edición de GH.
- 31 de enero de 2024: permanece sin corregir.
- OpenBSD transmitió:
- 10 de noviembre de 2023: Reportado vía correo electrónico.
- 28 de noviembre de 2023: parcheado en confirmación.
- Los tamaños de fragmentos se interpretan como su prefijo válido más largo y se vuelven a emitir.
- Caso de uso: Solicitar contrabando
- Requisitos: un servidor que interprete los prefijos
0_
o 0x
en tamaños de fragmentos. - Riesgo: Alto. Consulte los errores 1 y 25 del servidor y el error 19 del transductor.
- Carga útil:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn1these-bytes-never-get-validatedrnZrn0rnrn
- Programas afectados:
- Servidor de tráfico de Apache:
- 10 de octubre de 2023: Informado a través del problema de GH.
- 13 de febrero de 2024: fijo en pr.
- Marcador de posición :)
-
Transfer-Encoding: ,chunked
se envían intactos e interpretados como equivalentes a chunked
.
- Caso de uso: Solicitud de contrabando
- Requisitos: Un servidor que ignora los sys
Transfer-Encoding
desconocida y las tratadas ,chunked
como distintas de chunked
. - Riesgo: alto. Ver el error del servidor 21.
- Carga útil:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: ,chunkedrnrn0rnrn
- Programas afectados:
- Azure CDN:
- 15 de octubre de 2023: informado a través del informe de vulnerabilidad de MSRC.
- 29 de noviembre de 2023: fijado en o antes de esta fecha.
- 12 de diciembre de 2023: "Este caso no cumple con la barra para el servicio de MSRC, ya que el contrabando HTTP no se considera una vulnerabilidad y cerraremos este caso".
- NGHTTPX:
- 14 de octubre de 2023: informado por correo electrónico.
- 17 de octubre de 2023: fijo en pr.
-
r
se reenvía incorrectamente en los valores de encabezado.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que trata
r
como equivalente a rn
dentro de los campos de encabezado. - Riesgo: medio. Ver el error del servidor 13.
- Carga útil:
GET / HTTP/1.1rnInvalid-Header: thisrvaluerisrinvalidrnrn
- Google Cloud Classic Application Load Balancer:
- 7 de septiembre de 2023: informado a través de Google Issuetracker.
- 30 de enero de 2024: fijado en o antes de esta fecha.
- Los encabezados
Content-Length
vacío se reenvían incorrectamente, incluso en presencia de otros encabezados Content-Length
, siempre que el encabezado vacío Content-Length
viene primero.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que interpreta los valores vacíos
Content-Length
como 0 y acepta múltiples encabezados Content-Length
en solicitudes entrantes, priorizando el primero. - Riesgo: medio. Ver el error del servidor 42.
- Carga útil:
GET / HTTP/1.1rnhost: whateverrncontent-length: rncontent-length: 59rnrnPOST /evil HTTP/1.1rnhost: whateverrncontent-length: 34rnrnGET / HTTP/1.1rnhost: whateverrnrn
- Programas afectados:
- Haproxy:
- 2 de agosto de 2023: Informado por problema de GH.
- 9 de agosto de 2023: fijado en compromiso.
- 10 de agosto de 2023: Asignado CVE-2023-40225.
-
x00
se reenvía en los valores de encabezado.
- Caso de uso: Bypass de ACL
- Requisitos: un servidor que trunca los valores del encabezado en
x00
. - Riesgo: medio. Consulte los errores del servidor 35 y 43, y el error del transductor 20.
- Carga útil:
GET / HTTP/1.1rnHost: google.comx00.kallus.orgrnrn
- Programas afectados:
- Haproxy:
- 19 de septiembre de 2023: informado por correo electrónico.
- 31 de enero de 2024: fijo en compromiso.
- Openlitespeed:
- 3 de noviembre de 2023: informado por correo electrónico.
- 10 de julio de 2024: fijo en o antes de esta fecha.
- Bare
n
se acepta como un terminador de línea de fragmentos.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: ninguno
- Carga útil:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrnarn0123456789n0rnrn
- Programas afectados:
- Haproxy:
- 25 de enero de 2024: informado por correo electrónico.
- 30 de enero de 2024: fijo en las comunicaciones 7B737DA y 4837E99.
- Líneas de campo con no
:
se reenvían como está.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor de backend que malinterpreta las líneas de campo de encabezado con no
:
. - Riesgo: medio. Ver Transductor Bugs 28 y 37.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTenst: testrnConnection: closernrn
- Programas afectados:
- Openlitespeed:
- 3 de noviembre de 2023: informado por correo electrónico.
- 10 de julio de 2024: fijo en o antes de esta fecha.
- Las solicitudes que contienen encabezados
Content-Length
y Transfer-Encoding
se reenvían como es si el valor Transfer-Encoding
no se reconoce.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor de back-end que trata
,chunked
como equivalente a chunked
y prioriza Transfer-Encoding
a través de Content-Length
. Estos comportamientos están permitidos por los estándares. - Riesgo: alto. Esto permite la solicitud de contrabando a servidores que cumplen con los estándares.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnConnection: closernrn0rnrn
- Programas afectados:
- Openlitespeed:
- 3 de noviembre de 2023: informado por correo electrónico.
- 10 de julio de 2024: fijo en o antes de esta fecha.
- Libra:
- 4 de febrero de 2024: informado a través del problema de GH.
- 29 de marzo de 2024: fijo en compromiso.
-
n
no está normalizado a rn
en mensajes reenviados.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor de backend que no
n
como una línea que termina en las líneas de encabezado. El estándar permite a los servidores traducir n
a
. - Riesgo: alto. Este error es explotable contra los servidores que cumplen con los estándares.
- Carga útil:
GET / HTTP/1.1nHost: whatevernConnection: closenn
- Programas afectados:
- Openlitespeed:
- 3 de noviembre de 2023: informado por correo electrónico.
- 31 de enero de 2024: sigue sin fijar.
- Los cuerpos de mensajes fortados que contienen un extra
rn
antes de que la fragmentación de terminador no se desconecte sin reemplazar el encabezado Transfer-Encoding
con Content-Length
.
- Caso de uso: Solicitud de contrabando
- Requisitos: Ninguno.
- Riesgo: alto. Este error es explotable contra servidores de backend arbitrarios.
- Payload:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn17rn0rnrnGET / HTTP/1.1rnrnrnrn0rnrn
- Programas afectados:
- APARELITEPEED
- 30 de noviembre de 2023: informado por correo electrónico.
- 10 de julio de 2024: fijo en o antes de esta fecha.
-
Transfer-Encoding: ,chunked
se envían intactos y no se interpretan como equivalentes a chunked
.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que se interpreta
,chunked
como equivalente a chunked
, lo que el estándar dice que puede hacer. - Riesgo: alto. Esta es una vulnerabilidad de contrabando de solicitud que se puede utilizar contra los backends que cumplen con los estándares.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnrn0rnrn
- Programas afectados:
- OpenBSD Relayd:
- 10 de noviembre de 2023: informado por correo electrónico.
- 28 de noviembre de 2023: parcheado en compromiso.
- Los tamaños de fragmentos con los prefijos
+
, -
y 0x
se interpretan y reenvían.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que interpreta los tamaños de fragmentos como su prefijo más válido.
- Riesgo: alto. Ver el error del servidor 22.
- Carga útil:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn-0x0rnrn
- Programas afectados:
- OpenBSD Relayd:
- 10 de noviembre de 2023: informado por correo electrónico.
- 28 de noviembre de 2023: parcheado en compromiso.
- Libra:
- 10 de octubre de 2023: Informado a través del problema de GH.
- 11 de octubre de 2023: Se corrigió a través de comodidades 60A4F42 y F70DB92.
- Los encabezados que contienen
x00
o n
se concatenan en el valor del encabezado anterior.
- Caso de uso: Solicitud de contrabando
- Requisitos: Cualquier servidor de back-end que cumpla con los estándares.
- Riesgo: alto. Esta es una vulnerabilidad de contrabando de solicitudes genéricas.
- Carga útil:
GET / HTTP/1.1rna:brncx00rnrn
- Programas afectados:
- OpenBSD Relayd:
- 10 de noviembre de 2023: informado por correo electrónico.
- 29 de noviembre de 2023: parcheado en compromiso.
- Los cuerpos de mensajes se eliminan de las solicitudes de
GET
sus encabezados Content-Length
.
- Caso de uso: Solicitud de contrabando
- Requisitos: Cualquier servidor de back -end que admite tuberías.
- Riesgo: alto. Esta es una vulnerabilidad de contrabando de solicitudes genéricas.
- Carga útil:
GET / HTTP/1.1rnContent-Length: 10rnrn1234567890
- Programas afectados:
- OpenBSD Relayd:
- 28 de noviembre de 2023: informado por correo electrónico.
- 1 de diciembre de 2023: parcheado en compromiso.
- Se envían solicitudes que contienen múltiples encabezados
Content-Length
, priorizando el último.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que acepta solicitudes que contienen múltiples encabezados
Content-Length
, priorizando el primero. - Riesgo: alto. Ver el error del servidor 23.
- Carga útil:
POST / HTTP/1.1rnHost: arnContent-Length: 0rnContent-Length: 31rnrnGET /evil HTTP/1.1rnHost: arnrn
- Programas afectados:
- OpenBSD Relayd:
- 30 de noviembre de 2023: informado por correo electrónico.
- 10 de julio de 2024: sigue sin fijar.
- Se reenvian las solicitudes que contienen
Content-Length
y Transfer-Encoding
.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que prioriza
Content-Length
sobre Transfer-Encoding
, o no admite Transfer-Encoding: chunked
. - Riesgo: alto. Este es el clásico vector de contrabando de solicitudes.
- Carga útil:
POST / HTTP/1.1rnHost: arnContent-Length: 5rnTransfer-Encoding: chunkedrnrn0rnrn
- Programas afectados:
- OpenBSD Relayd:
- 30 de noviembre de 2023: informado por correo electrónico.
- 10 de julio de 2024: sigue sin fijar.
- Se aceptan y reenvían los trozos de fragmentos con prefijo en blanco.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: ninguno
- Carga útil:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn 0rnrn
- Programas afectados:
- OpenBSD Relayd:
- 30 de noviembre de 2023: informado por correo electrónico.
- 31 de enero de 2024: sigue sin fijar.
- Libra:
- 15 de octubre de 2023: informado a través del problema de GH.
- 25 de noviembre de 2023: fijo en compromiso.
- Solicitudes que contienen múltiples
Transfer-Encoding: chunked
se envían y se tratan como equivalentes a un solo encabezado.
- Caso de uso: Solicitud de contrabando
- Requisitos: un servidor que trata múltiples
Transfer-Encoding: chunked
como no equivalentes a la sin Transfer-Encoding: chunked
, o se une a los encabezados Transfer-Encoding
múltiples, y los tratados chunked,chunked
como distintos de chunked
. - Riesgo: medio. Ver el error del servidor 21.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnTransfer-Encoding: chunkedrnrn0rnrn
- Programas afectados:
- Libra:
- 7 de octubre de 2023: Informado a través del problema de GH.
- 12 de octubre de 2023: fijado en compromiso.
Errores de bonificación
Estos son errores que encontramos, por cierto, solo configurando el jardín HTTP y enviando una solicitud de ejemplo. Realmente no cuentan porque no requieren usar el jardín, pero creo que debería documentarlos de todos modos.
- El argumento nulo pasó a
memcpy
en desencadenantes de comportamiento indefinido.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: ninguno
- Carga útil: cualquier solicitud con un cuerpo de mensaje vacío que se reenviará a un backend proxy_fcgi.
- Programas afectados:
- Apache httpd:
- 2 de diciembre de 2023: Informado a través del problema de Bugzilla.
- 19 de diciembre de 2023: fijado en revisión 1914775.
- Uwsgi:
- 1 de enero de 2024: Informado a través del problema de GH.
- Februiario 8, 2024: parcheado en pr.
- Use el uso gratuito.
- Caso de uso: DOS
- Requisitos: el servidor utiliza
attach_server_session_to_client
- Riesgo: bajo. Si bien esto se bloquea ATS, es muy fácil notar que una persona razonable no habría implementado una instancia vulnerable en la producción.
- Carga útil: cualquier solicitud en absoluto.
- Programas afectados:
- Servidor de tráfico de Apache:
- 31 de julio de 2023: informado a través de la emisión de GH.
- 13 de septiembre de 2023: fijo a través de Pr.
- Enviar un byte adicional después de una solicitud con un cuerpo de mensajes fortados bloquea el servidor con un Segfault.
- Caso de uso: DOS
- Requisitos: FastCGI está habilitado.
- Riesgo: alto. Este es un error trivial a explotador que bloquea el servidor.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrn0rnrnx00
- Programas afectados:
- OpenBSD httpd:
- 1 de noviembre de 2023: informado por correo electrónico.
- 8 de noviembre de 2023: fijo en compromiso.
- Los cuerpos de solicitud de fragmentación entrantes se hacen eco antes de enviar la respuesta.
- Caso de uso: DOS
- Requisitos: FastCGI está habilitado.
- Riesgo: medio. Esto invalidará el flujo de solicitud para cualquier mensaje fortado, que arruinará las conexiones compartidas.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrn1rnZrn0rnrn
- Programas afectados:
- OpenBSD httpd:
- 4 de enero de 2024: reportado por correo electrónico.
- 31 de enero de 2024: sigue sin fijar.
- NULL Derferencia al recibir cualquier solicitud.
- Caso de uso: DOS
- Requisitos:
mod_dir
está habilitado con ciertas opciones de configuración. - Riesgo: bajo. Este error es tan obvio que nadie sano implementaría un servidor vulnerable.
- Carga útil: cualquier cosa en absoluto.
- Programas afectados:
- Apache httpd:
- 24 de enero de 2024: Informado a través del problema de Bugzilla.
- 24 de enero de 2024: sigue sin fijar.
Bonus Bonus Bugs
Estos son errores que encontramos cuando el jardín tenía soporte HTTP/2. Eliminamos el soporte HTTP/2 porque estaba un poco a medias, ¡pero me encantaría poder agregarlo!
- Los caracteres en blanco no se despojan de los valores de campo durante las rebajas HTTP/2 a HTTP/1.1.
- Caso de uso: ???
- Requisitos: N/A
- Riesgo: ninguno
- Carga útil:
PRI * HTTP/2.0rnrnSMrnrnx00x00x00x04x00x00x00x00x00x00x00Ex01x05x00x00x00x01x00n:authoritytlocalhostx00x05:pathx01/x00x07:methodx03GETx00x07:schemex04httpx00x05test1x03tat
- Programas afectados:
- Enviado:
- 7 de julio de 2023: informado a través del problema de GH.
- 7 de octubre de 2023: sigue sin fijar.
- H2O:
- 7 de julio de 2023: informado a través del problema de GH.
- 18 de julio de 2023: fijado en PR #3256.
- Caché de barniz:
- 7 de julio de 2023: informado a través del problema de GH.
- 22 de agosto de 2023: fijo en confirmación.
- Los nombres de los encabezados vacíos se conservan a través de la traducción HTTP/2 a HTTP/1.1, lo que lleva a la producción de http/1.1 inválido.
- Caso de uso: DOS
- Requisitos: se está realizando una rebaja HTTP/2, y el backend rechaza los nombres de los cabezales vacíos (como la mayoría lo hace).
- Riesgo: bajo. Este error se puede usar para hacer un servidor razonable 400, que romperá el intercambio de conexión.
- Carga útil:
PRI * HTTP/2.0rnrnSMrnrnx00x00x00x04x00x00x00x00x00x00x00=x01x05x00x00x00x01x00n:authoritytlocalhostx00x05:pathx01/x00x07:methodx03GETx00x07:schemex04httpx00x00x00
- Programas afectados:
- H2O:
- 7 de julio de 2023: informado a través del problema de GH.
- 18 de julio de 2023: fijado en PR #3256.