Conducting Mobile App Penetration Test
When to Use
- Testing mobile applications before release to identify security vulnerabilities and data protection issues
- Conducting compliance assessments against OWASP MASVS (Mobile Application Security Verification Standard) levels L1 and L2
- Evaluating the security of mobile banking, healthcare, or government applications handling sensitive data
- Testing mobile apps that interact with backend APIs to assess the end-to-end security of the mobile ecosystem
- Assessing mobile application resistance to reverse engineering, tampering, and runtime manipulation
Do not use against mobile applications without written authorization from the application owner, for distributing modified or repackaged applications, or for testing apps on the public app stores without a separate test build.
Most Often Missed & How to Confirm
- Backend API testing through the app — the mobile client is often just a thin shell; the real BOLA/BFLA/mass-assignment bugs live in the API. Bypass pinning, then test every endpoint the app calls with another user's IDs and a lower-privilege token. Don't treat "the API was tested separately" as coverage.
- Certificate pinning bypass before declaring network analysis done — if traffic won't proxy, that is pinning, not a secure app. Hook with Frida/Objection (and test second-layer pinning, e.g. Flutter/OkHttp custom trust managers) before concluding TLS is fine.
- Local artifact storage — SharedPreferences/NSUserDefaults plists, unencrypted SQLite/Realm/Core Data, Keychain/Keystore misuse, logcat output, clipboard, and screenshot caching on backgrounding. Pull the app data dir after exercising sensitive flows.
- Client-side control bypass via runtime hooking — root/jailbreak detection, biometric callbacks, and feature flags hooked to return success; these are not real security boundaries and should be demonstrated as bypassable.
- Exported components and deep links (Android) — exported activities/services/providers/receivers and custom URL schemes reached via
adb am start or crafted intents can skip auth or leak data.
- How to confirm: capture the artifact directly — a decrypted DB row containing a token, a plist with credentials, a Burp request/response showing pinning bypassed and victim data returned, or the Frida script + screenshot proving the biometric/root check was defeated. Don't conclude data-at-rest is safe until you have dumped the app sandbox after login; don't conclude pinning is enforced until you have tried both a system-CA bypass and a Frida hook.
Prerequisites
- Target application IPA (iOS) and APK (Android) files or access to download from a private distribution channel
- Rooted Android device or emulator (Genymotion, Android Studio AVD) with Frida, Objection, and Magisk installed
- Jailbroken iOS device or Corellium virtual device with Frida, Objection, and SSL Kill Switch installed
- Static analysis tools: jadx (Android decompilation), Hopper/Ghidra (iOS binary analysis), MobSF (automated scanning)
- Burp Suite Professional configured as proxy for intercepting mobile app traffic with CA certificate installed on the test device
Legal Notice: This skill is for authorized security testing and educational purposes only. Unauthorized use against systems you do not own or have written permission to test is illegal and may violate computer fraud laws.
Workflow
Step 1: Static Analysis
Analyze the application binary without executing it:
Android Static Analysis:
- Decompile the APK:
jadx -d output/ target.apk to obtain Java/Kotlin source code
- Review
AndroidManifest.xml for exported components (activities, services, receivers, content providers), permissions, and debuggable flag
- Search for hardcoded secrets:
grep -rn "api_key\|password\|secret\|token\|aws_" output/
- Identify insecure data storage patterns: SharedPreferences with sensitive data, SQLite databases without encryption, files in external storage
- Check for WebView vulnerabilities:
setJavaScriptEnabled(true), addJavascriptInterface(), and loading untrusted content
- Run MobSF automated scan:
python manage.py runserver and upload the APK for automated static analysis
iOS Static Analysis:
- Extract the IPA and locate the Mach-O binary
- Use
otool -L <binary> to list linked frameworks and identify third-party libraries
- Analyze with Ghidra or Hopper for hardcoded URLs, API endpoints, and embedded credentials
- Check Info.plist for App Transport Security (ATS) exceptions that allow insecure HTTP connections
- Review embedded entitlements for excessive capabilities
Step 2: Network Security Testing
Intercept and analyze all network communications:
- Configure Burp Suite as proxy on the test device and install the Burp CA certificate
- Exercise all application functionality while Burp captures API traffic
- SSL/TLS validation: Verify the app validates server certificates properly. If the app fails to connect through the proxy, it may implement certificate pinning.
- Certificate pinning bypass:
- Android: Use Frida script:
frida -U -f com.target.app -l ssl-pinning-bypass.js --no-pause
- iOS: Use SSL Kill Switch or Objection:
objection -g "Target App" explore --startup-command "ios sslpinning disable"
- API traffic analysis: Review all API calls for:
- Sensitive data transmitted without encryption
- Authentication tokens in URL parameters (visible in logs)
- Excessive data in API responses beyond what the UI displays
- Missing or weak authentication on API endpoints
- WebSocket and custom protocols: Check for non-HTTP communication channels that may bypass standard proxy interception
Step 3: Data Storage Analysis
Test for insecure local data storage:
Android Data Storage:
- Access app data directory:
/data/data/com.target.app/
- Check SharedPreferences XML files for stored credentials, tokens, and PII
- Examine SQLite databases:
sqlite3 /data/data/com.target.app/databases/*.db ".dump"
- Check for sensitive data in application logs:
logcat -d | grep -i "password\|token\|key"
- Verify that application data is excluded from backups:
android:allowBackup="false" in AndroidManifest.xml
- Check clipboard for sensitive data leakage
iOS Data Storage:
- Examine the Keychain for stored credentials:
objection -g "Target App" explore then ios keychain dump
- Check NSUserDefaults/plist files:
find /var/mobile/Containers/Data/Application/ -name "*.plist" -exec plutil -p {} \;
- Inspect SQLite databases and Core Data stores for unencrypted sensitive data
- Check for data leaking through screenshots (iOS captures screenshots during app backgrounding)
- Verify data protection class: sensitive files should use NSFileProtectionComplete
Step 4: Authentication and Session Management
Test mobile-specific authentication controls:
- Biometric bypass: Test if biometric authentication can be bypassed by hooking the authentication callback with Frida to always return success
- Token storage: Verify that authentication tokens are stored in the Keychain (iOS) or Android Keystore, not in SharedPreferences or files
- Session timeout: Verify that sessions expire after a reasonable idle timeout and that tokens are invalidated server-side on logout
- Root/jailbreak detection bypass: Test if the app detects rooted/jailbroken devices and if the detection can be bypassed with Frida or Magisk Hide
- Deep link abuse: Test if custom URL schemes or universal links can be used to bypass authentication or access restricted functionality
Step 5: Runtime Manipulation
Test the application's resistance to runtime attacks:
- Frida hooking: Use Frida to hook and modify application functions at runtime:
- Bypass root detection: hook the detection function to return false
- Modify return values of authentication checks
- Intercept encryption functions to capture plaintext data before encryption
- Bypass certificate pinning by hooking SSL verification
- Method swizzling (iOS): Use Frida to replace Objective-C method implementations
- Intent manipulation (Android): Send crafted intents to exported components:
adb shell am start -n com.target.app/.InternalActivity -e "user_id" "admin"
- Tampering detection: Modify the APK/IPA (add code, change resources), re-sign, and install. Verify whether the app detects tampering.
Key Concepts
| Term |
Definition |
| OWASP MASTG |
Mobile Application Security Testing Guide; comprehensive manual for mobile app security testing covering both iOS and Android platforms |
| Certificate Pinning |
A mobile security control that restricts which TLS certificates the app trusts, preventing man-in-the-middle attacks through proxy interception |
| Frida |
Dynamic instrumentation toolkit that allows injection of JavaScript into running processes to hook functions, modify behavior, and bypass security controls |
| Root/Jailbreak Detection |
Application-level checks to detect if the device has been modified to grant root access, typically blocking app usage on compromised devices |
| Android Keystore |
Hardware-backed credential storage on Android that protects cryptographic keys and secrets from extraction even on rooted devices |
| App Transport Security (ATS) |
iOS security feature that enforces HTTPS connections by default; ATS exceptions may indicate insecure network communication |
| Deep Links |
URL schemes that open specific screens within a mobile application, which may bypass normal navigation and authentication flows if not properly validated |
Tools & Systems
- Frida / Objection: Dynamic instrumentation tools for hooking functions, bypassing security controls, and manipulating application behavior at runtime
- MobSF (Mobile Security Framework): Automated static and dynamic analysis platform for Android and iOS applications
- jadx: Android decompiler that converts APK bytecode to readable Java source code for manual code review
- Burp Suite Professional: HTTP proxy for intercepting and modifying mobile app API traffic after bypassing certificate pinning
Common Scenarios
Scenario: Mobile Banking Application Security Assessment
Context: A bank is launching a new mobile banking app for iOS and Android. The app handles account viewing, fund transfers, bill payment, and check deposit. OWASP MASVS L2 compliance is required due to the financial data handled.
Approach:
- Static analysis of the Android APK reveals API endpoints, a hardcoded staging server URL, and an AWS API key in a configuration file
- Certificate pinning is implemented but bypassed with Frida SSL pinning bypass script
- API traffic analysis reveals that the balance check endpoint returns all account numbers associated with the user, not just the requested account
- Local data storage analysis finds that the app caches the last 10 transactions in an unencrypted SQLite database
- Biometric authentication bypass: Frida hook on the biometric callback always returns success, granting access without fingerprint
- Root detection is present but bypassed with Magisk Hide module, allowing the app to run on a rooted device with full data access
Pitfalls:
- Testing only on an emulator and missing hardware-specific security features (Android Keystore hardware backing, iOS Secure Enclave)
- Not testing both iOS and Android versions, as they may have different implementations and different vulnerabilities
- Ignoring the backend API security because it was "tested separately" when the mobile app may call API endpoints differently than the web app
- Failing to test certificate pinning bypass, resulting in an incomplete network analysis
Output Format
## Finding: Biometric Authentication Bypass via Frida Instrumentation
**ID**: MOB-003
**Severity**: High (CVSS 7.7)
**Platform**: Android and iOS
**OWASP MASVS**: MASVS-AUTH-2 (Biometric Authentication)
**Description**:
The mobile banking app's biometric authentication can be bypassed using Frida
dynamic instrumentation. The authentication callback function accepts a boolean
result from the biometric API, which can be hooked and forced to return true
without presenting a valid fingerprint or face scan.
**Proof of Concept (Android)**:
frida -U -f com.bank.mobileapp -l bypass-biometric.js --no-pause
// bypass-biometric.js
Java.perform(function() {
var BiometricCallback = Java.use("com.bank.mobileapp.auth.BiometricCallback");
BiometricCallback.onAuthenticationSucceeded.implementation = function(result) {
console.log("[*] Biometric bypassed");
this.onAuthenticationSucceeded(result);
};
});
**Impact**:
An attacker with physical access to an unlocked device can bypass biometric
authentication and access the victim's bank accounts, initiate transfers,
and view financial data without biometric verification.
**Remediation**:
1. Implement server-side biometric verification using Android BiometricPrompt
CryptoObject tied to a Keystore key
2. Require the biometric operation to decrypt a server-side challenge, making
client-side bypass ineffective
3. Add runtime integrity checks to detect Frida and other instrumentation frameworks
4. Implement step-up authentication for high-risk operations (transfers > threshold)
1---2name: conducting-mobile-app-penetration-test3description: Conducts penetration testing of iOS and Android mobile applications following the OWASP Mobile Application Security Testing Guide (MASTG) to identify vulnerabilities in data storage, network communication, authentication, cryptography, and platform-specific security controls. The tester performs static analysis of application binaries, dynamic analysis at runtime, and API security testing to evaluate the complete mobile attack surface. Activates for requests involving mobile app pentest, iOS security assessment, Android security testing, or OWASP MASTG assessment.4license: Apache-2.05---6# Conducting Mobile App Penetration Test
7
8## When to Use
9
10- Testing mobile applications before release to identify security vulnerabilities and data protection issues
11- Conducting compliance assessments against OWASP MASVS (Mobile Application Security Verification Standard) levels L1 and L2
12- Evaluating the security of mobile banking, healthcare, or government applications handling sensitive data
13- Testing mobile apps that interact with backend APIs to assess the end-to-end security of the mobile ecosystem
14- Assessing mobile application resistance to reverse engineering, tampering, and runtime manipulation
15
16**Do not use** against mobile applications without written authorization from the application owner, for distributing modified or repackaged applications, or for testing apps on the public app stores without a separate test build.
17
18## Most Often Missed & How to Confirm
19
20- **Backend API testing through the app** — the mobile client is often just a thin shell; the real BOLA/BFLA/mass-assignment bugs live in the API. Bypass pinning, then test every endpoint the app calls with another user's IDs and a lower-privilege token. Don't treat "the API was tested separately" as coverage.
21- **Certificate pinning bypass before declaring network analysis done** — if traffic won't proxy, that is pinning, not a secure app. Hook with Frida/Objection (and test second-layer pinning, e.g. Flutter/OkHttp custom trust managers) before concluding TLS is fine.
22- **Local artifact storage** — SharedPreferences/NSUserDefaults plists, unencrypted SQLite/Realm/Core Data, Keychain/Keystore misuse, logcat output, clipboard, and screenshot caching on backgrounding. Pull the app data dir after exercising sensitive flows.
23- **Client-side control bypass via runtime hooking** — root/jailbreak detection, biometric callbacks, and feature flags hooked to return success; these are not real security boundaries and should be demonstrated as bypassable.
24- **Exported components and deep links (Android)** — exported activities/services/providers/receivers and custom URL schemes reached via `adb am start` or crafted intents can skip auth or leak data.
25- **How to confirm**: capture the artifact directly — a decrypted DB row containing a token, a plist with credentials, a Burp request/response showing pinning bypassed and victim data returned, or the Frida script + screenshot proving the biometric/root check was defeated. Don't conclude data-at-rest is safe until you have dumped the app sandbox after login; don't conclude pinning is enforced until you have tried both a system-CA bypass and a Frida hook.
26
27## Prerequisites
28
29- Target application IPA (iOS) and APK (Android) files or access to download from a private distribution channel
30- Rooted Android device or emulator (Genymotion, Android Studio AVD) with Frida, Objection, and Magisk installed
31- Jailbroken iOS device or Corellium virtual device with Frida, Objection, and SSL Kill Switch installed
32- Static analysis tools: jadx (Android decompilation), Hopper/Ghidra (iOS binary analysis), MobSF (automated scanning)
33- Burp Suite Professional configured as proxy for intercepting mobile app traffic with CA certificate installed on the test device
34
35
36> **Legal Notice:** This skill is for authorized security testing and educational purposes only. Unauthorized use against systems you do not own or have written permission to test is illegal and may violate computer fraud laws.
37
38## Workflow
39
40### Step 1: Static Analysis
41
42Analyze the application binary without executing it:
43
44**Android Static Analysis:**
45- Decompile the APK: `jadx -d output/ target.apk` to obtain Java/Kotlin source code
46- Review `AndroidManifest.xml` for exported components (activities, services, receivers, content providers), permissions, and debuggable flag
47- Search for hardcoded secrets: `grep -rn "api_key\|password\|secret\|token\|aws_" output/`
48- Identify insecure data storage patterns: SharedPreferences with sensitive data, SQLite databases without encryption, files in external storage
49- Check for WebView vulnerabilities: `setJavaScriptEnabled(true)`, `addJavascriptInterface()`, and loading untrusted content
50- Run MobSF automated scan: `python manage.py runserver` and upload the APK for automated static analysis
51
52**iOS Static Analysis:**
53- Extract the IPA and locate the Mach-O binary
54- Use `otool -L <binary>` to list linked frameworks and identify third-party libraries
55- Analyze with Ghidra or Hopper for hardcoded URLs, API endpoints, and embedded credentials
56- Check Info.plist for App Transport Security (ATS) exceptions that allow insecure HTTP connections
57- Review embedded entitlements for excessive capabilities
58
59### Step 2: Network Security Testing
60
61Intercept and analyze all network communications:
62
63- Configure Burp Suite as proxy on the test device and install the Burp CA certificate
64- Exercise all application functionality while Burp captures API traffic
65- **SSL/TLS validation**: Verify the app validates server certificates properly. If the app fails to connect through the proxy, it may implement certificate pinning.
66- **Certificate pinning bypass**:
67 - Android: Use Frida script: `frida -U -f com.target.app -l ssl-pinning-bypass.js --no-pause`
68 - iOS: Use SSL Kill Switch or Objection: `objection -g "Target App" explore --startup-command "ios sslpinning disable"`
69- **API traffic analysis**: Review all API calls for:
70 - Sensitive data transmitted without encryption
71 - Authentication tokens in URL parameters (visible in logs)
72 - Excessive data in API responses beyond what the UI displays
73 - Missing or weak authentication on API endpoints
74- **WebSocket and custom protocols**: Check for non-HTTP communication channels that may bypass standard proxy interception
75
76### Step 3: Data Storage Analysis
77
78Test for insecure local data storage:
79
80**Android Data Storage:**
81- Access app data directory: `/data/data/com.target.app/`
82- Check SharedPreferences XML files for stored credentials, tokens, and PII
83- Examine SQLite databases: `sqlite3 /data/data/com.target.app/databases/*.db ".dump"`
84- Check for sensitive data in application logs: `logcat -d | grep -i "password\|token\|key"`
85- Verify that application data is excluded from backups: `android:allowBackup="false"` in AndroidManifest.xml
86- Check clipboard for sensitive data leakage
87
88**iOS Data Storage:**
89- Examine the Keychain for stored credentials: `objection -g "Target App" explore` then `ios keychain dump`
90- Check NSUserDefaults/plist files: `find /var/mobile/Containers/Data/Application/ -name "*.plist" -exec plutil -p {} \;`
91- Inspect SQLite databases and Core Data stores for unencrypted sensitive data
92- Check for data leaking through screenshots (iOS captures screenshots during app backgrounding)
93- Verify data protection class: sensitive files should use NSFileProtectionComplete
94
95### Step 4: Authentication and Session Management
96
97Test mobile-specific authentication controls:
98
99- **Biometric bypass**: Test if biometric authentication can be bypassed by hooking the authentication callback with Frida to always return success
100- **Token storage**: Verify that authentication tokens are stored in the Keychain (iOS) or Android Keystore, not in SharedPreferences or files
101- **Session timeout**: Verify that sessions expire after a reasonable idle timeout and that tokens are invalidated server-side on logout
102- **Root/jailbreak detection bypass**: Test if the app detects rooted/jailbroken devices and if the detection can be bypassed with Frida or Magisk Hide
103- **Deep link abuse**: Test if custom URL schemes or universal links can be used to bypass authentication or access restricted functionality
104
105### Step 5: Runtime Manipulation
106
107Test the application's resistance to runtime attacks:
108
109- **Frida hooking**: Use Frida to hook and modify application functions at runtime:
110 - Bypass root detection: hook the detection function to return false
111 - Modify return values of authentication checks
112 - Intercept encryption functions to capture plaintext data before encryption
113 - Bypass certificate pinning by hooking SSL verification
114- **Method swizzling** (iOS): Use Frida to replace Objective-C method implementations
115- **Intent manipulation** (Android): Send crafted intents to exported components: `adb shell am start -n com.target.app/.InternalActivity -e "user_id" "admin"`
116- **Tampering detection**: Modify the APK/IPA (add code, change resources), re-sign, and install. Verify whether the app detects tampering.
117
118## Key Concepts
119
120| Term | Definition |
121|------|------------|
122| **OWASP MASTG** | Mobile Application Security Testing Guide; comprehensive manual for mobile app security testing covering both iOS and Android platforms |
123| **Certificate Pinning** | A mobile security control that restricts which TLS certificates the app trusts, preventing man-in-the-middle attacks through proxy interception |
124| **Frida** | Dynamic instrumentation toolkit that allows injection of JavaScript into running processes to hook functions, modify behavior, and bypass security controls |
125| **Root/Jailbreak Detection** | Application-level checks to detect if the device has been modified to grant root access, typically blocking app usage on compromised devices |
126| **Android Keystore** | Hardware-backed credential storage on Android that protects cryptographic keys and secrets from extraction even on rooted devices |
127| **App Transport Security (ATS)** | iOS security feature that enforces HTTPS connections by default; ATS exceptions may indicate insecure network communication |
128| **Deep Links** | URL schemes that open specific screens within a mobile application, which may bypass normal navigation and authentication flows if not properly validated |
129
130## Tools & Systems
131
132- **Frida / Objection**: Dynamic instrumentation tools for hooking functions, bypassing security controls, and manipulating application behavior at runtime
133- **MobSF (Mobile Security Framework)**: Automated static and dynamic analysis platform for Android and iOS applications
134- **jadx**: Android decompiler that converts APK bytecode to readable Java source code for manual code review
135- **Burp Suite Professional**: HTTP proxy for intercepting and modifying mobile app API traffic after bypassing certificate pinning
136
137## Common Scenarios
138
139### Scenario: Mobile Banking Application Security Assessment
140
141**Context**: A bank is launching a new mobile banking app for iOS and Android. The app handles account viewing, fund transfers, bill payment, and check deposit. OWASP MASVS L2 compliance is required due to the financial data handled.
142
143**Approach**:
1441. Static analysis of the Android APK reveals API endpoints, a hardcoded staging server URL, and an AWS API key in a configuration file
1452. Certificate pinning is implemented but bypassed with Frida SSL pinning bypass script
1463. API traffic analysis reveals that the balance check endpoint returns all account numbers associated with the user, not just the requested account
1474. Local data storage analysis finds that the app caches the last 10 transactions in an unencrypted SQLite database
1485. Biometric authentication bypass: Frida hook on the biometric callback always returns success, granting access without fingerprint
1496. Root detection is present but bypassed with Magisk Hide module, allowing the app to run on a rooted device with full data access
150
151**Pitfalls**:
152- Testing only on an emulator and missing hardware-specific security features (Android Keystore hardware backing, iOS Secure Enclave)
153- Not testing both iOS and Android versions, as they may have different implementations and different vulnerabilities
154- Ignoring the backend API security because it was "tested separately" when the mobile app may call API endpoints differently than the web app
155- Failing to test certificate pinning bypass, resulting in an incomplete network analysis
156
157## Output Format
158
159```
160## Finding: Biometric Authentication Bypass via Frida Instrumentation
161
162**ID**: MOB-003
163**Severity**: High (CVSS 7.7)
164**Platform**: Android and iOS
165**OWASP MASVS**: MASVS-AUTH-2 (Biometric Authentication)
166
167**Description**:
168The mobile banking app's biometric authentication can be bypassed using Frida
169dynamic instrumentation. The authentication callback function accepts a boolean
170result from the biometric API, which can be hooked and forced to return true
171without presenting a valid fingerprint or face scan.
172
173**Proof of Concept (Android)**:
174frida -U -f com.bank.mobileapp -l bypass-biometric.js --no-pause
175
176// bypass-biometric.js
177Java.perform(function() {
178 var BiometricCallback = Java.use("com.bank.mobileapp.auth.BiometricCallback");
179 BiometricCallback.onAuthenticationSucceeded.implementation = function(result) {
180 console.log("[*] Biometric bypassed");
181 this.onAuthenticationSucceeded(result);
182 };
183});
184
185**Impact**:
186An attacker with physical access to an unlocked device can bypass biometric
187authentication and access the victim's bank accounts, initiate transfers,
188and view financial data without biometric verification.
189
190**Remediation**:
1911. Implement server-side biometric verification using Android BiometricPrompt
192 CryptoObject tied to a Keystore key
1932. Require the biometric operation to decrypt a server-side challenge, making
194 client-side bypass ineffective
1953. Add runtime integrity checks to detect Frida and other instrumentation frameworks
1964. Implement step-up authentication for high-risk operations (transfers > threshold)
197```