Incidente do backdoor no XZ - resultados da análise inicial
(securelist.com)-
Linha do tempo dos eventos:
- 2024.01.19: o site do XZ foi movido para GitHub Pages por um novo mantenedor (jiaT75)
- 2024.02.15:
build-to-host.m4é adicionado ao.gitignore - 2024.02.23: dois "arquivos de teste" contendo estágios de script malicioso são introduzidos
- 2024.02.24: XZ 5.6.0 é lançado
- 2024.02.26: commit em
CMakeLists.txtsabotando o recurso de segurança Landlock - 2024.03.04: o backdoor causa problemas com o Valgrind
- 2024.03.09: dois "arquivos de teste" são atualizados, funções de CRC são modificadas, problema com o Valgrind é "corrigido"
- 2024.03.09: XZ 5.6.1 é lançado
- 2024.03.28: bug descoberto, Debian e RedHat são notificadas, Debian faz rollback do XZ
- 2024.03.29: e-mail publicado na mailing list OSS-security, RedHat confirma envio de XZ com backdoor
- 2024.03.30: Debian interrompe builds e inicia processo de rebuild
- 2024.04.02: principal desenvolvedor do XZ reconhece o incidente do backdoor
-
Valores de hash das distribuições do XZ que incluíam o backdoor malicioso:
- xz-5.6.0: valores de hash MD5, SHA1 e SHA256 fornecidos
- xz-5.6.1: valores de hash MD5, SHA1 e SHA256 fornecidos
Análise inicial da infecção
-
Estágio 1 - script
build-to-hostadulterado:- os arquivos-fonte de release eram inicialmente inofensivos, mas incluíam um arquivo
build-to-host.m4que executava código malicioso quando baixado de uma URL controlada pelo invasor - esse arquivo
.m4era executado durante o build, modificando e descompactando o primeiro arquivo adicionado à pasta de testes
- os arquivos-fonte de release eram inicialmente inofensivos, mas incluíam um arquivo
-
Estágio 2 - script shell injetado:
- o script malicioso injetado pelo arquivo
.m4verifica se está rodando dentro do processo de build pretendido no Linux - ele usa o arquivo
good-large_compressed.lzmapara executar o próximo estágio; ele está compactado normalmente, mas os dados descompactados contêm dados lixo internamente - extrai 33.492 bytes com comandos
head/taile remove a ofuscação aplicando uma substituição básica com o comandotr
- o script malicioso injetado pelo arquivo
-
Estágio 3 - extração do backdoor:
- o script shell da etapa final realiza várias verificações para confirmar se está sendo executado no ambiente esperado
- ele extrai o próprio código binário do backdoor, escondido em outro offset do mesmo arquivo
good-large_compressed.lzma - extrai o arquivo com a ferramenta XZ e descriptografa os dados binários com uma série de chamadas
head, usando um algoritmo semelhante ao RC4 - extrai o arquivo compactado com XZ, remove os bytes iniciais com base em valores predefinidos e o salva como
liblzma_la-crc64-fast.o - modifica a função
is_arch_extension_supporteddecrc_x86_clmul.h, trocando a chamada__get_cpuidpor_get_cpuid
Análise do backdoor binário
-
Cenário de carregamento furtivo:
- o XZ usa as funções
lzma_crc32elzma_crc64para cálculo de CRC, e elas são armazenadas na tabela de símbolos ELF como tipo IFUNC - IFUNC é usado para decidir dinamicamente se deve usar a versão otimizada
- o backdoor é armazenado como arquivo-objeto, e o principal objetivo é ser vinculado ao executável
mainno momento da compilação - o arquivo-objeto inclui o símbolo
_get_cpuid; ao remover um sublinhado do código-fonte original, quando o código chama_get_cpuid, na prática passa a chamar a versão do backdoor
- o XZ usa as funções
-
Análise do código do backdoor:
- o código inicial do backdoor é chamado duas vezes, e a atividade maliciosa real começa quando o IFUNC
lzma_crc64chama_get_cpuid - ele encontra o endereço da GOT, localiza a posição do ponteiro
cpuide o substitui pelo ponteiro da função maliciosa principal - o objetivo principal é fazer hook de funções específicas para poder monitorar todas as conexões com o sistema infectado
- o código inicial do backdoor é chamado duas vezes, e a atividade maliciosa real começa quando o IFUNC
-
Comportamentos principais:
- tem como alvos de hook funções de
libcryptocomoRSA_public_decrypt,EVP_PKEY_set1_RSAeRSA_get0_key - verifica se o processo atual atende aos critérios de execução e se existe um kill switch
- usa uma estrutura Trie para realizar operações com strings
- usa três ou mais rotinas de symbol resolver para encontrar a posição das estruturas ELF Symbol
- obtém o hook de funções abusando do recurso
rtdl-auditpara sequestrar as rotinas de resolução de símbolos
- tem como alvos de hook funções de
Opinião do GN⁺
-
Este artigo mostra muito bem um caso extremamente sofisticado de injeção de malware em software open source. Ele traz a lição de que as vantagens do open source também podem ser exploradas de forma maliciosa.
-
Ataques cibernéticos e backdoors voltados a sistemas Linux estão ficando cada vez mais sofisticados. Em especial, ataques por meio de servidores SSH podem se tornar uma séria ameaça de segurança.
-
Por outro lado, isso também mostra a capacidade de autocorreção do ecossistema open source. No fim, o backdoor foi descoberto pela comunidade e houve uma resposta rápida. Transparência é essencial.
-
O uso de técnicas como estrutura de dados Trie avançada, Symbol Resolver e hooking via
dl_auditmostra a evolução técnica do malware para Linux. Também é preciso dar atenção redobrada à segurança de sistemas Linux. -
Ao adotar software open source em empresas, é essencial verificar não apenas a licença, mas também os aspectos de segurança. É preciso confirmar se a distribuição é confiável e se há monitoramento contínuo do código.
1 comentários
Comentários do Hacker News
Resumo: