Skip to content

Commit e93e13c

Browse files
committed
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: 6e63681 Tests: Update two test files. a3a29bb Tests: Test --single-stream can decompress bad-3-corrupt_lzma2.xz. 0b4ccc9 Tests: Update RISC-V test files. 8c9b8b2 liblzma: Fix typos in crc32_fast.c and crc64_fast.c. 82ecc53 liblzma: Fix false Valgrind error report with GCC. cf44e4b Tests: Add a few test files. 3060e10 Tests: Use smaller dictionary size in RISC-V test files. e2870db 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
1 parent f9cf4c0 commit e93e13c

12 files changed

+8
-66
lines changed

src/liblzma/check/crc32_fast.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,11 @@ typedef uint32_t (*crc32_func_type)(
135135
// This resolver is shared between all three dispatch methods. It serves as
136136
// the ifunc resolver if ifunc is supported, otherwise it is called as a
137137
// regular function by the constructor or first call resolution methods.
138-
// The function attributes are needed for safe IFUNC resolver usage with GCC.
139-
lzma_resolver_attributes
138+
// The __no_profile_instrument_function__ attribute support is checked when
139+
// determining if ifunc can be used, so it is safe to use here.
140+
#ifdef CRC_USE_IFUNC
141+
__attribute__((__no_profile_instrument_function__))
142+
#endif
140143
static crc32_func_type
141144
crc32_resolve(void)
142145
{

src/liblzma/check/crc64_fast.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ typedef uint64_t (*crc64_func_type)(
9898
# pragma GCC diagnostic ignored "-Wunused-function"
9999
#endif
100100

101-
lzma_resolver_attributes
101+
#ifdef CRC_USE_IFUNC
102+
__attribute__((__no_profile_instrument_function__))
103+
#endif
102104
static crc64_func_type
103105
crc64_resolve(void)
104106
{

src/liblzma/check/crc_common.h

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -128,31 +128,6 @@
128128
# endif
129129
#endif
130130

131-
#ifdef CRC_USE_IFUNC
132-
// Two function attributes are needed to make IFUNC safe with GCC.
133-
//
134-
// no-omit-frame-pointer prevents false Valgrind issues when combined with
135-
// a few other compiler flags. The optimize attribute is supported on
136-
// GCC >= 4.4 and is not supported with Clang.
137-
# if TUKLIB_GNUC_REQ(4,4) && !defined(__clang__)
138-
# define no_omit_frame_pointer \
139-
__attribute__((optimize("no-omit-frame-pointer")))
140-
# else
141-
# define no_omit_frame_pointer
142-
# endif
143-
144-
// The __no_profile_instrument_function__ attribute support is checked when
145-
// determining if ifunc can be used, so it is safe to use unconditionally.
146-
// This attribute is needed because GCC can add profiling to the IFUNC
147-
// resolver, which calls functions that have not yet been relocated leading
148-
// to a crash on liblzma start up.
149-
# define lzma_resolver_attributes \
150-
__attribute__((__no_profile_instrument_function__)) \
151-
no_omit_frame_pointer
152-
#else
153-
# define lzma_resolver_attributes
154-
#endif
155-
156131
// For CRC32 use the generic slice-by-eight implementation if no optimized
157132
// version is available.
158133
#if !defined(CRC32_ARCH_OPTIMIZED) && !defined(CRC32_GENERIC)

tests/files/README

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@
4141
good-0catpad-empty.xz has two zero-Block Streams concatenated with
4242
four-byte Stream Padding between the Streams.
4343

44-
good-2cat.xz has two Streams with one Block each.
45-
4644
good-1-check-none.xz has one Stream with one Block with two
4745
uncompressed LZMA2 chunks and no integrity check.
4846

@@ -83,14 +81,6 @@
8381
good-1-arm64-lzma2-2.xz is like good-1-arm64-lzma2-1.xz but with
8482
non-zero start offset. XZ Embedded doesn't support this file.
8583

86-
good-1-riscv-lzma2-1.xz uses the RISC-V filter and LZMA2. The
87-
uncompressed data is constructed so it tests all of the instructions
88-
that should be encoded and a few that should not. Additionally, the
89-
file contains random bytes to help test unforeseen corner cases.
90-
91-
good-1-riscv-lzma2-2.xz is like good-1-riscv-lzma2-1.xz but with
92-
non-zero start offset. XZ Embedded doesn't support this file.
93-
9484
good-1-lzma2-1.xz has two LZMA2 chunks, of which the second sets
9585
new properties.
9686

@@ -294,11 +284,6 @@
294284
Uncompressed Size bytes of output will have been produced but
295285
the LZMA2 decoder doesn't indicate end of stream.
296286

297-
bad-3-corrupt_lzma2.xz has three Streams in it. The first and third
298-
streams are valid xz Streams. The middle Stream has a correct Stream
299-
Header, Block Header, Index and Stream Footer. Only the LZMA2 data
300-
is corrupt. This file should decompress if --single-stream is used.
301-
302287

303288
3. Descriptions of Individual .lzma Files
304289

@@ -315,14 +300,6 @@
315300
will give an error at the end of the file after producing the
316301
correct uncompressed output.
317302

318-
good-small_compressed.lzma was created with a small dictionary (2^16).
319-
It contains the string "Hello World" repeated 100,000 times. This tests
320-
match decoding and wrapping the dictionary.
321-
322-
good-large_compressed.lzma was created with a mix of repeated
323-
characters and random data to test a data stream containing many
324-
matches and many literals.
325-
326303

327304
3.2. Bad Files
328305

@@ -344,10 +321,6 @@
344321
bad-too_small_size-without_eopm-3.lzma is like -1 above but instead
345322
of a literal the problem occurs in the middle of a match.
346323

347-
bad-dict_size.lzma has a valid dictionary size according to the .lzma
348-
File Format, but will be rejected by XZ Utils because it is not 2^n or
349-
2^n + 2^(n-1).
350-
351324

352325
4. Descriptions of Individual .lz (lzip) Files
353326

tests/files/bad-3-corrupt_lzma2.xz

-512 Bytes
Binary file not shown.

tests/files/bad-dict_size.lzma

-41 Bytes
Binary file not shown.
-7.25 KB
Binary file not shown.
-7.26 KB
Binary file not shown.

tests/files/good-2cat.xz

-136 Bytes
Binary file not shown.
-34.6 KB
Binary file not shown.

0 commit comments

Comments
 (0)