diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2024-04-08 15:32:58 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2024-04-09 17:57:39 +0300 |
commit | e93e13c8b3bec925c56e0c0b675d8000a0f7f754 (patch) | |
tree | 606eecef95eb881a9ec00220b65574786990027e /src/liblzma/check | |
parent | CMake: Fix sabotaged Landlock sandbox check. (diff) | |
download | xz-e93e13c8b3bec925c56e0c0b675d8000a0f7f754.tar.xz |
Remove the backdoor found in 5.6.0 and 5.6.1 (CVE-2024-3094).
While the backdoor was inactive (and thus harmless) without inserting
a small trigger code into the build system when the source package was
created, it's good to remove this anyway:
- The executable payloads were embedded as binary blobs in
the test files. This was a blatant violation of the
Debian Free Software Guidelines.
- On machines that see lots bots poking at the SSH port, the backdoor
noticeably increased CPU load, resulting in degraded user experience
and thus overwhelmingly negative user feedback.
- The maintainer who added the backdoor has disappeared.
- Backdoors are bad for security.
This reverts the following without making any other changes:
6e636819 Tests: Update two test files.
a3a29bbd Tests: Test --single-stream can decompress bad-3-corrupt_lzma2.xz.
0b4ccc91 Tests: Update RISC-V test files.
8c9b8b20 liblzma: Fix typos in crc32_fast.c and crc64_fast.c.
82ecc538 liblzma: Fix false Valgrind error report with GCC.
cf44e4b7 Tests: Add a few test files.
3060e107 Tests: Use smaller dictionary size in RISC-V test files.
e2870db5 Tests: Add two RISC-V Filter test files.
The RISC-V test files also have real content that tests the filter
but the real content would fit into much smaller files. A generator
program would need to be available as well.
Thanks to Andres Freund for finding and reporting it and making
it public quickly so others could act without a delay.
See: https://www.openwall.com/lists/oss-security/2024/03/29/4
Diffstat (limited to 'src/liblzma/check')
-rw-r--r-- | src/liblzma/check/crc32_fast.c | 7 | ||||
-rw-r--r-- | src/liblzma/check/crc64_fast.c | 4 | ||||
-rw-r--r-- | src/liblzma/check/crc_common.h | 25 |
3 files changed, 8 insertions, 28 deletions
diff --git a/src/liblzma/check/crc32_fast.c b/src/liblzma/check/crc32_fast.c index bfa295a0..079051f1 100644 --- a/src/liblzma/check/crc32_fast.c +++ b/src/liblzma/check/crc32_fast.c @@ -135,8 +135,11 @@ typedef uint32_t (*crc32_func_type)( // This resolver is shared between all three dispatch methods. It serves as // the ifunc resolver if ifunc is supported, otherwise it is called as a // regular function by the constructor or first call resolution methods. -// The function attributes are needed for safe IFUNC resolver usage with GCC. -lzma_resolver_attributes +// The __no_profile_instrument_function__ attribute support is checked when +// determining if ifunc can be used, so it is safe to use here. +#ifdef CRC_USE_IFUNC +__attribute__((__no_profile_instrument_function__)) +#endif static crc32_func_type crc32_resolve(void) { diff --git a/src/liblzma/check/crc64_fast.c b/src/liblzma/check/crc64_fast.c index 52cddb2c..5728b45e 100644 --- a/src/liblzma/check/crc64_fast.c +++ b/src/liblzma/check/crc64_fast.c @@ -98,7 +98,9 @@ typedef uint64_t (*crc64_func_type)( # pragma GCC diagnostic ignored "-Wunused-function" #endif -lzma_resolver_attributes +#ifdef CRC_USE_IFUNC +__attribute__((__no_profile_instrument_function__)) +#endif static crc64_func_type crc64_resolve(void) { diff --git a/src/liblzma/check/crc_common.h b/src/liblzma/check/crc_common.h index 5a86556f..856665db 100644 --- a/src/liblzma/check/crc_common.h +++ b/src/liblzma/check/crc_common.h @@ -128,31 +128,6 @@ # endif #endif -#ifdef CRC_USE_IFUNC -// Two function attributes are needed to make IFUNC safe with GCC. -// -// no-omit-frame-pointer prevents false Valgrind issues when combined with -// a few other compiler flags. The optimize attribute is supported on -// GCC >= 4.4 and is not supported with Clang. -# if TUKLIB_GNUC_REQ(4,4) && !defined(__clang__) -# define no_omit_frame_pointer \ - __attribute__((optimize("no-omit-frame-pointer"))) -# else -# define no_omit_frame_pointer -# endif - -// The __no_profile_instrument_function__ attribute support is checked when -// determining if ifunc can be used, so it is safe to use unconditionally. -// This attribute is needed because GCC can add profiling to the IFUNC -// resolver, which calls functions that have not yet been relocated leading -// to a crash on liblzma start up. -# define lzma_resolver_attributes \ - __attribute__((__no_profile_instrument_function__)) \ - no_omit_frame_pointer -#else -# define lzma_resolver_attributes -#endif - // For CRC32 use the generic slice-by-eight implementation if no optimized // version is available. #if !defined(CRC32_ARCH_OPTIMIZED) && !defined(CRC32_GENERIC) |