
Análise técnica e prova de conceito para a manipulação do parâmetro de classe do Apache Struts 1 (CVE-2014-0114), demonstrando execução remota de código no Tomcat e negação de serviço no JBoss/Wildfly.
Parâmetros em uma requisição POST ou GET são tratados como propriedades (properties) que devem ser definidas a partir do formulário. Os parâmetros podem ser um caminho para um objeto aninhado.
O Apache Struts 1.x pode ser manipulado para chamar getClass() em Form Beans. Por exemplo, é possível manipular diretamente atributos do classloader do formulário: https://example.com/?class.classLoader.defaultAssertionStatus=true.
Internamente, o Apache Struts 1.x usa commons-beanutils que, na versão 1.8 (e anteriores), não exclui o atributo class.
O Struts 2 teve falhas semelhantes, mas aqui focamos no Struts 1.x, para o qual não existem patches do framework cuja última versão foi lançada em 2008 (EOL desde 2013).
Se a aplicação estiver rodando no Tomcat (Catalina), é possível manipular o log para que o atacante crie um arquivo JSP que será executado quando for solicitado ao servidor. O arquivo JSP pode executar código Java arbitrário como o usuário que executa o processo Java.
Veja a demonstração de Julián Vilas para detalhes.
(Testado com JBoss EAP 7.1)
Existe um método simples para executar um ataque de DOS que, no pior caso, torna o JBoss completamente inacessível e exige reinicialização. No melhor caso, o JBoss responde lentamente.
Através do atributo class, é possível acessar Class#protectionDomain.codeSource.location. No JBoss, trata-se de um objeto URL com o protocolo vfs.
Para uma URL do tipo vfs://, o JBoss registrou um URLStreamHandler que retorna um objeto do tipo org.jboss.vfs.VirtualFile quando URL#getContent é chamado.
class.protectionDomain.codeSource.location.content.pathName aponta para o diretório <SÖKGVÄG>/<applikation>/WEB-INF/classes.
Via parent, acessa-se um objeto para o diretório um nível acima:
class.protectionDomain.codeSource.location.content.parent.pathName -> <SÖKVÄG>/<applikation>/WEB-INF
Pergunta:
Quantas referências parent são necessárias para chegar à raiz do sistema de arquivos?
Pergunta:
O que acontece quando solicitamos class.protectionDomain.codeSource.location.content.parent.parent.[...].childrenRecursively[0].pathName para o diretório raiz do sistema de arquivos?
Resposta:
O JBoss percorrerá todos os arquivos do sistema de arquivos e alocará um org.jboss.vfs.VirtualFile para cada arquivo e diretório.
Pergunta adicional: O que acontece se duas requisições solicitarem todos os arquivos do sistema de arquivos ao mesmo tempo? Três requisições? Cinco? Dez? Cem?
...
Resposta:
Se você esperar tempo suficiente, um erro é registrado