summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/elfutils/files/CVE-2021-33294.patch
blob: 0500a4cf831cef9bfb0078b41d22913ca3efa9e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
From 480b6fa3662ba8ffeee274bf0d37423413c01e55 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
Date: Wed, 3 Mar 2021 21:40:53 +0100
Subject: [PATCH] readelf: Sanity check verneed and verdef offsets in handle_symtab.

We are going through vna_next, vn_next and vd_next in a while loop.
Make sure that all offsets are sane. We don't want things to wrap
around so we go in cycles.

https://sourceware.org/bugzilla/show_bug.cgi?id=27501

Signed-off-by: Mark Wielaard <mark@klomp.org>

Upstream-Status: Backport [https://sourceware.org/git/?p=elfutils.git;a=commit;h=480b6fa3662ba8ffeee274bf0d37423413c01e55]
CVE: CVE-2021-33294
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
---
 src/ChangeLog |  5 +++++
 src/readelf.c | 10 +++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 6af977e..f0d9e39 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2021-03-03  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (handle_symtab): Sanity check verneed vna_next,
+	vn_next and verdef vd_next offsets.
+
 2019-11-26  Mark Wielaard  <mark@klomp.org>
 
 	* Makefile.am (BUILD_STATIC): Add libraries needed for libdw.
diff --git a/src/readelf.c b/src/readelf.c
index 5994615..ab7a1c1 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -2550,7 +2550,9 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
 						 &vernaux_mem);
 		      while (vernaux != NULL
 			     && vernaux->vna_other != *versym
-			     && vernaux->vna_next != 0)
+			     && vernaux->vna_next != 0
+			     && (verneed_data->d_size - vna_offset
+				 >= vernaux->vna_next))
 			{
 			  /* Update the offset.  */
 			  vna_offset += vernaux->vna_next;
@@ -2567,6 +2569,9 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
 			/* Found it.  */
 			break;
 
+		      if (verneed_data->d_size - vn_offset < verneed->vn_next)
+			break;
+
 		      vn_offset += verneed->vn_next;
 		      verneed = (verneed->vn_next == 0
 				 ? NULL
@@ -2602,6 +2607,9 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
 			/* Found the definition.  */
 			break;
 
+		      if (verdef_data->d_size - vd_offset < verdef->vd_next)
+			break;
+
 		      vd_offset += verdef->vd_next;
 		      verdef = (verdef->vd_next == 0
 				? NULL
-- 
2.25.1