Kernel deadlock with Content Filter + VPN on macOS 26

Hi all,

I've run into a kernel deadlock issue involving content filter + VPN system/network extension on macOS 26, and would really appreciate any insights.

A user reported that their mac is occasionally assigened a 169.254.0.0/16 address and can't reach any website after connecting Wi-Fi. Disabling our content filter restores network connectivity immediately.

They're running the following software on the mac:

  • macOS 26 (issue reproduced on 25C56 and 25F71)
  • NEFilterDataProvider-based content filter (our extension)
  • VPN network extension

A spindump taken while the system had lost network connectivity shows the content filter's process stuck while delivering an "allow" verdict to the kernel. All subsequent flow decisions for the extensions are blocked behind it, which would explain why new DHCP request can't complete and the interface stays on a self-assigned address.

Based on the "last ran" and timestamp in the spindump, the underlying deadlock appears to have occurred while the computer wasn't connected to any Wi-Fi network, so there was no visible symptom at the time. The user only noticed something was wrong once they tried to reconnect and saw the bad IP address; they did not realize the content filter was already stuck.

This issue may be identified by searching for keyword "sofreelastref" in the spindump (see comment below).

Has anyone else seen a content filter + VPN hang like this on macOS 26? Any guidance or pointers would be greatly appreciated. Thanks in advance!

For Developer Technical Support staffs: FB23720745

Shay

Answered by DTS Engineer in 897463022

If you’re ever able to reproduce this, please grab a sysdiagnose log and attach it to your bug report. Likewise, if you’re working with a customer who’s seeing this, please ask them to do the same. If they don’t want to share a sysdiagnose log with you, they can file their own bug, attach the log to that, and then pass their bug number along.


That spindump is… well… interesting. There’s a lot of other stuff going on at the time the log was taken, and some of it is quite worrying.

Let’s start with the 34 instances of the networksetup, all running under Rosetta. Is that your doing? Because they all seem to have been launched by one of the 9 instances of f_-s____m-s_____e_d____n-a____ [1], which are also running under Rosetta.

Oh, and then there’s the 63 instances of bash O-:

And there’s a total of 7 system extensions running: 5 from you, 2 from another developer, and 1 from yet another developer. And at least 3 of those are Endpoint Security sysexen, and any one of those has the capability to bork the entire system.

My advice here is for you to work with this customer to try to simplify their configuration in order to isolate the problem. As a first step, I recommend that you get the ES sysexen out of the mix, because it’s ridiculously easy for such products to create problems like this. If you can still reproduce the problem with only the NE sysexen, then at least you know that this is a networking problem.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

[1] Redacting the exact name, for pretty obvious reasons.

spindump:

Date/Time:        2026-07-08 13:20:56.218 -0400
End time:         2026-07-08 13:21:06.222 -0400
OS Version:       macOS 26.2 (Build 25C56)
Hardware model:   Mac16,12

