
Laboratorio didattico che replica il backdoor XZ Utils (CVE-2024-3094) con una coppia di chiavi Ed448 personalizzata. Include liblzma patchato, servizio systemd e client di exploit per ricerca sulla sicurezza autorizzata.
Solo per scopi educativi e di ricerca sulla sicurezza autorizzati.
CVE-2024-3094 è una backdoor introdotta nelle versioni 5.6.0 e 5.6.1 di XZ Utils (liblzma), scoperta il 29 marzo 2024 dal ricercatore di sicurezza Andres Freund. Le è stato assegnato un punteggio CVSS di 10.0 (Critico).
Si tratta di un attacco alla supply chain condotto per oltre due anni da un attore malevolo noto come "Jia Tan" (JiaT75), che ha costruito fiducia all'interno del progetto fino a ottenere lo status di co-maintainer e ha introdotto la backdoor direttamente nei tarball di distribuzione.
La backdoor opera come segue:
liblzma.so malevola aggancia la funzione RSA_public_decrypt() in OpenSSH tramite il meccanismo IFUNC di glibc, intercettando il processo di autenticazione SSH.system() con i privilegi di sshd (root).Questo laboratorio replica il meccanismo della backdoor utilizzando chiavi Ed448 personalizzate invece delle chiavi dell'attore originale (mai rese pubbliche).
Nei sistemi reali colpiti non c'era chroot. La backdoor operava direttamente sull'sshd del sistema, che caricava la liblzma.so malevola come qualsiasi altra libreria condivisa — completamente trasparente per il sistema e i suoi amministratori.
In questo laboratorio usiamo chroot esclusivamente per un motivo pratico: abbiamo bisogno di eseguire un sshd con una versione specifica di liblzma.so senza sostituire le librerie del sistema host. Questa è una decisione di progettazione per l'ambiente di ricerca, non un riflesso di come la backdoor operava in produzione.
| Componente | Descrizione |
|---|---|
env_fs/ | Filesystem minimo di Ubuntu 22.04 usato come chroot |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | liblzma 5.6.1 patchata con chiave Ed448 personalizzata |
/etc/systemd/system/xzback.service | Servizio systemd che avvia sshd vulnerabile sulla porta 2024 |
/xzbot/xzbot | Client exploit compilato dal sorgente |
La backdoor originale richiede condizioni molto specifiche che non esistono automaticamente in un ambiente di laboratorio. Sono state necessarie le seguenti modifiche:
La liblzma.so.5 inclusa nel repository originale di MagpieRYL utilizza una chiave Ed448 sconosciuta che è inconsistente con il binario xzbot incluso. La liblzma.so.5.6.1 originale e autentica è stata scaricata dallo snapshot Debian (sha256 verificato) e patchata usando patch.py da amlweems/xzbot con seed=0:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
La chiave pubblica Ed448 dell'attore originale è stata sostituita con:
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
Il servizio originale usa Type=notify, che richiede che sshd invii una notifica di avvio a systemd. L'sshd all'interno del chroot non la invia, causando timeout. Modificato in Type=simple.
sshd richiede /run/sshd per la separazione dei privilegi. Questa directory non esiste nel chroot e viene cancellata a ogni riavvio perché run/ è un tmpfs. Risolto con un ExecStartPre che la rigenera automaticamente prima di ogni avvio del servizio.
./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'
Il comando viene eseguito all'interno del chroot, quindi qualsiasi file creato sotto /tmp/ nel contesto della backdoor viene archiviato in:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
Cioè, se il comando è echo pwned > /tmp/result, il file si troverà in:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
Per localizzare qualsiasi file generato dall'exploit:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
Il messaggio ssh: handshake failed: EOF è il comportamento atteso e corretto. La backdoor esegue il comando e chiude la connessione senza stabilire una sessione SSH. Non indica un fallimento.
Questo laboratorio utilizza un paio di chiavi crittografiche personalizzate (seed=0). La liblzma.so patchata accetta solo payload firmati con la corrispondente chiave privata, che è quella usata dallo xzbot compilato in questo ambiente. Qualsiasi altro client riceverà EOF senza esecuzione.
Questo strumento è fornito solo per scopi educativi e test di sicurezza autorizzati. L'uso non autorizzato contro sistemi di cui non si possiede o non si ha esplicita autorizzazione scritta per testarli è illegale. L'autore non è responsabile per qualsiasi uso improprio.