Common Mobile Vulnerabilities
The same handful of storage, crypto, and network mistakes show up in almost every app.
What you will learn
- -Recognize insecure storage patterns and where secrets leak
- -Spot weak crypto and cleartext traffic in real apps
- -Map findings to the MASVS categories that structure a mobile test
Most mobile findings are not exotic. Pull apart ten apps and you will see the same short list of mistakes, because the platform makes the wrong thing easy and the right thing take extra work. Learn this list and you can walk into an unfamiliar app and know where to look first.
Insecure data storage is the reliable winner. Auth in Android shared_prefs, session data in iOS NSUserDefaults, an unencrypted SQLite database full of PII, an key sitting in strings.xml or hardcoded in a decompiled class. The device protects this data right up until the phone is rooted, jailbroken, or backed up, and then it is all . Any that must survive on the device belongs in the Keychain or Android Keystore, not a preferences file.
$strings -n 8 classes.dex | grep -iE 'api[_-]?key|secret|password|token|Bearer'Weak cryptography is the next tier, and it is usually self-inflicted. in ECB mode leaks structure because identical plaintext blocks produce identical . A hardcoded key or a static IV means the is decorative, because the secret you needed to protect the data is sitting right there in the binary. or unsalted -1 for is broken. Homegrown "encryption" that is really XOR against a fixed string is the classic. When you decompile, grep for Cipher.getInstance and read what mode and key it uses.
Cleartext traffic covers two failures. The obvious one is plaintext , which Android now blocks by default via network_security_config and iOS blocks via ATS, so its presence means someone added an exception. The subtler one is with validation disabled: a custom TrustManager that accepts every , or NSAllowsArbitraryLoads flipped on. That app talks but will happily trust your 's certificate, which is a man-in-the-middle waiting to happen. Absent or trivially bypassable certificate pinning lives in this bucket too.
The of the usual suspects:
- Sensitive data in . Tokens and full request bodies dumped to logcat, readable by any app with the right permission on older Android or by anyone with
adb. - Backups left on.
android:allowBackup="true"letsadb backupwalk out with the app's private files. - Insecure IPC. Exported Android components and iOS schemes that accept attacker input without validation.
- -side trust. Auth, entitlement, or "premium enabled" decisions made in the app instead of the .
The MASVS view
The OWASP Mobile Application Security Verification is how you turn that scattered list into a structured test. Instead of "check for bugs," MASVS gives you named groups, and every finding above lands in one of them.
- MASVS-STORAGE what the app keeps on the device and how it protects it.
- MASVS-CRYPTO key management and correct use of cryptographic primitives.
- MASVS- transport security and certificate validation.
- MASVS-AUTH and , enforced server-side.
- MASVS-PLATFORM safe use of IPC, WebViews, and platform APIs.
- MASVS-CODE dependency hygiene and handling of platform data.
- MASVS-RESILIENCE anti-tampering and , which are hardening, not primary controls.
The paired MASTG (Mobile Application Security Testing Guide) gives you the concrete test cases under each group, and it is the reference to keep open during an assessment. One thing to keep straight: MASVS-RESILIENCE last on purpose. detection and obfuscation slow an attacker down, but they never substitute for actually protecting the data. An app that pins its cert and detects root but stores the token in plaintext failed the test that mattered.
Verifying these issues means reading another party's stored data and intercepting their traffic, which is authorized only on your own builds or an app named in your . Reproduce them on deliberately vulnerable apps like DIVA, InsecureBankv2, iGoat, or the OWASP MAS test apps before you touch anything you were hired to assess.
An app uses HTTPS but a custom TrustManager returns without throwing on any certificate. What is the practical impact?