Process:          network-extension-with-data-filter-provider [370]

  Thread 0x42e45    DispatchQueue "NEFilterExtensionProviderContext queue"(88)    1001 samples (1-1001)    priority 37 (base 37)    last ran 3136.683s ago
  1001  start_wqthread + 8 (libsystem_pthread.dylib + 7068) [0x198b58b9c]
    1001  _pthread_wqthread + 292 (libsystem_pthread.dylib + 11852) [0x198b59e4c]
      1001  _dispatch_workloop_worker_thread + 692 (libdispatch.dylib + 85356) [0x1989b3d6c]
        1001  _dispatch_root_queue_drain_deferred_wlh + 292 (libdispatch.dylib + 87156) [0x1989b4474]
          1001  _dispatch_lane_invoke + 440 (libdispatch.dylib + 45048) [0x1989a9ff8]
            1001  _dispatch_lane_serial_drain + 740 (libdispatch.dylib + 42216) [0x1989a94e8]
              1001  _dispatch_client_callout + 16 (libdispatch.dylib + 113364) [0x1989baad4]
                1001  _dispatch_call_block_and_release + 32 (libdispatch.dylib + 7004) [0x1989a0b5c]
                  1001  __63-[NEFilterFlow updateSourceAppInfoWithQueue:completionHandler:]_block_invoke_2 + 300 (NetworkExtension + 629016) [0x1ad72f918]
                    1001  __114-[NEFilterDataExtensionProviderContext handleData:offset:forFlow:direction:reply:controlSocket:completionHandler:]_block_invoke + 360 (NetworkExtension + 579396) [0x1ad723744]
                      1001  -[NEFilterDataSavedMessageHandler enqueueWithFlow:context:] + 172 (NetworkExtension + 575824) [0x1ad722950]
                        1001  -[NEFilterDataSavedMessageHandler executeWithFlow:context:] + 240 (NetworkExtension + 576128) [0x1ad722a80]
                          1001  -[NEFilterDataSavedMessageHandler executeVerdictHandlerWithFlow:verdict:context:] + 292 (NetworkExtension + 576608) [0x1ad722c60]
                            1001  __114-[NEFilterDataExtensionProviderContext handleData:offset:forFlow:direction:reply:controlSocket:completionHandler:]_block_invoke.145 + 132 (NetworkExtension + 580208) [0x1ad723a70]
                              1001  -[NEFilterSocketFlow createDataReply:controlSocket:direction:verdict:context:] + 328 (NetworkExtension + 616272) [0x1ad72c750]
                                1001  write + 8 (libsystem_kernel.dylib + 18464) [0x198b1e820]
                                 *1001  ??? (kernel.release.t8132 + 15928) [0xfffffe0008857e38]
                                   *1001  ??? (kernel.release.t8132 + 1851712) [0xfffffe0008a18140]
                                     *1001  ??? (kernel.release.t8132 + 7705260) [0xfffffe0008fad2ac]
                                       *1001  ??? (kernel.release.t8132 + 6447640) [0xfffffe0008e7a218]
                                         *1001  ??? (kernel.release.t8132 + 6446924) [0xfffffe0008e79f4c]
                                           *1001  ??? (kernel.release.t8132 + 6445636) [0xfffffe0008e79a44]
                                             *1001  ??? (kernel.release.t8132 + 6476512) [0xfffffe0008e812e0]
                                               *1001  sosend + 2692 (kernel.release.t8132 + 6648852) [0xfffffe0008eab414]
                                                 *1001  ??? (kernel.release.t8132 + 6031184) [0xfffffe0008e14750]
                                                   *1001  ??? (kernel.release.t8132 + 4278944) [0xfffffe0008c68aa0]
                                                     *1001  ??? (kernel.release.t8132 + 4282704) [0xfffffe0008c69950]
                                                       *1001  ??? (kernel.release.t8132 + 4300868) [0xfffffe0008c6e044]
                                                         *1001  ??? (kernel.release.t8132 + 4303632) [0xfffffe0008c6eb10]
                                                           *1001  ??? (kernel.release.t8132 + 4528384) [0xfffffe0008ca5900]
                                                             *1001  sofreelastref + 804 (kernel.release.t8132 + 6621984) [0xfffffe0008ea4b20]
                                                               *1001  ??? (kernel.release.t8132 + 6691104) [0xfffffe0008eb5920]
                                                                 *1001  ??? (kernel.release.t8132 + 6280804) [0xfffffe0008e51664]
                                                                   *1001  lck_mtx_sleep + 232 (kernel.release.t8132 + 460604) [0xfffffe00088c473c]
                                                                     *1001  ??? (kernel.release.t8132 + 570132) [0xfffffe00088df314]
                                                                       *1001  ??? (kernel.release.t8132 + 575300) [0xfffffe00088e0744]

  Thread 0x1016    1001 samples (1-1001)    priority 31 (base 31)    last ran 9867.252s ago
  1001  _dispatch_sig_thread + 56 (libdispatch.dylib + 87768) [0x1989b46d8]
    1001  __sigsuspend_nocancel + 8 (libsystem_kernel.dylib + 34060) [0x198b2250c]
     *1001  ??? (kernel.release.t8132 + 6281512) [0xfffffe0008e51928]

  Binary Images:
           0x19899f000 -        0x1989e5e5f  libdispatch.dylib (1542.0.4)                     <A4B349E8-DD6F-3B71-84D9-34F3B4ACD849>             /usr/lib/system/libdispatch.dylib
           0x198b1a000 -        0x198b5649f  libsystem_kernel.dylib (12377.61.12)             <548C45C8-9733-3F0D-8EF4-C06DF1DF2AD0>             /usr/lib/system/libsystem_kernel.dylib
           0x198b57000 -        0x198b63abb  libsystem_pthread.dylib (539)                    <527C4BA0-91A5-378B-B3E2-D38269CA5A66>             /usr/lib/system/libsystem_pthread.dylib
           0x1ad696000 -        0x1ad9594ff  com.apple.NetworkExtension 1.0 (1)               <6A60134C-5DFF-3211-B643-5E92B788717B>             /System/Library/Frameworks/NetworkExtension.framework/Versions/A/NetworkExtension
   *0xfffffe0008854000 - 0xfffffe00091bffff  kernel.release.t8132 (25.2.0)                    <BE6139F8-2161-3F58-896B-68279E172031>__TEXT_EXEC  /System/Library/Kernels/kernel.release.t8132

