Bones a tots, a l'article d'avui tractarem un cas que s'està discutint força en els últims dies i és la vulnerabilitat CVE-2024-3094 o com se l'anomena comunament “backdoor a XZ”.
XZ Utils és una eina (open source) de compressió de dades present a gairebé totes les distribucions Linux, que serveix per comprimir formats d'arxius grans en mides més petites i manejables per ser compartits. En ser un programari de codi obert, és mantingut i actualitzat per desenvolupadors de manera liberal.
Aquestes actualitzacions s'afegeixen al projecte mitjançant el que s'anomenen “Pull Requests” i abans de ser admeses, són revisades per altres membres de l'equip que hi han contribuït amb anterioritat per evitar errors en el codi font proposat.
En aquest cas, un usuari de Github que va contribuir al projecte de XZ, anomenat Jia Tan va aconseguir obtenir permisos per revisar i acceptar modificacions de codi, guanyant-se la confiança de la resta de l'equip i podent acceptar les seves pròpies contribucions sense que aquestes fossin revisades per altres membres .
Amb aquesta confiança dipositada a la feina pels membres de l'equip, Jia va incorporar codi maliciós al projecte de xz-utils, amb la intenció de fer interferir l'autenticació del servei SSH i permetre una execució remota de codi o RCE.
Explicació de la vulnerabilitat
Tot neix quan Andrés Freund, enginyer de programari a Microsoft, detecta un comportament inusual amb el servei sshd, el qual estava consumint una alta quantitat de CPU.
Dins del procés de compilació de XZ, s'executa l'script “Build-to-Host.m4”. Aquest script conté la següent línia de codi:
gl_[$1]config='sed "r\n" $gl_am_configmake | eval $gl_path_map | $gl[$1]_prefix -d 2>/dev/null'
La qual cosa injecta un script obfuscat al final de l'script de configuració. Aquest script de configuracio és el responsable de crear els MakeFiles per a xz-utils i liblzma.
L'script té com a objectiu principal modificar el MakeFile de liblzma en temps d'execució, fent que el RSA_public_decrypt@....pl apunti al codi maliciós de la backdoor.
Durant el procés d'autenticació de sshd, s'invoca la funció RSA_public_decrypt@....pl fent que s'executi el codi maliciosos de l'atacant al qual esteu apuntant. Aquest codi és l'encarregat d'extreure el payload de la clau pública que se li passa durant el procés d'autenticació i que serà sotmesa a una sèrie de passos de verificació i controls de signatura. Si passa amb èxit aquestes comprovacions, transferiu-vos a la funció system() de libc, que serà l'encarregada d'executar el payload i dur a terme l'execució remota de codi (RCE).
El codi ofuscat que s'executa dins de l'script de configuració aixeca un backdoor únicament sota certes condicions:
1. El sistema operatiu de destinació ha de ser Linux x86-64.
2. El procés de compilació de XZ ha de formar part de la compilació d'un paquet Debian o RPM.
3. El binari que s'invoca ha d'estar al path /usr/sbin/sshd
4. La variable d'entorn TERM no ha d'estar configurada
5. Tampoc no ho han d'estar les variables LD_DEBUG i LD_PROFILE
6. La variable d'entorn LANG ha d'estar assetada per defecte per sshd.
Distribucions afectades
- Fedora 41 i Fedora Rawhide
- Kali Linux actualitzat entre el 26 i 29 de març
- Alpine 5.6.0, 5.6.0-r0, 5.6.0-r1, 5.6.1, 5.6.1-r0 i 5.6.1-r1
- Arch que tinguin instal·lat les versions de xz-utils 5.6.0 i 5.6.1
A més, per determinar si s'ha instal·lat una versió de programari de xz-utils vulnerable, es pot fer servir l'script creat per l'equip JFrog, el qual es troba al següent enllaç.
Aquest checker és força senzill, realitza les sis comprovacions, que formen part de les condicions necessàries que hem comentat anteriorment, per poder explotar aquesta vulnerabilitat. Us mostrem un exemple dús:
Moltes gràcies i fins a la propera entrega!