I am testing a fixed signed LaunchDaemon startup program that uses
setgroups, setgid and setuid to establish a dedicated non-root identity
before loading its service library or creating an application XPC listener.
This follows the single-process, deferred-library direction discussed in
DTS thread 844906.
The remaining question is the supported treatment of system-runtime state
initialized before the credential transition. Test environment: Apple silicon,
macOS 27.0.1 / Darwin 27.0.0, hardened runtime, no special entitlements.
The host links only libSystem and has no application constructors. This is a
temporary diagnostic, not an installed product or a file-operation service.
Our test verifies real, effective and saved UID/GID, the exact supplementary
group vector and failed attempts to regain root. After the transition, a
read-only own-task Mach inventory still sees a voucher even though successful
task/current-thread voucher getters return null. It also sees one send+receive
endpoint without an alias to any of the queried special/registered roles.
Ordinary hardened launchd controls in both the login GUI and user domains also
have a voucher and such an endpoint. Their recorded endpoint attributes match
the post-drop test: empty queue, sequence 1, make-send count 1, send rights present,
no send-once rights, port sets or notification requests. We do not treat this as
proof that the objects or authority are equivalent. No messages are sent to the
unidentified endpoint and no runtime-owned rights are destroyed.
In a separate ordinary-user test, public voucher recipe extraction reports only
a BANK attribute. Published libdispatch source describes a default task-bank
voucher stored separately from the current thread's voucher slot. Published XNU
source captures identity when bank context is initialized. We have not established
the corresponding lifecycle or authority implications on this OS release, and
do not claim that the observed voucher retains root authority.
For this startup arrangement, what supported public contract should an application
use to establish that libSystem's retained runtime context does not preserve usable
pre-drop administrator authority before loading service code? Is there a supported
sanitization step, or a specific documented OS trust assumption under which leaving
that state intact is intended? If the combination of exact group reduction,
deferred service loading and launchd Mach-service check-in cannot support that
boundary, which public architecture should we use instead?
We are seeking a documented arrangement or a clear limit on the guarantee,
rather than a private reset API or an explanation of every internal endpoint.
We have not used same-PID exec, a root supervisor, private APIs, or a broad
port-type allowlist. Relevant documentation or a minimal public sample would help.
1
0
304