O jardim HTTP
O HTTP Garden é uma coleção de servidores HTTP e proxies configurados para serem combináveis, junto com scripts para interagir com eles de uma forma que torna a localização de vulnerabilidades muito mais fácil. Para algumas demonstrações interessantes das vulnerabilidades que você pode encontrar no HTTP Garden, confira nossa palestra ShmooCon 2024.
Agradecimentos
Gostaríamos de agradecer aos nossos amigos da Galois, Trail of Bits, Narf Industries e Dartmouth College por tornarem este projeto possível.
Este material é baseado em trabalho apoiado pela Agência de Projetos de Pesquisa Avançada de Defesa (DARPA) sob o contrato número HR0011-19-C-0076.
Começando
Dependências
- O HTTP Garden é executado em Linux x86_64 e não foi testado em outras plataformas.
- Os servidores de destino são criados e executados em contêineres Docker, portanto, você precisará do Docker.
- Você também precisará dos seguintes pacotes Python, que podem ser obtidos no PyPI (ou seja, com
pip
) ou no gerenciador de pacotes do sistema:
-
docker
- Para interagir com Docker
-
pyyaml
-
tqdm
Se você estiver instalando pacotes Python com o gerenciador de pacotes do sistema, esteja ciente de que os nomes dos pacotes podem precisar ser prefixados com py3-
, python3-
ou python-
, dependendo do sistema.
- Eu também recomendo instalar o rlwrap do seu gerenciador de pacotes, porque isso torna a reposição do Garden muito mais divertida.
Prédio
docker build ./images/http-garden-soil -t http-garden-soil
Esta imagem contém alguns utilitários básicos, além de um AFL++ bifurcado que facilita a coleta de cobertura dos processos sem eliminá-los.
- Crie alguns servidores HTTP e proxies:
docker compose build gunicorn hyper nginx haproxy nginx_proxy
É claro que existem muito mais alvos no jardim HTTP do que aqueles que acabamos de construir. Só que construir todos eles leva muito tempo. Até mesmo construir esses poucos levará alguns minutos!
Correndo
- Inicie alguns servidores e proxies:
docker compose up gunicorn hyper nginx haproxy nginx_proxy
rlwrap python3 tools/repl.py
- Filtre uma solicitação GET básica por meio do HAProxy, depois por meio de um proxy reverso Nginx, envie o resultado para os servidores de origem Gunicorn, Hyper e Nginx e exiba se suas interpretações correspondem:
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 concordam. Vamos tentar uma carga mais interessante:
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 | ✓
Há uma discrepância! Isso ocorre porque o Nginx suporta n
como uma linha que termina em linhas de pedaços, mas o Hyper e o Gunicorn não. O Nginx está tecnicamente violando a RFC 9112 aqui, mas o impacto é provavelmente mínimo.
Layout do diretório
images
O diretório images
contém um subdiretório para cada servidor HTTP e transdutor no Garden. Cada destino obtém sua própria imagem Docker. Todos os programas são compilados a partir do código-fonte, quando possível. Para que possamos construir facilmente várias versões de cada destino, todos os destinos são paremetrizados com uma URL de repositório ( APP_REPO
), nome de ramificação ( APP_BRANCH
) e hash de commit ( APP_VERSION
).
tools
O diretório tools
contém os scripts usados para interagir com os servidores. Dentro dele você encontrará
-
diagnose_anomalies.py
: um script para enumerar peculiaridades benignas de análise HTTP nos sistemas em teste a serem ignoradas durante a difusão, -
repl.py
: A interface de usuário principal para o HTTP Garden, -
update.py
: um script que atualiza os hashes de commit em docker-compose.yml
, - ...e mais alguns scripts que não são voltados para o usuário.
Alvos
Servidores HTTP
Nome | Funciona localmente? | Cobertura coletada? |
---|
aiohttp | sim | sim |
apache_httpd | sim | sim |
apache_tomcat | sim | não |
charuto | sim | sim |
cpp_httplib | sim | não |
dardo_stdlib | sim | não |
eclipse_grizzly | sim | não |
eclipse_jetty | sim | não |
http rápido | sim | não |
go_stdlib | sim | não |
gunicórnio | sim | sim |
água2o | sim | sim |
haproxy_fcgi | sim | não |
hiper | sim | não |
hipercórnio | sim | sim |
ktor | sim | não |
evento libe | sim | não |
libmicrohttpd | sim | não |
sopa de lib | sim | não |
lighttpd | sim | sim |
mangusto | sim | sim |
líquido | sim | não |
nginx | sim | sim |
node_stdlib | sim | não |
velocidade aberta | sim | não |
openwrt_uhttpd | sim | sim |
php_stdlib | sim | não |
phusion_passenger | sim | não |
protocolo_http1 | sim | não |
puma | sim | não |
conversa de serviço | sim | não |
tornado | sim | não |
torcido | sim | não |
unicórnio | sim | não |
uvicórnio | sim | sim |
garçonete | sim | sim |
webrick | sim | não |
é | não | não |
openbsd_httpd | não | não |
Transdutores HTTP
Nome | Funciona localmente? |
---|
apache_httpd_proxy | sim |
apache_traffic_server | sim |
go_stdlib_proxy | sim |
h2o_proxy | sim |
haproxy | sim |
haproxy_inválido | sim |
lighttpd_proxy | sim |
nghttpx | sim |
nginx_proxy | sim |
openlitespeed_proxy | sim |
pingora | sim |
libra | sim |
lula | sim |
verniz | sim |
akamai | não |
awselb_classic | não |
awselb_application | não |
aws_cloudfront | não |
nuvem flare | não |
rapidamente | não |
google_classic | não |
google_global | não |
iis_proxy | não |
openbsd_relayd | não |
Erros
Estes são os bugs que encontramos usando o HTTP Garden. Se você encontrar alguns dos seus, envie um PR para adicioná-los a esta lista! Cada bug é descrito com os seguintes campos:
- Caso de uso: o tipo de ataque que um invasor pode executar com este bug
- Requisitos: Opções de configuração necessárias ou outros servidores para que este bug seja explorado.
- Risco: Nenhum|Baixo|Médio|Alto, seguido de uma breve explicação.
- Nenhum: o bug provavelmente não pode ser explorado.
- Baixo: o bug pode ser explorável, mas requer uma configuração muito estranha ou dependeria de um proxy se comportando de uma maneira que eu nunca vi.
- Médio: O bug provavelmente pode ser explorado, mas tem impacto apenas moderado ou requer uma combinação improvável de servidor/transdutor.
- Alto: O bug pode ser explorado em configurações comuns e combinações de servidor/transdutor.
- Carga útil: um exemplo de carga útil que aciona o bug
- Programas afetados: uma lista de servidores nos quais esse bug está presente, juntamente com cronogramas de relatórios e patches. Como alguns bugs de implementação são comuns, isso evita que eles desorganizem a lista :)
Erros de servidor
Esses são bugs na forma como os servidores aceitam e interpretam as solicitações.
- O construtor Python
int
é usado para analisar tamanhos de blocos, portanto 0x
, _
, +
e -
são mal interpretados.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que interpreta os tamanhos dos blocos como seu prefixo válido mais longo, mas os encaminha como estão.
- Risco: Médio. Veja bug do transdutor 7.
- Carga útil:
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0_2ernrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programas afetados:
- AIOHTTP:
- 1º de agosto de 2023: Relatado por meio de comunicado de segurança do GH.
- 7 de outubro de 2023: corrigido na versão 3.8.6.
- Gunicórnio:
- 1º de agosto de 2023: Relatado por meio de edição do GH.
- 25 de dezembro de 2023: corrigido no commit.
- Tornado:
- 2 de agosto de 2023: Relatado por meio de comunicado de segurança do GH.
- 10 de agosto de 2023: corrigido no commit.
-
x00
, r
ou n
são permitidos incorretamente em valores de cabeçalho.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe esses bytes em valores de cabeçalho ou aceite e encaminhe
n
como um terminador de linha de cabeçalho. - Risco: Alto. Veja os erros do transdutor 10, 12 e 16.
- Carga útil:
GET / HTTP/1.1rnHost: arnHeader: vnx00raluernrn
- Programas afetados:
- AIOHTTP:
- 1º de agosto de 2023: Relatado por meio de comunicado de segurança do GH.
- 7 de outubro de 2023: corrigido na versão 3.8.6.
- Gunicórnio:
- 31 de janeiro de 2024: Relatado por meio de edição do GH.
- 31 de janeiro de 2024: permanece sem correção.
- Tornado:
- 11 de agosto de 2023: Relatado por meio de edição do GH.
- 31 de janeiro de 2024: permanece sem correção.
- Os espaços em branco são removidos incorretamente do final dos nomes dos cabeçalhos.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que considere os espaços em branco antes de
:
como parte do nome do cabeçalho. - Risco: Baixo. Não tenho conhecimento de nenhum transdutor vulnerável, mas James Kettle diz que existe pelo menos um.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnContent-Length : 34rnrnGET / HTTP/1.1rnHost: whateverrnrn
- Programas afetados:
- AIOHTTP:
- 2 de agosto de 2023: Relatado por meio de comunicado de segurança do GH.
- 7 de outubro de 2023: corrigido na versão 3.8.6.
- Charuto:
- 4 de fevereiro de 2024: Relatado por meio de edição do GH.
- 4 de fevereiro de 2024: permanece sem correção.
- Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- 14 de agosto de 2023: Atribuído CVE-2023-40518.
- Os espaços em branco são removidos incorretamente do início do primeiro nome do cabeçalho.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que considere os espaços em branco no início do primeiro nome do cabeçalho como parte do nome do cabeçalho.
- Risco: Baixo. Não tenho conhecimento de nenhum transdutor vulnerável.
- Carga útil:
GET / HTTP/1.1rntContent-Length: 1rnrnX
- Programas afetados:
- AIOHTTP:
- 20 de agosto de 2023: Relatado por meio de comentário do consultor de segurança do GH.
- 7 de outubro de 2023: corrigido na versão 3.8.6.
- As versões HTTP são interpretadas como seu prefixo válido mais longo.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum
- Carga útil:
GET /test HTTP/1.32rnrn
- Programas afetados:
- AIOHTTP:
- 14 de outubro de 2023: Relatado via edição GH e PR.
- 15 de outubro de 2023: corrigido no commit.
- Os métodos HTTP são interpretados como seu prefixo válido mais longo.
- Caso de uso: desvio de ACL
- Requisitos: Um transdutor que encaminhe nomes de métodos inválidos como estão.
- Risco: Médio. Explicação omitida porque os bugs correspondentes ainda não foram relatados.
- Carga útil:
G=":<>(e),[T];?" /get HTTP/1.1rnrn
- Programas afetados:
- AIOHTTP:
- 14 de outubro de 2023: Relatado via edição GH e PR.
- 15 de outubro de 2023: corrigido no commit.
- URIs não são validados de forma alguma.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum
- Carga útil:
GET ! HTTP/1.1rnrn
- Programas afetados:
- AIOHTTP:
- 16 de outubro de 2023: Relatado por meio de edição do GH.
- 16 de outubro de 2023: Corrigido no PR.
- Alguns bytes não ASCII são permitidos incorretamente em nomes de cabeçalho.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum
- Carga útil:
GET / HTTP/1.1rnxefoo: barrnrn
- Programas afetados:
- AIOHTTP:
- 17 de outubro de 2023: Relatado via PR.
- 18 de outubro de 2023: Corrigido por meio da fusão do PR acima.
- Dafne:
- 4 de fevereiro de 2024: Relatado por meio de edição do GH.
- 10 de fevereiro de 2024: corrigido no commit.
- Mangusto:
- 13 de outubro de 2023: Relatado por meio de edição do GH.
- 5 de dezembro de 2023: corrigido no commit.
-
n
é permitido separar espaços em branco em uma linha de solicitação.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminha solicitações HTTP/0.9 com
n
vazio no estado em que se encontra e reutiliza a conexão subjacente. - Risco: Baixo. Não tenho conhecimento de nenhum transdutor vulnerável.
- Carga útil:
GET /nHTTP/1.1rnrn
- Programas afetados:
- AIOHTTP:
- 17 de outubro de 2023: Relatado via PR.
- 18 de outubro de 2023: corrigido por meio de mesclagem.
- O construtor Python
int
é usado para analisar valores Content-Length
, portanto _
, +
e -
são mal interpretados.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que interpreta os valores
Content-Length
como seu prefixo válido mais longo, mas os encaminha como estão. - Risco: Baixo. Não tenho conhecimento de nenhum transdutor vulnerável, mas Matt Grenfeldt diz que existe pelo menos um.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: +1_0rnrn0123456789
- Programas afetados:
- AIOHTTP:
- 1º de agosto de 2023: Relatado por meio de comunicado de segurança do GH.
- 7 de outubro de 2023: corrigido na versão 3.8.6.
- CPython http.servidor:
- 2 de abril de 2023: Relatado por meio de edição do GH.
- 2 de abril de 2023: corrigido no commit.
- Tornado:
- 2 de agosto de 2023: Relatado por meio de comunicado de segurança do GH.
- 10 de agosto de 2023: corrigido no commit.
- Trabalho:
- 1º de junho de 2023: Relatado por meio de edição do GH.
- 7 de junho de 2023: corrigido no commit 88c5c78.
- Solicitações contendo vários cabeçalhos
Transfer-Encoding: chunked
são aceitas e tratadas como não tendo corpo de mensagem.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminha solicitações contendo vários cabeçalhos
Transfer-Encoding
. - Risco: Alto. Veja bug do transdutor 28.
- Carga útil:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnTransfer-Encoding: chunkedrnrn1rnZrn0rnrn
- Programas afetados:
- Tornado:
- 7 de outubro de 2023: Relatado por meio de comunicado de segurança do GH.
- 6 de junho de 2024: corrigido no lançamento do comunicado de segurança.
-
xa0
e x85
são removidos do início e do fim dos valores do cabeçalho.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe valores desconhecidos
Transfer-Encoding
e os trate como distintos de chunked
. - Risco: Médio. Veja bug do transdutor 18.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: xa0chunkedxa0rnrn0rnrn
- Programas afetados:
- Tornado:
- 4 de fevereiro de 2024: Relatado por meio de comentário do consultor de segurança do GH.
- 4 de fevereiro de 2024: permanece sem correção.
-
r
é tratado como um terminador de linha nas linhas do campo de cabeçalho.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe
r
em nomes de cabeçalho. - Risco: Alto. Veja bug do transdutor 10.
- Carga útil:
GET / HTTP/1.1rnVisible: :/rSmuggled: :)rnrn
- Programas afetados:
- CPython http.servidor:
- 31 de janeiro de 2024: Relatado por meio de edição do GH.
- 31 de janeiro de 2024: permanece sem correção.
- Mangusto:
- 7 de julho de 2023: Relatado por meio de edição do GH.
- 9 de julho de 2023: corrigido no commit 6957c37.
- Caracteres ASCII não permitidos são permitidos incorretamente em nomes de cabeçalho.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum
- Carga útil:
GET / HTTP/1.1rnx00x01x02x03x04x05x06x07x08tx0bx0cx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1f "(),/;<=>?@[/]{}: whateverrnrn
- Programas afetados:
- Dafne:
- 4 de fevereiro de 2024: Relatado por meio de edição do GH.
- 10 de fevereiro de 2024: corrigido no commit.
- Mangusto:
- 13 de outubro de 2023: Relatado por meio de edição do GH.
- 5 de dezembro de 2023: corrigido no commit.
- Tornado:
- 11 de agosto de 2023: Relatado por meio de edição do GH.
- 31 de janeiro de 2024: permanece sem correção. Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- As versões HTTP não são validadas.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum
- Carga útil:
GET / HTTP/rr1.1rnrn
- Programas afetados:
- HTTP rápido:
- 4 de fevereiro de 2024: Relatado por meio de edição do GH.
- 11 de fevereiro de 2024: corrigido no commit.
- Valores vazios
Content-Length
são tratados como se fossem 0
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que interpreta valores vazios
Content-Length
como algo diferente de 0. - Risco: Baixo. Não conheço nenhum transdutor desse tipo.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnContent-Length: rnrn
- Programas afetados:
- Acesse a rede/http:
- 31 de julho de 2023: Relatado por meio de edição do GH
- 11 de agosto de 2023: corrigido no commit.
- Lighttpd:
- 1º de agosto de 2023: relatado por meio do rastreador de problemas.
- 3 de agosto de 2023: corrigido no commit.
- Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- Tamanhos de blocos vazios são tratados como se fossem
0
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceita e encaminha
rn
s extras entre pedaços. - Risco: Baixo. Não conheço nenhum transdutor desse tipo.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrnrnrn
- Programas afetados:
- Acesse a rede/http:
- 2 de dezembro de 2023: Relatado por meio de edição do GH.
- 4 de janeiro de 2024: corrigido no commit.
- Hiper:
- 1º de dezembro de 2023: Relatado por e-mail.
- 18 de dezembro de 2023: corrigido no commit.
- Mangusto:
- 3 de janeiro de 2024: Relatado por meio de edição do GH.
- 3 de janeiro de 2024: Corrigido no PR.
- Nomes de cabeçalho vazios são aceitos erroneamente.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceita e encaminha
rn:rn
e o trata como o final do bloco de cabeçalho. - Risco: Baixo. Não conheço nenhum transdutor desse tipo.
- Carga útil:
GET / HTTP/1.1rn: ignoredrnHost: whateverrnrn
- Programas afetados:
- Acesse a rede/http:
- 24 de janeiro de 2024: Relatado por meio de edição do GH.
- 30 de janeiro de 2024: corrigido no commit.
- Gunicórnio:
- 4 de dezembro de 2023: Relatado por meio de edição do GH.
- 25 de dezembro de 2023: corrigido no commit.
- Node.js:
- 13 de outubro de 2023: Relatado por meio de edição do GH.
- 17 de outubro de 2023: corrigido no commit.
- Tornado:
- 13 de outubro de 2023: Relatado por meio de comentário de edição do GH.
- 15 de outubro de 2023: permanece sem correção.
- Todas as sequências de espaços em branco que não sejam
rn
são removidas do início dos valores do cabeçalho (após :
).
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceite e encaminhe terminações de linha
n
simples em linhas de campo. - Risco: Médio. Veja bug do transdutor 16.
- Carga útil:
GET / HTTP/1.1rnHost: arnUseless:nnGET / HTTP/1.1rnrn
- Programas afetados:
- Gunicórnio:
- 2 de junho de 2023: Relatado por e-mail.
- 31 de janeiro de 2024: Relatado por meio de edição do GH.
- 31 de janeiro de 2024: permanece sem correção.
- Os bytes
xa0
e x85
são removidos do final dos nomes dos cabeçalhos, antes de :
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceite e encaminhe
xa0
ou x85
em nomes de cabeçalho. - Risco: Médio. Veja bug do transdutor 6.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Lengthx85: 10rnrn0123456789
- Programas afetados:
- Gunicórnio:
- 27 de junho de 2023: Relatado por e-mail.
- 25 de dezembro de 2023: corrigido no commit.
-
,chunked
é tratado como uma codificação distinta de chunked
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe o valor
Transfer-Encoding
,chunked
como está, e o interprete como equivalente a chunked
. - Risco: Alto. Veja bug do transdutor 9.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnrn0rnrn
- Programas afetados:
- Gunicórnio:
- 6 de novembro de 2023: Relatado por meio de edição do GH.
- 25 de dezembro de 2023: corrigido no commit.
- Mangusto:
- 6 de novembro de 2023: Relatado por meio de edição do GH.
- 1º de dezembro de 2023: corrigido no commit.
- Passageiro:
- 6 de novembro de 2023: Relatado por e-mail.
- 22 de janeiro de 2024: corrigido na versão.
- Tamanhos de blocos inválidos são interpretados como seu prefixo válido mais longo.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceite e encaminhe tamanhos de blocos prefixados de forma inválida (por exemplo, com prefixo
0x
). - Risco: Alto. Consulte os bugs 2 e 19 do transdutor.
- Carga útil:
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn0_2ernrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programas afetados:
- H2O:
- 1º de agosto de 2023: Relatado por e-mail.
- 12 de dezembro de 2023: Corrigido no PR.
- Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- WEBrick:
- 9 de novembro de 2023: Relatado por meio de edição do GH.
- 3 de fevereiro de 2024: Corrigido no PR.
- Solicitações com vários cabeçalhos
Content-Length
conflitantes são aceitas, priorizando o primeiro.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceita e encaminha solicitações com 2 cabeçalhos
Content-Length
, priorizando o último. - Risco: Médio. Veja bug do transdutor 22.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: 1rnContent-Length: 0rnrnZ
- Programas afetados:
- H2O:
- 30 de novembro de 2023: Relatado por e-mail.
- 10 de julho de 2024: Relatado por meio de edição do GH.
- 10 de julho de 2024: permanece sem correção.
- Velocidade OpenLite:
- 26 de junho de 2024: Relatado por meio de edição do GH.
- 10 de julho de 2024: permanece sem correção.
- Estouro de número inteiro de 8 bits em números de versão HTTP.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum
- Carga útil:
GET / HTTP/4294967295.255rnrn
- Programas afetados:
- Libevento:
- 17 de janeiro de 2024: PR enviado.
- 18 de janeiro de 2024: corrigido na mesclagem.
- Os tamanhos dos pedaços são analisados usando
strtoll(,,16)
, portanto, os prefixos 0x
, +
e -
são erroneamente aceitos.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que interpreta os tamanhos dos blocos como seu prefixo válido mais longo, mas os encaminha como estão.
- Risco: Médio. Veja bug do transdutor 2.
- Carga útil:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrn
- Programas afetados:
- Libevento:
- 18 de janeiro de 2024: PR enviado.
- 18 de fevereiro de 2024: corrigido na mesclagem.
- Velocidade OpenLite:
- 2 de agosto de 2023: Relatado por e-mail.
- 11 de agosto de 2023: corrigido no OLS 1.7.18.
- Cabeçalhos negativos
Content-Length
podem ser usados para forçar o servidor a entrar em um loop ocupado infinito.
- Caso de uso: DoS
- Requisitos: Nenhum.
- Risco: Alto. Este bug é fácil de explorar.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: -48rnrn
- Programas afetados:
- Mangusto:
- 27 de abril de 2023: Relatado por e-mail.
- 16 a 18 de maio de 2023: corrigido nos commits 4663090, 926959a e 2669991.
- Atribuído CVE-2023-34188.
- O bloco de cabeçalho HTTP é truncado após o recebimento de um cabeçalho sem nome ou valor.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe nomes de cabeçalho vazios.
- Risco: Médio. Veja bônus bônus bug 2.
- Carga útil:
GET / HTTP/1.1rn:rnI: am chopped offrnrn
- Programas afetados:
- Mangusto:
- 26 de junho de 2023: Relatado por meio de edição do GH.
- 29 de junho de 2023: Corrigido no commit 415bbf2.
- Os nomes dos cabeçalhos podem ser separados dos valores apenas no espaço; não
:
obrigatório.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe linhas de cabeçalho que não contenham
:
. - Risco: Médio. Veja bug do transdutor 14.
- Carga útil:
GET / HTTP/1.1rnContent-Length 10rnrn0123456789
- Programas afetados:
- Mangusto:
- 7 de julho de 2023: Relatado por meio de edição do GH.
- 7 de julho de 2023: corrigido no commit 5dff282.
- Cabeçalhos
Content-Length
inválidos são interpretados como equivalentes ao seu prefixo válido mais longo.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminha valores
Content-Length
com prefixos inválidos (por exemplo, 0x
ou +
) - Risco: Alto. Veja bug do transdutor 1.
- Carga útil:
GET / HTTP/1.1rnContent-Length: 1ZrnrnZ
- Programas afetados:
- Mangusto:
- 31 de julho de 2023: Relatado por meio de edição do GH
- 17 de agosto de 2023: corrigido no commit.
- Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- O bloco de cabeçalho pode ser finalizado incorretamente em
rnrX
, onde X
pode ser qualquer byte.
- Caso de uso: ???
- Requisitos: Um transdutor que encaminhe nomes de cabeçalho começando com
r
ou permita r
como espaço em branco de início de linha dobrável. - Risco: Baixo. Não conheço tal transdutor.
- Carga útil:
GET / HTTP/1.1rnHost: arnrZGET /evil: HTTP/1.1rnHost: arnrn
- Programas afetados:
- Node.js:
- 7 de julho de 2023: Relatado por meio do relatório HackerOne.
- 31 de julho de 2023: corrigido no commit llhttp.
- 16 de setembro de 2023: corrigido no commit do Node.
- As linhas de pedaços são terminadas incorretamente em
rX
, onde X
pode ser qualquer byte.
- Caso de uso: Solicitar contrabando.
- Requisitos: Um transdutor que encaminhe
r
dentro do espaço em branco opcional em um chunk-ext. - Risco: Alto. Veja bug do transdutor 3.
- Carga útil:
GET / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn5rr;ABCDrn34rnErn0rnrnGET / HTTP/1.1rnHost: arnContent-Length: 5rnrn0rnrn
- Programas afetados:
- Node.js:
- 9 de julho de 2023: Relatado por meio de comentário do HackerOne.
- 31 de julho de 2023: corrigido no commit llhttp.
- 16 de setembro de 2023: corrigido no commit do Node.
- Os cabeçalhos
Content-Length
são interpretados com strtoll(,,0)
, portanto, 0
, +
, -
e 0x
iniciais são mal interpretados.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe
0
s iniciais em valores Content-Length
, o que é permitido pelo padrão. - Risco: Alto. Isto pode ser explorado contra transdutores compatíveis com os padrões.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnContent-Length: 010rnrn01234567
- Programas afetados:
- Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- Solicitações com vários cabeçalhos
Content-Length
conflitantes são aceitas, priorizando o último.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceite e encaminhe solicitações com 2 cabeçalhos
Content-Length
, priorizando o primeiro. - Risco: Baixo. Não conheço nenhum transdutor desse tipo, mas a existência de um parece extremamente provável.
- Carga útil:
GET / HTTP/1.1rnHost: arnContent-Length: 0rnContent-Length: 1rnrnZ
- Programas afetados:
- HTTP rápido:
- 4 de fevereiro de 2024: Relatado por e-mail.
- 11 de fevereiro de 2024: corrigido no commit.
-
r
é permitido em valores de cabeçalho.
- Caso de uso: ???
- Requisitos: Um transdutor que interpreta mal e encaminha
r
nos valores do cabeçalho. - Risco: Baixo. Não conheço nenhum transdutor desse tipo.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnHeader: varluernrn
- Programas afetados:
- Velocidade OpenLite:
- 31 de julho de 2023: Relatado por e-mail.
- 10 de agosto de 2023: corrigido no OLS 1.7.18.
- Os valores do cabeçalho são truncados em
x00
.
- Caso de uso: desvio de ACL
- Requisitos: Um transdutor que encaminhe
x00
em valores de cabeçalho. - Risco: Médio. Veja bug do transdutor 12.
- Carga útil:
GET / HTTP/1.1rnHost: whateverrnTest: testx00THESE BYTES GET DROPPEDrnConnection: closernrn
- Programas afetados:
- Velocidade OpenLite:
- 3 de novembro de 2023: Relatado por e-mail.
- 10 de julho de 2024: Fixo nesta data ou antes dela.
- Libevento:
- 29 de janeiro de 2024: Relatado por meio de comunicado de segurança do GH.
- 31 de janeiro de 2024: permanece sem correção.
- Os retornos de carro são encaminhados dentro do espaço em branco opcional após o ponto e vírgula em uma extensão de bloco.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor que trate
rr
como equivalente a rn
neste local. - Risco: Alto. Veja bug do servidor 31.
- 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 afetados:
- CDN da Akamai:
- 3 de dezembro de 2023: Relatado por e-mail.
- 10 de julho de 2024: Fixo nesta data ou antes dela.
- Os nomes dos cabeçalhos podem continuar através das linhas.
- Caso de uso: solicitar contrabando.
- Requisitos: Um transdutor que encaminhe linhas de cabeçalho que não contenham
:
. - Risco: Médio. Veja bug do transdutor 14.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-rnEncoding: chunkedrnContent-Length: 5rnrn0rnrn
- Programas afetados:
- Passageiro:
- 6 de novembro de 2023: Relatado por e-mail.
- 22 de janeiro de 2024: corrigido na versão.
-
Content-Length
vazio nas solicitações é interpretado como "lido até que o tempo limite ocorra".
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que aceita e encaminha valores de cabeçalho
Content-Length
vazios e os trata como equivalentes a 0. - Risco: Médio. Veja os bugs 5 e 11 do transdutor.
- Carga útil:
GET / HTTP/1.1rnHost: localhostrnContent-Length: rnrnGET / HTTP/1.1rnHost: localhostrnrn
- Programas afetados:
- Puma:
- 16 de junho de 2023: Relatado por e-mail.
- 17 de agosto de 2023: corrigido no Puma 6.3.1 e 5.6.7. Consulte o comunicado.
- Os corpos das mensagens fragmentadas são finalizados em
rnXX
, onde XX
pode ter quaisquer dois bytes.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que preserve os campos de trailer e não adicione espaços em branco entre o valor
:
e nos campos de trailer. (ATS é um desses servidores) - Risco: Alto. Os requisitos para explorar este bug não exigem que o transdutor viole os padrões.
- Carga útil:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrn0rnX:POST / HTTP/1.1rnrn
- Programas afetados:
- Puma:
- 31 de julho de 2023: Relatado por e-mail.
- 17 de agosto de 2023: Corrigido no Puma 6.3.1 e 5.6.7. Consulte o comunicado.
- Atribuído CVE-2023-40175.
- Os métodos e versões HTTP não são validados.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum.
- Carga útil:
x00 / HTTP/............0596.7407.rnrn
- Programas afetados:
- Garçonete:
- 17 de outubro de 2023: PR enviado.
- 4 de fevereiro de 2024: Corrigido na fusão do PR.
-
xa0
e x85
são removidos do início e do fim dos valores do cabeçalho, exceto para o cabeçalho Transfer-Encoding
.
- Caso de uso: desvio de ACL de valor de cabeçalho
- Requisitos: Um transdutor que aceite e encaminhe
xa0
e x85
no lugar. - Risco: Médio. O padrão permite que os transdutores encaminhem texto obs em valores de cabeçalho.
- Carga útil:
GET /login HTTP/1.1rnHost: arnUser: x85adminxa0rnrn
- Programas afetados:
- Garçonete:
- 4 de fevereiro de 2024: Relatado por meio de edição do GH.
- 4 de fevereiro de 2024: corrigido no commit.
- Valores vazios
Content-Length
são interpretados como equivalentes a 0
e priorizados em relação a quaisquer valores Content-Length
subsequentes.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe valores vazios
Content-Length
antes dos não vazios e interprete os não vazios. - Risco: Alto. Veja bug do transdutor 11.
- Carga útil:
GET / HTTP/1.1rnContent-Length: rnContent-Length: 43rnrnPOST /evil HTTP/1.1rnContent-Length: 18rnrnGET / HTTP/1.1rnrn
- Programas afetados:
- WEBrick:
- 14 de agosto de 2023: Relatado por meio de edição do GH.
- 15 de agosto de 2023: Corrigido no PR.
-
x00
é removido do final dos valores do cabeçalho.
- Caso de uso: desvio de ACL
- Requisitos: Um transdutor que encaminhe
x00
em valores de cabeçalho. - Risco: Médio. Veja bug do transdutor 12.
- Carga útil:
GET / HTTP/1.1rnEvil: evilx00rnrn
- Programas afetados:
- WEBrick:
- 30 de novembro de 2023: Relatado por meio de edição do GH.
- 3 de fevereiro de 2024: Corrigido no PR.
- Todas as codificações de transferência desconhecidas são tratadas como equivalentes a
chunked
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que encaminhe Transfer-Encodings diferentes de
identity
e chunked
. Isso é permitido pelo padrão. - Risco: Alto. Isso permite o contrabando de solicitações contra alguns transdutores compatíveis com os padrões.
- Carga útil:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: bleghrnrn1rnZrn0rnrn
- Programas afetados:
- HTTP rápido:
- 4 de fevereiro de 2024: Relatado por e-mail.
- 11 de fevereiro de 2024: corrigido no commit.
- As conexões são fechadas prematuramente quando uma solicitação inválida é canalizada após uma solicitação válida.
- Caso de uso: ???
- Requisitos: Nenhum.
- Risco: Nenhum.
- Carga útil:
GET / HTTP/1.1rnConnection: closernrnInvalidrnrn
- Programas afetados:
- Mangusto:
- 29 de janeiro de 2024: Relatado por meio de edição do GH.
- 13 de fevereiro de 2024: corrigido no commit.
- Uvicórnio:
- 29 de janeiro de 2024: Relatado por meio de comentário de discussão do GH.
- 6 de fevereiro de 2024: corrigido inadvertidamente no commit.
- Bytes maiores que
x80
são removidos do início e do fim dos valores do cabeçalho.
- Caso de uso: Host de problemas.
- Requisitos: Um transdutor que encaminhe cabeçalhos de Host contendo bytes maiores que
x80
. - Risco: Médio.
- Carga útil:
POST / HTTP/1.1rnHost: xffaxffrnTransfer-Encoding: xffchunkedxffrnrn1rnZrn0rnrn
- Programas afetados:
- Pão:
- 13 de fevereiro de 2024: Relatado por meio de edição do GH.
- 13 de fevereiro de 2024: permanece sem correção.
- Quando um bloco inválido é recebido, a conexão não é fechada e o início da próxima mensagem é colocado após o primeiro
rn
após o bloco inválido.
- Caso de uso: envenenamento da fila de resposta.
- Requisitos: Um transdutor que encaminhe pedaços inválidos.
- Risco: Médio.
- Carga útil:
POST / HTTP/1.1rnHost: whateverrnTransfer-Encoding: chunkedrnrnINVALID!!!rnGET / HTTP/1.1rnHost: whateverrnrn
- Programas afetados:
- Charuto:
- 14 de fevereiro de 2024: Relatado por meio de edição do GH.
- 14 de fevereiro de 2024: permanece sem correção.
- As solicitações em pipeline no buffer de solicitação inicial são interpretadas como o corpo da mensagem da primeira solicitação no buffer, mesmo que tenha um cabeçalho
Content-Length: 0
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um transdutor que não altere os limites dos elementos do fluxo de entrada.
- Risco: Baixo. Não tenho conhecimento de nenhum transdutor desse 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 afetados:
- Puma:
- 2 de fevereiro de 2024: Relatado por e-mail.
- 2 de fevereiro de 2024: corrigido no commit.
Erros do transdutor
Esses são erros na forma como os transdutores interpretam, normalizam e encaminham solicitações.
- Valores
Content-Length
com prefixo 0x
são aceitos e encaminhados incorretamente, sem validação do corpo da mensagem.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor que interpreta
Content-Length
como seu prefixo válido mais longo ou interpreta Content-Length
com prefixo 0x
. - Risco: Médio. Veja os bugs 10, 29 e 32 dos servidores.
- Carga útil:
POST / HTTP/1.1rnHost: akamai.my-domain.coolrnContent-Length: 0x10rnrnZ
- Programas afetados:
- CDN da Akamai:
- 7 de setembro de 2023: Relatado por e-mail.
- 27 de novembro de 2023: Notificado sobre a correção por e-mail.
- Valores de tamanho de bloco inválidos são aceitos e encaminhados incorretamente.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor back-end HTTP/1.1
- Risco: Alto. Este bug pode ser explorado para contrabando de solicitações contra back-ends arbitrários.
- Carga útil:
POST / HTTP/1.1rnHost: akamai.my-domain.coolrnTransfer-Encoding: chunkedrnrnZrnZZrnZZZrnrn
- Programas afetados:
- CDN da Akamai:
- 7 de setembro de 2023: Relatado por e-mail.
- 27 de novembro de 2023: Notificado sobre a correção por e-mail.
-
r
é permitido incorretamente no espaço em branco chunk-ext antes do ;
.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor que interpreta mal
r
neste local. - Risco: Alto. Veja bug do servidor 31.
- 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 afetados:
- CDN da Akamai:
- 7 de setembro de 2023: Relatado por e-mail.
- 27 de novembro de 2023: Notificado sobre a correção por e-mail.
- Servidor de tráfego Apache:
- 20 de setembro de 2023: Relatado por meio de edição do GH.
- 13 de fevereiro de 2024: Corrigido no PR.
- Balanceador de carga de aplicativo clássico do Google Cloud:
- 13 de setembro de 2023: Relatado por meio do Google IssueTracker.
- 30 de janeiro de 2024: Fixado em ou antes desta data.
- Mensagens contendo pedaços inválidos são encaminhadas sem o corpo da mensagem.
- Caso de uso: ???
- Requisitos: N/A
- Risco: Nenhum.
- Carga útil:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn1r0n
- Programas afetados:
- Libra:
- 13 de junho de 2024: Relatado por meio de edição do GH.
- 14 de junho de 2024: corrigido no commit.
- Cabeçalhos
Content-Length
vazios são encaminhados incorretamente.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor que interpreta valores vazios
Content-Length
como algo diferente de 0 - Risco: Médio. Veja bug do servidor 38.
- Carga útil:
GET / HTTP/1.1rnhost: whateverrncontent-length: rnrn
- Programas afetados:
- Servidor de tráfego Apache:
- 2 de agosto de 2023: Relatado por meio da edição GH.
- 6 de agosto de 2023: Corrigido via PR.
- Bytes não permitidos são aceitos e encaminhados dentro de nomes de cabeçalho.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor que interpreta mal esses bytes inválidos nos nomes de cabeçalho.
- Risco: Médio. Veja bug do servidor 41.
- Carga útil:
GET / HTTP/1.1rnHost: fanoutrnHeaderx85: valuernrn
- Programas afetados:
- Servidor de tráfego Apache:
- 29 de junho de 2023: Relatado por e-mail.
- 18 de setembro de 2023: Relatado por meio de edição do GH.
- 31 de janeiro de 2024: permanece sem correção.
- Retransmissão do OpenBSD:
- 10 de novembro de 2023: Relatado por e-mail.
- 28 de novembro de 2023: corrigido no commit.
- Os tamanhos dos pedaços são interpretados como seu prefixo válido mais longo e reemitidos.
- Caso de uso: solicitação de contrabando
- Requisitos: Um servidor que interpreta prefixos
0_
ou 0x
em tamanhos de blocos. - Risco: Alto. Consulte Bugs do servidor 1 e 25 e Bug 19.
- Carga de pagamento:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn1these-bytes-never-get-validatedrnZrn0rnrn
- Programas afetados:
- Servidor de tráfego Apache:
- 10 de outubro de 2023: Relatado via GH Issue.
- 13 de fevereiro de 2024: fixado em pr.
- Espaço reservado :)
-
Transfer-Encoding: ,chunked
são encaminhados intactos e interpretados como equivalentes a chunked
.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor que ignora
Transfer-Encoding
desconhecida e as guloseimas ,chunked
como distintas de chunked
. - Risco: alto. Consulte o bug do servidor 21.
- Carga de pagamento:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: ,chunkedrnrn0rnrn
- Programas afetados:
- Azure CDN:
- 15 de outubro de 2023: relatado pelo Relatório de Vulnerabilidades do MSRC.
- 29 de novembro de 2023: fixado antes ou antes desta data.
- 12 de dezembro de 2023: "Este caso não se reúne para a manutenção do MSRC, pois o contrabando de HTTP não é considerado uma vulnerabilidade e estaremos fechando este caso".
- nghttpx:
- 14 de outubro de 2023: relatado por e -mail.
- 17 de outubro de 2023: fixado em pr.
-
r
é encaminhado incorretamente nos valores do cabeçalho.
- Caso de uso: Solicitação de contrabando
- Requisitos: um servidor que trata
r
como equivalente a rn
nos campos de cabeçalho. - Risco: Médio. Consulte o bug do servidor 13.
- Carga de pagamento:
GET / HTTP/1.1rnInvalid-Header: thisrvaluerisrinvalidrnrn
- Google Cloud Classic Application Load Balancer:
- 7 de setembro de 2023: relatado pelo Google IssueTracker.
- 30 de janeiro de 2024: fixado antes ou antes desta data.
- Os cabeçalhos vazios
Content-Length
são encaminhados incorretamente, mesmo na presença de outros cabeçalhos Content-Length
, desde que o cabeçalho vazio Content-Length
seja primeiro.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor que interpreta valores
Content-Length
vazio como 0 e aceita vários cabeçalhos Content-Length
nas solicitações recebidas, priorizando o primeiro. - Risco: Médio. Consulte o bug do servidor 42.
- Payload:
GET / HTTP/1.1rnhost: whateverrncontent-length: rncontent-length: 59rnrnPOST /evil HTTP/1.1rnhost: whateverrncontent-length: 34rnrnGET / HTTP/1.1rnhost: whateverrnrn
- Programas afetados:
- Haproxy:
- 2 de agosto de 2023: relatado via GH Eddion.
- 9 de agosto de 2023: fixado em comprometimento.
- 10 de agosto de 2023: atribuído CVE-2023-40225.
-
x00
é encaminhado nos valores do cabeçalho.
- Caso de uso: desvio da ACL
- Requisitos: um servidor que trunca os valores do cabeçalho em
x00
. - Risco: Médio. Consulte Bugs do servidor 35 e 43 e Bug do transdutor 20.
- Carga de pagamento:
GET / HTTP/1.1rnHost: google.comx00.kallus.orgrnrn
- Programas afetados:
- Haproxy:
- 19 de setembro de 2023: relatado por e -mail.
- 31 de janeiro de 2024: fixado em compromisso.
- OpenLitesPeed:
- 3 de novembro de 2023: relatado por e -mail.
- 10 de julho de 2024: fixado antes ou antes desta data.
-
n
é aceito como um terminador de linha de pedaços.
- Caso de uso: ???
- Requisitos: n/a
- Risco: Nenhum
- Payload:
GET / HTTP/1.1rnTransfer-Encoding: chunkedrnrnarn0123456789n0rnrn
- Programas afetados:
- Haproxy:
- 25 de janeiro de 2024: relatado por e -mail.
- 30 de janeiro de 2024: Corrigido nos Commmits 7B737DA e 4837E99.
- As linhas de campo com não
:
são encaminhadas como está.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor de back -end que interrompe as linhas de campo do cabeçalho com não
:
. - Risco: Médio. Veja Bugs de transdutor 28 e 37.
- Carga de pagamento:
GET / HTTP/1.1rnHost: whateverrnTenst: testrnConnection: closernrn
- Programas afetados:
- OpenLitesPeed:
- 3 de novembro de 2023: relatado por e -mail.
- 10 de julho de 2024: fixado antes ou antes desta data.
- As solicitações contendo cabeçalhos de
Content-Length
e Transfer-Encoding
são encaminhadas como o valor Transfer-Encoding
não for reconhecido.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor de back-end que trata
,chunked
como equivalente a chunked
e prioriza Transfer-Encoding
em relação ao Content-Length
. Esses comportamentos são permitidos pelos padrões. - Risco: alto. Isso permite o contrabando de solicitação para servidores compatíveis com padrões.
- Payload:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnConnection: closernrn0rnrn
- Programas afetados:
- OpenLitesPeed:
- 3 de novembro de 2023: relatado por e -mail.
- 10 de julho de 2024: fixado antes ou antes desta data.
- Libra:
- 4 de fevereiro de 2024: Relatado via GH Eddion.
- 29 de março de 2024: fixado em comprometimento.
-
n
não é normalizado para rn
em mensagens encaminhadas.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor de back -end que não interpreta
n
como uma linha que termina nas linhas de cabeçalho. O padrão permite que os servidores traduzam n
para
. - Risco: alto. Este bug é explorável contra servidores compatíveis com padrões.
- Carga de pagamento:
GET / HTTP/1.1nHost: whatevernConnection: closenn
- Programas afetados:
- OpenLitesPeed:
- 3 de novembro de 2023: relatado por e -mail.
- 31 de janeiro de 2024: permanece não fixado.
- Os corpos de mensagens em pedaços que contêm um
rn
antes do pedaço do terminador não são autorizados sem substituir o cabeçalho Transfer-Encoding
por Content-Length
.
- Caso de uso: Solicitação de contrabando
- Requisitos: Nenhum.
- Risco: alto. Este bug é explorável contra servidores de back -end arbitrários.
- Carga de pagamento:
POST / HTTP/1.1rnHost: arnTransfer-Encoding: chunkedrnrn17rn0rnrnGET / HTTP/1.1rnrnrnrn0rnrn
- Programas afetados:
- OpenLitesPeed
- 30 de novembro de 2023: relatado por e -mail.
- 10 de julho de 2024: fixado antes ou antes desta data.
-
Transfer-Encoding: ,chunked
são encaminhados intactos e não são interpretados como equivalentes a chunked
.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor que interpreta
,chunked
como equivalente a chunked
, o que o padrão diz que você pode fazer. - Risco: alto. Esta é uma solicitação de contrabando de vulnerabilidade que é utilizável contra back-ends compatíveis com padrões.
- Carga de pagamento:
GET / HTTP/1.1rnHost: whateverrnTransfer-Encoding: ,chunkedrnContent-Length: 5rnrn0rnrn
- Programas afetados:
- OpenBSD Relayd:
- 10 de novembro de 2023: relatado por e -mail.
- 28 de novembro de 2023: remendado em comprometimento.
- Os tamanhos de bloco com prefixos
+
, -
e 0x
são interpretados e encaminhados.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor que interpreta o tamanhos de parceria como seu prefixo válido mais longo.
- Risco: alto. Consulte o bug do servidor 22.
- Payload:
POST / HTTP/1.1rnTransfer-Encoding: chunkedrnrn-0x0rnrn
- Programas afetados:
- OpenBSD Relayd:
- 10 de novembro de 2023: relatado por e -mail.
- 28 de novembro de 2023: remendado em comprometimento.
- Libra:
- 10 de outubro de 2023: Relatado via GH Issue.
- 11 de outubro de 2023: corrigido via comprometimento 60A4F42 e F70DB92.
- Os cabeçalhos que contêm
x00
ou n
são concatenados no valor do cabeçalho anterior.
- Caso de uso: Solicitação de contrabando
- Requisitos: qualquer servidor de back-end compatível com padrões.
- Risco: alto. Esta é uma solicitação genérica que contrabandeava vulnerabilidade.
- Carga de pagamento:
GET / HTTP/1.1rna:brncx00rnrn
- Programas afetados:
- OpenBSD Relayd:
- 10 de novembro de 2023: relatado por e -mail.
- 29 de novembro de 2023: remendados com comprometimento.
- Os corpos de mensagens são retirados de solicitações
GET
sem remover seus cabeçalhos Content-Length
.
- Caso de uso: Solicitação de contrabando
- Requisitos: qualquer servidor de back -end que suporta pipelining.
- Risco: alto. Esta é uma solicitação genérica que contrabandeava vulnerabilidade.
- Carga de pagamento:
GET / HTTP/1.1rnContent-Length: 10rnrn1234567890
- Programas afetados:
- OpenBSD Relayd:
- 28 de novembro de 2023: relatado por e -mail.
- 1 de dezembro de 2023: remendado com comprometimento.
- Solicitações contendo vários cabeçalhos
Content-Length
são encaminhadas, priorizando o último.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor que aceita solicitações contendo vários cabeçalhos
Content-Length
, priorizando o primeiro. - Risco: alto. Consulte o bug do servidor 23.
- Carga de pagamento:
POST / HTTP/1.1rnHost: arnContent-Length: 0rnContent-Length: 31rnrnGET /evil HTTP/1.1rnHost: arnrn
- Programas afetados:
- OpenBSD Relayd:
- 30 de novembro de 2023: relatado por e -mail.
- 10 de julho de 2024: permanece não fixado.
- As solicitações contendo
Content-Length
e Transfer-Encoding
são encaminhadas.
- Caso de uso: Solicitação de contrabando
- Requisitos: Um servidor que prioriza
Content-Length
sobre Transfer-Encoding
ou não suporta Transfer-Encoding: chunked
. - Risco: alto. Este é o vetor de contrabando de solicitação clássico.
- Carga de pagamento:
POST / HTTP/1.1rnHost: arnCon