Lab White Paper LAB-TR-0017
Where Device Security Settings Live on Disk: A Verified Path and Key Map for Unmanaged iPhones and Android Phones, and Pitfalls That Produce Silent Empty Reads
Lab Technical Report (white paper), preprint, not peer reviewed
27 October 2026
Executive Summary
A reader that looks for a security setting in a phone extraction can return nothing without an error, and the empty field looks like a setting that was never set. We mapped where iPhones and Android phones that are not under device management store common security settings, and verified each entry read-only on 48 full file system extractions of research devices (34 iOS, iOS 15 to 26; 14 Android, Android 10 to 16), recording presence, format and key presence but no values. Ten pitfalls decided whether a read returned anything. All 53 settings files on Android 12 and later were Android Binary XML, which a standard XML parser rejected every time. Several iOS preference files share their name with launchd property lists and asset copies; the Find My accounts file existed in two different copies on 20 of 34 iOS extractions; and keys written only after a change were missing from most files that exist, for example the Lockdown Mode key from 28 of 33 global preference files. In Apple's schema, 121 of 176 iOS restriction keys are supervised-only. A reader should therefore report why a field is empty, not only that it is.
CCS Concepts • Applied computing → System forensics; • Security and privacy → Mobile platform security.
Keywords mobile forensics, iOS, Android, full file system extraction, security settings, property list, Android Binary XML, SQLite write-ahead log, multi-user, parser validation
ACM Reference FormatDaniel Addai, Sanders Larweh Tetteh, Selorm Adjabeng, and Kingsley Albert Egyir. 2026. Where Device Security Settings Live on Disk: A Verified Path and Key Map for Unmanaged iPhones and Android Phones, and Pitfalls That Produce Silent Empty Reads. Lab Technical Report LAB-TR-0017 (white paper), version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0017/
1 Problem
Examiners are asked to state how a phone was configured: whether it had a passcode policy, whether updates installed automatically, whether Lockdown Mode, Find My or Mail Privacy Protection was on, whether USB debugging was enabled. On a full file system extraction these settings are read from files: property lists on iOS, settings XML files, SQLite databases and build property files on Android. A reader of such a file can fail without an error. It may look under the wrong path, open the wrong one of several files with the same name, parse a binary file as text, open a database without its journal, or look up a key that the platform writes only after a user changes the setting. Each failure produces the same output as a setting that is unset: an empty field.
A motivating example. On Android 12 and later the platform writes the settings files in Android Binary XML (ABX), a binary encoding of XML [5], [10]. In our sample, 53 of 58 settings files were ABX. A standard XML parser rejected all 53, and a text search for the pattern name="…", which finds every setting in a plain XML settings file, found nothing in any of them, while a decoder for the binary format recovered between 69 and 505 settings per file. A reader that catches the parse error and returns an empty list, or that searches the text, reports every setting on these phones as absent.
The gap. Paths and key names for these settings are scattered across vendor schemas, platform source, tool modules and practitioner notes. They are rarely stated together with the condition under which a read of them is valid, and we found no published map that was checked against a set of real extractions, with counts of how often each source exists. This white paper supplies such a map for phones that are not under device management, and names the conditions that turn a correct path into an empty result.
Questions. We ask three questions.
- Q1 (Locations). Where do common security settings live on iOS and Android full file system extractions (path, file, key or table, format), and how often is each source present?
- Q2 (Preconditions). Which condition must hold for a read of each source to be valid, by operating system family and version?
- Q3 (Pitfalls). Which reading errors return an empty result without an error, and how often did their trigger occur in the sample?
Contributions. (1) A path and key map for iPhone and Android settings in which every entry is either verified on real extractions, with the number of extractions that carried it, or marked as taken from documentation and not verified (Section 4.1 to 4.3). (2) The preconditions for a valid read, by format and version range (Section 4.4). (3) Ten pitfalls that produce silent empty reads, each with the trigger counted in the sample and a guard (Section 4.5). (4) A reading of Apple's device-management schema that shows which restriction keys can occur at all on an unsupervised iPhone (Section 4.6).
Scope. The map describes where settings are stored and what makes a read of them valid. It does not say what a value means for security, which values are acceptable, or how settings should be assessed; value semantics are given only where the platform documents them and are otherwise out of scope. Counts describe 48 extractions of research devices (Section 3.1). No device was toggled and re-extracted, so the map establishes where a key is stored, not how each value changes when a user changes a setting.
2 Background
2.1 Storage formats
Property lists (iOS). iOS preferences are property lists in one of two encodings: binary (the file begins with bplist00) or XML. A reader that accepts only XML finds nothing in a binary file. Preferences of system daemons are usually under /private/var/mobile/Library/Preferences/; data shared by a group of apps sits in an app-group container whose directory name is a random identifier, mapped to the group by a metadata property list in the container.
Android Binary XML. ABX files begin with the four bytes 41 42 58 00 (“ABX” and a version byte of zero). Each token is one byte that combines a command (start tag, end tag, attribute, text) with a value type, and repeated strings are stored once and then referenced by index [5]. The format first appeared on Android 12 test images, mostly in system files [10].
SQLite and its journal. In write-ahead logging (WAL) mode, committed changes are appended to a separate -wal file and reach the main database file only at a checkpoint; a database separated from its WAL file can lose committed transactions [14]. Bytes 18 and 19 of the database header are 1 for a rollback journal and 2 for WAL [15], so the header tells a reader whether a -wal file must accompany the database. A previous report measured the effect on one iOS store: counts changed when the log was not applied on 14 of 17 stores [4].
2.2 Users, containers and storage classes
Android keeps per-user data in directories named by user number: device-encrypted (DE) storage under /data/system_de/<user>, /data/user_de/<user> and /data/misc_de/<user>, credential-encrypted (CE) storage under /data/system_ce/<user>, /data/misc_ce/<user> and /data/user/<user> [6]. Settings are stored per user under /data/system/users/<user>/. A previous report showed that a parser that takes the first matching file can return only a second user's copy [3].
2.3 Device management on iOS
Apple publishes the schema of its device-management payloads [7]. For each key it states the release that introduced it and whether it requires a supervised device, that is, one enrolled by an organisation. A supervised-only restriction cannot be set on a personal iPhone, so its absence there is expected and says nothing about the user. On a personal device, effective restriction and passcode values are kept in a profile store whose typed wrapper (restrictedBool, restrictedValue) has been described in practitioner work on the auto-lock and passcode settings [12].
2.4 Related sources and position of this work
Open-source parsers read several of the files mapped here: ALEAPP reads the Android settings files and decodes ABX [8]; iLEAPP reads the Find My accounts file, the system version file and the App Privacy Report streams [9]; MVT reads the Lockdown Mode key from the global preferences [13]. Earlier Lab reports measured silent failure modes of parser suites on current releases [3], the ABX settings files on two Android 16 images [2], the App Ops files [1] and the effect of the WAL on the Screen Time store [4]. Tool testing literature calls for validation against known data [11]. This paper does not test or compare tools. It contributes a location map in which each entry carries the number of real extractions that held it, the precondition for a valid read, and the pitfalls that defeat a read, gathered in one place.
3 Method
3.1 Evidence
The evidence is every full file system extraction in the Lab's research corpus: 48 extractions, read only (Table 1). One duplicate copy of an extraction was counted once.
| Family | Versions (extractions) | Total |
|---|---|---|
| iOS | iOS 15 (2), iOS 16 (5), iOS 17 (3), iOS 18 (3), iOS 26 (20), undetermined (1) | 34 |
| Android | Android 10 (1), Android 12 (1), Android 13 (2), Android 14 (1), Android 16 (9) | 14 |
iOS versions were read from the system version file of each extraction where present, otherwise from the container metadata. One iOS extraction was acquired before first unlock; one other held neither the system volume nor the mobile user's directory. Both are kept in the denominators, so a source missing from them counts as missing. Android: Samsung 12, Motorola 1, Pixel 1; the Android 16 group includes one Pixel. Device classes only; no models are given.
3.2 Candidate map
We compiled a candidate list of sources from Apple's device-management schema [7], Android platform documentation and source [5], [6], the modules of open-source parsers [8], [9], [13] and practitioner notes [10], [12]. The list covers commonly discussed security settings: operating system release and patch level, passcode and lock screen, automatic updates, Lockdown Mode, Find My, Mail Privacy Protection, iCloud Private Relay, Screen Time restrictions and App Privacy Report on iOS; and on Android the settings namespaces, lock screen store, credential files, developer options and USB debugging, installation from unknown sources, app verification, device administrators, users, accounts, Wi-Fi, Bluetooth and runtime permissions.
3.3 Verification on extractions
Each extraction is a zip archive (a vendor container or a plain archive). A verification script read the archive's central directory, which lists every member, and matched each candidate path against it. Because the containers place the file system under different prefixes, the script first found the prefix from a known anchor (the global preferences directory on iOS, data/system/ on Android) and removed it. For every matched source it then recorded:
- Presence, and every other directory in which a file of the same name occurred (user numbers and container identifiers normalised; third-party app containers collapsed to a placeholder).
- Format, from the first bytes: binary or XML property list, ABX or plain XML, SQLite with its journal mode (header byte 18) and the sizes of any
-walor-journalfile. - Decoding: property lists with a standard library parser; ABX with a decoder written from the platform serializer [5]; for comparison, each settings file also with a standard XML parser and a text search; SQLite databases opened from private copies, once with and once without their
-walfile. - Key presence for named keys, structures and table rows. Values were never recorded.
Separately, we parsed the restriction and passcode payload schemas of Apple's device-management repository at release Release-v27.2 [7] and counted, for every key available on iOS, whether the schema marks it supervised-only, and whether five key names that are easy to derive from user-facing labels exist in the schema.
3.4 Ratings
An entry is rated verified when the file was found at the stated path and, where a key is named, the key was found in at least one decoded file; the table then gives the number of extractions that carried the source and the key. An entry is rated documentation only when the source was not found on any extraction or its key could not be checked; it is listed so that a reader knows it was not confirmed here. Neither rating says what a value means.
4 Findings
The verification ran over all 48 extractions with no read errors. Archives held between 45,837 and 3,068,129 members. Figure 1 shows the five steps of a read at which the pitfalls in this section occur.
4.1 iOS path and key map
Table 2 gives the iOS map. Paths are relative to the root of the file system. Every property list among the system preference files we decoded was a binary property list (192 files); the profile store files were XML in 26 and binary in 17 of 43 cases, so a reader must accept both encodings.
| Setting | Path | Format; key or structure | Present | Rating |
|---|---|---|---|---|
| OS release | / | plist; ProductVersion, ProductBuildVersion | 32/34 | Verified |
| Lockdown Mode | / | binary plist; LDMGlobalEnabled | 33/34; key 5/33 | Verified |
| Lockdown Mode (managed copy) | / | binary plist; same file name | 31/34; key 0/31 | Verified; key never seen |
| Find My | /; also in system containers (Section 4.1) | binary plist; account dictionary, no single on/off key [9] | 21/34 | Verified; location varies |
| Automatic iOS updates | / | binary plist; SUAutomaticUpdateV2Enabled, SUDisableAutoDownload, SUAutoInstallSecurityResponse, SUAutoInstallSystemDataFiles | 20/34; keys 15, 4, 0, 2 | Verified for keys seen; others documentation only |
| Automatic App Store updates | / | binary plist; AutoUpdatesEnabled | 30/34; key 16/30 | Verified |
| Mail Privacy Protection | /; container found by MCMMetadataIdentifier = group.com.apple.mail in .com.apple.mobile_container_manager.metadata.plist | binary plist; LoadRemoteContent-v2 (integer) | 30/34; key 26/30 | Verified |
| Passcode and restriction values (effective) | /; or / | XML or binary plist; restrictedBool.<key>.value; restrictedValue.<key>.{value, rangeMinimum, rangeMaximum}; intersection; union. Passcode keys in restrictedValue: maxInactivity, maxGracePeriod, minLength | 33/34; wrapper 33; keys 33, 33, 32 | Verified |
| Public copy of effective settings | / (or the system group path) | plist | 33/34 | Verified |
| Screen Time configuration | / and RMAdminStore-Cloud.sqlite | SQLite in WAL mode; tables as in [4] | 30/34 and 29/34; non-empty -wal 29 and 24 | Verified (file and journal) |
| iCloud Private Relay | / | binary plist; top-level NSPServiceStatusManagerInfo (embedded archive; field meaning not verified) | 29/34; key 29/29 | Verified (key); content documentation only |
| App Privacy Report | / | SEGB stream files [9] | 9/34; non-empty files on 9 | Verified (files) |
Three points need comment. First, the Find My accounts file was not always where tools look for it: the file was at /private/var/mobile/Library/Preferences/ on 19 extractions, inside a system data container with a random name (/private/var/containers/Data/System/<UUID>/Library/Preferences/) on 14, all of them iOS 26, and in the system group container systemgroup.com.apple.icloud.findmydevice.managed on 7; it was absent from 13. Two copies existed on 20 extractions and differed in size on all of them, so a reader that knows only one path reads one of two different files. Second, the profile store holds the typed wrapper on every extraction that had it: entries of restrictedBool carry one key, value, and entries of restrictedValue carry value, rangeMinimum and rangeMaximum. Each store held between 40 and 275 restrictedBool entries, which is more than a user sets, so the presence of a key in this store does not show that a person or a profile set it. Third, the companion files ProfileTruth.plist, PayloadManifest.plist, UserSettings.plist and PublicInfo/NamespacedUserSettings.plist exist on current releases (34, 34, 31 and 34 of 34 extractions), in both profile store directories. The profile store itself occurred in both directories on 8 extractions; the copies differed in size on 8, and on 8 the archive recorded a later modification time for the copy in the mobile user's directory.
4.2 Android path and key map
Table 3 gives the Android map, Table 4 the presence of individual settings keys. Paths are relative to the root of the file system image; <u> is a user number.
| Setting area | Path | Format | Key, table or structure | Present |
|---|---|---|---|---|
| Settings namespaces | data/, settings_secure.xml, settings_system.xml | ABX on Android 12, 13, 14, 16 (53 files); XML on Android 10 (5 files) | <setting name= value=>; global only for user 0 | 14/14 |
| Lock screen store | data/ | SQLite; journal: rollback on 13, WAL on 1 (Android 10) | table locksettings (name, value, user); sp-handle 14, lockscreen.passwordhistory 11 | 14/14 |
| Synthetic-password blobs | data/ | binary | file presence only | 14/14 |
| Build properties | system/, vendor/ | text, key=value | system: ro.build.version.release 13, ro.build.version.security_patch 13, ro.build.version.sdk 13, ro.build.tags 13, ro.system.build.fingerprint 13; vendor: ro.vendor.build.security_patch 13, ro.vendor.build.fingerprint 13 | 13/14, 13/14 |
| Device administrators | data/; per-user copies in data/ | ABX on Android 12, 13, 14, 16; XML on Android 10 | <admin> elements | 14/14 |
| Notification policy | data/ | ABX on Android 12, 13, 14, 16; XML on Android 10 | policy elements | 14/14 |
| App ops | data/; data/ | ABX on Android 12, 13, 14, 16; XML on Android 10 | see [1] | 7 and 10 |
| Users | data/, data/ | ABX on Android 12, 13, 14, 16; XML on Android 10 | user entries and flags | 14/14 |
| Accounts | data/, data/ | SQLite; rollback journal (37 of 39 databases) | table accounts | 14/14, 14/14 |
| Installed packages | data/ | ABX on Android 12, 13, 14, 16; XML on Android 10 | package elements | 14/14 |
| Runtime permissions | data/; Android 10: data/ | XML on all | permission elements per package | 13 and 1 |
| Saved Wi-Fi networks | data/; per user data/; Android 10: data/ | XML on all | network blocks with security type | 13 and 1 |
| Bluetooth pairings | data/ | text (INI sections) | one section per device | 14/14 |
| Persistent properties | data/ | protobuf | name and value records [2] | 14/14 |
| Samsung enterprise store | data/ | SQLite | 156 to 170 tables, 11 to 26 with rows | 12 of 12 Samsung |
| Storage classes | data/, data/, data/ | directories | device- and credential-encrypted split [6] | 14, 14, 14 |
| File | Key | Present |
|---|---|---|
settings_global | adb_enabled | 14/14 |
settings_global | development_settings_enabled | 14/14 |
settings_global | package_verifier_user_consent | 14/14 |
settings_global | package_verifier_enable | 2/14 |
settings_global | auto_time | 14/14 |
settings_global | auto_time_zone | 14/14 |
settings_global | device_provisioned | 14/14 |
settings_secure | lock_screen_lock_after_timeout | 13/14 |
settings_secure | lock_screen_allow_private_notifications | 14/14 |
settings_secure | lock_screen_show_notifications | 14/14 |
settings_secure | install_non_market_apps | 14/14 |
settings_secure | location_mode | 14/14 |
settings_secure | location_providers_allowed | 3/14 |
settings_secure | package_verifier_state | 3/14 |
settings_secure | backup_enabled | 14/14 |
settings_secure | enabled_input_methods | 14/14 |
settings_secure | default_input_method | 14/14 |
settings_secure | user_setup_complete | 14/14 |
settings_secure | lock_to_app_exit_locked | 6/14 |
settings_secure | always_on_vpn_app | 0/14 |
settings_secure | always_on_vpn_lockdown | 0/14 |
settings_system | show_password | 10/14 |
settings_system | lock_to_app_enabled | 2/14 |
Three observations matter for readers. First, keys that guides describe as legacy are still written: install_non_market_apps was in the secure settings of all 14 extractions, so its presence says nothing about the current release. Second, the lock screen store no longer holds the keys older guides name: lockscreen.password_type was present on 2 extractions (Android 10, 13) and lock_pattern_autolock on none, while sp-handle, which points to the synthetic-password blob, was present on all 14. Third, not every numbered directory under data/system/users/ is a user: on 3 Samsung extractions a directory numbered 1000 held only files of the vendor's data-protection engine and appeared in no other per-user tree, so user numbers should be taken from userlist.xml. The second user that does appear, number 150, was present on 6 extractions and had its own secure and system settings files, but never a global one, which is device-wide.
4.3 Sources that were not found
Several sources named in documentation or older guides were absent from every extraction or held none of their documented keys (Table 5). A reader that depends on them returns nothing on current devices, and their absence must not be read as a setting being off.
| Source or key | Documented as | Observed |
|---|---|---|
data/ | legacy settings database | absent from all 14; files named settings.db belonged to other apps on 12 |
gesture.key, password.key in data/ | legacy credential files | absent from all 14 |
gatekeeper.*.key in data/ | credential files | absent from all 14; spblob present on 14 |
fpdata under data/ or data/ | fingerprint enrolment files | at these paths on 1 of 14 (Android 12); documentation only otherwise |
ro.crypto.state, ro.crypto.type | encryption properties | in no build property file; runtime properties, not on disk |
ro.build.fingerprint in system/ | build fingerprint | in 0 of 13 system build property files; ro.system.build.fingerprint in 13 |
lockscreen.password_type in locksettings | credential type | only on Android 10, 13 (2 of 14) |
lockscreen.disabled in locksettings | lock screen disabled flag | on 8 of 14 (Android 10, 12, 13, 14, 16) |
lock_pattern_autolock in locksettings | legacy pattern flag | on 0 of 14 |
always_on_vpn_app, always_on_vpn_lockdown | always-on VPN (secure namespace) | on 0 and 0 of 14 (written only when configured) |
maxFailedAttempts, pinHistory, forcePIN, allowSimple in EffectiveUserSettings.plist | passcode policy keys (schema [7]) | in 0, 0, 1 and 1 of 33 stores; documentation only |
AutomaticUpdateAuthorizations in com.apple.appstored.plist | per-app update authorisation | in 0 of 30 files; documentation only |
4.4 Preconditions by format and version
Table 6 states, for each format, the version range in which we observed it and the condition a read must meet. Figure 2 shows the switch from plain XML to ABX for the Android settings files.
settings_global, _secure, _system) per extraction, by Android version. Every settings file on Android 12 and later was ABX; the Android 10 extraction used plain XML. Source: 58 settings files on 14 extractions.| Format or layout | Where | Observed on | Precondition | If not met |
|---|---|---|---|---|
| Binary property list | iOS system preference files | every iOS extraction (iOS 15 to 26) | parse both binary and XML encodings | parse error or empty dictionary |
| XML property list | iOS profile store (EffectiveUserSettings.plist) | 26 of 43 files XML, 17 binary | same | same |
| Android Binary XML | settings files, packages.xml, device_policies.xml, notification_policy.xml, userlist.xml, user files | Android 12, 13, 14, 16 (all 53 settings files); plain XML on Android 10 | first bytes 41 42 58 00: decode before key lookup | XML parser error; text search finds no name="…" |
| Plain XML | the same files on Android 10; WifiConfigStore.xml and runtime-permissions.xml on all | Android 10 to 16 | do not assume ABX for every system XML file | decoder rejects a plain file |
| SQLite, WAL mode | Screen Time store (iOS); locksettings.db on 1 Android extraction(s) | iOS 15 to 26; Android 10 | header byte 18 = 2: open with the -wal file | missing or stale rows [4], [14] |
| SQLite, rollback journal | locksettings.db, accounts_de.db, accounts_ce.db | most Android extractions | byte 18 = 1: main file is sufficient | none observed |
| Protobuf | persistent_properties | all Android | decode fields; do not scan as text | few or no records [2] |
| Per-user trees | data/system/users/<u>, system_de/<u>, system_ce/<u> | user 150 on 6 Android extractions | enumerate all user numbers | second user's data missed |
| Random container names | iOS app-group and system data containers | all iOS | resolve by metadata or search | fixed path matches nothing |
4.5 Pitfalls that produce silent empty reads
Table 7 lists ten pitfalls. For each it names what returns empty, how often the trigger occurred in the sample, and a guard. Figure 3 shows the pitfall that is easiest to miss on iOS: a preference file that exists but does not hold the key, because the key is written only when the setting is changed.
| Pitfall | What returns empty | Trigger in the sample | Guard |
|---|---|---|---|
| P1 Container prefix | a pattern anchored at the start of the member name | iOS: filesystem1/ on 22, a leading / on 11, a nested archive path on 1; a second tree filesystem2/ beside the first on 3. Android: Dump/ on 13, a leading / on 1 | derive the prefix from an anchor file |
| P2 Same-named files | the first match is another file of the same name | iOS: a launchd property list of the same name in /System/Library/LaunchDaemons/ for the software update, iTunes store, App Store and Private Relay preferences (32, 32, 32, 32 extractions); .GlobalPreferences.plist in up to four places (template, root, managed, mobile) on 34; asset copies of SystemVersion.plist on 22, up to 42 per extraction, with a different version in one copy on 1; UserSettings.plist inside third-party app containers on 4. Android: backup copies of accounts_*.db or packages.xml in data/system/pm_backup_files/ on 11; settings.db only inside app packages on 12; a locksettings.db inside an app on 2; a Knox copy of the accounts databases on 1 | prefer the canonical path; list the others |
| P3 Random container names | a fixed container path | Mail app group: 25 to 401 app-group containers per extraction, resolved by metadata on 30 of 30; Find My accounts also in a system data container on 14, two copies of different size on 20 | resolve by metadata; search container classes |
| P4 Second users | reading user 0 only | more than one user on 7 of 14 Android extractions (user 150 on 6); settings files for a second user on 7; settings_global.xml only for user 0 | enumerate user numbers |
| P5 Binary XML | an XML parser or text search | 53 of 58 settings files ABX; XML parser rejected 53, text search found nothing in 53 | sniff the magic bytes and decode |
| P6 Missing journal | a database opened without its -wal | non-empty -wal beside the Screen Time store on 29 of 30; locksettings.db in WAL mode on 1 (row count unchanged there) | read with the journal; state it |
| P7 Keys written on change | a key lookup in a file that exists | Lockdown Mode key in 5 of 33 files; update key in 15 of 20; App Store key in 16 of 30; Mail key in 26 of 30 | report “key absent”, not “off” |
| P8 Renamed or moved items | a name or path from an older release | ro.build.fingerprint absent from every system build property file (13), present as ro.system.build.fingerprint; lockscreen.password_type only on Android 10, 13; appops_accesses.xml beside or instead of appops.xml on Android 14, 16; Wi-Fi store and runtime permissions under apexdata from Android 12; on iOS the profile store also or only in the system group container (iOS 15, 16, 17, 26), and the Find My accounts file also in a system data container on all 14 iOS 26 extractions that had it | keep names per release |
| P9 Presence is not state | a presence check read as “set” | 40 to 275 restrictedBool entries in every profile store; stream folders exist for App Privacy Report (records needed, [9]) | read values and records, not presence |
| P10 Schema names and supervision | label-derived or supervised-only keys | 5 label-derived names absent from the schema; 121 of 176 iOS restriction keys supervised-only [7] | validate names; mark not applicable |
4.6 What the iOS schema implies for unmanaged iPhones
In Apple's restriction payload (com.apple.applicationaccess) at Release-v27.2, 176 keys are available on iOS, and 121 of them are marked supervised-only [7]. On a personal, unsupervised iPhone these 121 cannot be set, so a reader should report them as not applicable, not as missing. All 10 iOS keys of the passcode policy payload (com.apple.mobiledevice.passwordpolicy) are available without supervision. Five key names that are easy to derive from the labels in Settings do not exist in the schema in that form, and a lookup by them returns nothing (Table 8).
| Name derived from the label | Schema key | iOS, supervision |
|---|---|---|
allowHideApps | allowAppsToBeHidden | iOS 18.0; supervised |
allowFaceTime | allowVideoConferencing | supervised (iOS 13 and later) |
allowScreenRecording | no top-level key; a sub-restriction nested under allowScreenShot | allowScreenShot: unsupervised |
allowContentRatings | no such key; ratingApps, ratingMovies, ratingTVShows, allowExplicitContent | ratings unsupervised; explicit content supervised |
allowESIMOutgoingTransfer | allowESIMOutgoingTransfers (plural) | iOS 18.0; supervised |
5 Recommendations
For authors of readers and for examiners who check a reader's output, the findings reduce to one rule: a reader must report why a field is empty. We recommend the following.
- Report four states, not two. Distinguish a value that was read, a key that is absent from a file that was read, a source that is absent from the extraction, and a source that could not be read (wrong format, missing journal, decode error). Only the first is a statement about the setting.
- Find the root before matching. Derive the container's path prefix from an anchor file and match relative paths; do not anchor a pattern at the start of the member name.
- Choose the copy deliberately. Prefer the canonical system path; list every other same-named file (asset copies, managed-preference copies, backup copies, third-party bundles) and say which one was read.
- Resolve containers by metadata. Find app-group and system containers through their metadata files, and search the known container classes for relocated preference files.
- Enumerate every user. Read settings, accounts, lock screen rows and permissions for each user number, and expect device-wide settings only under user 0.
- Sniff the format. Decode ABX when the first four bytes are
41 42 58 00, accept binary and XML property lists, and treat a parse error as “not read”, never as an empty list. - Bring the journal. Read a SQLite database together with its
-walfile whenever header byte 18 is 2, and state whether the log was applied. - Treat a missing key as unknown. Many preferences are written only after a change. Use a documented default only when the platform documents it, and label the result as a default.
- Check key names against the schema and the release. Validate iOS restriction names against the device-management schema, mark supervised-only keys not applicable on unsupervised devices, and expect renamed and partition-prefixed keys on Android (Section 4.3).
- Test with a second user and a binary file. A reader's test set should include an ABX file, a binary property list, a database with a non-empty
-walfile, and an extraction with a second Android user.
6 Limitations
No toggle study. No phone was switched between settings and re-extracted. The map therefore establishes where a key is stored and in what format, not which value corresponds to which state, and not whether a change in Settings always reaches the file. A controlled toggle-and-diff study on a test iPhone and a test Android phone is the next step and would be needed before the map supports statements about value semantics.
Sample. The sample is one research corpus. Of the 14 Android extractions, 12 are Samsung, and Android 11 and 15 are absent; 20 of 34 iOS extractions run iOS 26. One iOS extraction was acquired before first unlock, one held neither the system volume nor the mobile user's directory, and for one the iOS version could not be determined. Counts are reported per version where the version matters and are not generalised beyond the devices examined.
What was checked. Presence was checked against archive member names and key presence against decoded files; the script recorded no values. A source found under a path not in the candidate list would be missed unless its file name was among those searched for relocated copies. The management state of the devices was not determined; that most were personal phones is an assumption from their provenance, not a measurement, and the entries in the profile store do not separate user choices from defaults. Value semantics stated in Section 2 come from documentation. The App Privacy Report check counted non-empty stream files, not records.
Not covered. Settings held only in the keychain, in secure hardware or in a server-side account (for example the activation state of Find My on Apple's servers) are outside a file system map. Logical and backup extractions, sysdiagnose archives and Android bug reports were not examined.
Artifact Availability
The verification scripts that read the 48 extractions are not released, and the extractions cannot be released. A re-implementation of a guarded reader (root prefix from an anchor file, same-named copies, format sniffing, an Android Binary XML decoder, SQLite journal mode, and one of four states per field), with six invented archives that reproduce the pitfalls of Table 7 where they do not depend on vendor-specific files, and 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 Sections 3.3, 4.4 and 5; it contains none of the counts of this report, none of the vendor-specific branches of the verification, and no parser of the device-management schema repository.
Data Handling Statement
The evidence for this study is drawn from the Lab's research corpus of mobile device extractions and was read only. The report gives aggregate counts and device classes. It contains no identifiers, personal data, message or file content, or case information. The verification read each archive's central directory and a small number of system members (property lists, settings files, build property files, SQLite databases with their journals). Only the presence of files and keys, file formats, journal modes and aggregate counts were recorded; no setting value, account, identifier, application name or user content is reported. Paths in this paper are platform paths with user numbers and container identifiers replaced by placeholders.
Declaration of AI Assistance
The authors conceived the research questions and directed the work. The verification scripts, the data checks and the first draft of this paper 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. Where Android Records Who Used What: App Ops History in Databases, XML Files and Bug Reports. Lab Technical Report LAB-TR-0003, version 1.0. SectraTEK Lab. https://doi.org/10.5281/zenodo.23717925
- Daniel Addai. 2026. Informative but Individually Unreliable: An Empirical Study of Android Reset Indicators and Their Clocks. Lab Technical Report LAB-TR-0004, version 1.0. SectraTEK Lab. https://doi.org/10.5281/zenodo.23717927
- Daniel Addai. 2026. Empty Is Not Absent: Silent Failure Modes in Open-Source Mobile Forensic Parsers on iOS 26 and Android 16. Lab Technical Report LAB-TR-0006, version 1.0. SectraTEK Lab. https://doi.org/10.5281/zenodo.23717929
- Daniel Addai. 2026. Screen Time on iOS 15 to 27: Mostly Empty Usage Tables and Counts That Change Without the Write-Ahead Log. Lab Technical Report LAB-TR-0009, version 1.0. SectraTEK Lab. https://doi.org/10.5281/zenodo.23717933
- Android Open Source Project. 2022. BinaryXmlSerializer.java (platform/frameworks/libs/modules-utils). Source file. Retrieved October 27, 2026 from https://android.googlesource.com/platform/frameworks/libs/modules-utils/+/refs/heads/main/java/com/android/modules/utils/BinaryXmlSerializer.java
- Android Open Source Project. [n. d.]. File-based encryption. Retrieved October 27, 2026 from https://source.android.com/docs/security/features/encryption/file-based
- Apple. 2026. device-management: Device management schema (release Release-v27.2, commit 9e7fdbe23990). GitHub repository (MIT licence). Files
mdm/profiles/com.apple.applicationaccess.yamlandmdm/profiles/com.apple.mobiledevice.passwordpolicy.yaml. Retrieved October 27, 2026 from https://github.com/apple/device-management - Alexis Brignoni et al. [n. d.]. ALEAPP: Android Logs Events And Protobuf Parser. GitHub repository (MIT licence). Retrieved October 27, 2026 from https://github.com/abrignoni/ALEAPP
- Alexis Brignoni et al. [n. d.]. iLEAPP: iOS Logs, Events, And Plists Parser. GitHub repository (MIT licence). Retrieved October 27, 2026 from https://github.com/abrignoni/iLEAPP
- Alex Caithness. 2022. Android ABX – Binary XML. CCL Solutions Group blog, January 6, 2022. Retrieved October 27, 2026 from https://www.cclsolutionsgroup.com/post/android-abx-binary-xml
- 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.)
- Scott Koenig. 2022. DFIR Review showcase: iOS settings, Display Auto-Lock and Require Passcode. Presentation, DFRWS USA 2022. https://dfrws.org/presentation/dfir-review-showcase-ios-settings-display-auto-lock-require-passcode/ (Not re-verified: the page returned HTTP 403 to our fetch; title, author and event taken from search results.)
- Mobile Verification Toolkit (MVT) project. [n. d.]. MVT, module
ios/modules/mixed/global_preferences.py. GitHub repository. Retrieved October 27, 2026 from https://github.com/mvt-project/mvt - SQLite. [n. d.]. Write-Ahead Logging. Retrieved October 27, 2026 from https://www.sqlite.org/wal.html
- SQLite. [n. d.]. Database File Format. Retrieved October 27, 2026 from https://www.sqlite.org/fileformat2.html