This has happened a few times, including out in the field; it's happened on macOS 14 and 15 I think.
"This" is: our app runs, activates the extension, it has to get user approval, and... the system dialogue window never appears. The extension stays waiting for user approval. I've got sysdiagnose from one of the systems, and I see the system log about it going into the user approval needed state, and... nothing else.
It's there in Settings, and can be approved then.
Has anyone run into this? Ever?
I just filed FB17948001, with the sysdiagnose attached.
So, I was able to take a look at it today and there are definitely some oddities I don't understand. FYI, the list of things below constructed across a significant period of time, so it isn't order in any particular way nor is it necessarily "prioritized".
(a) One of your components ("ProxyAgent") crashed twice, with a reboot in between. You can find the crash log data in the system log archive by looking for pids "1401" and "339". The crashes themselves are fairly similar, with a high thread ID GCD thread crashing here:
6 <redact> 0x101581398 -[ExtensionLoader asyncControlProxyWithErrorHandler:]
7 <redact> 0x10102cebd -[AppBypassCollector sendAppEntry:]
8 <redact> 0x10157e847 -[AppEntryCollector addName:]
9 <redact> 0x10102d2a2 AppBypassConfig::sendListByOS(std::__1::set<std::__1::basic_string<char,
10 <redact> 0x1010226d5 AppBypassConfig::sendAppBypassList()
I'm not sure how it connect (if at all), but the timing is suspicious as it lines up with about the time the system extension activation started.
(b) An app update is what triggered this (from 1.0.16593-> 1.0.16594) and one of my questions is whether or not the extension actually updates. More specifically, there are two components I'm concerned about here:
-
The Info.plist data, particularly the version number.
-
The build UUID
Across most of the system (particularly, the "high" level system), the Info.plist data (particularly the bundle ID and version data) are how the system references and manages "your app". However, some lower level components actually use the build UUID as their unique identifier.
My concern here is how this interacts with codesigning, as ANY change to the bundle contents will change the bundle ID, but only build changes will modify the build UUID. Depending on your build strategy, that means you can end up in a situation where the build UUID hasn't changed (because the executable didn't change) but the bundle data HAS (because, for example, you increased the build number).
I don't know if this applies in your case, if you are incrementing version numbers with every release (even when a specific executable didn't change), then I would recommend modifying your code to ensure that it DOES change.
(c) I'm not sure that it will actually effect anything, but trustd does not like the entitlement configuration of your app group and logs a ton of this message:
"...is ignored because of invalid application signature or incorrect provisioning profile"
(d) There are multiple EndpointSecurity clients active, one of which appears to be semi-broken based on this message (~4000):
Failed to open service: 0xe00002d8: Caller lacks TCC authorization for Full Disk Access
Note that EndpointSecurity API is particularly dangerous because it's basically capable of silently disrupting anything in the entire system.
(e) This failure caught my eye:
2025-06-09 15:16:48.915439+0530 sysextd: [com.apple.sx:Staging]
Removing tree at
path: /Library/SystemExtensions/30D6C688-7BDF-46EE-A7AF-459AB7699380
failed with
error: “30D6C688-7BDF-46EE-A7AF-459AB7699380” couldn’t be removed.
Resetting flags and trying again!
Are you setting UF_IMMUTABLE on anything in your extension? It was fixed before the system your on (23B45 vs 23F79), but there was a bug (r.113410811) in sysextd which would prevent staging from completing if the UF_IMMUTABLE bit had been set on any component.
(f) As far as I can tell, the direct reason we never presented the dialog is that, as far as the sysextd was concerned, we already had:
2025-06-09 15:32:13.834324+0530 sysextd: activateDecision found existing entry of same version: state activated_waiting_for_user, ID 30D6C688-7BDF-46EE-A7AF-459AB7699380
2025-06-09 15:32:13.834345+0530 sysextd: initial activation decision: coalesceWithActivationInProgress(<sysextd.Extension: 0x7fc262405b60>)
It's likely something else occurred during the first activation pass which prevented the initial notification, however, I didn't see any explanation in the log data and, unfortunately, the first activation occurred before the most recent power cycle (which purges significant log data).
...and that's what I've found.
__
Kevin Elliott
DTS Engineer, CoreOS/Hardware