Issue Activating PacketTunnelProvider on MacOS

Hi,

When trying to activate a PacketTunnelProvider Network Extension in X-code on MacOS 13.3.1 (a) I get the following system logs:

default	22:43:43.440691-0700	PacketTunnel	Metal API Validation Enabled
error	22:43:43.571295-0700	kernel	Sandbox: PacketTunnel(46998) deny(1) mach-lookup com.apple.sysextd
default	22:43:43.581295-0700	PacketTunnel	ExtensionManager didFailWithError The operation couldn’t be completed. (OSSystemExtensionErrorDomain error 1.)

Here is the Delegate I'm using:

import Foundation
import SystemExtensions
import os.log

class ExtensionManager : NSObject, OSSystemExtensionRequestDelegate {
    let identifier = "xx.xxxxxxx.PacketTunnel.PacketTunnelProvider"
    static let shared = ExtensionManager()
    
    static let log = OSLog(subsystem: "xx.xxxxxxx.PacketTunnel", category: "ExtensionManager")
    private let log: OSLog
    
    public override init() {
        self.log = Self.log
        os_log(.debug, log: self.log, "init")
        super.init()
    }
    
    func activate() {
        let activationRequest = OSSystemExtensionRequest.activationRequest(forExtensionWithIdentifier: identifier, queue: .main)
        activationRequest.delegate = self
        OSSystemExtensionManager.shared.submitRequest(activationRequest)
    }
    
    func deactivate() {
        let activationRequest = OSSystemExtensionRequest.deactivationRequest(forExtensionWithIdentifier: identifier, queue: .main)
        activationRequest.delegate = self
        OSSystemExtensionManager.shared.submitRequest(activationRequest)
    }
    
    func request(_ request: OSSystemExtensionRequest, actionForReplacingExtension existing: OSSystemExtensionProperties, withExtension replacement: OSSystemExtensionProperties) -> OSSystemExtensionRequest.ReplacementAction {
        os_log("ExtensionManager actionForReplacingExtension %@ %@", existing, replacement)
        return .replace
    }
    
    func requestNeedsUserApproval(_ request: OSSystemExtensionRequest) {
        os_log("ExtensionManager requestNeedsUserApproval")
    }
    
    func request(_ request: OSSystemExtensionRequest, didFinishWithResult result: OSSystemExtensionRequest.Result) {
        os_log("ExtensionManager didFinishWithResult %@", result.rawValue)
    }
    
    func request(_ request: OSSystemExtensionRequest, didFailWithError error: Error) {
        os_log("ExtensionManager didFailWithError %@", error.localizedDescription)
    }
}

And I'm running it via a basic View:

import SwiftUI

let minWidth: CGFloat = 180
let minHeight: CGFloat = 400

struct ContentView: View {
    var body: some View {
        VStack {
            Button(action: ExtensionManager.shared.activate) {
                Text("Activate")
            }
            Button(action: ExtensionManager.shared.deactivate) {
                Text("Deactivate")
            }
            Button(action: TunnelConfigurationService.shared.configure) {
                Text("Configure")
            }
            Button(action: TunnelConfigurationService.shared.start) {
                Text("Start")
            }
        }
        .padding()
        .frame(minWidth: minWidth, maxWidth: .infinity, minHeight: minHeight, maxHeight: .infinity)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Any Ideas how to debug this further? I'm not sure how to proceed.

Cheers

Post not yet marked as solved Up vote post of jason_s Down vote post of jason_s
395 views

Replies

So I added System Extension Entitlement to the App and got passed the first issue, but now seeing the following:

default	01:10:55.346468-0700	sysextd	client activation request for xx.xxxxxxx.PacketTunnel.PacketTunnelProvider
default	01:10:55.346523-0700	sysextd	attempting to realize extension with identifier xx.xxxxxxx.PacketTunnel.PacketTunnelProvider
default	01:10:55.356353-0700	sysextd	unable to find a SystemExtensions directory at /Users/jason/Library/Developer/Xcode/DerivedData/PacketTunnel-dzfgoqadttjzdvbfyibcsuipodzn/Build/Products/Debug/PacketTunnel.app/Contents/Library/SystemExtensions
default	01:10:55.356667-0700	PacketTunnel	ExtensionManager didFailWithError Extension not found in App bundle: perhaps App is not validly structured

That directory doesn't exist. I guess I'm missing some build config? Am I even doing the right thing here loading a system extension?

Is there some basic tutorial for setting up a new NetworkExtension App in Xcode for MacOS? I think I'm just missing some basics here, but can't find any tutorials that help.

So it turns out I created an App Extension/Network Extension, and not a System Extension/Network Extension. Once I updated to System Extension/Network Extension and ran the App from /Applications, the entitlement works! Cheers, I managed to find the clues here on this forum over multiple posts.