Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
rewrite-cve-2026-22732 — Receita OpenRewrite que detecta e corrige a supressão de cabeçalhos do Spring Security (CVE-2026-22732), identificando o uso indevido do cabeçalho Content-Length e gerando configuração de escrita antecipada de cabeçalhos. | Kitploit
Ferramentas/GitHubGitHub/moderneinc/rewrite-cve-2026-22732
Análise EstáticaAnálise de VulnerabilidadesAnálise de CódigoSegurança WebDevSecOps
GitHubmoderneinc/rewrite-cve-2026-22732

rewrite-cve-2026-22732

Receita OpenRewrite que detecta e corrige a supressão de cabeçalhos do Spring Security (CVE-2026-22732), identificando o uso indevido do cabeçalho Content-Length e gerando configuração de escrita antecipada de cabeçalhos.

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Ver Repositório
há 9h 19mAinda não revisado
Compartilhar

rewrite-cve-2026-22732

Receita OpenRewrite que detecta código suscetível ao CVE-2026-22732, uma falha do Spring Security em que definir Content-Length por meio de um dos três métodos de resposta ignora o OnCommittedResponseWrapper do Spring Security. Como o wrapper nunca vê o cabeçalho, onResponseCommitted() nunca é acionado, e os cabeçalhos de segurança adicionados de forma preguiçosa (X-Frame-Options, X-Content-Type-Options, Cache-Control, etc.) são silenciosamente descartados.

O que ela encontra

Os gatilhos reais, confirmados contra o Spring Security 6.4.12 vulnerável com Spring Boot 3.4.3 / Tomcat embarcado:

  1. Content-Length do Servlet por meio das sobrecargas que ignoram o wrapper

root@kitploit:~
response.setHeader("Content-Length", "42");
response.setIntHeader("Content-Length", 42);
response.addIntHeader("Content-Length", 42);

Essas três sobrecargas não são sobrescritas em OnCommittedResponseWrapper. Gravações subsequentes no corpo completam o comprimento declarado e o contêiner faz o commit sem acionar o gravador de cabeçalhos preguiçoso.

  • Content-Length do WebFlux por meio de HttpHeaders

    root@kitploit:~
    serverHttpResponse.getHeaders().set("Content-Length", "42");
    serverHttpResponse.getHeaders().add("Content-Length", "42");
    serverHttpResponse.getHeaders().setContentLength(42L);
    
  • Commits de resposta incondicionais do WebFlux

    root@kitploit:~
    serverHttpResponse.writeWith(Mono.just(dataBuffer));
    serverHttpResponse.writeAndFlushWith(publisher);
    serverHttpResponse.setComplete();
    
  • A receita é condicionada à presença do Spring Security — ela não emite nada em arquivos que não referenciam nenhum tipo org.springframework.security.* — e às faixas de versão afetadas do Spring Security. De acordo com o aviso do Spring publicado em 2026-03-19, as faixas afetadas e as versões corrigidas são:

    SérieAfetadaCorrigida
    5.7.x5.7.0 – 5.7.215.7.22 (Enterprise)
    5.8.x5.8.0 – 5.8.235.8.24 (Enterprise)
    6.3.x6.3.0 – 6.3.146.3.15 (Enterprise)
    6.4.x6.4.0 – 6.4.146.4.15 (Enterprise)
    6.5.x6.5.0 – 6.5.86.5.9 (OSS)
    7.0.x7.0.0 – 7.0.37.0.4 (OSS)

    Projetos que resolvem uma versão do Spring Security igual ou superior à correção em sua série (ou em qualquer série futura além de 7.0 / 6.5) são tratados como não afetados e não recebem marcadores por sink ou por arquivo. Projetos em que a versão não pode ser resolvida recorrem à detecção padrão baseada em padrões, de modo que um scanner tende a relatar uma descoberta que não pode refutar. A tabela de dados SpringSecurityVersionByProject ainda registra a versão resolvida e sinaliza cada projeto como afetado ou não, para que você possa auditar o que foi filtrado.

    O que intencionalmente NÃO é sinalizado

    Estes parecem perigosos, mas são rastreados pelo wrapper, portanto os cabeçalhos de segurança são gravados antes do commit da resposta:

    CódigoPor que é seguro
    response.setContentLength(int) / setContentLengthLong(long)Sobrescritos — o wrapper registra o comprimento declarado e aciona onResponseCommitted() quando o corpo é concluído.
    response.flushBuffer()Sobrescrito — chama doOnResponseCommitted() antes de super.flushBuffer().
    response.getOutputStream().write(..) / flush() / close()Retorna SaveContextServletOutputStream; cada write/flush/close aciona doOnResponseCommitted() antes de delegar.
    response.getWriter().write(..) / print(..) / println(..) / flush() / close()Retorna SaveContextPrintWriter; mesmo padrão.
    response.addHeader("Content-Length", v)Tratado de forma especial no wrapper — roteado por meio de setContentLength(long).

    O endpoint /vuln/flush da demonstração do Semgrep afirma que flushBuffer() é o gatilho, mas em um Spring Security 6.4.12 vulnerável a resposta na verdade retorna todos os seis cabeçalhos de segurança. Os gatilhos reais na demonstração são as chamadas setIntHeader("Content-Length", ...) em /vuln/stream e /vuln/content-length.

    Detecção

    Execute esta:

    ReceitaFinalidade
    io.moderne.recipe.cve202622732.FindSpringSecurityHeaderSuppressionExecuta todas as detecções e emite a tabela de relatório de versão

    Blocos de construção (avançado)

    O agregador acima é composto por duas receitas menores. Você pode invocá-las individualmente se quiser apenas uma detecção.

    ReceitaFinalidade
    io.moderne.recipe.cve202622732.FindHttpResponseContentLengthHeaderFluxo de taint para o literal "Content-Length" alcançando setHeader / setIntHeader / addIntHeader (servlet) ou HttpHeaders.set / add (WebFlux)
    io.moderne.recipe.cve202622732.FindHttpResponseContentLengthOrFlushBufferCommits incondicionais do WebFlux: writeWith, writeAndFlushWith, setComplete, HttpHeaders.setContentLength

    Correção

    Execute esta:

    ReceitaFinalidade
    io.moderne.recipe.cve202622732.FixSpringSecurityHeaderSuppressionEscolhe a remediação mais barata que cada projeto pode realmente adotar

    Ela executa duas etapas em ordem.

    1. Atualizar para a correção na própria série do projeto. O Spring Security publicou a correção como 6.5.9 e 7.0.4 no Maven Central. Cada atualização é condicionada a uma pré-condição FindAffectedSpringSecuritySeries, porque UpgradeDependencyVersion apenas verifica se o destino é mais novo — instruído a ir para 7.0.4, ele arrastaria alegremente um projeto 5.8 por duas versões principais.

    2. Adicionar uma configuração de gravação antecipada de cabeçalhos para o que a etapa 1 não pôde corrigir. Isso gera uma classe @Configuration por projeto:

    root@kitploit:~
    @Bean
    public static BeanPostProcessor eagerHeaderWriterFilterBeanPostProcessor() {
        return new BeanPostProcessor() {
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof HeaderWriterFilter) {
                    ((HeaderWriterFilter) bean).setShouldWriteHeadersEagerly(true);
                }
                return bean;
            }
        };
    }
    

    Gravar os cabeçalhos antecipadamente torna irrelevante se o wrapper observa o commit, portanto isso fecha todos os sinks do projeto de uma só vez — incluindo aqueles que a análise de taint não consegue alcançar, como o fluxo Map em "Limitações conhecidas". O BeanPostProcessor vê os filtros construídos pelo DSL HttpSecurity porque AutowireBeanFactoryObjectPostProcessor os inicializa por meio da fábrica de beans. Duas correções publicadas independentemente para este CVE usam exatamente essa forma (hmcts/idam-web-public, e os forks do Spinnaker da armory-io por meio do ObjectPostProcessor equivalente).

    A etapa 2 é o que cobre os projetos que a etapa 1 não pode ajudar:

    SituaçãoPor que a atualização não funciona
    5.7, 5.8, 6.3, 6.4A correção é enviada apenas aos assinantes do Spring Enterprise — não está no Maven Central
    6.0 - 6.2Nenhuma correção foi lançada nessas séries
    Versão gerenciada por um BOM importadoNada é declarado localmente para a atualização editar

    Essa última linha não é um caso isolado. nla/bamboo resolve 7.0.3 — uma série com correção de código aberto — inteiramente do BOM do Spring Boot, portanto uma verificação de versão sozinha o ignoraria em ambas as etapas e o deixaria vulnerável. AddEagerHeaderWriterConfiguration portanto só adia para a atualização quando o projeto tem uma correção de código aberto disponível e declara uma versão própria.

    A classe gerada é colocada ao lado de uma classe @EnableWebSecurity quando existe, recorrendo a @SpringBootApplication e depois a qualquer @Configuration, de modo que sempre cai em algum lugar que a varredura de componentes alcança. Projetos que já gravam cabeçalhos antecipadamente, ou que fornecem um OnCommittedResponseWrapper corrigido (como jogetworkflow/jw-community faz), são deixados em paz.

    Blocos de construção (avançado)

    ReceitaFinalidade
    io.moderne.recipe.cve202622732.UpgradeSpringSecurityToPatchedVersionAtualização condicionada por série para 6.5.9 / 7.0.4
    io.moderne.recipe.cve202622732.AddEagerHeaderWriterConfigurationA configuração gerada, por conta própria
    io.moderne.recipe.cve202622732.FindAffectedSpringSecuritySeriesMarca projetos em uma série afetada; a pré-condição da atualização

    Verificada contra um servidor em execução

    Aplicada a semgrep/cve-2026-22732-demo no Spring Security 6.4.12 vulnerável, contra Tomcat embarcado. Seu HeaderVerificationTest afirma que os cabeçalhos de segurança estão ausentes, portanto uma correção funcional o faz falhar:

    EndpointAntesDepois
    /vuln/streamX-Content-Type-Options: nullnosniff
    /vuln/content-lengthX-Content-Type-Options: nullnosniff
    /safenosniffnosniff

    X-Frame-Options e Cache-Control seguem o mesmo padrão.

    Nos 16 repositórios do corpus que compilam (de 29 identificados), a correção gerou uma configuração para três e corretamente deixou o restante em paz:

    RepositórioResultado
    semgrep/cve-2026-22732-demoGerada em com/example/vuln, ao lado de @EnableWebSecurity; compila, cabeçalhos restaurados
    nla/bambooGerada em ui/src/bamboo, ao lado de @SpringBootApplication; compila. O caso 7.0.3 gerenciado por BOM que a atualização não consegue alcançar
    star-whale/starwhaleGerada em ai/starwhale/mlops/configuration/security, ao lado de @EnableWebSecurity; compila (JDK 11, seu alvo declarado)
    hmcts/idam-web-publicDeixado em paz — já chama setShouldWriteHeadersEagerly
    okta/okta-idx-java (6.5.9), psi-probe (6.5.11), Ant-Media-Server (6.5.11)Deixados em paz — além da correção em suas séries
    apache/shenyu (6.3.1)Deixado em paz — apenas reativo; HeaderWriterFilter não tem API de servlet por trás, e o CVE é apenas de servlet
    brutusin/Brutusin-RPC (4.0.4)Deixado em paz — anterior a setShouldWriteHeadersEagerly (5.2)
    bootplus, template-app, front50, igor, rosco, spring-security, reportserverDeixados em paz — nenhuma versão afetada do Spring Security resolvida

    Reexecutar a correção sobre os três repositórios corrigidos não gera nada adicional, portanto a remediação é idempotente em relação à própria saída em projetos reais.

    Um segundo corpus mais amplo tem como alvo a população que a correção realmente aborda — qualquer aplicação servlet do Spring Security afetada, já que nenhum sink é necessário. Dos 64 projetos encontrados por busca de código, 52 compilaram, 48 resolveram uma versão afetada, e 38 foram corrigidos; 35 desses compilam (os outros três falham de forma idêntica sem o arquivo gerado). Todos os 8 projetos em Spring Security abaixo de 5.2 foram corretamente ignorados. Consulte a seção 8 de SUSCEPTIBLE-REPOSITORIES.md.

    Limitações

    • As detecções do WebFlux são um risco diferente, não este CVE. OnCommittedResponseWrapper extends jakarta.servlet.http.HttpServletResponseWrapper, portanto o CVE-2026-22732 é apenas de servlet e uma aplicação reativa não está exposta a ele. Descobertas de FindHttpResponseContentLengthOrFlushBuffer sinalizam o padrão reativo análogo e ainda precisam de revisão manual, mas a correção deliberadamente não age sobre elas. AddEagerHeaderWriterConfiguration ignora qualquer módulo que possa ver HeaderWriterFilter sem a API de servlet por trás — o filtro estende OncePerRequestFilter, e spring-security-web carrega a API de servlet como uma dependência provided não transitiva, portanto gerar ali falha com cannot access jakarta.servlet.Filter (observado em apache/shenyu).
    • Versões abaixo do Spring Security 5.2 são detectadas, mas não corrigidas. HeaderWriterFilter.setShouldWriteHeadersEagerly chega na 5.2; na 4.0.4 o filtro tem apenas um construtor e doFilterInternal. A detecção ainda relata versões EOL, mas a remediação é retida em vez de emitir uma chamada que não pode compilar.
    • Cabeçalhos antecipados são gravados para cada requisição, incluindo aquelas posteriormente substituídas por um dispatch de erro. Esse é o trade-off que o padrão preguiçoso do Spring Security evita, e é por isso que a atualização é executada primeiro.

    Tabelas de dados

    TabelaLinhas
    TaintFlowTable (de rewrite-program-analysis)Uma linha por ocorrência de taint de cabeçalho Content-Length
    HttpResponseDirectCommitTableUma linha por ocorrência estrutural do WebFlux
    SpringSecurityVersionByProjectUma linha por projeto com versão detectada do Spring Security

    Execução

    Via CLI do Moderne:

    root@kitploit:~
    mod run . --recipe io.moderne.recipe.cve202622732.FindSpringSecurityHeaderSuppression
    

    Via rewrite.yml:

    root@kitploit:~
    ---
    type: specs.openrewrite.org/v1beta/recipe
    name: com.example.DetectSpringSecurityHeaderSuppression
    displayName: Detect CVE-2026-22732
    recipeList:
      - io.moderne.recipe.cve202622732.FindSpringSecurityHeaderSuppression
    

    Reproduzindo o corpus de avaliação

    repos.csv lista os 75 repositórios públicos contra os quais estas receitas foram desenvolvidas e medidas, fixados no commit exato em que cada um foi avaliado. Vários são mantidos ativamente e serão corrigidos upstream, portanto a coluna changeset é o que torna os números abaixo reproduzíveis em vez de meramente plausíveis.

    root@kitploit:~
    mod git sync csv ./corpus repos.csv --with-sources
    mod build ./corpus
    mod run ./corpus --recipe=io.moderne.recipe.cve202622732.CveDevCenter
    mod devcenter ./corpus --last-recipe-run
    

    A sincronização leva cerca de 20 segundos e 1,4 GB; a compilação leva aproximadamente 15 minutos e é a única etapa lenta. mod devcenter grava devcenter.html em corpus/.moderne/run/<runId>/, além de um por subdiretório de organização.

    A coluna org1 divide o corpus em grupos que refletem por que cada repositório está presente — Servlet Sinks e WebFlux Sinks para as duas formas de chamada vulneráveis, Patched para repositórios já remediados upstream, Reference para o próprio Spring Security e outros não consumidores, Verified para o caso verificado contra um servidor em execução, Gradle para cobertura de ferramentas de build, e Wide para a amostra em massa.

    Espere, nos commits fixados:

    Resultado
    Cartão de atualização39 Major, 21 Minor, 6 Patch, 4 Concluídos (70 repositórios)
    Cartão de segurança65 repositórios expostos
    Não aplicável5 repositórios não resolvem nenhuma dependência do Spring Security

    Quatro desses cinco genuinamente não usam Spring Security — spring-projects/spring-security é a própria biblioteca, JoeyBling/bootplus usa Apache Shiro, jenkinsci/stapler tem como alvo a API de servlet diretamente, e infofabrik/reportserver não tem build Maven ou Gradle para resolver. O quinto, xtuer/template-app, declara spring-security-web:5.0.0.RELEASE mas seu build Gradle não resolve nenhuma dependência durante mod build, portanto nenhuma receita pode ver a versão. Trate-o como não medido em vez de não afetado.

    Para aplicar a correção e verificar o resultado:

    root@kitploit:~
    mod run ./corpus --recipe=io.moderne.recipe.cve202622732.FixSpringSecurityHeaderSuppression
    mod git apply ./corpus --last-recipe-run
    mod exec ./corpus --last-recipe-run MODERNE_BUILD_TOOL_CHECK
    

    mod git apply grava nos checkouts no local. Um check completo no corpus é lento e revelará falhas não relacionadas a esta alteração — toolchains JDK ausentes, repositórios de dependências inacessíveis, testes que já estavam vermelhos — portanto o sinal significativo é o delta em relação ao mesmo comando executado antes da aplicação.

    O que é coberto além da demonstração literal

    A análise de taint de rewrite-program-analysis lida com fluxo de dados local e resumos por método, portanto estes padrões são detectados automaticamente:

    • Nome de cabeçalho Content-Length propagado por constante. String h = "Content-Length"; response.setIntHeader(h, 42); é sinalizado — o framework rastreia o taint do literal por meio da atribuição local.
    • Helper que envolve a chamada — o taint flui por meio de valores de retorno via resumos de método.

    Limitações conhecidas

    • Fluxo por meio de tipos de contêiner genéricos (Map, List, coleções personalizadas). stash.put("k", "Content-Length") seguido de response.setIntHeader(stash.get("k"), 42) não é detectado — a identidade put/get é opaca para a análise.

    Licença

    Moderne Proprietária. Apenas para uso por clientes da Moderne sob os termos de um contrato comercial.

    Baixar ferramenta