Prerequisites
- Target system, dependencies and environment configured.
Usage
Purpose
An iOS app ships as an IPA — an archive containing a compiled binary, resources, and configuration. Static analysis reads all of it without running the app: hardcoded secrets, insecure settings, exposed URLs, and whether the binary has the protections it should. iOS is more locked down than Android (encrypted binaries, stronger platform controls), which changes the analysis, but the goals are the same. This skill covers statically assessing an iOS app.
When to use it
The opening pass on any iOS assessment, alongside the Android equivalent. It's static and safe; dynamic analysis and traffic inspection come after. Analyse only apps you're authorised to test.
Procedure
- Unpack the IPA. It's a zip — extract it to get the
.app bundle (the binary, Info.plist, resources, embedded provisioning profile):unzip app.ipa # -> Payload/AppName.app/
- Read
Info.plist — the app's configuration. It reveals a lot: URL schemes (deep-link surface), App Transport Security settings (NSAppTransportSecurity — is TLS enforced, or is NSAllowsArbitraryLoads set, disabling it?), permissions, and background modes.
- Extract strings and hunt for secrets. Like Android, strings leak API keys, endpoints, and credentials:
strings AppName # then grep for keys, URLs, secrets
Note: App Store binaries are encrypted (FairPlay); a binary pulled from the App Store may need decryption (from a jailbroken device) before strings are readable. A binary from the developer or a test build is usually unencrypted.
- Inspect the binary's protections with
otool — check for stack canaries, PIE/ASLR, and whether it's a release build:otool -hv AppName # header, PIE flag
otool -Iv AppName | grep stack_chk # stack canaries
- Recover class/method structure —
class-dump (on an unencrypted binary) or a disassembler (Hopper/Ghidra) reveals the Objective-C/Swift class interfaces, exposing the app's logic and sensitive method names.
- Check data-storage and crypto usage in the code/resources — insecure storage of secrets (see that skill), weak or hardcoded crypto, and disabled security features.
- Run an automated pass (MobSF) for breadth and a checklist score, then verify findings by hand.
Cheatsheet
IPA = zip (binary + Info.plist + resources). static = read without running.
iOS more locked down (encrypted App Store binaries, stronger platform) — goals same as Android
1. UNPACK: unzip app.ipa -> Payload/App.app/
2. Info.plist (config, high value):
URL schemes (deep-link surface) | NSAppTransportSecurity (NSAllowsArbitraryLoads = TLS disabled!)
| permissions | background modes
3. STRINGS -> secrets/keys/URLs (App Store binary = FairPlay-encrypted -> decrypt first from JB device;
dev/test build usually unencrypted)
4. BINARY PROTECTIONS (otool): PIE/ASLR (otool -hv), stack canaries (otool -Iv | grep stack_chk)
5. CLASS STRUCTURE: class-dump (unencrypted) / Hopper / Ghidra -> ObjC/Swift interfaces + method names
6. data storage (insecure secrets) + crypto (weak/hardcoded/disabled features)
7. MobSF automated pass (breadth + score) -> verify by hand
Reading the analysis
NSAllowsArbitraryLoads: true in Info.plist = App Transport Security is disabled, so the app can make cleartext HTTP connections — a finding, since it undermines the TLS enforcement iOS gives by default. Check it explicitly.
- A live secret in strings = a direct leak the app ships to every device; the same as Android — anything in the binary is extractable. High value.
- URL schemes in Info.plist = the deep-link attack surface (ties into the deep-link skill); note them for how the app handles inbound links.
- Missing binary protections (no PIE, no stack canaries) = weaker exploitation resistance; a hardening gap, though release builds usually have them.
- An encrypted App Store binary = strings/class-dump won't work until decrypted (from a jailbroken device); a dev/test build is easier. Recognise which you have.
- Class/method structure recovered = the app's logic and sensitive methods exposed, guiding deeper analysis and the dynamic phase.
- MobSF findings = leads to verify, not verdicts; confirm each in the binary/resources.
Pitfalls
- Expecting to read an encrypted App Store binary directly. FairPlay encryption means strings/class-dump fail until the binary is decrypted (from a jailbroken device). Use a dev/test build where possible, or decrypt first.
- Skipping Info.plist. It holds high-value config — ATS/TLS settings, URL schemes, permissions. The fastest findings are often here (like the Android manifest).
- Missing
NSAllowsArbitraryLoads. It silently disables the platform's TLS enforcement; easy to overlook, important to flag.
- Treating iOS like Android. The binary format, encryption, and platform controls differ; the tools (otool, class-dump) and the encrypted-binary reality are iOS-specific.
- Trusting the automated score. MobSF flags possibilities; verify in the actual binary and resources.
References
- OWASP Mobile Application Security Testing Guide (MASTG) — iOS static analysis
- OWASP MASVS; otool, class-dump, Hopper/Ghidra, MobSF documentation
- The android-static-analysis, insecure-data-storage, and deep-link-and-ipc-abuse skills
- Apple App Transport Security documentation
Inputs
- Relevant source code, logs, network traces, or system specifications.
Outputs
- Analysis findings, security audit report, or generated code artifacts.
1---2name: ios-static-analysis3description: Use when you have an iOS app (IPA) and want to read it statically for secrets, weak configuration, and binary protection gaps — without running it.4---5678## Prerequisites9- Target system, dependencies and environment configured.1011## Usage12### Purpose1314An iOS app ships as an IPA — an archive containing a compiled binary, resources, and configuration. Static analysis reads all of it without running the app: hardcoded secrets, insecure settings, exposed URLs, and whether the binary has the protections it should. iOS is more locked down than Android (encrypted binaries, stronger platform controls), which changes the analysis, but the goals are the same. This skill covers statically assessing an iOS app.1516### When to use it1718The opening pass on any iOS assessment, alongside the Android equivalent. It's static and safe; dynamic analysis and traffic inspection come after. Analyse only apps you're authorised to test.1920### Procedure21221. **Unpack the IPA.** It's a zip — extract it to get the `.app` bundle (the binary, `Info.plist`, resources, embedded provisioning profile):23 ```24 unzip app.ipa # -> Payload/AppName.app/25 ```262. **Read `Info.plist` — the app's configuration.** It reveals a lot: URL schemes (deep-link surface), App Transport Security settings (`NSAppTransportSecurity` — is TLS enforced, or is `NSAllowsArbitraryLoads` set, disabling it?), permissions, and background modes.273. **Extract strings and hunt for secrets.** Like Android, strings leak API keys, endpoints, and credentials:28 ```29 strings AppName # then grep for keys, URLs, secrets30 ```31 Note: App Store binaries are encrypted (FairPlay); a binary pulled from the App Store may need decryption (from a jailbroken device) before strings are readable. A binary from the developer or a test build is usually unencrypted.324. **Inspect the binary's protections** with `otool` — check for stack canaries, PIE/ASLR, and whether it's a release build:33 ```34 otool -hv AppName # header, PIE flag35 otool -Iv AppName | grep stack_chk # stack canaries36 ```375. **Recover class/method structure** — `class-dump` (on an unencrypted binary) or a disassembler (Hopper/Ghidra) reveals the Objective-C/Swift class interfaces, exposing the app's logic and sensitive method names.386. **Check data-storage and crypto usage** in the code/resources — insecure storage of secrets (see that skill), weak or hardcoded crypto, and disabled security features.397. **Run an automated pass** (MobSF) for breadth and a checklist score, then verify findings by hand.4041### Cheatsheet4243```44IPA = zip (binary + Info.plist + resources). static = read without running.45 iOS more locked down (encrypted App Store binaries, stronger platform) — goals same as Android46471. UNPACK: unzip app.ipa -> Payload/App.app/482. Info.plist (config, high value):49 URL schemes (deep-link surface) | NSAppTransportSecurity (NSAllowsArbitraryLoads = TLS disabled!)50 | permissions | background modes513. STRINGS -> secrets/keys/URLs (App Store binary = FairPlay-encrypted -> decrypt first from JB device;52 dev/test build usually unencrypted)534. BINARY PROTECTIONS (otool): PIE/ASLR (otool -hv), stack canaries (otool -Iv | grep stack_chk)545. CLASS STRUCTURE: class-dump (unencrypted) / Hopper / Ghidra -> ObjC/Swift interfaces + method names556. data storage (insecure secrets) + crypto (weak/hardcoded/disabled features)567. MobSF automated pass (breadth + score) -> verify by hand57```5859### Reading the analysis6061- **`NSAllowsArbitraryLoads: true` in Info.plist** = App Transport Security is disabled, so the app can make cleartext HTTP connections — a finding, since it undermines the TLS enforcement iOS gives by default. Check it explicitly.62- **A live secret in strings** = a direct leak the app ships to every device; the same as Android — anything in the binary is extractable. High value.63- **URL schemes in Info.plist** = the deep-link attack surface (ties into the deep-link skill); note them for how the app handles inbound links.64- **Missing binary protections** (no PIE, no stack canaries) = weaker exploitation resistance; a hardening gap, though release builds usually have them.65- **An encrypted App Store binary** = strings/class-dump won't work until decrypted (from a jailbroken device); a dev/test build is easier. Recognise which you have.66- **Class/method structure recovered** = the app's logic and sensitive methods exposed, guiding deeper analysis and the dynamic phase.67- **MobSF findings** = leads to verify, not verdicts; confirm each in the binary/resources.6869### Pitfalls7071- **Expecting to read an encrypted App Store binary directly.** FairPlay encryption means strings/class-dump fail until the binary is decrypted (from a jailbroken device). Use a dev/test build where possible, or decrypt first.72- **Skipping Info.plist.** It holds high-value config — ATS/TLS settings, URL schemes, permissions. The fastest findings are often here (like the Android manifest).73- **Missing `NSAllowsArbitraryLoads`.** It silently disables the platform's TLS enforcement; easy to overlook, important to flag.74- **Treating iOS like Android.** The binary format, encryption, and platform controls differ; the tools (otool, class-dump) and the encrypted-binary reality are iOS-specific.75- **Trusting the automated score.** MobSF flags possibilities; verify in the actual binary and resources.7677### References7879- OWASP Mobile Application Security Testing Guide (MASTG) — iOS static analysis80- OWASP MASVS; otool, class-dump, Hopper/Ghidra, MobSF documentation81- The android-static-analysis, insecure-data-storage, and deep-link-and-ipc-abuse skills82- Apple App Transport Security documentation8384## Inputs85- Relevant source code, logs, network traces, or system specifications.8687## Outputs88- Analysis findings, security audit report, or generated code artifacts.