|
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