|
5 | 5 | '''
|
6 | 6 | Test script for security-check.py
|
7 | 7 | '''
|
| 8 | +import lief #type:ignore |
8 | 9 | import os
|
9 | 10 | import subprocess
|
10 | 11 | from typing import List
|
@@ -41,25 +42,49 @@ def call_security_check(cc, source, executable, options):
|
41 | 42 | p = subprocess.run(['./contrib/devtools/security-check.py',executable], stdout=subprocess.PIPE, universal_newlines=True)
|
42 | 43 | return (p.returncode, p.stdout.rstrip())
|
43 | 44 |
|
| 45 | +def get_arch(cc, source, executable): |
| 46 | + subprocess.run([*cc, source, '-o', executable], check=True) |
| 47 | + binary = lief.parse(executable) |
| 48 | + arch = binary.abstract.header.architecture |
| 49 | + os.remove(executable) |
| 50 | + return arch |
| 51 | + |
44 | 52 | class TestSecurityChecks(unittest.TestCase):
|
45 | 53 | def test_ELF(self):
|
46 | 54 | source = 'test1.c'
|
47 | 55 | executable = 'test1'
|
48 | 56 | cc = determine_wellknown_cmd('CC', 'gcc')
|
49 | 57 | write_testcode(source)
|
| 58 | + arch = get_arch(cc, source, executable) |
50 | 59 |
|
51 |
| - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-fno-stack-protector','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
52 |
| - (1, executable+': failed PIE NX RELRO Canary')) |
53 |
| - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fno-stack-protector','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
54 |
| - (1, executable+': failed PIE RELRO Canary')) |
55 |
| - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
56 |
| - (1, executable+': failed PIE RELRO')) |
57 |
| - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-pie','-fPIE', '-Wl,-z,separate-code']), |
58 |
| - (1, executable+': failed RELRO')) |
59 |
| - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,noseparate-code']), |
60 |
| - (1, executable+': failed separate_code')) |
61 |
| - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code']), |
62 |
| - (0, '')) |
| 60 | + if arch == lief.ARCHITECTURES.X86: |
| 61 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-fno-stack-protector','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
| 62 | + (1, executable+': failed PIE NX RELRO Canary CONTROL_FLOW')) |
| 63 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fno-stack-protector','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
| 64 | + (1, executable+': failed PIE RELRO Canary CONTROL_FLOW')) |
| 65 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
| 66 | + (1, executable+': failed PIE RELRO CONTROL_FLOW')) |
| 67 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-pie','-fPIE', '-Wl,-z,separate-code']), |
| 68 | + (1, executable+': failed RELRO CONTROL_FLOW')) |
| 69 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,noseparate-code']), |
| 70 | + (1, executable+': failed separate_code CONTROL_FLOW')) |
| 71 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code']), |
| 72 | + (1, executable+': failed CONTROL_FLOW')) |
| 73 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code', '-fcf-protection=full']), |
| 74 | + (0, '')) |
| 75 | + else: |
| 76 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-fno-stack-protector','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
| 77 | + (1, executable+': failed PIE NX RELRO Canary')) |
| 78 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fno-stack-protector','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
| 79 | + (1, executable+': failed PIE RELRO Canary')) |
| 80 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), |
| 81 | + (1, executable+': failed PIE RELRO')) |
| 82 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-pie','-fPIE', '-Wl,-z,separate-code']), |
| 83 | + (1, executable+': failed RELRO')) |
| 84 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,noseparate-code']), |
| 85 | + (1, executable+': failed separate_code')) |
| 86 | + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code']), |
| 87 | + (0, '')) |
63 | 88 |
|
64 | 89 | clean_files(source, executable)
|
65 | 90 |
|
|
0 commit comments