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

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.

Table 1: Extractions examined, by operating system version.
FamilyVersions (extractions)Total
iOSiOS 15 (2), iOS 16 (5), iOS 17 (3), iOS 18 (3), iOS 26 (20), undetermined (1)34
AndroidAndroid 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:

  1. 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).
  2. 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 -wal or -journal file.
  3. 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 -wal file.
  4. 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.

Five steps of reading a setting from an extraction, and how each fails silentlyA vertical flow of five steps. Step 1, find the root: the path prefix differs by container (filesystem1/, a leading slash, Dump/), so a pattern anchored at the start matches nothing. Step 2, pick the copy: files of the same name exist as asset, managed, backup and third-party copies. Step 3, enumerate users and containers: reading only user 0, or a fixed container path, misses the data. Step 4, decode the format: Android Binary XML read as XML, a binary property list read as XML, or a SQLite database read without its write-ahead log returns nothing or stale rows. Step 5, look up the key: keys written only when a setting changes, and renamed or label-derived names, return nothing. The result is reported in one of four states: value read, key absent, source absent, not read. 1 Find the rootpath prefix of archive Empty if the pattern is anchored:filesystem1/, leading /, Dump/ 2 Pick the copyone of several names Wrong copy read first:asset, managed, backup, app 3 Enumerateusers and containers Missed if only user 0 is reador a container path is fixed 4 Decode the formatABX, plist, SQLite Empty if ABX is parsed as XMLor the -wal file is left out 5 Look up the keyname, release, user Empty if the key is writtenonly on change, or renamed Report one of four statesvalue read · key absent in a read file · source absent · not read
Figure 1: Five steps of a read and the way each can fail without an error. Only the first of the four reported states is a statement about the setting. The counts behind each step are in Table 7.

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.

