Preparation
- Read iOS Basics to understand the iOS security model, sandboxing, Keychain, and data protection classes
- Prepare your test environment (jailbroken device or Corellium, Frida/Objection installed)
- Obtain the IPA file and install it on the test device
- Perform initial analysis using MobSF static scan
Data Storage
Check all storage locations immediately after installing, after exercising all features, and after logging out and back in with a different account.
- Plist files — check
Library/Preferences/<bundleID>.plistfor sensitive information stored viaNSUserDefaults - Core Data (SQLite) — inspect at
Library/Application Support/for unencrypted sensitive data - YapDatabases (SQLite) — same directory as Core Data
- Firebase — check for misconfigured Realtime Database unauthenticated access
- Realm databases — find with
find ./ -name "*.realm*", inspect with Realm Studio - Couchbase Lite — check
Library/Application Support/ - Binary cookies — inspect
Library/Cookies/cookies.binarycookieswithios cookies get - Cache data — check
Library/Caches/<BundleID>/Cache.db(WebKit and NSURLSession caches) - Automatic snapshots — check
Library/Caches/Snapshots/for sensitive screen captures - Keychain — dump with
ios keychain dump(Objection) or Keychain-Dumper on jailbroken device - In summary: search for all sensitive information saved in the filesystem
Keyboards & Cache
- Does the application allow custom keyboards? Third-party keyboards may log keystrokes.
- Check keyboard cache files at
Library/Keyboard/{locale}-dynamic-text.datfor sensitive data in autocomplete suggestions - Sensitive input fields should set
autocorrectionType = UITextAutocorrectionTypeNoandsecureTextEntry = YES
Logs
- Check if sensitive information is being logged via
NSLog,NSAssert,fprintf, custom logging frameworks - Monitor device logs:
- Connect via Xcode: Window → Devices and Simulators → Open Console
Backups
- Backups may include sensitive app data — create an iTunes/Finder backup and analyze it
- Check
Manifest.plistforIsEncryptedkey - Test whether backup modification can bypass security controls (e.g., remove a PIN stored in a plist, restore, and observe bypass)
- Critical files should use
NSURLIsExcludedFromBackupKeyto exclude from backups
Application Memory
- Check for sensitive information in memory (passwords, tokens, PII)
- Dump memory with Objection (
memory dump all) or Fridump: - Use r2frida for real-time memory analysis without dumping:
Broken Cryptography
- Check for hardcoded passwords or keys used for encryption
- Check for deprecated/weak algorithms: RC4, MD4, MD5, SHA1
- Use Objection to monitor crypto libraries:
- Scan binary for weak hash functions:
Local Authentication
- Identify if local authentication is used (
LocalAuthentication.framework, keychain biometrics) - If using
LocalAuthentication.framework, try Objection biometrics bypass: - If using keychain-based auth, create a custom Frida script to hook
evaluatePolicy - Detect framework usage:
Sensitive Functionality via IPC
Custom URI Handlers / Deep Links
- Check if the app registers any URL scheme (check
Info.plistforCFBundleURLTypes) - Check if the app receives sensitive data via the custom scheme that could be intercepted by another app registering the same scheme
- Check if the app validates and sanitizes input from custom schemes
- Check if sensitive actions are callable from anywhere via the scheme
Universal Links
- Check if the app registers universal links (
apple-app-site-associationfile) - Verify input validation on data received via universal links
- Check the
apple-app-site-associationfile for path patterns
UIPasteboard
- Check if the app copies sensitive data to the general pasteboard
- Monitor pasteboard for sensitive data exposure
WebViews
- Identify which WebView types are used:
UIWebView(deprecated),WKWebView,SFSafariViewController - Check status of
javaScriptEnabled,JavaScriptCanOpenWindowsAutomatically,hasOnlySecureContent - Check if WebView can access local files with
file://(allowFileAccessFromFileURLs,allowUniversalAccessFromFileURLs) - Check if JavaScript can access native methods (
JSContext,postMessage)
Network Communication
- Perform MitM and search for web vulnerabilities in traffic
- Check if the hostname of the certificate is verified
- Check and attempt to bypass Certificate Pinning:
Miscellaneous
- Check for automatic patching/hot-updating mechanisms that bypass App Store review
- Review third-party libraries for known CVEs
- Check binary security properties: