summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/recipes-extended/libarchive/libarchive/CVE-2024-20696.patch115
-rw-r--r--meta/recipes-extended/libarchive/libarchive_3.7.4.bb3
2 files changed, 117 insertions, 1 deletions
diff --git a/meta/recipes-extended/libarchive/libarchive/CVE-2024-20696.patch b/meta/recipes-extended/libarchive/libarchive/CVE-2024-20696.patch
new file mode 100644
index 0000000000..e55d58d37b
--- /dev/null
+++ b/meta/recipes-extended/libarchive/libarchive/CVE-2024-20696.patch
@@ -0,0 +1,115 @@
1From eac15e252010c1189a5c0f461364dbe2cd2a68b1 Mon Sep 17 00:00:00 2001
2From: "Dustin L. Howett" <dustin@howett.net>
3Date: Thu, 9 May 2024 18:59:17 -0500
4Subject: [PATCH] rar4 reader: protect copy_from_lzss_window_to_unp() (#2172)
5
6copy_from_lzss_window_to_unp unnecessarily took an `int` parameter where
7both of its callers were holding a `size_t`.
8
9A lzss opcode chain could be constructed that resulted in a negative
10copy length, which when passed into memcpy would result in a very, very
11large positive number.
12
13Switching copy_from_lzss_window_to_unp to take a `size_t` allows it to
14properly bounds-check length.
15
16In addition, this patch also ensures that `length` is not itself larger
17than the destination buffer.
18
19CVE: CVE-2024-20696
20Upstream-Status: Backport [https://github.com/libarchive/libarchive/commit/eac15e252010c1189a5c0f461364dbe2cd2a68b1]
21
22Signed-off-by: Nitin Wankhade <nitin.wankhade@kpit.com>
23---
24
25--- a/libarchive/archive_read_support_format_rar.c 2024-04-26 14:52:59.000000000 +0530
26+++ b/libarchive/archive_read_support_format_rar.c 2024-12-12 07:35:33.287412704 +0530
27@@ -432,7 +432,7 @@ static int make_table_recurse(struct arc
28 struct huffman_table_entry *, int, int);
29 static int expand(struct archive_read *, int64_t *);
30 static int copy_from_lzss_window_to_unp(struct archive_read *, const void **,
31- int64_t, int);
32+ int64_t, size_t);
33 static const void *rar_read_ahead(struct archive_read *, size_t, ssize_t *);
34 static int parse_filter(struct archive_read *, const uint8_t *, uint16_t,
35 uint8_t);
36@@ -2060,7 +2060,7 @@ read_data_compressed(struct archive_read
37 bs = rar->unp_buffer_size - rar->unp_offset;
38 else
39 bs = (size_t)rar->bytes_uncopied;
40- ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, (int)bs);
41+ ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, bs);
42 if (ret != ARCHIVE_OK)
43 return (ret);
44 rar->offset += bs;
45@@ -2213,7 +2213,7 @@ read_data_compressed(struct archive_read
46 bs = rar->unp_buffer_size - rar->unp_offset;
47 else
48 bs = (size_t)rar->bytes_uncopied;
49- ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, (int)bs);
50+ ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, bs);
51 if (ret != ARCHIVE_OK)
52 return (ret);
53 rar->offset += bs;
54@@ -3094,11 +3094,16 @@ copy_from_lzss_window(struct archive_rea
55
56 static int
57 copy_from_lzss_window_to_unp(struct archive_read *a, const void **buffer,
58- int64_t startpos, int length)
59+ int64_t startpos, size_t length)
60 {
61 int windowoffs, firstpart;
62 struct rar *rar = (struct rar *)(a->format->data);
63
64+ if (length > rar->unp_buffer_size)
65+ {
66+ goto fatal;
67+ }
68+
69 if (!rar->unp_buffer)
70 {
71 if ((rar->unp_buffer = malloc(rar->unp_buffer_size)) == NULL)
72@@ -3110,17 +3115,17 @@ copy_from_lzss_window_to_unp(struct arch
73 }
74
75 windowoffs = lzss_offset_for_position(&rar->lzss, startpos);
76- if(windowoffs + length <= lzss_size(&rar->lzss)) {
77+ if(windowoffs + length <= (size_t)lzss_size(&rar->lzss)) {
78 memcpy(&rar->unp_buffer[rar->unp_offset], &rar->lzss.window[windowoffs],
79 length);
80- } else if (length <= lzss_size(&rar->lzss)) {
81+ } else if (length <= (size_t)lzss_size(&rar->lzss)) {
82 firstpart = lzss_size(&rar->lzss) - windowoffs;
83 if (firstpart < 0) {
84 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
85 "Bad RAR file data");
86 return (ARCHIVE_FATAL);
87 }
88- if (firstpart < length) {
89+ if ((size_t)firstpart < length) {
90 memcpy(&rar->unp_buffer[rar->unp_offset],
91 &rar->lzss.window[windowoffs], firstpart);
92 memcpy(&rar->unp_buffer[rar->unp_offset + firstpart],
93@@ -3130,9 +3135,7 @@ copy_from_lzss_window_to_unp(struct arch
94 &rar->lzss.window[windowoffs], length);
95 }
96 } else {
97- archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
98- "Bad RAR file data");
99- return (ARCHIVE_FATAL);
100+ goto fatal;
101 }
102 rar->unp_offset += length;
103 if (rar->unp_offset >= rar->unp_buffer_size)
104@@ -3140,6 +3143,11 @@ copy_from_lzss_window_to_unp(struct arch
105 else
106 *buffer = NULL;
107 return (ARCHIVE_OK);
108+
109+fatal:
110+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
111+ "Bad RAR file data");
112+ return (ARCHIVE_FATAL);
113 }
114
115 static const void *
diff --git a/meta/recipes-extended/libarchive/libarchive_3.7.4.bb b/meta/recipes-extended/libarchive/libarchive_3.7.4.bb
index 6e406611f9..80b2e49eac 100644
--- a/meta/recipes-extended/libarchive/libarchive_3.7.4.bb
+++ b/meta/recipes-extended/libarchive/libarchive_3.7.4.bb
@@ -33,7 +33,8 @@ SRC_URI = "http://libarchive.org/downloads/libarchive-${PV}.tar.gz"
33SRC_URI += "file://configurehack.patch \ 33SRC_URI += "file://configurehack.patch \
34 file://CVE-2024-48957.patch \ 34 file://CVE-2024-48957.patch \
35 file://CVE-2024-48958.patch \ 35 file://CVE-2024-48958.patch \
36 " 36 file://CVE-2024-20696.patch \
37 "
37UPSTREAM_CHECK_URI = "http://libarchive.org/" 38UPSTREAM_CHECK_URI = "http://libarchive.org/"
38 39
39SRC_URI[sha256sum] = "7875d49596286055b52439ed42f044bd8ad426aa4cc5aabd96bfe7abb971d5e8" 40SRC_URI[sha256sum] = "7875d49596286055b52439ed42f044bd8ad426aa4cc5aabd96bfe7abb971d5e8"