Esta publicação do blog aborda uma vulnerabilidade descoberta recentemente relacionada ao protocolo HTTP/2. Sob determinadas condições, essa vulnerabilidade pode ser explorada para executar um ataque de negação de serviço contra o NGINX Open Source, o NGINX Plus e produtos relacionados que implementam a parte do servidor da especificação HTTP/2. Para proteger seus sistemas contra esse ataque, recomendamos uma atualização imediata da configuração do NGINX.
O problema com as redefinições de fluxo do HTTP/2
Após estabelecer uma conexão com um servidor, o protocolo HTTP/2 permite que os clientes iniciem fluxos simultâneos para a troca de dados. Ao contrário das versões anteriores do protocolo, se um usuário final decidir sair da página ou interromper a troca de dados por qualquer outro motivo, o HTTP/2 oferece um método para cancelar o fluxo. Para isso, ele envia um quadro RST_STREAM ao servidor, evitando que este execute tarefas desnecessariamente.
A vulnerabilidade é explorada iniciando e cancelando rapidamente um grande número de fluxos HTTP/2 em uma conexão estabelecida, contornando assim o limite máximo de fluxos simultâneos do servidor. Isso ocorre porque os fluxos recebidos são redefinidos mais rapidamente do que os fluxos subsequentes chegam, permitindo que o cliente sobrecarregue o servidor sem nunca atingir o limite configurado.
Impacto no NGINX
Por motivos de desempenho e consumo de recursos, o NGINX limita o número de fluxos simultâneos a 128 por padrão (consulte http2_max_concurrent_streams). Além disso, para equilibrar de forma ideal o desempenho da rede e do servidor, o NGINX permite que o cliente mantenha conexões HTTP por até 1.000 solicitações por padrão usando uma conexão HTTP persistente (consulte keepalive_requests).
Ao utilizar o limite padrão de keepalive, o NGINX impede esse tipo de ataque. A criação de conexões adicionais para contornar esse limite expõe agentes mal-intencionados por meio de ferramentas padrão de monitoramento e alerta da camada 4.
No entanto, se o NGINX estiver configurado com um valor de keepalive substancialmente superior à configuração padrão e recomendada, o ataque poderá esgotar os recursos do sistema. Quando ocorre a redefinição de um fluxo, o protocolo HTTP/2 exige que nenhum dado subsequente seja retornado ao cliente nesse fluxo. Normalmente, a redefinição gera uma sobrecarga insignificante no servidor, na forma de tarefas que tratam o cancelamento de maneira adequada. No entanto, contornar o limite de fluxos do NGINX permite que um cliente explore essa sobrecarga e a amplifique iniciando rapidamente milhares de fluxos. Isso provoca um pico no uso da CPU do servidor, impedindo que clientes legítimos acessem o serviço.

