
Detecte e corrija Apache Commons Text vulneráveis em artefatos JAR/WAR Java; identifique classes por fingerprint e analise o bytecode em busca de locais de chamada do CVE-2022-42889 (Text4Shell).
Clique para encontrar:
commons-text e suas versõescommons-textcommons-text para desativar os comportamentos vulneráveisA CVE-2022-42889 pode representar uma séria ameaça a uma ampla gama de aplicações baseadas em Java. As perguntas importantes que um desenvolvedor pode fazer nesse contexto são:
commons-text? Quais versões?O código distribuído inclui commons-text? Qual versão da biblioteca está incluída nele? Responder a essas perguntas pode não ser imediato devido a dois fatores:
Dependências transitivas: embora commons-text possa não estar na lista de dependências diretas do projeto, ele pode ser usado indiretamente por alguma outra dependência.
O código desta biblioteca pode não aparecer diretamente como um arquivo separado, mas sim estar empacotado em algum outro arquivo jar de código.
A JFrog está disponibilizando uma ferramenta para ajudar a resolver esse problema: scan_commons_text_versions. A ferramenta procura pelo código da classe StringLookupFactory independentemente dos nomes dos arquivos .jar e do conteúdo dos arquivos pom.xml, e tenta identificar as versões dos objetos para informar se a versão incluída do commons-text é vulnerável.
commons-text?A pergunta é relevante para os casos em que o desenvolvedor deseja verificar se as chamadas ao commons-text no código podem passar dados potencialmente controlados por um atacante. Embora a forma mais segura de corrigir a vulnerabilidade, conforme discutido nos avisos de segurança, seja aplicar os patches apropriados, avaliar e verificar o impacto potencial sob a suposição de um commons-text sem patch pode ser valioso em muitas situações.
scan_commons_text_calls_jar.py, que localiza as chamadas às funções vulneráveis em arquivos .jar compilados, e relata os resultados como nome da classe e nomes dos métodos nos quais cada chamada aparece.
commons-text vulneráveis no meu sistema, como posso desativar rapidamente o comportamento perigoso?Atualizar continua a ser a melhor solução — esta solução destina-se a um hot patch rápido.
No contexto da vulnerabilidade CVE-2022-42889, a classe org/apache/commons/text/lookup/ScriptStringLookup no commons-text permite a execução de scripts que podem estar embutidos em uma string recebida de uma fonte controlada pelo atacante por meio de ${script}. Portanto, invocações da função ScriptStringLookup.lookup indicam que a funcionalidade está ativada.
Fornecemos uma ferramenta, Text4ShellPatch, que permite aplicar patch nessa chamada específica para que a funcionalidade de execução de scripts não possa ser utilizada. Após aplicar o patch, a biblioteca sempre executará um script que retorna uma mensagem de aviso (em vez do código potencialmente controlado pelo atacante).
Da mesma forma, o lookup de DNS e URL pode carregar conteúdo não confiável se for controlado por um atacante por meio de ${dns} e ${url}; assim, seus respectivos lookups DnsStringLookup e UrlStringLookup podem ser desativados por meio de patch para retornar uma mensagem de aviso.
O patch pode ser aplicado a um arquivo jar específico, apenas para o lookup script, ou para script, dns e url para uma melhor proteção caso não sejam destinados ao uso na aplicação.
Um backup é gerado no mesmo local do jar original antes de ser substituído pelo jar com patch. O nome do arquivo de backup segue o seguinte padrão: <original_jar_name>_YYYY.MM.DD_HH.mm.ss.orig.jar, onde YYYY, MM, DD são respectivamente o ano, o mês e o dia, e HH, mm, ss são respectivamente a hora, os minutos e os segundos.
Também é possível localizar versões vulneráveis do commons-text e aplicar patch nelas automaticamente, como a próxima pergunta responde.
commons-text vulneráveis?Duas das nossas ferramentas, em conjunto, oferecem a capacidade de varrer e aplicar patch nos arquivos .jar do commons-text vulneráveis.
Um exemplo de script bash está presente neste repositório do Github com o nome scan_and_patch.sh. Basicamente, ele usa o script scan_commons_text_versions.py para encontrar, em uma root-folder específica, os arquivos .jar do commons-text vulneráveis com uma versão vulnerável e executar a ferramenta Text4ShellPatch neles, como a seguir.

scan_commons_text_versions.pypython scan_commons_text_versions.py root-folder [-quiet] [-exclude folder1 folder2 ..]
A ferramenta varrerá root_folder recursivamente em busca de arquivos .jar e .war; em cada arquivo localizado, a ferramenta procura por StringLookupFactory.class (recursivamente em cada arquivo .jar). Se pelo menos uma das classes for encontrada, a ferramenta tenta identificar sua versão (incluindo algumas variações encontradas em patches e backports de patches) para informar se o código é vulnerável.
Com a flag -quiet, apenas as conclusões sobre a versão são exibidas, e as outras mensagens (arquivos não encontrados / arquivos que falharam ao abrir / arquivos protegidos por senha) são silenciadas.
As pastas que aparecem após -exclude (opcional) são ignoradas.
scan_commons_text_calls_jar.pyA ferramenta requer python 3 e as seguintes bibliotecas de terceiros: jawa, tqdm, easyargs, colorama
pip install -r requirements.txt
O caso de uso padrão:
python scan_commons_text_calls_jar.py root-folder
varrerá recursivamente todos os arquivos .jar em root-folder, exibindo para cada um as localizações (nome da classe e nome do método) das chamadas aos métodos lookup/replace/replaceIn de StringSubstitutor/StringLookup.
A ferramenta pode ser configurada para casos de uso adicionais usando os seguintes argumentos de linha de comando.
| Flag | Default value | Use |
|---|---|---|
--class_regex | (.*StringSubstitutor|.*StringLookup) | Expressão regular para o nome da classe exigida |
--method_regex | (lookup|replace|replaceIn) | Expressão regular para o nome do método exigido |
--quickmatch_string | (StringLookup|StringSubstitutor) | Pré-condição para análise de arquivos: arquivos .jar que não contêm a regex especificada serão ignorados |
--class_existence | Não definido | Quando não definido, procura chamadas para classe::método conforme especificado pelas regexes. Quando definido, --method_regex é ignorado e a ferramenta procurará a existência de classes especificadas por --class_regex no jar. |
--no_quickmatch | Não definido | Quando definido, o valor de --quickmatch_string é ignorado e todos os arquivos .jar são analisados |
--caller_block | .*org/apache/commons/text | Se a classe do chamador corresponder a esta regex, ela não será exibida |
text_4_shell_patchjava -jar Text4ShellPatch.jar TARGET_JAR [PATCHING_MODE]
Where TARGET_JAR is the application to patch and PATCHING_MODE is
0 (default): Patch Script lookup
1: Patch Script + DNS + URL lookups
[Note: The original Jar will be kept in the same folder with the .orig.jar extension]
A ferramenta procurará a classe org/apache/commons/text/lookup/ScriptStringLookup no jar do commons-text fornecido e substituirá o conteúdo da função lookup() por uma mensagem de aviso, retornando da função. Assim, o eval não existirá na nova classe ScriptStringLookup.
Ela também pode aplicar patch nas classes DnsStringLookup e URLStringLookup e desativar a função lookup() ao definir a opção PATCHING_MODE como 1.
Um arquivo de backup é gerado durante o processo no mesmo caminho, com a extensão .orig.jar.
O Text4ShellPatch pode ser editado e compilado com o Maven usando o simples comando:
mvn clean assembly:single. Ele criará um arquivo Text4ShellPatch.jar na pasta target/.