MASTG-TEST-0087: Make Sure That Free Security Features Are Activated
Overview¶
Static Analysis¶
You can use radare2 to check the binary security features.
Let's use the Damn Vulnerable iOS App DVIA v1 as an example. Open its main binary with radare2:
r2 DamnVulnerableIOSApp
And run the following commands:
[0x1000180c8]> i~pic,canary
canary true
pic true
[0x1000180c8]> is~release,retain
124 0x002951e0 0x1000891e0 LOCAL FUNC 0 imp.dispatch_release
149 0x00294e80 0x100088e80 LOCAL FUNC 0 imp.objc_autorelease
150 0x00294e8c 0x100088e8c LOCAL FUNC 0 imp.objc_autoreleasePoolPop
151 0x00294e98 0x100088e98 LOCAL FUNC 0 imp.objc_autoreleasePoolPush
152 0x00294ea4 0x100088ea4 LOCAL FUNC 0 imp.objc_autoreleaseReturnValue
165 0x00294f40 0x100088f40 LOCAL FUNC 0 imp.objc_release
167 0x00294f58 0x100088f58 LOCAL FUNC 0 imp.objc_retainAutorelease
168 0x00294f64 0x100088f64 LOCAL FUNC 0 imp.objc_retainAutoreleaseReturnValue
169 0x00294f70 0x100088f70 LOCAL FUNC 0 imp.objc_retainAutoreleasedReturnValue
All the features are enabled in these examples:
-
PIE (Position Independent Executable): indicated by the flag
pic true
.- Applies to all apps independently of the language used.
- Applies only to the main executable (
MH_EXECUTE
), not to dynamic libraries (MH_DYLIB
).
-
Stack Canary: indicated by the flag
canary true
.- Applies to apps containing Objective-C code.
- Not necessarily required for pure Swift apps (Swift is memory safe by design).
- Especially important for apps containing C/C++ code, as they provide direct access to memory and pointers, making them more vulnerable to buffer overflows.
-
ARC (Automatic Reference Counting): indicated by symbols such as
objc_autorelease
orobjc_retainAutorelease
.- Important for binaries containing Objective-C code.
- For binaries written purely in Swift, ARC is enabled by default.
- ARC is not relevant for binaries written purely in C/C++, as it's a memory management feature specific to Objective-C and Swift.
Dynamic Analysis¶
These checks can be performed dynamically using objection. Here's one example:
com.yourcompany.PPClient on (iPhone: 13.2.3) [usb] # ios info binary
Name Type Encrypted PIE ARC Canary Stack Exec RootSafe
-------------------- ------- ----------- ----- ----- -------- ------------ ----------
PayPal execute True True True True False False
CardinalMobile dylib False False True True False False
FraudForce dylib False False True True False False
...