
Spring Framework CVE-2022-22965 本地影响条件验证、版本升级修复与复测项目
Este projeto é utilizado para aprender e verificar o CVE-2022-22965 do Spring Framework, também conhecido como vulnerabilidade Spring4Shell, incluindo as condições de impacto, manifestação de risco, métodos de correção e o processo de re-teste pós-correção.
O projeto foi concluído em um ambiente de laboratório local autorizado e configurado individualmente. O foco do projeto não é atacar alvos reais, mas sim construir ambientes de teste Spring MVC antes e depois da correção, confirmar item por item as condições de impacto relacionadas à vulnerabilidade e usar um método somente leitura seguro e controlado para observar as diferenças nos caminhos de propriedade interna da vinculação de dados do Spring antes e depois da atualização de versão.
Este projeto concluiu os seguintes processos:
Este projeto é utilizado exclusivamente em ambientes locais auto-construídos ou em ambientes de teste de segurança explicitamente autorizados.
O projeto não realiza varredura, detecção ou exploração de vulnerabilidades em sites públicos, servidores ou sistemas de terceiros, e não contém dados reais de usuários ou dados reais de negócios.
Durante o teste, as seguintes operações NÃO foram executadas:
É proibido usar os métodos de teste deste projeto em qualquer alvo não autorizado.
O CVE-2022-22965, geralmente chamado de Spring4Shell, é uma vulnerabilidade de execução remota de código no Spring Framework relacionada ao mecanismo de vinculação de dados de parâmetros de requisição.
O Spring MVC suporta a vinculação automática de parâmetros de requisição HTTP a propriedades de objetos Java. Por exemplo, este projeto recebe parâmetros de nome e e-mail da seguinte forma:
@ModelAttribute("profile") UserProfile profile
Normalmente, os parâmetros de requisição name e email são vinculados ao objeto UserProfile de acordo com o nome da propriedade.
Nas versões afetadas, as restrições de acesso a alguns caminhos de propriedade interna não são suficientemente rigorosas. Ao usar JDK 9 ou superior, e atender a condições específicas do contêiner Servlet, modo de implantação e vinculação de dados, os parâmetros de requisição externos podem percorrer além dos objetos de negócio comuns para acessar objetos internos relacionados a Class do Java, módulos, carregadores de classe ou contêiner.
Em ambientes específicos exploráveis, um atacante pode modificar ainda mais a configuração do servidor ou escrever arquivos no servidor, formando assim um risco de execução remota de código.
Este projeto não executa a exploração completa de execução remota, mas sim usa o seguinte caminho de propriedade para diagnóstico diferencial seguro e somente leitura:
class.module.name
Este projeto foi concluído em um ambiente de laboratório isolado VMware local.
127.0.0.1Dados de teste de funcionalidade normal:
Alice[email protected]Caminho de propriedade para diagnóstico de segurança:
class.module.name
spring4shell-local-verification-lab/
README.md: Introdução do projeto, abordagem de teste, resultados de verificação e instruções de correçãodocs/: Relatório de verificação das condições de impacto local, correção e re-teste do Spring4Shellimages/: Capturas de tela do ambiente do projeto, processo de teste e re-testevulnerable-demo/: Projeto pré-correção usando Spring Framework 5.3.17fixed-demo/: Projeto pós-correção usando Spring Framework 5.3.18notes/: Anotações de estudo e registro do processoEstrutura principal do código-fonte:
config/: Classes de configuração Spring MVC e classes de inicialização da aplicaçãocontroller/: Controlador de processamento de formulários e diagnóstico de caminhos de propriedademodel/: Classe UserProfile para receber parâmetros de nome e e-mailWEB-INF/views/: Páginas JSP de página inicial, resultado de envio e resultado de diagnósticoEste projeto estabeleceu duas aplicações Spring MVC, uma antes e outra após a correção.
Diretório do projeto:
vulnerable-demo
Versão utilizada:
Spring Framework 5.3.17
Arquivo WAR gerado:
spring4shell-vulnerable-demo.war
Endereço de acesso:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
Página de diagnóstico:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
Diretório do projeto:
fixed-demo
Versão utilizada:
Spring Framework 5.3.18
Arquivo WAR gerado:
spring4shell-fixed-demo.war
Endereço de acesso:
http://127.0.0.1:8080/spring4shell-fixed-demo/
Página de diagnóstico:
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
O projeto de teste fornece um formulário simples de perfil de usuário, contendo:
O controlador recebe os parâmetros de requisição da seguinte forma:
@ModelAttribute("profile") UserProfile profile
Quando o usuário envia nome e e-mail, o Spring MVC vincula automaticamente os parâmetros name e email ao objeto UserProfile.
A página de resultado lê o objeto vinculado e exibe o nome e e-mail enviados pelo usuário.
Esta funcionalidade é usada para confirmar que o projeto pode ser executado normalmente e, ao mesmo tempo, prova que existe uma entrada efetiva de vinculação de dados de parâmetros de requisição Spring MVC na aplicação.
Este projeto segue a abordagem de "primeiro confirmar a funcionalidade normal, depois confirmar as condições de impacto, em seguida realizar o diagnóstico de risco somente leitura, e finalmente corrigir e re-testar".
@ModelAttribute para vincular os parâmetros de requisição ao objeto UserProfile.BeanWrapper do Spring para realizar diagnóstico somente leitura de class.module.name.Este projeto confirmou item por item as seguintes condições de impacto:
spring-webmvc@ModelAttributeAs dependências Spring reais implantadas no projeto pré-correção incluem:
spring-beans-5.3.17.jarspring-core-5.3.17.jarspring-web-5.3.17.jarspring-webmvc-5.3.17.jarEste projeto não julga diretamente se a vulnerabilidade é válida apenas com base na versão do Spring Framework, mas sim realiza uma análise abrangente combinando JDK, Spring MVC, Tomcat, implantação WAR e entrada de vinculação de dados.
Para evitar a execução de exploração de vulnerabilidade destrutiva, este projeto usa o BeanWrapper fornecido pelo Spring Framework para realizar uma verificação somente leitura do seguinte caminho de propriedade:
class.module.name
Este caminho significa:
class: acessa o objeto Class Java correspondente ao objeto de negócio atualmodule: acessa o módulo Java ao qual a classe pertencename: lê o nome do móduloO processo de diagnóstico chama apenas métodos de verificação de legibilidade de propriedade e leitura de valor de propriedade:
Portanto, este diagnóstico só pode ser usado para observar as diferenças de acesso aos caminhos de propriedade interna antes e depois da correção, e não pode provar sozinho que a execução remota de código foi alcançada.
O ambiente pré-correção usa:
Spring Framework 5.3.17
Verificação do caminho de propriedade:
class.module.name
Resultado do diagnóstico:
truenulltrue significa que o ambiente atual pode continuar a resolver module.name ao longo da propriedade class do objeto de negócio comum.
O resultado da leitura é null porque a aplicação WAR atual está sendo executada em um módulo Java não nomeado, onde o nome do módulo está vazio, o que não significa que a leitura do caminho de propriedade falhou.
O ambiente pós-correção usa:
Spring Framework 5.3.18
Re-diagnóstico usando o mesmo caminho de propriedade:
class.module.name
Resultado do diagnóstico:
falseNot readableOs resultados antes e depois da correção formam um contraste claro:
Este resultado indica que, após a atualização da versão, o acesso ao caminho de propriedade de diagnóstico original foi restringido, e a manifestação de risco observada antes da correção não aparece mais.
Este projeto adota a abordagem de atualizar a versão do Spring Framework para correção.
Configuração pré-correção:
<spring.version>5.3.17</spring.version>
Configuração pós-correção:
<spring.version>5.3.18</spring.version>
Durante o processo de correção, as seguintes operações foram concluídas:
fixed-demo.As dependências Spring reais implantadas no projeto pós-correção incluem:
spring-beans-5.3.18.jarspring-core-5.3.18.jarspring-web-5.3.18.jarspring-webmvc-5.3.18.jarEste resultado prova que a versão corrigida foi reconstruída e implantada de fato, não apenas o número da versão no pom.xml foi alterado.
Após a atualização para Spring Framework 5.3.18, acesse novamente a página inicial do projeto corrigido e envie os seguintes dados de teste:
Alice[email protected]Após o envio, a página ainda exibe normalmente:
Alice[email protected]Este resultado indica que a atualização da versão não afetou a funcionalidade original de vinculação de parâmetros de requisição e exibição de página do projeto.
O mecanismo de vinculação automática de dados do Spring MVC pode acessar propriedades de objetos Java com base nos nomes dos parâmetros de requisição HTTP.
Os parâmetros normais de negócios name e email precisam apenas acessar as propriedades comuns correspondentes em UserProfile.
No entanto, o mecanismo de acesso a propriedades do Spring também suporta caminhos de propriedade aninhados com pontos. Nas versões afetadas, as restrições a alguns caminhos de propriedade interna não são suficientemente rigorosas, permitindo que, em ambientes específicos, os parâmetros externos possam continuar a partir do objeto de negócio comum para objetos relacionados a Class do Java, módulos, carregadores de classe ou contêiner Servlet.
Quando existem propriedades graváveis em objetos internos que podem afetar a configuração do servidor ou o sistema de arquivos, e a aplicação atende simultaneamente às condições de JDK, Tomcat, implantação WAR e vinculação de dados, pode-se formar um risco de execução remota de código.
Esta vulnerabilidade não se deve ao fato de que as propriedades name ou email em si tenham problemas, nem todos os projetos que usam Spring MVC podem ser explorados. A validade da vulnerabilidade geralmente requer a coexistência de múltiplas condições.
Em sistemas de negócios reais, recomenda-se tomar as seguintes medidas:













Este projeto concluiu a confirmação das condições de impacto, diagnóstico de manifestação de risco, correção por atualização de versão e re-teste pós-correção do CVE-2022-22965 do Spring Framework em um ambiente local isolado.
O projeto pré-correção usou Spring Framework 5.3.17. No ambiente com JDK 11, Spring MVC, Apache Tomcat 9.0.60 e implantação WAR tradicional, o caminho de propriedade class.module.name foi considerado legível.
O projeto pós-correção atualizou o Spring Framework para 5.3.18. O mesmo caminho de propriedade tornou-se ilegível, enquanto a funcionalidade normal de vinculação de dados para nome e e-mail continuou utilizável.
Este projeto não executou a exploração completa de execução remota de código, mas sim completou a verificação diferencial antes e depois da correção através de um método seguro e controlado de somente leitura.
O projeto enfatiza as seguintes habilidades: