Merge pull request #6165 from MarcZX10/codex/unwrap-self-truncated-elf

fix(tools): reject unsupported inner ELF encodings
This commit is contained in:
Dean authored and GitHub committed 2026-10-21 04:46:15 +13:00
commit f0d8e6924d
2 files changed
+13

No files matched your search

+11
View File
@@ -300,6 +300,17 @@ class UnwrapTest(unittest.TestCase):
self.assertNotIn("Traceback", result.stderr)
self.assertEqual(output.read_bytes(), b"previous output")
def test_unsupported_inner_elf_class_and_byte_order_are_refused(self):
for offset, value in ((4, 1), (5, 2)):
with self.subTest(offset=offset, value=value):
container = bytearray(build_container(default_segments(), default_records(), default_payloads()))
container[ELF_HEADER_OFFSET + offset] = value
result, output = self.convert(bytes(container))
self.assertEqual(result.returncode, 2)
self.assertIn("inner ELF is not 64-bit little-endian", result.stderr)
self.assertNotIn("Traceback", result.stderr)
self.assertFalse(output.exists())
def test_a_container_whose_load_segments_look_encrypted_is_refused(self):
random_like = bytes(range(256)) * 4
segments = [(PT_LOAD, 1, 0x1234, 0x0, 0x400, PAGE), (PT_LOAD, 4, 0x1500, 0x1000, 0x400, PAGE)]
+2
View File
@@ -108,6 +108,8 @@ def parse_elf(data):
if inner + 0x40 > len(data):
raise Refused("inner ELF header is truncated")
header = bytearray(data[inner:inner + 0x40])
if header[4] != 2 or header[5] != 1:
raise Refused("inner ELF is not 64-bit little-endian")
program_offset = struct.unpack_from("<Q", header, 0x20)[0]
entry_size = struct.unpack_from("<H", header, 0x36)[0]
count = struct.unpack_from("<H", header, 0x38)[0]