Medidas para reduzir a exposição a ataques
Como um servidor e proxy completo, o NGINX oferece aos administradores ferramentas avançadas para mitigar ataques de negação de serviço. Para aproveitar esses recursos, é essencial fazer as seguintes atualizações nos arquivos de configuração do NGINX, minimizando a superfície de ataque do servidor:
- keepalive_requests deve ser mantido na configuração padrão de 1.000 solicitações.
- http2_max_concurrent_streams deve ser mantido na configuração padrão de 128 fluxos.
Também recomendamos que estas medidas de segurança sejam adotadas como uma prática recomendada:
- limit_conn impõe um limite ao número de conexões permitidas de um único cliente. Essa diretiva deve ser adicionada com uma configuração adequada que equilibre o desempenho e a segurança da aplicação.
- limit_req impõe um limite ao número de solicitações de um único cliente que serão processadas em um determinado período. Essa diretiva deve ser adicionada com uma configuração razoável que equilibre o desempenho e a segurança da aplicação.
Como estamos respondendo
Testamos várias estratégias de mitigação que nos ajudaram a entender como esse ataque poderia afetar nossa ampla gama de clientes e usuários. Embora essa pesquisa tenha confirmado que o NGINX já conta com todas as ferramentas necessárias para evitar o ataque, quisemos tomar medidas adicionais para garantir que os usuários que realmente precisam configurar o NGINX além das especificações recomendadas possam fazê-lo.
Nossa investigação resultou em um método para aumentar a resiliência dos servidores diante de diversas formas de ataques de inundação teoricamente possíveis por meio do protocolo HTTP/2. Como resultado, lançamos um patch que aumenta a estabilidade do sistema nessas condições. Para se proteger contra essas ameaças, recomendamos que os usuários do NGINX Open Source recompilarem os binários usando a base de código mais recente e que os clientes do NGINX Plus atualizem imediatamente para os pacotes mais recentes (R29p1 ou R30p1).
Como o patch funciona
Para garantir a detecção precoce de ataques de inundação no NGINX, o patch impõe um limite ao número de novos fluxos que podem ser introduzidos em um único ciclo de eventos. Esse limite é definido como o dobro do valor configurado por meio da diretiva http2_max_concurrent_streams. O limite é aplicado mesmo que o valor máximo nunca seja atingido, como quando os fluxos são redefinidos logo após o envio da solicitação (como ocorre neste ataque).
Produtos afetados
Esta vulnerabilidade afeta o módulo HTTP/2 do NGINX (ngx_http_v2_module). Para obter informações sobre o seu produto específico da NGINX ou F5 que possa ser afetado, acesse: https://my.f5.com/manage/s/article/K000137106
Para obter mais informações sobre a CVE-2023-44487 — ataque de redefinição rápida do HTTP/2, consulte: https://www.cve.org/CVERecord?id=CVE-2023-44487
Agradecimentos
Gostaríamos de agradecer à Cloudflare, à Amazon e ao Google por sua contribuição na descoberta, identificação e mitigação colaborativa dessa vulnerabilidade.
Esta publicação do blog foi atualizada após a data de publicação original para incluir mais detalhes sobre a correção e tornar o conteúdo mais claro.
Sobre o autor
Publicações relacionadas no blog

Entrega e proteção de agentes de IA em fábricas de IA: F5 para a arquitetura de referência NVIDIA OpenShell para agentes de IA seguros
As soluções da F5 ampliam a Arquitetura de Referência NVIDIA OpenShell para agentes de IA seguros.
Como medir – e minimizar – o custo total de propriedade do seu Kubernetes
O Kubernetes pode ser baixado e executado gratuitamente, mas sua manutenção está longe de não ter custos. Assim como outras grandes plataformas de código aberto que são “gratuitas” apenas em um sentido simplista, o Kubernetes quase certamente exigirá investimentos para ser implantado e operado.
As-Code: a pilha de TI contínua
Infraestrutura, configuração, pipeline, operações. De repente, tudo é “como código”. Lori MacVittie busca esclarecer a terminologia e identificar os diferentes componentes de uma stack contínua de TI.
O estado da entrega de aplicações em 2017: automação, APIs e DevOps
Explore o relatório State of Application Delivery de 2017. Leia o blog retrospectivo da F5 sobre o início da ascensão das redes declarativas e dos pipelines de DevOps.
DevOps Summit: onde a rede foi convidada para a festa
No DevOps Summit NY, falou-se muito não apenas sobre DevOps, mas também sobre contêineres, IoT e microsserviços. As sessões se concentraram não só na mudança cultural necessária para crescer em escala com uma abordagem DevOps, mas também fizeram questão de incluir...
F5 e Nutanix convergem em infraestrutura no .NEXT
Aplicações empresariais como Microsoft SharePoint e Exchange, juntamente com a VDI, continuam sendo a espinha dorsal da sua empresa. A produtividade, embora não seja tão atraente quanto o lucro, é um fator essencial para o sucesso das operações empresariais atuais. Deixar de...