Lab Technical Report LAB-TR-0012
What the iOS Unified Log Says About Device Security Controls: Most Leave a Trace, Few Record a Change
Lab Technical Report, preprint, not peer reviewed
27 October 2026
Abstract
Examiners ask whether an iPhone's security controls, such as Lockdown Mode, a VPN or privacy permissions, were on, changed or enforced, but which controls leave a trace in the unified log of a sysdiagnose, and of what kind, has not been measured. We inventoried 45 controls from Apple's documentation and searched two decoded logs of research iPhones (iOS 27.0: 42.6 million records, 11.8 days; iOS 26.6: 25.6 million, 32.5 days), classifying each trace as a state change, an enforcement decision or a restated status. Thirty-one controls left a trace (12 strong, 19 partial) and 14 none. State changes were rare: a passcode-change notification appeared twice, and Lockdown Mode was only ever restated as off. Redaction withholds URLs, permission requesters and biometric results; in the iOS 27.0 log, 1,235,369 of 1,238,152 connection lines that name an endpoint give it only as a hash tag. Markers on literal message text in a named process separate events from repetition and look-alikes: one tunnel wrote 3,752 on-demand start lines against 306 status changes, and a subsystem first read as device management was a weather widget's configuration fetch. On these logs, a control's state is a last known value with a validity window.
CCS Concepts • Applied computing → System forensics; • Security and privacy → Mobile platform security.
Keywords iOS forensics, unified logging, sysdiagnose, security controls, Lockdown Mode, TCC, redaction, log markers, iOS 27
ACM Reference FormatDaniel Addai, Sanders Larweh Tetteh, Selorm Adjabeng, and Kingsley Albert Egyir. 2026. What the iOS Unified Log Says About Device Security Controls: Most Leave a Trace, Few Record a Change. Lab Technical Report LAB-TR-0012, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0012/
1 Introduction
iOS offers its user, and a device administrator, a set of security controls: Lockdown Mode, Stolen Device Protection, the passcode and the lock state, privacy permissions, configuration profiles and device management, VPN and content filters, among others [13]. In an investigation the question is often whether one of them was on at a given time, whether it changed, or whether it blocked something. A sysdiagnose, the diagnostic archive an iPhone writes on request, carries the unified log of the last days, and the log is written by the daemons that implement these controls. Whether a control's state can be read from that log is therefore a practical question with no measured answer.
A motivating example. Lockdown Mode is turned on by the user and needs a restart [10], so one might expect a line that records the change. In the iOS 27.0 log examined here, the Lockdown Mode daemon wrote “Lockdown Mode is off” twice, the telephony daemon told the baseband eight times that the mode was false, and the messaging daemon skipped a Lockdown-only check 32 times because the mode was not enabled (Figure 1). The iOS 26.6 log holds one line from the daemon and two from the telephony daemon. In the three sysdiagnoses of two devices listed in Table 2, all 11 lines of a Photos flag read NO. No line in any of these logs records the mode being switched, and none has the “on” form. The log therefore supports “off when these lines were written”; it says nothing about the hours between them, and nothing about how an “on” state would be written.
The problem. The example is one instance of the question this report addresses: for each security control of a current iPhone, does the unified log carry a trace, is that trace a change, a decision or a restated status, and which part of it does the platform redact? Without an answer, an examiner cannot tell an absent line from an absent event, and a search that keys on a subsystem name or on a repeated line can report events that did not occur. We ask three research questions.
- RQ1 (Coverage). Which documented security controls leave a trace in the unified log, and of what kind: state change, enforcement decision or periodic status?
- RQ2 (Redaction). What do the traces withhold?
- RQ3 (Extraction). Can markers on literal message text collect the traces without counting repetition or look-alike lines as events?
Contributions. This report makes four contributions.
- An inventory of 45 security controls drawn from Apple's documentation, each with the strength and the kind of its trace as measured on two decoded unified logs (Sections 3.1 and 5.1, Table 4).
- Counts of the marker lines per control in both logs, showing that explicit state changes are rare, that most traces restate a status, and that several controls were seen only in their negative form (Section 5.2, Figure 4).
- A map of what redaction withholds, including network endpoints printed as hash tags in nearly every connection line (Section 5.3, Table 5).
- Marker-based extraction for nine trace families, with the design rules that keep it from over-counting, results on real and public-corpus sysdiagnoses, and the look-alike lines it must exclude (Sections 3.4, 5.4 and 5.5, Tables 6 and 7).
Scope. The study describes what two decoded unified logs of unmanaged research iPhones contain, plus marker counts on further sysdiagnoses (Table 2). No control was switched on purpose, so the absence of a trace means that none was written in these windows, not that the control cannot leave one. Counts depend on the devices' use and on the log windows, and are not compared as rates between the releases. Section 7 states the limits.
Section 2 describes the log and positions the work, Section 3 the inventory, the classification and the markers, Section 4 the evidence, Section 5 the results, and Section 6 what they mean for reading a control's state from the log.
2 Background and Related Work
This section describes the unified log as evidence, the documentation of the controls, and the tools that read the log, and states where this work stands.
2.1 The unified log in a sysdiagnose
Apple platforms write one system-wide log. Each record carries a time, the writing process, an optional subsystem and category chosen by the developer, a level, and a message built from a format string and its arguments. Besides ordinary log records the store holds activities, signposts, and statedumps, records in which a process writes out a block of its current state. A sysdiagnose includes the log archive of the device, and decoders turn its tracev3 files back into records [23]. Dynamic arguments are private by default: unless the developer marks an argument public, the stored record holds <private> in its place, and the value cannot be recovered from the archive [16]. How far back the log reaches depends on volume and on the device; one practitioner account notes that many entries expire within hours and that a sysdiagnose mainly covers the days before it was taken [6].
2.2 Documentation of the controls
Apple's Platform Security guide [13] describes the hardware, system, data-protection, app, service, network and device-management controls of its platforms. Support articles describe single controls from the user's side, among them Lockdown Mode [10], Stolen Device Protection [11], iCloud Private Relay [9], Communication Safety [8], the App Privacy Report [7], iCloud data protection [15] and alerts about unwanted trackers [17]. The enterprise notes for iOS 27 add new status reporting, including Lockdown Mode status, and declarative VPN, DNS and relay settings [18]; Memory Integrity Enforcement is described in a security-research post [19]; and the security content of iOS 27 names components such as TCC, Sandbox, Safe Browsing, Managed Configuration and NetworkExtension [12]. None of these documents says what a control writes to the log.
2.3 Tools that read the log
The open-source decoder of Mandiant [23] converts log archives into records; its release 0.7.0 added the decompression that iOS 27 archives need [24], [1]. The Sysdiagnose Analysis Framework [21] converts the log and many other sysdiagnose files, and its analysers cover applications, processes, managed-configuration state and Wi-Fi, among others; none summarises security-control traces. MVT's sysdiagnose command records device details and leaves forensic checks to plug-in modules [25]. iLEAPP [20] imports a decoded log into a table and runs artifacts that select lines by literal markers; before the work reported here it had artifacts for, among others, biometric matches, unlock events and USB connections, and none for Lockdown Mode, VPN sessions, privacy-permission caches or capture sessions. Practitioner writing describes the log's value and its short retention [6]. Work on tool testing argues that forensic tools need validation against known data [22].
Position of this work. In the sources above we found no list of which security controls write to the log, no classification of the kind of trace, and no measurement of what redaction leaves readable for these controls. This report adds an inventory measured on two logs and markers built from the measured text. The inventory and the trace classes are new as far as we found; the redaction behaviour itself is documented by Apple [16], and what is new is where it falls for each control; the markers are engineering.
3 Method
The work has four steps: an inventory of controls from documents, a harvest of candidate records from each log, a classification of each control's trace, and markers built from the classified text (Figure 2).
3.1 Control inventory
We listed every control that the Platform Security guide [13] names in its contents and that a user, an administrator or the system can switch, enforce or report, and added controls described in the support articles, the enterprise notes and the security content of iOS 27 (Section 2.2). Two entries rest on observation only: a hardened web-content process seen in the iOS 27.0 log, and tracker-domain matching by the DNS daemon. A control mentioned only in secondary press coverage was left out. The result is 45 controls (Table 4).
3.2 Harvest and masked templates
For each control we wrote down candidate subsystems, processes and search terms, from the control's name, the daemons the documentation or the process list suggests, and the text of related records. One pass over each decoded log collected every record from 55 candidate subsystems, about 60 processes and about 80 terms: 3.9 million records from the iOS 27.0 log and 1.5 million from the iOS 26.6 log. Each message was reduced to a masked template, in which numbers, hexadecimal values, UUIDs and non-Apple reverse-DNS identifiers are replaced by tags, giving about 200,000 and 68,000 distinct templates. We read the templates per control and wrote, for each trace we kept, a predicate on process, subsystem, category and literal message text that reproduces its count.
3.3 Trace strength and trace kind
Each control received a strength and a kind. The strength is strong when the log carries the control's own state or decisions, partial when it carries only a status proxy or one aspect of the control, and none when no usable line was found in either log. The kind is the strongest of three classes seen for the control, in the order state change, enforcement, status (Table 1).
| Kind | Written when | Example |
|---|---|---|
| State change (S) | The state changes; the line names the change | Passcode-change notification; new keybag state; VPN status transition; profile installed or removed |
| Enforcement (E) | The control decides | Privacy-permission result; sandbox denial; revocation result; Safe Browsing check |
| Status (T) | A daemon starts or is queried and restates the state | “Lockdown Mode is off”; “No MDM installation found” |
Where a template encodes a value as a digit, masking hides it; those values (for example a passcode set-state) were re-read from the raw text.
3.4 Marker-based extraction
A marker is a literal piece of message text, within a named process or subsystem, that selects one kind of line. The markers were implemented as artifacts of iLEAPP [20], which imports a decoded log into a table, copies the lines that match any marker into a second table in a collection stage, and lets each artifact filter that second table; the network artifacts read the first table directly, because their lines number over a million. Five rules govern the markers.
- Literal text in a named source. A marker is a message prefix or phrase measured in Section 3.2, never a subsystem or process name alone.
- Values as logged. Fields are copied as written; a
<private>value stays<private>, a hash tag is not resolved, and no meaning is assigned that the line does not state. - Summaries for repeated lines. Where one state is restated many times, the artifact groups lines by process and masked template and gives the first and last time and the count, instead of one row per line.
- Statedumps by their title. Statedump records carry no subsystem or category, so they are selected by the first line of the message (
title: ...) and their body is parsed per entry. - Tests that fail when a marker is lost. Every family except the URL opens is tested through the real chain on a synthetic
log showexport with decoy lines under other subsystems; where a family uses the collection stage, a test fails if a marker that an artifact reads is missing from it.
Nine families of markers were built: URL opens [2]; camera and microphone capture sessions, with streaming power events and recording-indicator lines [3]; the TCC authorization cache and the location manager state, both statedumps [4]; a Lockdown Mode flag printed by Photos, passkey record loads, background shortcut actions and the VPN connectivity state [5]; and network connections with NetworkExtension session events (Artifact Availability).
3.5 Recount
For this report, every count from the two logs that appears in Section 5 was recomputed with a separate script that opens each store read-only and runs the predicates of Section 3.2 as SQL, and the network endpoint forms were recounted with the endpoint pattern of the network artifact. Counts on the other sysdiagnoses come from the recorded runs of the artifacts (Section 4).
4 Evidence and Setup
Table 2 lists the evidence. The two decoded logs come from two iPhones of different hardware generations, both unmanaged and in ordinary use, with no known compromise and no switching of controls for the study. They are the iOS 27.0 and one iOS 26.6 archive of LAB-TR-0011 [1]. The iOS 27.0 archive was decoded with the open-source decoder version 0.7.0 and the iOS 26.6 archive with version 0.6.0 [23], [24]; both runs completed with no rejected record, and the logs themselves mark 968 and 386 loss events, records dropped on the device before collection. The decoded records were held in one relational store per log and queried read-only.
| Class | n | iOS | Used for |
|---|---|---|---|
| Decoded unified logs of research iPhones (newer and earlier hardware generation) | 2 | 27.0 (42,588,594 records, 11.8 days); 26.6 (25,598,286 records, 32.5 days) | Inventory, trace counts, redaction, recount (Sec. 5.1 to 5.3) |
| Sysdiagnoses of research iPhones, two devices | 3 | 26.6 (2 captures of one device), 26.6.2 (1) | Lockdown flag, passkey, shortcut and VPN-state markers [5] |
| Sysdiagnoses of a public test corpus | 2 | 26.5.2, 26.6 | Capture-session and statedump markers [3], [4] |
| Sysdiagnoses of research iPhones used for the URL-open markers | 2 | 26.2, 26.6 | URL-open markers [2] |
Synthetic log show exports | 4 | n/a | Marker tests (all families except URL opens) |
The iOS 26.6 device of the second row is the device of the decoded iOS 26.6 log, and both sysdiagnoses of the fourth row come from the Lab’s research corpus, the iOS 26.6 one from the same device. The network markers were also run on the full iOS 27.0 log and on bounded windows of both decoded logs.
Reference for the counts. The stored data are the reference. A count states how many records of a given form the log holds; it is checked by a second count made by other means (SQL against the stores, or a separate script that applies the marker conditions to the decoder's output), not by knowledge of what the user did. We did not observe the devices in use.
5 Results
Most controls leave some trace, few leave a change, and much of what would identify an actor or a target is redacted. Table 3 answers each research question; the subsections give the evidence.
| Question | Answer | Evidence |
|---|---|---|
| RQ1 Coverage | 31 of 45 controls left a trace (12 strong, 19 partial); 14 left none in these windows. The strongest kind is a state change for 12 controls, an enforcement decision for 7 and a restated status for 12. Several controls were seen only in their negative or idle form. | Sec. 5.1 and 5.2, Figures 1, 3 and 4, Table 4 |
| RQ2 Redaction | URLs, permission requesters in request contexts, biometric request bodies, pairing queries, tracker events, attestation parameters and certificate host names are <private>; endpoints of connection lines are hash tags in 1,235,369 of 1,238,152 lines. Service names, operation names, setting names and state words stay readable. | Sec. 5.3, Table 5 |
| RQ3 Extraction | Yes, when a marker is literal text in a named process and repeated lines are summarised. Without that, one tunnel's 3,752 on-demand start lines, a biometric daemon's camera sessions, a weather widget's configuration fetch and capture-time integrity notices would be read as events. | Sec. 5.4 and 5.5, Figure 5, Tables 6 and 7 |
5.1 Which controls leave a trace (RQ1)
Table 4 gives the inventory with the strength and kind of each trace, and Figure 3 summarises it. Twelve controls have a strong trace: biometrics, passcode change, lock state, code integrity, the sandbox, privacy permissions (TCC), software update, device management, configuration profiles, Safe Browsing, certificate revocation and VPN sessions. Nineteen have a partial trace, typically a status line or one aspect: Lockdown Mode, Stolen Device Protection availability, Activation Lock eligibility, Developer Mode, Private Relay on the telephony side. Fourteen have none in these windows, among them USB Restricted Mode, secure boot, the App Privacy Report (whose accesses are kept in files), Memory Integrity Enforcement, Background Security Improvements (only settings-interface lines, 124 in the iOS 27.0 log), Advanced Data Protection, pairing decisions, Wallet and the keychain.
| # | Control | Source | Trace | Kind | # | Control | Source | Trace | Kind |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Lockdown Mode | [10], [13], [18] | partial | T | 24 | Screen Time, content restrictions, web filter | [13] | partial | S |
| 2 | Stolen Device Protection | [11] | partial | T | 25 | Advanced Data Protection for iCloud | [15] | none | – |
| 3 | Secure Enclave, Face ID and Touch ID | [13] | strong | E | 26 | iCloud Private Relay | [9] | partial | T |
| 4 | Passcode set, change and policy | [11], [13] | strong | S | 27 | Safari fraud and malware warnings (Safe Browsing) | [12], [13] | strong | E |
| 5 | Passcode attempts, lockout, erase after failures | [13] | partial | T | 28 | Tracker-domain matching | observed | partial | E |
| 6 | Data Protection, keybags, lock state | [13] | strong | S | 29 | Communication Safety | [8] | partial | T |
| 7 | Activation Lock and Find My device | [13] | partial | T | 30 | Safety Check | [13] | partial | S |
| 8 | USB Restricted Mode, accessory authorisation | [10], [13] | none | – | 31 | Pairing and trusted computers | [13] | none | – |
| 9 | Code signing, AMFI, launch constraints, trust cache | [13] | strong | E | 32 | Certificate trust and revocation | [13] | strong | E |
| 10 | Signed system volume, cryptexes | [13] | partial | T | 33 | VPN, NetworkExtension, content filters | [13], [18] | strong | S |
| 11 | Secure boot | [13] | none | – | 34 | App Attest, DeviceCheck, managed attestation | [12], [13] | none | – |
| 12 | Sandbox and containers | [12], [13] | strong | E | 35 | Passkeys and credential providers | [13] | partial | T |
| 13 | Privacy permissions (TCC) | [12], [13] | strong | S | 36 | Wallet and Apple Pay | [13] | none | – |
| 14 | Camera and microphone indicators | [13] | partial | S | 37 | Firmware and baseband attestation | [13] | none | – |
| 15 | App Privacy Report | [7] | none | – | 38 | Unwanted-tracker alerts | [17] | partial | T |
| 16 | Memory Integrity Enforcement | [19] | none | – | 39 | Location Services authorisation | [13] | partial | S |
| 17 | Hardened web-content process | observed | partial | E | 40 | Hardware microphone disconnect | [13] | none | – |
| 18 | Background Security Improvements | [14] | none | – | 41 | Keychain and iCloud Keychain | [13] | none | – |
| 19 | Software update | [12], [13] | strong | S | 42 | Wi-Fi private address, secure joining | [13] | none | – |
| 20 | Developer Mode | [13] | partial | T | 43 | Restrictions of Siri and AI features | [18] | partial | T |
| 21 | Device management, enrolment, supervision | [13], [18] | strong | S | 44 | Apple Account security | [13] | none | – |
| 22 | Configuration profiles | [10], [13] | strong | S | 45 | AirDrop and Bluetooth sharing settings* | [13] | partial | S |
| 23 | Managed restrictions, declarative management | [13], [18] | partial | T |
“Observed”: entered from the log, with no documentary source. *Classified from earlier observation of AirDrop and Bluetooth pairing lines; not re-measured on these two logs.
5.2 What kind of trace (RQ1)
Explicit state changes are few and uneven between the logs (Figure 4). The passcode-change notification of the configuration daemon appears twice in the iOS 27.0 log, at one moment, and not in the iOS 26.6 log, which contains no passcode change; the line says neither who changed the passcode nor why. The keybag state lines (Unlocked, Locked, Locking) occur only in the iOS 27.0 log (286 lines); the lock-status line of the software-update daemon occurs in both (151 and 183). A permission change (“Update Access Record”) occurs once, with its own absolute time and the identifier of the requesting app in the message. Profile installation and removal occur only in the iOS 26.6 log, two install requests and one removal within one short interval.
Enforcement lines are plentiful. The iOS 27.0 log holds 6,099 TCC results (5,389 without error) and the iOS 26.6 log 8,825 (8,454 without error); sandbox violation reports number 62,035 and 28,804, the iOS 27.0 reports concentrated in 2.8 days; certificate-revocation enforcement (CRLite) appears 1,377 times in the iOS 27.0 log and never in the iOS 26.6 log. Status lines restate a state many times or seldom: “No MDM installation found” 3,142 and 1,058 times, “Activation lock is allowed” 48 and 37 times, “Lockdown Mode is off” 2 and one, “Developer mode enabled: NO” once and 9 times.
Several controls appear only in their negative or idle form. Lockdown Mode was always off; the passcode set-state value was always 1 (4 and 1 lines); every Safe Browsing check ended “no threat”; the TCC prompting wording known from macOS did not occur; and Stolen Device Protection appeared only as an availability check that failed because biometry was not enrolled (62 lines, iOS 27.0). For these controls the positive wording is unknown. The VPN connectivity state shows how a wider sample can close such a gap: in the three iOS 26 sysdiagnoses of Table 2 it never read Connected [5], while the iOS 27.0 log holds 1,121 such lines, 5 of them Connected (473 Disconnected, 340 Connecting, 303 Disconnecting).
5.3 What redaction withholds (RQ2)
Table 5 lists, per control, what the trace withholds and what it keeps. The redaction is plain: the hashed form that Apple's logging interface offers for correlating private values [16] occurs in none of the 42,588,594 and 25,598,286 records. A quarter of all records hold at least one <private> value (10,640,594 and 7,050,142, or 25.0 and 27.5 percent); this share is not a redaction rate, since it depends on how many records have a dynamic argument at all. The pattern is consistent across controls: the kind of event and the platform component stay readable, and the actor, the target and the payload are withheld. A permission request names its service (kTCCService plus a name) but not its requester, which is readable only in the separate attribution line and only for platform components; a URL open names the handling process but not the URL [2]; a certificate check gives its result but not the host.
| Control (trace) | Withheld | Readable |
|---|---|---|
| URL opens | The URL (<private>) | That a URL was opened, when, by which handling process; failed scheme opens |
| TCC request context | Requester (daemon_dict=<private>) | Service name; preflight flag; requester in the attribution line, for platform components |
| TCC result | Nothing within the line | Numeric decision, reason and version values |
| Biometrics | Request bodies of the biometric daemon | Lockout-state polls; kernel driver lines |
| Pairing and trusted computers | Every queried key and value | That a query occurred |
| Unwanted-tracker alerts | The event payload | That an event was ingested |
| Firmware attestation | Board and nonce parameters | That attestation parameters were logged |
| Certificate revocation | Host names | Revoked flag and fetch-failure counters |
| Recording indicator | The set of active sensors (empty or redacted) | That the indicator layer was created or changed |
| Camera streaming power events | Application identifier on 66 of 556 lines (iOS 27.0) | Device type and port type |
| Network connections | Endpoint as a hash tag on 1,235,369 of 1,238,152 lines that name one | Writing process, port, state word, link on 2.2 percent of lines |
| Managed settings | Setting values of the effective domains | Domain names; names and Boolean values of changed settings |
| VPN sessions | Nothing within the line | Configuration display name, a third-party name (not reproduced here) |
The connection lines show the effect at scale. The iOS 27.0 log holds 1,561,241 lines of the network connection category, written by 112 processes, one of which wrote 92.4 percent of them. Of the 1,238,152 lines whose header names an endpoint, 1,235,369 give a tag of the form Hostname#, IPv4# or IPv6# followed by hexadecimal digits; only 2,783 give a name or a literal address. The other 323,089 lines carry no endpoint. The iOS 26.6 log holds fewer lines and fewer tags: 255,625 connection lines from 130 processes, of which 217,133 name an endpoint and 180,455 (83.1 percent) give it as a tag. No tag occurred under two processes (0 of 980 distinct tags in the iOS 27.0 log, 0 of 776 in a window of the iOS 26.6 log), so lines of different processes cannot be joined on a tag.
5.4 Marker extraction on further sysdiagnoses (RQ3)
Table 6 gives the results of the marker families on the evidence of Table 2. Every family returned the lines it was built for, and the counts equalled a count made by other means where one was made. Two results bear directly on how the lines may be read.
| Family | Marker (source) | Result | Reading |
|---|---|---|---|
| URL opens | SpringBoard URL-open action; scene URL open; unregistered scheme | 88 lines (iOS 26.6); 24 (iOS 26.2, where the scene form is absent); 0 capability checks counted | Opens, not URLs |
| Capture sessions | Capture daemon session create, start and stop, status; streaming power events; recording indicator | Corpus iOS 26.5.2: 102 session rows, all from the biometric daemon, 12 streaming rows, 0 indicator rows; corpus iOS 26.6: 0, 0 and 1 (an empty activity set) | A session is not app camera use |
| TCC authorization cache | Statedump titled TCC Authorization Cache | 542 entries from 481 dumps (26.5.2); 278 from 254 (26.6); iOS 27.0 log: 14,698 dumps against 1,225 in the iOS 26.6 log | Cached verdict and reason per writing process |
| Location manager state | Statedump titled CLLocationManagerStateTracker | 2,174 rows (26.5.2); 514 (26.6); iOS 27.0 log: 12,771 dumps against 2,666 | Writing process only; the app is not named |
| Lockdown Mode flag | Photos isLockdownMode: | 1, 2 and 8 lines, all NO | Off when written |
| Passkey record loads | Saved-account store record loads | 4, 8 and 27 lines | A count, not a list of passkeys |
| Background shortcut actions | Shortcut runner actionID= signposts | 0, 0 and 6 lines | Not proof that a shortcut completed |
| VPN connectivity state | NEVPNConnectivityState word | 55 lines (36 Disconnected, 9 Connecting, 10 Disconnecting), 17 and 17 (all Disconnected); iOS 27.0 log: 1,121 lines, 5 Connected | A Disconnected line names no VPN |
| Network connections and sessions | Connection category header; session manager lines | iOS 27.0 log: 1,561,241 lines in 1,845 rows; 24,282 session lines in 685 rows | Lines, not connections; a lead, not proof of contact |
The three counts of a row without a log named are, in order, the two iOS 26.6 captures and the iOS 26.6.2 capture of Table 2. Corpus counts are from the public test corpus.
First, every capture session found in the iOS 26.5.2 corpus sysdiagnose belonged to the biometric daemon, and none to the Camera app or a third-party app [3]. A marker on capture sessions that ignores which process ran the session would therefore report camera use where the face-authentication hardware ran. Second, the statedumps add what the request lines lack: the TCC cache gives, per writing process, the cached verdict and its reason (user consent, system set, entitled), and the location-manager dumps say whether a process held a live location manager and whether it ran in the background. They do not name the application they describe; the only attribution is the process that wrote the dump [4].
5.5 Repetition and look-alikes (RQ3)
The VPN session lines of the iOS 27.0 log show why markers must not count lines as events (Figure 5). One always-on style tunnel produced 3,752 “On Demand start” lines, 3,851 “Received a start command” lines and 3,745 “Skip a start command” lines, while the session's status changed 306 times, 102 times to connecting and once to connected. A count of start lines would report thousands of sessions for one configuration.
Other lines match an obvious search term but record something else (Table 7). The most instructive is the remote-configuration subsystem, whose growth from 29 records in the iOS 26.6 log to 3,298 in the iOS 27.0 log was first read as a sign of device management. All 3,298 records were written by a weather widget (3,179) and the weather daemon (119), as were all 29 in the iOS 26.6 log; the four most frequent templates of the iOS 27.0 log occur 138 times each, one configuration request cycle repeated. None concerns management. A subsystem name alone is not a marker.
| Look-alike | Count | What it records |
|---|---|---|
| Remote-configuration subsystem | 3,298 / 29 | A weather widget's configuration fetch, not device management |
| VPN on-demand start lines | 3,752 / 0 | Repeated triggers of one tunnel, not new sessions |
| Capture sessions of the biometric daemon | 102 (corpus) | Face-authentication camera use, not app capture |
| AMFI launch-constraint notices (not enforcing) | 135 / 62 | Diagnostic helpers launched by the sysdiagnose itself, all at capture time |
| Carrier profile check | 82+ / about 5 | “Installing carrier configuration profile if needed”, not a profile installation |
| Cloud data protection “Manatee is available” | 3,844 / 332 | Eligibility, not whether Advanced Data Protection is on |
| Memory-tagging keywords | 0 real | Only a trial namespace whose name contains an opt-out term |
Counts for the carrier profile check are per template and were not recounted.
6 Discussion
6.1 Reading a control's state from the log
Because most traces restate a status and few record a change, what the log supports for most controls is a last known value with a validity window: the value of the last status line, valid from the first to the last line that restates it, and unknown outside the window of the log. A change can be placed only between the last line of one value and the first line of the next, unless a change line falls in that interval. The absence of a line supports a statement only for controls whose status is restated regularly; the 3,142 restatements of “No MDM installation found” support “not enrolled” across the iOS 27.0 window, while the absence of an “on” line for Lockdown Mode supports nothing on its own.
6.2 What the examiner can and cannot say
With the traces measured here an examiner can say, for example, that the passcode was changed at a given moment, that the device reported itself locked and unlocked at given times, that a permission for a named service was decided, that the sandbox denied named operations, or that a VPN session changed state. Because of redaction the examiner usually cannot say who requested a permission, which URL was opened, which host a certificate check concerned, or which server a process contacted. Where the log withholds the value, a file in the same archive may hold it: both corpus sysdiagnoses also hold the permission database, which names the requesting app [4].
6.3 Release differences
Some wording differs between the logs: the keybag state lines and the Stolen Device Protection checks occur only in the iOS 27.0 log, a Screen Time status line only in the iOS 26.6 log. With one device per release, use and release are confounded, and we do not attribute these differences to the release. A marker that is to be used on another release should be re-measured there; the markers of Section 3.4 are tested against synthetic exports, which fix their syntax, not against every build.
7 Threats to Validity
Internal validity. The trace of a control was found by searching candidate subsystems, processes and terms; a trace written under names we did not think of is missed, so the 14 controls without a trace are a statement about our search as well as about the logs. Template masking can merge distinct events and hides values written as digits; we re-read such values from raw text where they mattered. The strength and kind were assigned by one person; a second reader was not used.
Construct validity. A line is a record a process chose to write, not an observation of a user's action. Status lines are written when a daemon starts or is asked, so their frequency measures daemon activity, not the stability of the state. Several meanings, such as the weather origin of the remote-configuration records or the capture-time origin of the integrity notices, are read from the writing process and the text, not from documentation.
External validity. Two decoded logs from two unmanaged devices of different generations and use, with windows of 11.8 and 32.5 days, cannot represent iPhones in general. No device was managed and none had Lockdown Mode on, so the positive branches of most traces are unobserved. The further sysdiagnoses are iOS 26 only. The two logs were decoded with different decoder versions.
Conclusion validity. No inference beyond the counts is drawn, and no rate is compared between the releases. Counts are given per log because usage differs: the messaging application, for example, wrote 149,788 records in one log and 29 in the other.
Limitations. The Platform Security guide was used at the level of its contents. The study did not measure logs reached through a full file system extraction, the log show rendering of the marker lines (only decoded archives were read), the timing of status lines relative to the events they restate, or other tools' handling of the same lines. One control (AirDrop and Bluetooth sharing) was classified from earlier observation and not re-measured on these logs.
8 Conclusion and Future Work
Whether an iPhone's security controls can be read from its unified log had not been measured. We inventoried 45 controls from Apple's documentation, searched two decoded logs of research iPhones for their traces, and classified each trace as a change, a decision or a restated status. Thirty-one controls left a trace and 14 did not; few traces record a change, many controls were seen only in their negative form, and redaction withholds most actors, targets and payloads, including the endpoints of nearly every connection line. Markers keyed on literal text in a named process, with repeated lines summarised, collected the traces on further sysdiagnoses without counting repetition or look-alikes as events. On these logs a control's state is a last known value with a validity window; the same reading applies to any tool that reports these lines, open-source parsers included.
Future work, in order of value: (1) a protocol on test devices that switches each control at logged times on iOS 26 and iOS 27, to record the positive wordings (Lockdown Mode on, VPN connected, Stolen Device Protection on) and to measure how soon a status line follows a change; (2) the same inventory on managed devices and on more builds; (3) the marker lines as rendered by log show and in logs from full file system extractions.
Artifact Availability
The marker artifacts of eight families are part of iLEAPP [20] under the MIT licence, merged through four pull requests: #2311 (URL opens) [2], #2517 (capture sessions, streaming power events, recording indicator) [3], #2518 (TCC cache and location-manager statedumps) [4] and #2577 (Lockdown Mode flag, passkey loads, background shortcut actions, VPN connectivity state) [5], with their synthetic generators and tests. The network-connection and NetworkExtension-session artifacts, with their synthetic export generator and 36 tests, are in a public fork of iLEAPP at commit d4d3c8e7; no pull request has been opened for them. The address of the fork is available on request through the research address. The public test corpus of Table 2 is iLEAPP's. The two decoded logs, the sysdiagnoses of research devices and the per-control classification cannot be released. A re-implementation of the marker predicates, the read-only recount and a synthetic log show export with planted lines and decoys, with a self-test, will be released in the Lab's public artifacts repository, with no release date set (code MIT, data and text CC BY 4.0). The package is not public yet, and the sentences that follow describe it as planned. It was written for release from Section 3 and is not the code that produced the counts of this report; its process, subsystem and some marker names are invented, and it reproduces the behaviour of the predicates, not the counts.
Data Handling Statement
The evidence for this study is drawn from the Lab’s research corpus of mobile device sysdiagnose archives and decoded unified logs and was read only. It also uses sysdiagnoses of a public test corpus and fully synthetic log show exports written by the authors with invented processes, identifiers and times. The two decoded logs, the three sysdiagnoses of two devices and the two sysdiagnoses of the URL-open markers are from the Lab’s research corpus. The report gives aggregate counts and device classes, operating system versions, Apple process, subsystem and category names and masked Apple message templates. It contains no identifiers, personal data, message or file content, or case information; no names, numbers, accounts, application names of third parties, configuration names, host names, tags, absolute times or file paths from the real data appear in it. No offensive technique, exploit or credential-recovery method is described.
Declaration of AI Assistance
The authors conceived the research questions and directed the work. The marker code, the data checks and the first draft of this report were produced with AI assistance (Anthropic Claude). The authors reviewed the results and the text and are responsible for the content.
References
- Daniel Addai. 2026. Log Compression and Archive Structure in the iOS 27.0 Sysdiagnose: An Early Observation Tested Against Ten Archives. Lab Technical Report LAB-TR-0011, version 1.0. SectraTEK Lab, Prudential Associates. https://doi.org/10.5281/zenodo.23717935
- Daniel Addai. 2026. Add logarchive URL / link-open artifact. iLEAPP pull request #2311, merged October 14, 2026. Retrieved October 27, 2026 from https://github.com/abrignoni/iLEAPP/pull/2311
- Daniel Addai. 2026. logarchive: camera and microphone capture sessions, streaming power events, recording indicator lines. iLEAPP pull request #2517, merged October 20, 2026. Retrieved October 27, 2026 from https://github.com/abrignoni/iLEAPP/pull/2517
- Daniel Addai. 2026. logarchive: TCC authorization cache and location manager state statedump artifacts. iLEAPP pull request #2518, merged October 20, 2026. Retrieved October 27, 2026 from https://github.com/abrignoni/iLEAPP/pull/2518
- Daniel Addai. 2026. Unified logs: Lockdown Mode flag, passkey record loads, background shortcut actions and VPN connectivity state. iLEAPP pull request #2577, merged October 25, 2026. Retrieved October 27, 2026 from https://github.com/abrignoni/iLEAPP/pull/2577
- Oleg Afonin. 2025. Extracting and Analyzing Apple sysdiagnose Logs. ElcomSoft blog, June 27, 2025. Retrieved October 27, 2026 from https://blog.elcomsoft.com/2025/06/extracting-and-analyzing-apple-unified-logs/
- Apple. [n. d.]. About App Privacy Report. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/102188 (Title confirmed; page body not read.)
- Apple. [n. d.]. About Communication Safety on your child's Apple device. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/105069 (Title confirmed; page body not read.)
- Apple. [n. d.]. About iCloud Private Relay. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/102602 (Title confirmed; page body not read.)
- Apple. [n. d.]. About Lockdown Mode. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/105120
- Apple. [n. d.]. About Stolen Device Protection for iPhone. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/120340
- Apple. 2026. About the security content of iOS 27 and iPadOS 27. Apple Support, released September 14, 2026. Retrieved October 27, 2026 from https://support.apple.com/en-us/149034
- Apple. 2026. Apple Platform Security. Edition August 2026. Retrieved October 27, 2026 from https://support.apple.com/guide/security/welcome/web (Edition and contents read; individual chapters not read in full.)
- Apple. [n. d.]. Apple security releases. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/100100
- Apple. [n. d.]. iCloud data security overview. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/102651 (Title confirmed; page body not read.)
- Apple. [n. d.]. OSLogPrivacy. Apple Developer Documentation. Retrieved October 27, 2026 from https://developer.apple.com/documentation/os/oslogprivacy (Not re-verified: title confirmed, page body not readable by the fetch tool; the private-by-default and hash-mask behaviour is stated from the public API.)
- Apple. [n. d.]. What to do if you get an alert that an AirTag, set of AirPods, Find My network accessory, or compatible Bluetooth location-tracking device is with you. Apple Support. Retrieved October 27, 2026 from https://support.apple.com/en-us/HT212227 (Title confirmed.)
- Apple. 2026. What's new for enterprise in iOS 27. Apple Support, published October 26, 2026. Retrieved October 27, 2026 from https://support.apple.com/en-us/148828
- Apple Security Research. 2025. Memory Integrity Enforcement: A complete vision for memory safety in Apple devices. Blog post, September 9, 2025. Retrieved October 27, 2026 from https://security.apple.com/blog/memory-integrity-enforcement/
- Alexis Brignoni et al. [n. d.]. iLEAPP: iOS Logs, Events, And Plist Parser. GitHub repository (MIT licence). Retrieved October 27, 2026 from https://github.com/abrignoni/iLEAPP
- EC-DIGIT-CSIRC. [n. d.]. Sysdiagnose Analysis Framework (SAF). GitHub repository (EUPL-1.2). Retrieved October 27, 2026 from https://github.com/EC-DIGIT-CSIRC/sysdiagnose
- Graeme Horsman. 2019. Tool testing and reliability issues in the field of digital forensics. Digital Investigation 28 (2019), 163–175. https://doi.org/10.1016/j.diin.2019.01.009 (Bibliographic data confirmed from index records; full text not read.)
- Mandiant. [n. d.]. macos-UnifiedLogs. GitHub repository (Apache-2.0). Retrieved October 27, 2026 from https://github.com/mandiant/macos-UnifiedLogs
- Mandiant. 2026. macos-UnifiedLogs release v0.7.0. GitHub release, published September 14, 2026. Retrieved October 27, 2026 from https://github.com/mandiant/macos-UnifiedLogs/releases/tag/v0.7.0
- MVT Project. [n. d.]. Check an iOS Sysdiagnose. Mobile Verification Toolkit documentation. Retrieved October 27, 2026 from https://docs.mvt.re/en/latest/ios/sysdiagnose/