logarchive: TCC authorization cache and location manager state statedump artifacts by danjethh · Pull Request #2518 · abrignoni/iLEAPP · GitHub
Skip to content

logarchive: TCC authorization cache and location manager state statedump artifacts - #2518

Merged
abrignoni merged 5 commits into
abrignoni:mainfrom
danjethh:add-tcc-location-statedump-artifacts
Oct 20, 2026
Merged

abrignoni merged 5 commits into
abrignoni:mainfrom
danjethh:add-tcc-location-statedump-artifacts

Conversation

@danjethh

@danjethh danjethh commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Four artifacts over the logarchive_artifacts table. Statedump records have no
subsystem or category and the table does not keep the event type, so they are
collected by the first line of the message, as well as filtered in the
dependent artifacts:

  • logarchive TCC authorization cache dumps: one row per cached entry of each
    'title: TCC Authorization Cache' dump, with the service, the two object
    addresses, the auth right, reason, version and any flags text as logged and the
    process that wrote the dump. Empty dumps give no row; an unreadable body gives
    one row with the text as logged.
  • logarchive TCC authorization cache summary: the same entries collapsed, with the
    first and last dump holding each and the number of dumps. A labelled view, not
    a change log.
  • logarchive location manager state dumps: one row per 'title:
    CLLocationManagerStateTracker' dump with sixteen logged keys as columns and the
    remaining keys, and any line that is not a key and value, in Other Fields.
  • logarchive location manager state summary: distinct content per process and
    PID, with first and last dump and the number of dumps.

Values are copied as logged and no meaning is assigned. The dumps do not name the
application they describe; the only attribution is the process that wrote them.

Tested through the real ileapp.py two-stage chain on a synthetic 'log show'
export (each parser fallback, invented shapes marked in the generator, decoys,
and a test that fails if a collection marker is removed). The new case runs the
logarchive producer over the export; the artifacts declare no paths so the case
harness cannot supply their input. No data from a real extraction is committed.

Also run on two corpus sysdiagnoses, read from tracev3 data; counts are in
sample_data:

  • ai16_ios26_sysdiag (iOS 26.5.2): 542 TCC cache rows from 481 dumps, 2,174
    location state rows. Every body read and every authorization record matched.
  • hc_ios26_sysdiag (iOS 26.6): 278 TCC cache rows from 254 dumps, 514 location
    state rows.

Most TCC rows are entitled AddressBook entries written by system processes.
Both sysdiagnoses also hold TCC.db, which names the client; the dumps add the
writing process and the dump time. The two address columns are now named
Credential Object Address and Authorization Object Address.

Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com

danjethh and others added 5 commits October 19, 2026 18:36
…ump artifacts

Four artifacts over the logarchive_artifacts table. Statedump records have no
subsystem or category and the table does not keep the event type, so they are
collected by the first line of the message, as well as filtered in the
dependent artifacts:

- logarchive TCC authorization cache dumps: one row per cached entry of each
  'title: TCC Authorization Cache' dump, with the service, the two object
  addresses, the auth right, reason, version and any flags text as logged and the
  process that wrote the dump. Empty dumps give no row; an unreadable body gives
  one row with the text as logged.
- logarchive TCC authorization cache summary: the same entries collapsed, with the
  first and last dump holding each and the number of dumps. A labelled view, not
  a change log.
- logarchive location manager state dumps: one row per 'title:
  CLLocationManagerStateTracker' dump with sixteen logged keys as columns and the
  remaining keys, and any line that is not a key and value, in Other Fields.
- logarchive location manager state summary: distinct content per process and
  PID, with first and last dump and the number of dumps.

Values are copied as logged and no meaning is assigned. The dumps do not name the
application they describe; the only attribution is the process that wrote them.

Tested through the real ileapp.py two-stage chain on a synthetic 'log show'
export (every branch, shapes marked INVENTED SHAPE, decoys, a marker-removal
check that fails the tests). The new case runs the logarchive producer over the
export; the artifacts declare no paths so the case harness cannot supply their
input. make_test_data.py treats `paths: None` as no patterns (same change as on
add-camera-mic-capture-sessions). No data from a real extraction is committed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
testdata.logarchive.json: union of the case keys (case_synthetic_capture from
main, case_synthetic_statedump from this branch).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…lines with POSIX paths

- testdata.logarchive.json: both cases (case_synthetic_capture, case_synthetic_statedump) regenerated with make_test_data.py so every artifact of the module is listed, including the camera/microphone and the TCC and location statedump artifacts. Descriptions, maker and the case zips are unchanged.
- The statedump baseline was recorded on Windows, so input_zip_path held backslashes. Re-recorded (TZ=UTC); headers and rows are identical to the superseded snapshot apart from the path separator, which is now POSIX. The capture baseline's input_zip_path gets the same separator fix.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Row counts from ai16_ios26_sysdiag (iOS 26.5.2) and hc_ios26_sysdiag
(iOS 26.6), read from tracev3 data. The notes now give the values seen
there, the share of rows that are entitled AddressBook entries written
by system processes, how the dumps sit beside TCC.db, and the location
dumps' fixed key set. "Tested" becomes "read" for the privately read
logs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The TCC address columns hold only the hex address taken from each
description, so they are now Credential Object Address and
Authorization Object Address. Dump-count sentences give the measured
range instead of "many", the per-manager premise for location dumps is
stated as not established, and process counts say they count image
paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@abrignoni
abrignoni merged commit c3248e0 into abrignoni:main Oct 20, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants