Sin dudas el caso del backdoor que fue detectado en la utilidad XZ, es uno de los casos que pasara a la historia de Linux y es que no es por nada, pero todo el trabajo realizado por Jia Tan es uno de los mejores ejemplos de ingeniería social aplicada, ya que el trabajo realizado sin dudas es de admirar por la cantidad de tiempo invertido, pues no hablamos de semanas o meses, al menos dos años.
Este caso ha llamado la atención de muchos y se han comenzado a realizar análisis de ingeniería inversa, los cuales según sus resultados preliminares revelan la presencia de un backdoor incrustado en liblzma como parte de una campaña para infiltrar el paquete XZ. Este backdoor está diseñado específicamente para afectar a sistemas x86_64 con el kernel de Linux y la biblioteca Glibc C, donde se aplica un parche adicional a sshd para vincularlo con libsystemd.
Los investigadores mencionan que inicialmente se creyó que el backdoor podría evadir la autenticación sshd y obtener acceso al sistema a través de SSH, pero al realizar un análisis más detallado se reveló que el backdoor permite la ejecución de código arbitrario en el sistema sin dejar rastros en los registros sshd.
La función RSA_public_decrypt es interceptada por el backdoor para verificar la firma del host usando la clave fija Ed448. Si la verificación es exitosa, se ejecuta el código transmitido por el host externo utilizando la función system() antes de que sshd restablezca los privilegios. Los datos del código a ejecutar se extraen del parámetro «N» pasado a la función RSA_public_decrypt y se verifican y descifran utilizando la clave predefinida ChaCha20.
Para activar el backdoor en sshd, se utiliza el mecanismo estándar de intercambio de claves de host y responde únicamente a la clave preparada por el atacante y correspondiente a la clave fija predefinida Ed448. Si la verificación de la firma de la clave pública falla o si no se confirma la integridad de los datos de ejecución, el backdoor devuelve el control a las funciones SSH estándar.
La clave privada del atacante sigue siendo desconocida, lo que imposibilita la implementación de un código de verificación para activar el backdoor desde fuentes externas o para desarrollar un escáner que detecte hosts comprometidos en la red. Sin embargo, los investigadores han desarrollado un script que muestra cómo se puede sustituir una clave pública en un certificado OpenSSH transmitido por un cliente SSH, lo cual es procesado por la función RSA_public_decrypt interceptada por el backdoor
Además, los investigadores descubrieron la existencia de un mecanismo para neutralizar el backdoor (killswitch
) en el sistema local mediante la configuración de una variable de entorno antes de iniciar sshd. También se ha realizado un análisis detallado de compilaciones de shell utilizadas para confundir el proceso de extracción de un archivo objeto con un backdoor y reemplazarlo en la biblioteca liblzma.
Durante la compilación del paquete XZ, se ejecutó un código desde el script «build-to-host.m4
» que manipuló un archivo de prueba y realizó ciertas modificaciones en los caracteres y lo transformó en un archivo intacto, del cual se extrajo el script de shell. El script de shell resultante fue capaz de extraer gradualmente otro script de shell del contenido, omitiendo ciertas secuencias con los comandosy reemplazando caracteres.
Como resultado de este proceso, se creó un script de shell bastante complejo y extenso que extrajo directamente el archivo con el backdoor del archivo good-large_compressed.lzma, lo descifró y lo insertó en liblzma. Este script también incluía una implementación del mecanismo de complemento, que permitía la entrega de componentes ejecutables adicionales posteriormente al colocar nuevos archivos de prueba sin alterar good-large_compressed.lzma y bad-3-corrupt_lzma2.xz, mediante una búsqueda de firmas. El código también incorporaba un descifrador basado en el algoritmo RC4, implementado en el lenguaje AWK
Por otra parte, cabe mencionar que en base al incidente, se ha desarrollado un conjunto de herramientas llamado xzbot, que incluye:
- Un honeypot para crear servidores ficticios que simulan ser vulnerables para detectar intentos de conexión de atacantes.
- Un parche para reemplazar la clave pública en la puerta trasera dentro de liblzma.so con una propia (para conectarse a la puerta trasera usando la clave privada correspondiente).
- Una demostración para iniciar la ejecución de código en una puerta trasera modificada utilizando la clave privada correspondiente.