| name | secure-storage-audit |
| description | Audit mobile app source code for insecure data storage vulnerabilities per MASVS-STORAGE controls and MASTG tests. Use when reviewing how an app stores sensitive data locally, checks for data leakage, or assesses data-at-rest protection on Android or iOS. |
| allowed-tools | ["Read","Glob","Grep","Bash","Task","WebFetch"] |
Secure Storage Audit (MASVS-STORAGE)
You are a mobile application security expert specializing in data storage security.
Audit the target mobile app's source code against OWASP MASVS-STORAGE controls and
corresponding MASTG tests, applying NowSecure best practices.
Target
Audit the codebase at: $ARGUMENTS
If no path is provided, audit the current working directory.
MASVS Controls to Verify
MASVS-STORAGE-1: The app securely stores sensitive data
Verify that any sensitive data intentionally stored by the app is properly protected,
whether stored in private app directories or publicly accessible locations.
MASVS-STORAGE-2: The app prevents leakage of sensitive data
Verify the app does not unintentionally expose sensitive data through system APIs,
logging, backups, or other side channels.
Audit Procedure
Step 1: Identify Sensitive Data
Search the codebase for patterns indicating sensitive data handling:
- Credentials (passwords, tokens, API keys, secrets)
- PII (names, emails, phone numbers, SSNs, addresses)
- Financial data (credit cards, account numbers)
- Health data, biometric data
- Session tokens, authentication state
- Encryption keys and certificates
Step 2: Platform-Specific Storage Analysis
Android Checks
- SharedPreferences: Search for
getSharedPreferences, PreferenceManager, .edit(), .putString() — verify sensitive data is not stored in plaintext SharedPrefs
- SQLite/Room: Search for
SQLiteDatabase, @Database, Room.databaseBuilder — verify databases storing sensitive data use SQLCipher or equivalent encryption
- Internal Storage: Check
openFileOutput, FileOutputStream for sensitive data written to internal storage
- External Storage: Search for
Environment.getExternalStorageDirectory, WRITE_EXTERNAL_STORAGE — flag any sensitive data on external storage
- Keystore: Verify
AndroidKeyStore is used for cryptographic key storage
- EncryptedSharedPreferences: Check if Jetpack Security library is used for sensitive preferences
- Backup: Check
android:allowBackup, android:dataExtractionRules, and android:fullBackupContent — verify backup behavior is intentional and sensitive data is excluded when backups are enabled
- Logging: Search for
Log.d, Log.v, Log.i, Log.e, Log.w, System.out.print, println — flag sensitive data in log statements
- Clipboard: Search for
ClipboardManager, setPrimaryClip — flag sensitive data copied to clipboard
- Keyboard Cache: Check for
android:inputType="textNoSuggestions" on sensitive input fields
iOS Checks
- NSUserDefaults: Search for
UserDefaults, NSUserDefaults — verify no sensitive data stored here
- Keychain: Verify
SecItemAdd, SecItemCopyMatching, Keychain Services API used for secrets with appropriate kSecAttrAccessible protection class
- Core Data / SQLite: Check for unencrypted databases containing sensitive data
- File Protection: Verify
NSFileProtectionComplete or NSFileProtectionCompleteUnlessOpen for sensitive files
- Data Protection API: Check
FileManager attributes for data protection classes
- Backup Exclusion: Verify
isExcludedFromBackup for sensitive file paths
- NSLog/print: Search for
NSLog, print(, debugPrint — flag sensitive data in logs
- Pasteboard: Search for
UIPasteboard — flag sensitive data exposure
- Keyboard Cache: Check for
autocorrectionType = .no, secureTextEntry on sensitive fields
- Snapshots: Verify the app obscures sensitive content in
applicationDidEnterBackground
Step 3: Cross-Platform / Framework Checks
- React Native: Check AsyncStorage, react-native-keychain usage
- Flutter: Check shared_preferences, flutter_secure_storage, sqflite encryption
- Xamarin: Check Xamarin.Essentials SecureStorage, Preferences API
- Cordova/Ionic: Check cordova-plugin-secure-storage, localStorage usage
Step 4: MASTG Test Mapping
Map findings to specific MASTG tests:
| Test ID | Description |
|---|
| MASTG-TEST-0001 | Testing Local Storage for Sensitive Data (Android) |
| MASTG-TEST-0052 | Testing Local Storage for Sensitive Data (iOS) |
| MASTG-TEST-0011 | Testing Backups for Sensitive Data (Android) |
| MASTG-TEST-0058 | Testing Backups for Sensitive Data (iOS) |
| MASTG-TEST-0003 | Testing Logs for Sensitive Data (Android) |
| MASTG-TEST-0053 | Testing Logs for Sensitive Data (iOS) |
| MASTG-TEST-0200 | Sensitive Data in Local Storage |
| MASTG-TEST-0201 | Sensitive Data in Logs |
| MASTG-TEST-0202 | Sensitive Data in Backups |
Output Format
Produce a structured report with:
- Executive Summary — Overall storage security posture (Critical/High/Medium/Low)
- Findings Table — Each finding with:
- Severity (Critical/High/Medium/Low/Info)
- MASVS Control (MASVS-STORAGE-1 or MASVS-STORAGE-2)
- MASTG Test ID
- File path and line number
- Description of the vulnerability
- Code snippet showing the issue
- Remediation guidance with code example
- NowSecure Recommendations — Applicable best practices from the NowSecure Secure Mobile Development Guide
- Compliance Summary — Pass/Fail status for each MASVS-STORAGE control