Eu li sobre vulnerabilidades de segurança relacionadas ao Log4j.
Como verifico se o Log4j está instalado no meu servidor? Meus servidores específicos usam Ubuntu 18.04.6 LTS
.
Eu instalei muitos pacotes de terceiros e talvez alguns deles o contenham.
Existe um comando a ser executado no meu servidor para verificar se o Log4j está instalado?
Tente este script para obter uma dica:
Certifique-se de que seu banco de dados de localização esteja atualizado com o
updatedb
.Ou melhor verificar e executar o script aprimorado do GitHub , que também pesquisa dentro de arquivos Java compactados . Corra em uma linha com
Não tenho certeza se pode haver programas Java compilados em execução no servidor sem que o java esteja instalado?
Ou até mesmo versões compiladas onde os arquivos de origem não são mais encontrados dentro de arquivos compactados?
Também há muito desenvolvimento no GitHub , onde você encontra ataques e contramedidas.
Isso leva muito tempo para mim. Estou procurando alguém que possa transferir a propriedade do repositório no GitHub
Não há comando que certamente lhe dirá isso. Alguns aplicativos enviam as bibliotecas que usam diretamente como um arquivo jar, alguns os contêm em um arquivo.
E mesmo assim você não sabe qual versão é enviada e como é usada. A única maneira de ter certeza de mitigar o CVE é ler os anúncios de segurança e as notas de lançamento de seus aplicativos e seguir seus avisos.
Tente este Comandos:
dpkg -l | grep liblog4j
dpkg -l | grep log4
find / -name log4j-core-*.jar
locate log4j | grep -v log4js
Eu escrevi este script Python para encontrar versões vulneráveis do Log4j2 em seu sistema: https://github.com/fox-it/log4j-finder
Ele funciona varrendo o disco e dentro dos arquivos Java Archive recursivamente e procurando por arquivos ruins conhecidos.
log4jscanner
Publicado pelo Google sob a licença Apache-2.0, o log4jscanner é um scanner de sistema de arquivos de vulnerabilidade log4j e um pacote Go para analisar arquivos JAR.
Pedindo desculpas pela referência de material externo, espero que isso seja tolerável nas circunstâncias atuais.
As informações que o Lunasec.io divulgou sobre hashes de arquivos .class binários Java vulneráveis:
https://github.com/lunasec-io/lunasec/blob/master/tools/log4shell/constants/vulnerablehashes.go
Veja também o blog deles: https://www.lunasec.io/docs/blog/log4j-zero-day-mitigation-guide/
Se você tiver ordenado hashes (um por linha) de classes suspeitas em um arquivo
hashes
e tiver um arquivo jarsubject.jar
e tiver os comandosunzip
,find
esha256sum
, poderá fazer uma comparação com os hashes conhecidos com:Se
comm
tiver saída, haverá um hash correspondente.Experimente o syft . Ele cria uma lista de materiais de software (SBOM), que você pode procurar por versões antigas do log4j (até funciona com imagens do docker).
Algo como
syft dir:/opt/foo-application | grep log4j
pesquisas em implantações convencionais.syft dir:/ | grep log4j
deve funcionar para todo o seu servidor.Passar suas imagens docker também funciona:
Criar um script para passar todas as suas imagens docker para o syft não deve ser muito difícil, mas você pode encontrar alguma inspiração nesses meus scripts: https://github.com/debuglevel/syft-grype-utils
John Hammond publicou com alguns outros um serviço de redirecionamento LDAP hospedado para que você possa pular todas as travessuras. https://log4shell.huntress.com/
As instruções são simples - ele gera um ID de cliente para você (está na URL, bem como parte da string de injeção) que você pode postar em qualquer formulário/solicitação/ou derivado de solicitação da web.
Geralmente, se você estiver executando qualquer coisa que "não funcione com isso porque é acesso local", tudo bem, pois não há meios de encaminhar através de seu aplicativo baseado em Java.
De nota - acredito que a maior preocupação deve ser colocada no hardware de gerenciamento de rede L2/L3; Especialmente se você estiver lidando com um ISP ou seu conteúdo for veiculado por meio de um serviço de hospedagem.
A verificação de pacotes instalados não é suficiente, pois
log4j
pode ser instalado manualmente por alguns outros aplicativos.Para servidores Linux, estou usando o seguinte:
find / -iname "*log4j*.jar"
Para servidores Windows, pode-se usar algo semelhante a isso:
dir C:\*log4j*.jar /s
(mudandoC:
paraD:
e assim por diante para outros discos).Os nomes dos arquivos geralmente mostrarão a versão da biblioteca, mas para verificar novamente, você pode abrir o arquivo de manifesto e ler os campos de versão/implementação.
Observe que o acima não é suficiente para capturar embutidos
log4j
(por exemplo: em outros arquivos jar). Para isso, é necessário grep a string relevante, mas isso consome bastante tempo e recursos, então sugiro usar a pesquisa de arquivos como um primeiro (mas incompleto) passo.Todas as tentativas aqui para resolver as vulnerabilidades no log4j ficam aquém. Você não pode confiar no
locate
comando, pois ele apenas procura em um conjunto de caminhos configurados (/etc/updatedb.conf
no Debian).O software pode se instalar em locais não configurados
updatedb.conf
e ser completamente ignorado pelo cron job que atualiza o banco de dados de localização.Além disso, está sendo descoberto que fornecedores de software (como Elastic ) reempacotaram o JndiLookup.class vulnerável (por exemplo:
elasticsearch-sql-cli-7.16.1.jar
) em locais que não eram conhecidos anteriormente, o que deixa soluções incompletas que são construídas em torno de hashes, nomes ou caminhos de arquivos conhecidos.@shodanshok está no caminho certo aqui, mas ao invés de procurar por log4j explicitamente, uma olhada em cada '.jar' no sistema é o que é necessário.
Este é mais completo, requer o pacote zip. e uma extensão da resposta de shodanshok. Isso apenas mostrará os locais onde o
JndiLookup.class
código é encontrado. Outra linha pode ser adicionada para remover essas vulnerabilidades, mas prefiro deixar isso a critério do administrador. O link elástico acima mostra como:Exemplo:
Tenha cuidado ao executar isso em um sistema com sistemas de arquivos de rede montados, pois o desempenho pode ser afetado. Nesses casos, você precisa executar os comandos no próprio servidor de arquivos.