-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Port MASTG-TEST-0082: Testing whether the App is Debuggable (ios) (by @appknox) #3097
base: master
Are you sure you want to change the base?
Conversation
|
||
## Steps | ||
|
||
1. Run a static analysis using @MASTG-TOOL-0111 to extract entitlements from the binary to check the value of the `get-task-allow` key and is set to `true`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Prefer to use the technique instead of specific tools in TESTS
https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0111/
Also, let's do the evaluation (check for true, in this case) later.
1. Run a static analysis using @MASTG-TOOL-0111 to extract entitlements from the binary to check the value of the `get-task-allow` key and is set to `true`. | |
1. Use @MASTG-TECH-0111 to extract entitlements from the binary and obtain the value of the `get-task-allow` key. |
## Steps | ||
|
||
1. Run a static analysis using @MASTG-TOOL-0111 to extract entitlements from the binary to check the value of the `get-task-allow` key and is set to `true`. | ||
2. Run a [dynamic analysis](../../../techniques/ios/MASTG-TECH-0084.md) using @MASTG-TOOL-0057. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The static analysis step should be enough. However, you still can refer to this TECH. See overview
|
||
## Observation | ||
|
||
The entitlement get-task-allow is false, and anti-reverse engineering measures prevent debugger attachment attempts. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The entitlement get-task-allow is false, and anti-reverse engineering measures prevent debugger attachment attempts. | |
The output contains the value of the `get-task-allow` entitlement. |
|
||
## Evaluation | ||
|
||
The test fails as the entitlement get-task-allow is true, allowing debugger attachment. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test fails as the entitlement get-task-allow is true, allowing debugger attachment. | |
The test fails if the `get-task-allow` entitlement is `true`. |
|
||
## Overview | ||
|
||
The test evaluates whether an iOS application is configured to allow debugging. If an app is debuggable, attackers can leverage debugging tools to reverse-engineer the application, analyse its runtime behaviour, and potentially compromise sensitive data or functionality. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test evaluates whether an iOS application is configured to allow debugging. If an app is debuggable, attackers can leverage debugging tools to reverse-engineer the application, analyse its runtime behaviour, and potentially compromise sensitive data or functionality. | |
The test evaluates whether an iOS application is configured to allow debugging. If an app is debuggable, attackers can leverage debugging tools (see @MASTG-TECH-0084) to analyse the runtime behaviour of the app, and potentially compromise sensitive data or functionality. |
First round of review done. Please remember to include a demo using https://github.com/cpholguera/MASTestApp-iOS Thanks a lot @jeel38! |
@cpholguera Please Review it |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for contribution. I added a few comments in code.
One more thingy, your demo covers 2 cases:
- detects if an app is debuggable
- detects if an app is currently being debugged
Can you split these two cases into two distinct demos and make sure this subtle difference is clear for the reader?
print("📄 Info.plist Path: \(infoPath)") | ||
|
||
if let infoDict = NSDictionary(contentsOfFile: infoPath) { | ||
print("📋 Info.plist Contents: \(infoDict)") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we print Info.plist
? Does it contain info about a debuggable capability?
|
||
if data.count > 0 { | ||
if let content = String(data: data, encoding: .ascii), | ||
content.contains("get-task-allow") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am afraid this method might cause false positives. For example, if there is a third-party code in the binary that also contains get-task-allow
string, this would trigger a false positive. It's also a bit slow to search through the whole binary, no? Can you optimise it?
|
||
// Method 4: Process Info | ||
print("\nMethod 4: Checking Process Info") | ||
let isDebugger = isDebuggerAttached() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you make such a function for each method? It would clean up the code a bit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need this file at all? If I'm not wrong I think we just need the modified entitlements file, so that we can build the app using it, and the reversed version.
Here's the original: https://github.com/cpholguera/MASTestApp-iOS/blob/main/entitlements.plist
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reducing this demo to only one method is also ok
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove
@@ -0,0 +1 @@ | |||
r2 -q -i debuggable.r2 -A MASTestApp > output.asm |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
r2 -q -i debuggable.r2 -A MASTestApp > output.asm | |
rabin2 -OC MASTestApp | grep -A1 get-task-allow |
search for get-task-allow | ||
271 0x00011987 0x100011987 401 402 ascii <?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n\t<key>application-identifier</key>\n\t<string>AYRP7NNB54.org.owasp.mastestapp.MASTestApp-iOS</string>\n\t<key>com.apple.developer.team-identifier</key>\n\t<string>AYRP7NNB54</string>\n\t<key>get-task-allow</key>\n\t<true/>\n</dict>\n</plist>\n | ||
273 0x00011baa 0x100011baa 14 15 ascii get-task-allow |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
search for get-task-allow | |
271 0x00011987 0x100011987 401 402 ascii <?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n\t<key>application-identifier</key>\n\t<string>AYRP7NNB54.org.owasp.mastestapp.MASTestApp-iOS</string>\n\t<key>com.apple.developer.team-identifier</key>\n\t<string>AYRP7NNB54</string>\n\t<key>get-task-allow</key>\n\t<true/>\n</dict>\n</plist>\n | |
273 0x00011baa 0x100011baa 14 15 ascii get-task-allow | |
<key>get-task-allow</key> | |
<true/> |
|
||
## Steps | ||
|
||
1. Use @MASTG-TECH-0111 to extract entitlements from the binary and obtain the value of the `get-task-allow` key. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1. Use @MASTG-TECH-0111 to extract entitlements from the binary and obtain the value of the `get-task-allow` key. | |
1. Use @MASTG-TECH-0111 to extract entitlements from the binary | |
2. Search for the `get-task-allow` key. |
|
||
The code snippet below shows sample code that verify the application is debuggable. | ||
|
||
{{ MastgTest.swift }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of this we need the modified entitlements file, so that we can build the app using it, and the reversed version.
Here's the original: https://github.com/cpholguera/MASTestApp-iOS/blob/main/entitlements.plist
{{ MastgTest.swift }} | |
{{ entitlements.plist # entitlements_reversed.plist }} |
2. Open the app binary with @MASTG-TOOL-0073 with the `-i` option to run this script. | ||
|
||
{{ debuggable.r2 }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
2. Open the app binary with @MASTG-TOOL-0073 with the `-i` option to run this script. | |
{{ debuggable.r2 }} | |
2. Run @MASTG-TOOL-0129 with the `-OC` options to obtain the entitlements file. |
|
||
### Evaluation | ||
|
||
The test passes because debugging detection checks are implemented in the app. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test passes because debugging detection checks are implemented in the app. | |
The test fails because the app is debuggable due to the `get-task-allow` entitlement being present. |
@@ -0,0 +1,32 @@ | |||
--- | |||
platform: ios | |||
title: Verify App is Debuggable with r2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
title: Verify App is Debuggable with r2 | |
title: Debuggable Entitlement Enabled in the entitlements.plist with rabin2 |
@@ -0,0 +1,23 @@ | |||
--- | |||
platform: ios | |||
title: Testing Whether the App is Debuggable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
title: Testing Whether the App is Debuggable | |
title: Debuggable Entitlement Enabled in the entitlements.plist |
title: Testing Whether the App is Debuggable | ||
id: MASTG-TEST-0x82 | ||
type: [static, dynamic] | ||
weakness: MASWE-0101 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MASWE-0067: Debuggable Flag Not Disabled
weakness: MASWE-0101 | |
weakness: MASWE-0067 |
@jeel38 we're almost there, thanks!! |
@jeel38 any news? Thanks |
closes #3010