ios-image-triage · git:20260504.2a64374 · 2026-05-04 · sha256 b6b5634020f8e68a

ios-image-triage git:20260504.2a64374A

Immutable. This exact content is served forever at /api/v1/blob/b6b5634020f8e68a.

---
name: ios-image-triage
description: Structured first-pass triage of an unknown iOS acquisition — iTunes/Finder backup or full-filesystem extraction. Use when handed an iOS image and asked "what's on this phone and does it look compromised?" — establishes ground truth before any targeted hunt.
---

# iOS Image Triage

## When to Use
- First contact with an unfamiliar iOS backup or FFS
- Incident scoping before deep-diving (spyware hunt, comms analysis, etc.)
- Quick posture check on a device handed over for review

## Goal
Answer these in order: what device / iOS, what apps, what profiles, what grants, any STIX hits, any obvious anomalies.

## Procedure

### 1. Identify the source
Run `mvt_status` then `mvt_info`. Record:
- Device name, model (product type), serial / UDID
- iOS build + major version
- Acquisition timestamp (last backup date for backups; FFS capture time if present)
- Encryption status (backups only)

All subsequent tools take `source_kind` — set it once based on this (`backup` for iTunes/Finder, `fs` for FFS).

If the backup is encrypted, run `mvt_decrypt_backup` into a working directory and use that as `source` for everything that follows.

### 2. Installed apps
`mvt_installed_apps`. Look for:
- Bundle IDs you don't recognize — look up on App Store, flag blanks
- Apps installed very recently relative to the compromise window
- Enterprise-signed / sideloaded apps outside the App Store (`AppleInternal`, `Enterprise`, `Developer` marker in metadata)
- Known-bad bundle IDs (Hermit, Predator loaders — see Amnesty STIX)
- Duplicates with near-identical names (lookalike icons / typosquats)

### 3. Configuration profiles (high signal)
`mvt_configuration_profiles`. *Every* installed profile deserves a sentence of explanation:
- Corporate MDM from a known vendor (Jamf, Intune, VMware Workspace ONE) → typically benign; verify issuer
- Apple Beta profile / carrier profile → typically benign
- Anything else — especially self-signed, recently installed, granting VPN / Root-CA / Supervision → investigate
- Rogue profiles are the #1 iOS persistence + MitM vector for opportunistic attackers

### 4. TCC grants
`mvt_tcc`. Score every non-Apple grant:
- Microphone / Camera / Screen Recording to a non-AV / non-communication app → suspicious
- Full-Disk-Access equivalents on iOS (Files, Photos-All) to a recently-installed app → suspicious
- Location (Always) to anything not obviously location-aware → suspicious
- Accessibility (Switch Control, AssistiveTouch) unexpectedly enabled → investigate; AX grants are a classic mobile stalkerware footprint

### 5. Cellular / data usage
`mvt_datausage`. Red flags:
- Processes with non-zero bytes that don't match any bundle in `mvt_installed_apps`
- Short-lived rows (`ZFIRSTTIMESTAMP` and `ZTIMESTAMP` near-identical) for unknown processes
- Large WWAN egress from background daemons
Cross-reference PIDs / process names against your installed-apps list.

### 6. Broad STIX sweep
If you have an Amnesty / Citizen Lab / vendor STIX file:
`mvt_check_iocs(source, iocs="/path/to/stix.json")`

This runs every module with IoC correlation. Read the `_detected` entries first — any hit warrants a focused `spyware-hunt`.

If no STIX file is to hand, download the latest Amnesty feed or skip this step and come back to it.

### 7. Shutdown log (FFS only — very high signal)
`mvt_shutdown_log`. The iOS shutdown log keeps a per-process record of processes that delayed shutdown. Multiple Pegasus campaigns were first surfaced by anomalous shutdown-log entries (Kaspersky's Triangulation writeup, Amnesty's 2021 reports).

- Unknown / short-named / numeric-named processes in shutdown_log = high priority
- Entries pointing at paths outside `/usr`, `/System`, `/private/var/containers` = high priority

### 8. Record findings
Triage table columns: module, record / identifier, evidence pointer (file or DB row), verdict (benign / suspicious / confirmed), skill to run next.

## Heuristic Priorities
If you only have time for three things: (a) configuration_profiles + tcc, (b) datausage cross-referenced against installed_apps, (c) `mvt_check_iocs` with a current STIX. Those catch ~80% of iOS compromises outside of sophisticated zero-click spyware (which needs the full `spyware-hunt` playbook).

## Common Pitfalls
- Trusting `mvt_installed_apps` alone — uninstalled or hidden apps can still have left-over `datausage` / `tcc` rows
- Assuming a profile is benign because it's signed — self-signed enterprise profiles are trivial to generate
- Skipping `mvt_info` — without device context every finding downstream is ambiguous
- Running a broad STIX sweep on an encrypted backup before decrypting (modules will produce empty or partial results)
- Treating an empty `shutdown_log` as "all clear" — the log rotates; absence of evidence isn't evidence of absence