OSDN Git Service

Added phdr upper bound checks to ElfObject.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 5 Oct 2017 20:01:32 +0000 (20:01 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 5 Oct 2017 20:01:32 +0000 (20:01 +0000)
Ensure the program_headers call will fail correctly if the program
headers are larger than the underlying buffer.

Patch by Parker Thompson!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315012 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELF.h
test/Object/Inputs/invalid-phdr.elf [new file with mode: 0644]
test/Object/elf-invalid-phdr.test [new file with mode: 0644]

index 670c0bb..c3bfa7b 100644 (file)
@@ -144,6 +144,10 @@ public:
   Expected<Elf_Phdr_Range> program_headers() const {
     if (getHeader()->e_phnum && getHeader()->e_phentsize != sizeof(Elf_Phdr))
       return createError("invalid e_phentsize");
+    if (getHeader()->e_phoff +
+            (getHeader()->e_phnum * getHeader()->e_phentsize) >
+        getBufSize())
+      return createError("program headers longer than binary");
     auto *Begin =
         reinterpret_cast<const Elf_Phdr *>(base() + getHeader()->e_phoff);
     return makeArrayRef(Begin, Begin + getHeader()->e_phnum);
diff --git a/test/Object/Inputs/invalid-phdr.elf b/test/Object/Inputs/invalid-phdr.elf
new file mode 100644 (file)
index 0000000..8a5cc53
Binary files /dev/null and b/test/Object/Inputs/invalid-phdr.elf differ
diff --git a/test/Object/elf-invalid-phdr.test b/test/Object/elf-invalid-phdr.test
new file mode 100644 (file)
index 0000000..aef1772
--- /dev/null
@@ -0,0 +1,26 @@
+# invalid-phdr.elf is generated by creating a simple elf file with yaml2obj:
+# !ELF
+# FileHeader:
+#   Class:           ELFCLASS64
+#   Data:            ELFDATA2LSB
+#   Type:            ET_EXEC
+#   Machine:         EM_X86_64
+# Sections:
+#   - Name:            .text
+#     Type:            SHT_PROGBITS
+#     Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+#     AddressAlign:    0x0000000000001000
+#     Content:         "00000000"
+# ProgramHeaders:
+#   - Type: PT_LOAD
+#     Flags: [ PF_X, PF_R ]
+#     VAddr: 0xAAAA1000
+#     PAddr: 0xFFFF1000
+#     Sections:
+#       - Section: .text
+#
+# Then editing the e_phoff in with a hexeditor to set it to 0xffffff
+RUN: not llvm-objdump -private-headers %p/Inputs/invalid-phdr.elf 2>&1 \
+RUN:         | FileCheck %s
+
+CHECK: LLVM ERROR: Invalid data was encountered while parsing the file