
Regras do Semgrep que sinalizam padrões de bypass de autenticação por confiança no cabeçalho (classe CVE-2025-29927). Complemento para bk-security.github.io.
Um pequeno pacote de regras Semgrep que sinaliza código que toma decisões de autenticação, autorização ou confiança com base em cabeçalhos de requisição HTTP que um atacante controla.
O exemplo canônico desta classe de vulnerabilidade é o
CVE-2025-29927: Next.js
confiava no cabeçalho x-middleware-subrequest para decidir se o middleware era executado,
e qualquer requisição de entrada que fornecesse um valor manipulado poderia pular o middleware
por completo. O mesmo padrão se repete em frameworks e ecossistemas.
Este pacote contém regras para duas famílias de linguagens e três subclasses do bug. Ele é destinado como um auxílio de revisão de código, não como um portão de CI totalmente ajustado. As regras priorizam a revocação sobre a precisão e são melhor executadas interativamente, com um humano tomando a decisão sobre cada descoberta.
Para um artigo mais longo sobre a classe de vulnerabilidade e as escolhas de design por trás deste pacote, veja bk-security.github.io.
| Regra | Linguagem | Severidade | Captura |
|---|---|---|---|
nodejs-header-flag-auth-bypass | JS / TS | Warning | Leituras de cabeçalhos cujo nome sugere uso de protocolo interno ou bypass de autenticação (x-internal, x-bypass-auth, x-middleware-subrequest, x-admin-override, x-impersonate, etc.) |
nodejs-header-as-identity | JS / TS | Warning | Leituras de cabeçalhos convencionalmente usados para carregar identidade de usuário (x-forwarded-user, x-authenticated-user, x-remote-user, etc.) |
nodejs-forwarded-for-trust | JS / TS | Info | Leituras de x-forwarded-for, x-real-ip, e cabeçalhos similares de IP de origem que são comumente confiados para decisões de segurança |
python-header-flag-auth-bypass | Python | Warning | Mesmo que a variante Node.js, incluindo acesso request.META["HTTP_X_*"] no estilo Django |
python-header-as-identity | Python | Warning | Mesmo que a variante Node.js, com sabor Python |
python-forwarded-for-trust | Python | Info | Mesmo que a variante Node.js, com sabor Python |
Instale o Semgrep:
pip install semgrep
Execute o pacote contra um alvo:
semgrep --config /caminho/para/auth-header-trust-rules/rules /caminho/para/alvo
Ou execute uma única regra:
semgrep --config /caminho/para/auth-header-trust-rules/rules/nodejs/header-flag-auth-bypass.yaml /caminho/para/alvo
Valide as regras contra os fixtures incluídos:
semgrep --test --config rules/ tests/
Saída esperada:
6/6: ✓ Todos os testes passaram
As regras correspondem a uma lista curada de nomes de cabeçalhos conhecidos por serem perigosos quando confiados. Elas vão capturar os casos comuns. Elas não vão capturar:
getInternalFlag(req) que lê x-some-novel-name passará pelas regras.x-internal-*, x-trust-*, e x-bypass-*, mas nomes novos
passarão despercebidos.Ao estender o pacote para uma base de código específica, as adições de maior valor
são geralmente padrões de funções auxiliares específicas do framework. Se uma base de código tem um
auxiliar isInternalRequest(req), a regra que o captura é uma linha de YAML.
rules/<lang>/<name>.yaml.tests/<lang>/<name>.<ext> com exemplos
positivos anotados # ruleid: <rule-id> e exemplos negativos anotados
# ok: <rule-id>.semgrep --test --config rules/ tests/. A nova regra e fixture serão
detectados automaticamente; os testes devem passar antes de enviar uma alteração.MIT.
Bruce Kang. O código-fonte do blog post complementar está em bk-security.github.io.