323 lines
17 KiB
Diff
323 lines
17 KiB
Diff
From dfec13f399701bdb47e114457069f129a883c197 Mon Sep 17 00:00:00 2001
|
|
From: Lukas Javorsky <ljavorsk@redhat.com>
|
|
Date: Mon, 16 Mar 2026 15:04:31 +0100
|
|
Subject: [PATCH] Infinite loop in Rar5 decompression
|
|
|
|
Fix for CVE-2026-4111
|
|
|
|
Source: https://github.com/libarchive/libarchive/pull/2877
|
|
---
|
|
Makefile.am | 2 +
|
|
libarchive/archive_read_support_format_rar5.c | 4 +-
|
|
libarchive/test/CMakeLists.txt | 1 +
|
|
.../test/test_read_format_rar5_loop_bug.c | 53 +++++
|
|
.../test_read_format_rar5_loop_bug.rar.uu | 189 ++++++++++++++++++
|
|
5 files changed, 248 insertions(+), 1 deletion(-)
|
|
create mode 100644 libarchive/test/test_read_format_rar5_loop_bug.c
|
|
create mode 100644 libarchive/test/test_read_format_rar5_loop_bug.rar.uu
|
|
|
|
diff --git a/Makefile.am b/Makefile.am
|
|
index a36126c..a5c6e93 100644
|
|
--- a/Makefile.am
|
|
+++ b/Makefile.am
|
|
@@ -518,6 +518,7 @@ libarchive_test_SOURCES= \
|
|
libarchive/test/test_read_format_rar_filter.c \
|
|
libarchive/test/test_read_format_rar_invalid1.c \
|
|
libarchive/test/test_read_format_rar5.c \
|
|
+ libarchive/test/test_read_format_rar5_loop_bug.c \
|
|
libarchive/test/test_read_format_raw.c \
|
|
libarchive/test/test_read_format_tar.c \
|
|
libarchive/test/test_read_format_tar_concatenated.c \
|
|
@@ -910,6 +911,7 @@ libarchive_test_EXTRA_DIST=\
|
|
libarchive/test/test_read_format_rar5_invalid_dict_reference.rar.uu \
|
|
libarchive/test/test_read_format_rar5_leftshift1.rar.uu \
|
|
libarchive/test/test_read_format_rar5_leftshift2.rar.uu \
|
|
+ libarchive/test/test_read_format_rar5_loop_bug.rar.uu \
|
|
libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu \
|
|
libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu \
|
|
libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu \
|
|
diff --git a/libarchive/archive_read_support_format_rar5.c b/libarchive/archive_read_support_format_rar5.c
|
|
index b99105d..a970bda 100644
|
|
--- a/libarchive/archive_read_support_format_rar5.c
|
|
+++ b/libarchive/archive_read_support_format_rar5.c
|
|
@@ -2963,7 +2963,9 @@ static int parse_filter(struct archive_read* ar, const uint8_t* p) {
|
|
if(block_length < 4 ||
|
|
block_length > 0x400000 ||
|
|
filter_type > FILTER_ARM ||
|
|
- !is_valid_filter_block_start(rar, block_start))
|
|
+ !is_valid_filter_block_start(rar, block_start) ||
|
|
+ (rar->cstate.window_size > 0 &&
|
|
+ (ssize_t)block_length > rar->cstate.window_size >> 1))
|
|
{
|
|
archive_set_error(&ar->archive, ARCHIVE_ERRNO_FILE_FORMAT,
|
|
"Invalid filter encountered");
|
|
diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt
|
|
index 314c972..e526a68 100644
|
|
--- a/libarchive/test/CMakeLists.txt
|
|
+++ b/libarchive/test/CMakeLists.txt
|
|
@@ -162,6 +162,7 @@ IF(ENABLE_TEST)
|
|
test_read_format_rar_invalid1.c
|
|
test_read_format_rar_filter.c
|
|
test_read_format_rar5.c
|
|
+ test_read_format_rar5_loop_bug.c
|
|
test_read_format_raw.c
|
|
test_read_format_tar.c
|
|
test_read_format_tar_concatenated.c
|
|
diff --git a/libarchive/test/test_read_format_rar5_loop_bug.c b/libarchive/test/test_read_format_rar5_loop_bug.c
|
|
new file mode 100644
|
|
index 0000000..77dd78c
|
|
--- /dev/null
|
|
+++ b/libarchive/test/test_read_format_rar5_loop_bug.c
|
|
@@ -0,0 +1,53 @@
|
|
+/*-
|
|
+ * Copyright (c) 2026 Tim Kientzle
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
|
|
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
+ */
|
|
+#include "test.h"
|
|
+
|
|
+DEFINE_TEST(test_read_format_rar5_loop_bug)
|
|
+{
|
|
+ const char *reffile = "test_read_format_rar5_loop_bug.rar";
|
|
+ struct archive_entry *ae;
|
|
+ struct archive *a;
|
|
+ const void *buf;
|
|
+ size_t size;
|
|
+ la_int64_t offset;
|
|
+
|
|
+ extract_reference_file(reffile);
|
|
+ assert((a = archive_read_new()) != NULL);
|
|
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
|
|
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
|
|
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, reffile, 10240));
|
|
+
|
|
+ // This has just one entry
|
|
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
|
+
|
|
+ // Read blocks until the end of the entry
|
|
+ while (ARCHIVE_OK == archive_read_data_block(a, &buf, &size, &offset)) {
|
|
+ }
|
|
+
|
|
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
|
|
+
|
|
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
|
|
+ assertEqualInt(ARCHIVE_OK, archive_free(a));
|
|
+}
|
|
diff --git a/libarchive/test/test_read_format_rar5_loop_bug.rar.uu b/libarchive/test/test_read_format_rar5_loop_bug.rar.uu
|
|
new file mode 100644
|
|
index 0000000..3e47004
|
|
--- /dev/null
|
|
+++ b/libarchive/test/test_read_format_rar5_loop_bug.rar.uu
|
|
@@ -0,0 +1,189 @@
|
|
+begin 644 test_read_format_rar5_loop_bug.rar
|
|
+M4F%R(1H'`0#%&C,R`P$``)T-9%L.`@+P0`"`@`P`@`,``6'(WFP@`?\7_U/^
|
|
+M8@!.`B`H````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+M````````````````````````````````````````````````````````````
|
|
+5```````````````````Y^;*!`@4`
|
|
+`
|
|
+end
|
|
--
|
|
2.53.0
|
|
|