mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-05 14:06:27 -05:00
contrib: add macOS fixup_chains check to security-check
Followup to #27676.
This commit is contained in:
parent
3dca683cb7
commit
7f96638723
2 changed files with 21 additions and 10 deletions
|
@ -158,6 +158,12 @@ def check_MACHO_NOUNDEFS(binary) -> bool:
|
||||||
'''
|
'''
|
||||||
return binary.header.has(lief.MachO.HEADER_FLAGS.NOUNDEFS)
|
return binary.header.has(lief.MachO.HEADER_FLAGS.NOUNDEFS)
|
||||||
|
|
||||||
|
def check_MACHO_FIXUP_CHAINS(binary) -> bool:
|
||||||
|
'''
|
||||||
|
Check for use of chained fixups.
|
||||||
|
'''
|
||||||
|
return binary.has_dyld_chained_fixups
|
||||||
|
|
||||||
def check_MACHO_Canary(binary) -> bool:
|
def check_MACHO_Canary(binary) -> bool:
|
||||||
'''
|
'''
|
||||||
Check for use of stack canary
|
Check for use of stack canary
|
||||||
|
@ -208,6 +214,7 @@ BASE_PE = [
|
||||||
BASE_MACHO = [
|
BASE_MACHO = [
|
||||||
('NOUNDEFS', check_MACHO_NOUNDEFS),
|
('NOUNDEFS', check_MACHO_NOUNDEFS),
|
||||||
('Canary', check_MACHO_Canary),
|
('Canary', check_MACHO_Canary),
|
||||||
|
('FIXUP_CHAINS', check_MACHO_FIXUP_CHAINS),
|
||||||
]
|
]
|
||||||
|
|
||||||
CHECKS = {
|
CHECKS = {
|
||||||
|
|
|
@ -119,27 +119,31 @@ class TestSecurityChecks(unittest.TestCase):
|
||||||
arch = get_arch(cc, source, executable)
|
arch = get_arch(cc, source, executable)
|
||||||
|
|
||||||
if arch == lief.ARCHITECTURES.X86:
|
if arch == lief.ARCHITECTURES.X86:
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-Wl,-allow_stack_execute','-fno-stack-protector']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-Wl,-allow_stack_execute','-fno-stack-protector', '-Wl,-no_fixup_chains']),
|
||||||
|
(1, executable+': failed NOUNDEFS Canary FIXUP_CHAINS PIE NX CONTROL_FLOW'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-Wl,-allow_stack_execute','-fno-stack-protector', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed NOUNDEFS Canary PIE NX CONTROL_FLOW'))
|
(1, executable+': failed NOUNDEFS Canary PIE NX CONTROL_FLOW'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-Wl,-allow_stack_execute','-fstack-protector-all']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-Wl,-allow_stack_execute','-fstack-protector-all', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed NOUNDEFS PIE NX CONTROL_FLOW'))
|
(1, executable+': failed NOUNDEFS PIE NX CONTROL_FLOW'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-fstack-protector-all']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-fstack-protector-all', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed NOUNDEFS PIE CONTROL_FLOW'))
|
(1, executable+': failed NOUNDEFS PIE CONTROL_FLOW'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-fstack-protector-all']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-fstack-protector-all', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed PIE CONTROL_FLOW'))
|
(1, executable+': failed PIE CONTROL_FLOW'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-bind_at_load','-fstack-protector-all']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-bind_at_load','-fstack-protector-all', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed PIE CONTROL_FLOW'))
|
(1, executable+': failed PIE CONTROL_FLOW'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-bind_at_load','-fstack-protector-all', '-fcf-protection=full']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-bind_at_load','-fstack-protector-all', '-fcf-protection=full', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed PIE'))
|
(1, executable+': failed PIE'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-pie','-Wl,-bind_at_load','-fstack-protector-all', '-fcf-protection=full']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-pie','-Wl,-bind_at_load','-fstack-protector-all', '-fcf-protection=full', '-Wl,-fixup_chains']),
|
||||||
(0, ''))
|
(0, ''))
|
||||||
else:
|
else:
|
||||||
# arm64 darwin doesn't support non-PIE binaries, control flow or executable stacks
|
# arm64 darwin doesn't support non-PIE binaries, control flow or executable stacks
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-no_fixup_chains']),
|
||||||
|
(1, executable+': failed NOUNDEFS Canary FIXUP_CHAINS'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed NOUNDEFS Canary'))
|
(1, executable+': failed NOUNDEFS Canary'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fstack-protector-all']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fstack-protector-all', '-Wl,-fixup_chains']),
|
||||||
(1, executable+': failed NOUNDEFS'))
|
(1, executable+': failed NOUNDEFS'))
|
||||||
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-bind_at_load','-fstack-protector-all']),
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-bind_at_load','-fstack-protector-all', '-Wl,-fixup_chains']),
|
||||||
(0, ''))
|
(0, ''))
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue