61 lines
2.4 KiB
61 lines
2.4 KiB
9 years ago
|
#!/usr/bin/python2
|
||
|
'''
|
||
|
Test script for security-check.py
|
||
|
'''
|
||
|
from __future__ import division,print_function
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import unittest
|
||
|
|
||
|
def write_testcode(filename):
|
||
|
with open(filename, 'w') as f:
|
||
|
f.write('''
|
||
|
#include <stdio.h>
|
||
|
int main()
|
||
|
{
|
||
|
printf("the quick brown fox jumps over the lazy god\\n");
|
||
|
return 0;
|
||
|
}
|
||
|
''')
|
||
|
|
||
|
def call_security_check(cc, source, executable, options):
|
||
|
subprocess.check_call([cc,source,'-o',executable] + options)
|
||
|
p = subprocess.Popen(['./security-check.py',executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||
|
(stdout, stderr) = p.communicate()
|
||
|
return (p.returncode, stdout.rstrip())
|
||
|
|
||
|
class TestSecurityChecks(unittest.TestCase):
|
||
|
def test_ELF(self):
|
||
|
source = 'test1.c'
|
||
|
executable = 'test1'
|
||
|
cc = 'gcc'
|
||
|
write_testcode(source)
|
||
|
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-fno-stack-protector','-Wl,-znorelro']),
|
||
|
(1, executable+': failed PIE NX RELRO Canary'))
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fno-stack-protector','-Wl,-znorelro']),
|
||
|
(1, executable+': failed PIE RELRO Canary'))
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro']),
|
||
|
(1, executable+': failed PIE RELRO'))
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-pie','-fPIE']),
|
||
|
(1, executable+': failed RELRO'))
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE']),
|
||
|
(0, ''))
|
||
|
|
||
|
def test_PE(self):
|
||
|
source = 'test1.c'
|
||
|
executable = 'test1.exe'
|
||
|
cc = 'i686-w64-mingw32-gcc'
|
||
|
write_testcode(source)
|
||
|
|
||
|
self.assertEqual(call_security_check(cc, source, executable, []),
|
||
|
(1, executable+': failed PIE NX'))
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat']),
|
||
|
(1, executable+': failed PIE'))
|
||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--dynamicbase']),
|
||
|
(0, ''))
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|
||
|
|