Symbolicated backtrace in kernel space:

 *1001  fleh_synchronous (in kernel.release.t8132) + 72 [0xfffffe0008857e38]
   *1001  sleh_synchronous (in kernel.release.t8132) (sleh.c:1484) [0xfffffe0008a18140]
   *1001  [^inline]handle_svc (in kernel.release.t8132) (sleh.c:0) [0xfffffe0008a18140]
     *1001  unix_syscall (in kernel.release.t8132) (systemcalls.c:181) [0xfffffe0008fad2ac]
       *1001  write (in kernel.release.t8132) (sys_generic.c:721) [0xfffffe0008e7a218]
       *1001  [^inline]write_nocancel (in kernel.release.t8132) (sys_generic.c:705) [0xfffffe0008e7a218]
       *1001  [^inline]write_internal (in kernel.release.t8132) (sys_generic.c:0) [0xfffffe0008e7a218]
         *1001  writev_internal (in kernel.release.t8132) (sys_generic.c:672) [0xfffffe0008e79f4c]
           *1001  fp_writev (in kernel.release.t8132) (sys_generic.c:596) [0xfffffe0008e79a44]
             *1001  soo_write (in kernel.release.t8132) (sys_socket.c:153) [0xfffffe0008e812e0]
               *1001  sosend (in kernel.release.t8132) (uipc_socket.c:2443) [0xfffffe0008eab414]
                 *1001  ctl_send (in kernel.release.t8132) (kern_control.c:831) [0xfffffe0008e14750]
                   *1001  cfil_ctl_send (in kernel.release.t8132) (content_filter.c:2089) [0xfffffe0008c68aa0]
                     *1001  cfil_action_data_pass (in kernel.release.t8132) (content_filter.c:4869) [0xfffffe0008c69950]
                     *1001  [^inline]cfil_set_socket_pass_offset (in kernel.release.t8132) (content_filter.c:4790) [0xfffffe0008c69950]
                       *1001  cfil_service_inject_queue (in kernel.release.t8132) (content_filter.c:4560) [0xfffffe0008c6e044]
                         *1001  cfil_sock_is_dead (in kernel.release.t8132) (content_filter.c:0) [0xfffffe0008c6eb10]
                           *1001  in_pcbdetach (in kernel.release.t8132) (in_pcb.c:0) [0xfffffe0008ca5900]
                             *1001  sofreelastref (in kernel.release.t8132) (uipc_socket.c:1066) [0xfffffe0008ea4b20]
                             *1001  [^inline]sowflush (in kernel.release.t8132) (uipc_socket.c:4420) [0xfffffe0008ea4b20]
                               *1001  sblock (in kernel.release.t8132) (uipc_socket2.c:2576) [0xfffffe0008eb5920]
                                 *1001  _sleep (in kernel.release.t8132) (kern_synch.c:0) [0xfffffe0008e51664]
                                   *1001  lck_mtx_sleep (in kernel.release.t8132) (locks.c:1170) [0xfffffe00088c473c]
                                     *1001  thread_block_reason (in kernel.release.t8132) (sched_prim.c:3825) [0xfffffe00088df314]
                                       *1001  thread_invoke (in kernel.release.t8132) (sched_prim.c:3208) [0xfffffe00088e0744]

If you’re ever able to reproduce this, please grab a sysdiagnose log and attach it to your bug report. Likewise, if you’re working with a customer who’s seeing this, please ask them to do the same. If they don’t want to share a sysdiagnose log with you, they can file their own bug, attach the log to that, and then pass their bug number along.


That spindump is… well… interesting. There’s a lot of other stuff going on at the time the log was taken, and some of it is quite worrying.

Let’s start with the 34 instances of the networksetup, all running under Rosetta. Is that your doing? Because they all seem to have been launched by one of the 9 instances of f_-s____m-s_____e_d____n-a____ [1], which are also running under Rosetta.

Oh, and then there’s the 63 instances of bash O-:

And there’s a total of 7 system extensions running: 5 from you, 2 from another developer, and 1 from yet another developer. And at least 3 of those are Endpoint Security sysexen, and any one of those has the capability to bork the entire system.

My advice here is for you to work with this customer to try to simplify their configuration in order to isolate the problem. As a first step, I recommend that you get the ES sysexen out of the mix, because it’s ridiculously easy for such products to create problems like this. If you can still reproduce the problem with only the NE sysexen, then at least you know that this is a networking problem.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

[1] Redacting the exact name, for pretty obvious reasons.

Hi Eskimo,

I appreciate your input regarding this issue.

We currently have remote access to one of the customer's computers. We plan to try reproducing this issue while disabling endpoint security clients. As you know, troubleshooting network issues remotely presents its own challenges.

In parallel, I am setting up a simplified test environment with minimal network extensions, hoping to replicate the issue with the leanest possible code. I am still encountering difficulties getting App Proxy and Transparent Proxy working in this test setup.

Regarding the networksetup processes running under Rosetta, they are launched by the VPN application. That app runs these commands every 5 seconds:

  • networksetup -listnetworkserviceorder
  • networksetup -listnetworkserviceorder
  • networksetup -getdnsservers "Thunderbolt Bridge"
  • networksetup -listnetworkserviceorder
  • networksetup -getdnsservers Wi-Fi
  • networksetup -listnetworkserviceorder
  • networksetup -listnetworkserviceorder
  • networksetup -getdnsservers "Thunderbolt Bridge"
  • networksetup -listnetworkserviceorder
  • networksetup -getdnsservers Wi-Fi

I will provide an update as soon as we have further progress.

Best regards,

Shay

Kernel deadlock with Content Filter + VPN on macOS 26
 
 
Q