Table 2: iOS path and key map. “Present” counts the 34 iOS extractions that held the source; key counts are among the files present.
SettingPathFormat; key or structurePresentRating
OS release/System/Library/CoreServices/SystemVersion.plistplist; ProductVersion, ProductBuildVersion32/34Verified
Lockdown Mode/private/var/mobile/Library/Preferences/.GlobalPreferences.plistbinary plist; LDMGlobalEnabled33/34; key 5/33Verified
Lockdown Mode (managed copy)/private/var/Managed Preferences/mobile/.GlobalPreferences.plistbinary plist; same file name31/34; key 0/31Verified; key never seen
Find My/private/var/mobile/Library/Preferences/com.apple.icloud.findmydeviced.FMIPAccounts.plist; also in system containers (Section 4.1)binary plist; account dictionary, no single on/off key [9]21/34Verified; location varies
Automatic iOS updates/private/var/mobile/Library/Preferences/com.apple.softwareupdateservicesd.plistbinary plist; SUAutomaticUpdateV2Enabled, SUDisableAutoDownload, SUAutoInstallSecurityResponse, SUAutoInstallSystemDataFiles20/34; keys 15, 4, 0, 2Verified for keys seen; others documentation only
Automatic App Store updates/private/var/mobile/Library/Preferences/com.apple.itunesstored.plistbinary plist; AutoUpdatesEnabled30/34; key 16/30Verified
Mail Privacy Protection/private/var/mobile/Containers/Shared/AppGroup/<UUID>/Library/Preferences/group.com.apple.mail.plist; container found by MCMMetadataIdentifier = group.com.apple.mail in .com.apple.mobile_container_manager.metadata.plistbinary plist; LoadRemoteContent-v2 (integer)30/34; key 26/30Verified
Passcode and restriction values (effective)/private/var/mobile/Library/UserConfigurationProfiles/EffectiveUserSettings.plist; or /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles/Library/ConfigurationProfiles/EffectiveUserSettings.plistXML or binary plist; restrictedBool.<key>.value; restrictedValue.<key>.{value, rangeMinimum, rangeMaximum}; intersection; union. Passcode keys in restrictedValue: maxInactivity, maxGracePeriod, minLength33/34; wrapper 33; keys 33, 33, 32Verified
Public copy of effective settings/private/var/mobile/Library/UserConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist (or the system group path)plist33/34Verified
Screen Time configuration/private/var/mobile/Library/Application Support/com.apple.remotemanagementd/RMAdminStore-Local.sqlite and RMAdminStore-Cloud.sqliteSQLite in WAL mode; tables as in [4]30/34 and 29/34; non-empty -wal 29 and 24Verified (file and journal)
iCloud Private Relay/private/var/mobile/Library/Preferences/com.apple.networkserviceproxy.plistbinary plist; top-level NSPServiceStatusManagerInfo (embedded archive; field meaning not verified)29/34; key 29/29Verified (key); content documentation only
App Privacy Report/private/var/mobile/Library/PrivacyAccounting/Biome/com.apple.privacy.accounting.stream*/local/*SEGB stream files [9]9/34; non-empty files on 9Verified (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.

Table 3: Android path and key map (all entries verified). “Present” counts the 14 Android extractions that held the source.
Setting areaPathFormatKey, table or structurePresent
Settings namespacesdata/system/users/<u>/settings_global.xml, settings_secure.xml, settings_system.xmlABX on Android 12, 13, 14, 16 (53 files); XML on Android 10 (5 files)<setting name= value=>; global only for user 014/14
Lock screen storedata/system/locksettings.dbSQLite; journal: rollback on 13, WAL on 1 (Android 10)table locksettings (name, value, user); sp-handle 14, lockscreen.passwordhistory 1114/14
Synthetic-password blobsdata/system_de/<u>/spblob/*.spblobbinaryfile presence only14/14
Build propertiessystem/build.prop, vendor/build.proptext, key=valuesystem: 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 1313/14, 13/14
Device administratorsdata/system/device_policies.xml; per-user copies in data/system/users/<u>/ABX on Android 12, 13, 14, 16; XML on Android 10<admin> elements14/14
Notification policydata/system/notification_policy.xmlABX on Android 12, 13, 14, 16; XML on Android 10policy elements14/14
App opsdata/system/appops.xml; data/system/appops_accesses.xmlABX on Android 12, 13, 14, 16; XML on Android 10see [1]7 and 10
Usersdata/system/users/userlist.xml, data/system/users/<u>.xmlABX on Android 12, 13, 14, 16; XML on Android 10user entries and flags14/14
Accountsdata/system_de/<u>/accounts_de.db, data/system_ce/<u>/accounts_ce.dbSQLite; rollback journal (37 of 39 databases)table accounts14/14, 14/14
Installed packagesdata/system/packages.xmlABX on Android 12, 13, 14, 16; XML on Android 10package elements14/14
Runtime permissionsdata/misc_de/<u>/apexdata/com.android.permission/runtime-permissions.xml; Android 10: data/system/users/<u>/runtime-permissions.xmlXML on allpermission elements per package13 and 1
Saved Wi-Fi networksdata/misc/apexdata/com.android.wifi/WifiConfigStore.xml; per user data/misc_ce/<u>/apexdata/com.android.wifi/; Android 10: data/misc/wifi/WifiConfigStore.xmlXML on allnetwork blocks with security type13 and 1
Bluetooth pairingsdata/misc/bluedroid/bt_config.conftext (INI sections)one section per device14/14
Persistent propertiesdata/property/persistent_propertiesprotobufname and value records [2]14/14
Samsung enterprise storedata/system/enterprise.dbSQLite156 to 170 tables, 11 to 26 with rows12 of 12 Samsung
Storage classesdata/system_de/<u>, data/system_ce/<u>, data/user_de/<u>directoriesdevice- and credential-encrypted split [6]14, 14, 14
Table 4: Settings keys found in the decoded settings files of user 0, out of 14 Android extractions. Presence only; values were not recorded.
FileKeyPresent
settings_globaladb_enabled14/14
settings_globaldevelopment_settings_enabled14/14
settings_globalpackage_verifier_user_consent14/14
settings_globalpackage_verifier_enable2/14
settings_globalauto_time14/14
settings_globalauto_time_zone14/14
settings_globaldevice_provisioned14/14
settings_securelock_screen_lock_after_timeout13/14
settings_securelock_screen_allow_private_notifications14/14
settings_securelock_screen_show_notifications14/14
settings_secureinstall_non_market_apps14/14
settings_securelocation_mode14/14
settings_securelocation_providers_allowed3/14
settings_securepackage_verifier_state3/14
settings_securebackup_enabled14/14
settings_secureenabled_input_methods14/14
settings_securedefault_input_method14/14
settings_secureuser_setup_complete14/14
settings_securelock_to_app_exit_locked6/14
settings_securealways_on_vpn_app0/14
settings_securealways_on_vpn_lockdown0/14
settings_systemshow_password10/14
settings_systemlock_to_app_enabled2/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.

Table 5: Documented sources and keys that were not found, or found only on older releases.
Source or keyDocumented asObserved
data/data/com.android.providers.settings/databases/settings.dblegacy settings databaseabsent from all 14; files named settings.db belonged to other apps on 12
gesture.key, password.key in data/system/legacy credential filesabsent from all 14
gatekeeper.*.key in data/system/credential filesabsent from all 14; spblob present on 14
fpdata under data/vendor_de/<u>/ or data/system/users/<u>/fingerprint enrolment filesat these paths on 1 of 14 (Android 12); documentation only otherwise
ro.crypto.state, ro.crypto.typeencryption propertiesin no build property file; runtime properties, not on disk
ro.build.fingerprint in system/build.propbuild fingerprintin 0 of 13 system build property files; ro.system.build.fingerprint in 13
lockscreen.password_type in locksettingscredential typeonly on Android 10, 13 (2 of 14)
lockscreen.disabled in locksettingslock screen disabled flagon 8 of 14 (Android 10, 12, 13, 14, 16)
lock_pattern_autolock in locksettingslegacy pattern flagon 0 of 14
always_on_vpn_app, always_on_vpn_lockdownalways-on VPN (secure namespace)on 0 and 0 of 14 (written only when configured)
maxFailedAttempts, pinHistory, forcePIN, allowSimple in EffectiveUserSettings.plistpasscode policy keys (schema [7])in 0, 0, 1 and 1 of 33 stores; documentation only
AutomaticUpdateAuthorizations in com.apple.appstored.plistper-app update authorisationin 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.

Format of the Android settings files, by Android versionHorizontal bars, one per Android version, counting extractions by the format of their settings files. Android 10: 0 extraction(s) with ABX settings files, 1 with plain XML; Android 12: 1 extraction(s) with ABX settings files, 0 with plain XML; Android 13: 2 extraction(s) with ABX settings files, 0 with plain XML; Android 14: 1 extraction(s) with ABX settings files, 0 with plain XML; Android 16: 9 extraction(s) with ABX settings files, 0 with plain XML. All 53 settings files on Android 13 and later were ABX.ABX (binary)plain XMLAndroid 101Android 121Android 132Android 141Android 169extractions (n = 14)
Figure 2: Format of the 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.
Table 6: Preconditions for a valid read, by format, with the range in which we observed each format.
Format or layoutWhereObserved onPreconditionIf not met
Binary property listiOS system preference filesevery iOS extraction (iOS 15 to 26)parse both binary and XML encodingsparse error or empty dictionary
XML property listiOS profile store (EffectiveUserSettings.plist)26 of 43 files XML, 17 binarysamesame
Android Binary XMLsettings files, packages.xml, device_policies.xml, notification_policy.xml, userlist.xml, user filesAndroid 12, 13, 14, 16 (all 53 settings files); plain XML on Android 10first bytes 41 42 58 00: decode before key lookupXML parser error; text search finds no name="…"
Plain XMLthe same files on Android 10; WifiConfigStore.xml and runtime-permissions.xml on allAndroid 10 to 16do not assume ABX for every system XML filedecoder rejects a plain file
SQLite, WAL modeScreen Time store (iOS); locksettings.db on 1 Android extraction(s)iOS 15 to 26; Android 10header byte 18 = 2: open with the -wal filemissing or stale rows [4], [14]
SQLite, rollback journallocksettings.db, accounts_de.db, accounts_ce.dbmost Android extractionsbyte 18 = 1: main file is sufficientnone observed
Protobufpersistent_propertiesall Androiddecode fields; do not scan as textfew or no records [2]
Per-user treesdata/system/users/<u>, system_de/<u>, system_ce/<u>user 150 on 6 Android extractionsenumerate all user numberssecond user's data missed
Random container namesiOS app-group and system data containersall iOSresolve by metadata or searchfixed 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.

iOS preference files present versus key presentPaired bars for four keys. LDMGlobalEnabled: file present on 33 of 34 iOS extractions, key present on 5; SUAutomaticUpdateV2Enabled: file present on 20 of 34 iOS extractions, key present on 15; AutoUpdatesEnabled: file present on 30 of 34 iOS extractions, key present on 16; LoadRemoteContent-v2: file present on 30 of 34 iOS extractions, key present on 26.file presentkey present in the fileLDMGlobalEnabled(.GlobalPreferences.plist)335SUAutomaticUpdateV2Enabled(softwareupdateservicesd)2015AutoUpdatesEnabled(itunesstored)3016LoadRemoteContent-v2(group.com.apple.mail)3026bar length: iOS extractions, out of 34
Figure 3: On iOS, the preference file usually exists while the key does not: these keys are written when a setting is changed. A reader that finds the file but not the key has learned that the key is absent, not that the setting is off. Source: Table 2.
Table 7: Ten pitfalls that produce silent empty reads, the trigger counted in the sample (34 iOS, 14 Android extractions) and a guard.
PitfallWhat returns emptyTrigger in the sampleGuard
P1 Container prefixa pattern anchored at the start of the member nameiOS: 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 1derive the prefix from an anchor file
P2 Same-named filesthe first match is another file of the same nameiOS: 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 1prefer the canonical path; list the others
P3 Random container namesa fixed container pathMail 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 20resolve by metadata; search container classes
P4 Second usersreading user 0 onlymore 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 0enumerate user numbers
P5 Binary XMLan XML parser or text search53 of 58 settings files ABX; XML parser rejected 53, text search found nothing in 53sniff the magic bytes and decode
P6 Missing journala database opened without its -walnon-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 changea key lookup in a file that existsLockdown 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 30report “key absent”, not “off”
P8 Renamed or moved itemsa name or path from an older releasero.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 itkeep names per release
P9 Presence is not statea 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 supervisionlabel-derived or supervised-only keys5 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).

Table 8: Five label-derived key names that do not exist in Apple's restriction schema, and the schema's own keys (Release-v27.2).
Name derived from the labelSchema keyiOS, supervision
allowHideAppsallowAppsToBeHiddeniOS 18.0; supervised
allowFaceTimeallowVideoConferencingsupervised (iOS 13 and later)
allowScreenRecordingno top-level key; a sub-restriction nested under allowScreenShotallowScreenShot: unsupervised
allowContentRatingsno such key; ratingApps, ratingMovies, ratingTVShows, allowExplicitContentratings unsupervised; explicit content supervised
allowESIMOutgoingTransferallowESIMOutgoingTransfers (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.

  1. 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.
  2. 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.
  3. 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.
  4. Resolve containers by metadata. Find app-group and system containers through their metadata files, and search the known container classes for relocated preference files.
  5. Enumerate every user. Read settings, accounts, lock screen rows and permissions for each user number, and expect device-wide settings only under user 0.
  6. 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.
  7. Bring the journal. Read a SQLite database together with its -wal file whenever header byte 18 is 2, and state whether the log was applied.
  8. 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.
  9. 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).
  10. 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 -wal file, 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. Android Open Source Project. [n. d.]. File-based encryption. Retrieved October 27, 2026 from https://source.android.com/docs/security/features/encryption/file-based
  7. Apple. 2026. device-management: Device management schema (release Release-v27.2, commit 9e7fdbe23990). GitHub repository (MIT licence). Files mdm/profiles/com.apple.applicationaccess.yaml and mdm/profiles/com.apple.mobiledevice.passwordpolicy.yaml. Retrieved October 27, 2026 from https://github.com/apple/device-management
  8. 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
  9. 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
  10. 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
  11. 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.)
  12. 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.)
  13. 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
  14. SQLite. [n. d.]. Write-Ahead Logging. Retrieved October 27, 2026 from https://www.sqlite.org/wal.html
  15. SQLite. [n. d.]. Database File Format. Retrieved October 27, 2026 from https://www.sqlite.org/fileformat2.html

Cite and download

Cite as

Daniel 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/

Citation guide

No DOI has been assigned to this version yet.

lab-tr-0017.bib
@techreport{addai2026labtr0017,
  author      = {Addai, Daniel and Tetteh, Sanders Larweh and Adjabeng, Selorm and Egyir, Kingsley Albert},
  title       = {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},
  institution = {SectraTEK Lab, Prudential Associates},
  type        = {Lab Technical Report (white paper)},
  number      = {LAB-TR-0017},
  year        = {2026},
  url         = {https://lab.sectratek.com/research/reports/lab-tr-0017/},
  note        = {Version 1.0, preprint, not peer reviewed. CC BY 4.0}
}

Licence: CC BY 4.0. The print layout of this page is set for US Letter in two columns. Related reports: LAB-TR-0004, LAB-TR-0006 and LAB-TR-0009.

Versions and corrections

VersionDateChange
1.02026-10-27First release.

Corrections: none so far. Errors can be reported through the corrections page.