blob: 45c637967b517ce835f2e1e6aea3b2599f7b72db [file] [log] [blame]
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001From cf93e9c2cf8f8b2566f8fc86e961592b51b5980d Mon Sep 17 00:00:00 2001
2From: Alan Modra <amodra@gmail.com>
3Date: Thu, 20 Sep 2018 18:23:17 +0930
4Subject: [PATCH] PR23685, buffer overflow
5
6 PR 23685
7 * peXXigen.c (pe_print_edata): Correct export address table
8 overflow checks. Check dataoff against section size too.
9
10CVE: CVE-2018-17360
11Upstream-Status: Backport
12Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com>
13---
14 bfd/ChangeLog | 6 ++++++
15 bfd/peXXigen.c | 11 ++++++-----
16 2 files changed, 12 insertions(+), 5 deletions(-)
17
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080018--- a/bfd/peXXigen.c
19+++ b/bfd/peXXigen.c
Brad Bishop977dc1a2019-02-06 16:01:43 -050020@@ -1661,7 +1661,8 @@ pe_print_edata (bfd * abfd, void * vfile
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080021
22 dataoff = addr - section->vma;
23 datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
24- if (datasize > section->size - dataoff)
25+ if (dataoff > section->size
26+ || datasize > section->size - dataoff)
27 {
28 fprintf (file,
29 _("\nThere is an export table in %s, but it does not fit into that section\n"),
Brad Bishop977dc1a2019-02-06 16:01:43 -050030@@ -1778,11 +1779,11 @@ pe_print_edata (bfd * abfd, void * vfile
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080031 edt.base);
32
33 /* PR 17512: Handle corrupt PE binaries. */
34- if (edt.eat_addr + (edt.num_functions * 4) - adj >= datasize
35+ /* PR 17512 file: 140-165018-0.004. */
36+ if (edt.eat_addr - adj >= datasize
37 /* PR 17512: file: 092b1829 */
38- || (edt.num_functions * 4) < edt.num_functions
39- /* PR 17512 file: 140-165018-0.004. */
40- || data + edt.eat_addr - adj < data)
41+ || (edt.num_functions + 1) * 4 < edt.num_functions
42+ || edt.eat_addr - adj + (edt.num_functions + 1) * 4 > datasize)
43 fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
44 (long) edt.eat_addr,
45 (long) edt.num_functions);