Identify the type of permission prompt

Clash clients for macOS do not all work the same way. Clash Verge Rev, ClashX Meta, and other clients differ in their interfaces, how they launch the core, and how they handle permissions. Using the mihomo core does not necessarily mean a client uses Apple Network Extension to route traffic. Before responding to a prompt, check the app name, developer, and requested action.

First-launch approval, network extension approval, privileged helper installation, and Keychain access are separate mechanisms. Allowing an app to open does not authorize a helper installation, and successfully installing a helper does not mean the system proxy is enabled. Do not lump every prompt together as “Clash doesn’t have permission.”

Prompt or symptomWhat it relates toCheck first
Developer cannot be verified or app can’t be openedGatekeeper launch checkDownload source, signature, and Privacy & Security settings
Requests to add a VPN configuration or allow a network extensionVPN configuration, Network Extension, or system extensionRequesting app and specific extension type
Admin password requested to install a helperPrivileged helper installationWhether the current client initiated the installation
Requests access to an item in the “login” KeychainAccess to protected credentialsKeychain item name and requesting process

Blocked on first launch: check the app’s location and source

Move the client to Applications before launching it

  1. Check your chip type under Apple menu > About This Mac. Choose an Apple Silicon or arm64 installer for an Apple silicon Mac, and an x64 installer for an Intel Mac.
  2. Open the downloaded disk image and drag the app into Applications (/Applications). Quit any copy running from the disk image, then launch the installed app.
  3. If macOS blocks the app from launching, first verify its download source and app name. Only if the source is trusted and the block is due to developer verification should you use the system settings to allow that specific app.

On macOS Ventura 13, Sonoma 14, and Sequoia 15, check near the bottom of System Settings > Privacy & Security for a security notice; “Open Anyway” appears when available. On macOS Monterey 12 and earlier, go to System Preferences > Security & Privacy > General. The wording may vary slightly between versions.

Some older macOS versions let you Control-click the app in Finder and choose “Open.” macOS Sequoia 15 changed the process for bypassing some Gatekeeper checks, so do not assume right-clicking and opening works on every version.

Network extensions and TUN are different settings

TUN is a virtual network interface mechanism. A client may use a privileged helper to launch the core, create an interface, and configure routes, or use Apple Network Extension to route traffic. Whether you see an “Add VPN Configurations” or “Allow System Extension” prompt depends on the client’s implementation; the name “TUN” alone tells you nothing about which one it uses.

So, if enabling TUN in Clash Verge Rev does not trigger a VPN configuration prompt, that alone does not mean installation failed. Another client may request VPN configuration approval without requiring the same helper installation steps. Follow that client’s setup guide and check its startup logs.

Find the relevant setting based on the prompt

Settings categories vary by macOS version and installed components. If you can’t find a category, search System Settings for “VPN” or “Extensions.” If there is no request or corresponding component, you don’t need to install extra software just to “complete” permissions.

Use read-only commands to help verify

sw_vers
systemextensionsctl list
ifconfig -l
scutil --nc list

sw_vers shows the macOS version. systemextensionsctl list lists registered system extensions, but not every kind of app extension or privileged helper. ifconfig -l shows interface names, and scutil --nc list can help you inspect network connection services registered with the system.

Seeing a utun interface only means the system has a tunnel interface. iCloud features, other VPNs, and network tools can also create one; its presence alone does not prove Clash TUN is routing traffic successfully.

Privileged helper installation: what admin approval allows

A standard user process usually cannot perform every system-level routing operation directly. Some clients use a privileged helper to perform these actions, so the graphical app does not need to run as an administrator all the time. In Clash Verge Rev, for example, service mode is associated with TUN routing. The service installation option may move between versions, so look for “Service Mode” or the service status in your current version’s settings.

  1. Quit other clients that are changing system proxy or routing settings to prevent multiple apps from restoring or overwriting network settings at the same time.
  2. Start the service installation or repair from within the client, then verify the app name in the system authorization prompt.
  3. If admin approval is required, enter the credentials for a local account with administrator privileges. Your Apple ID password or subscription password is not the credential requested here.
  4. After installation, return to the client and check the service status, then enable TUN separately. Check the logs for permission errors, interface creation failures, or route configuration failures.

If you still get a permissions error after installing the service, first confirm that the client app and helper came from the same installation. Replacing an old app while keeping multiple copies can leave the interface updated but the helper outdated. Use the client’s built-in service repair or uninstall-and-reinstall option; do not manually delete system files whose origin you can’t verify.

Keychain prompt: check which item it wants to access

“An app wants to use confidential information stored in your Keychain” means a process is requesting access to a protected item. Depending on the client, that item may be an app-saved credential, proxy authentication, or something used by another feature. It is not a required step for importing a subscription link, and the prompt alone does not prove the request is legitimate.

Know whether it wants your admin or Keychain password

If you reset your account password through macOS Recovery or with an administrator’s help, your “login” Keychain may still use the old password. You may be able to sign in to your Mac with the new password but still be unable to unlock the original Keychain. Follow Apple’s Keychain recovery guidance; don’t keep trying unrelated subscription passwords.

Check the request in Keychain Access

  1. Use Spotlight to search for and open Keychain Access. The Passwords app in newer macOS versions does not replace all Keychain item management features.
  2. Select the “login” Keychain and search for the item name shown in the prompt. Don’t delete items in bulk based on guesses.
  3. Open the matching item’s details and check its name, type, and available access control information. Verify that the requesting process belongs to the client you installed.
  4. If the request is appropriate, choose “Allow” to grant access this time. Consider “Always Allow” only after verifying the app’s identity and confirming that you need ongoing access.

A prompt that reappears after an app update does not necessarily mean the password is wrong. Changes to the app’s signature, path, or the Keychain item’s access controls can require approval again. If it appears every time you launch the app, note the item name and requesting process, and check whether you have copies running from both Downloads and Applications.

If the prompt requests a sensitive item unrelated to the proxy, choose “Deny” and check which feature is making the request. Resetting the default Keychain may make existing saved passwords unavailable, so it should not be your first-line fix.

After approval: check the port, system proxy, and routes separately

Approval only means macOS allows an action. To confirm connectivity, you also need to check that the core is running, the configuration has loaded, and the rules and policy groups are working. Turn off TUN and test the system proxy first; once it works, test apps that actually require TUN.

Step 1: Check the port actually in use

The examples below assume the configured mixed proxy port is 7890. This is an example, not a default for every client. If your settings show a different port, update the number in the commands accordingly.

mixed-port: 7890
allow-lan: false
mode: rule

This is only a configuration snippet, not a complete Profile with proxies, policy groups, and rules. Don’t overwrite your subscription to use the example. mixed-port accepts HTTP and SOCKS proxy connections. The external controller is for a different purpose; even if a configuration uses 9090, that is not a browser proxy port.

lsof -nP -iTCP:7890 -sTCP:LISTEN
scutil --proxy
curl --proxy http://127.0.0.1:7890 --connect-timeout 10 --max-time 20 -I https://example.com

The first command helps check the listening process, the second shows the current system proxy status, and the third sends a request through the specified proxy port. An HTTP response from the target site confirms that request went through the proxy, but does not prove that all sites, UDP traffic, or apps are routed through it.

Step 2: Check that the system proxy uses the same port

On macOS Ventura 13 and later, go to System Settings > Network > your current network service > Details > Proxies. Compare the address and port with the client settings; local proxies commonly use 127.0.0.1. Wi-Fi and Ethernet are separate network services, so check the service actually in use after switching connections.

Whether an app uses the system proxy depends on whether it follows those settings. Command-line tools do not necessarily read the system proxy automatically, which is why the curl command above specifies the proxy explicitly. A command-line request going direct does not by itself mean network extension approval failed.

Step 3: Test TUN and DNS separately

After enabling TUN, send a request from an app that does not follow the system proxy, and watch the client’s connection log and runtime logs at the same time. Only after confirming the connection reaches the current core should you check which rule matched and which policy group was used.

If the logs show DNS timeouts, check the DNS listener, routing, and conflicts with other network tools instead of repeatedly approving Keychain access. With a fake-ip configuration, also check that domain resolution follows the expected path. A virtual interface alone does not prove that DNS and rule-based routing are working correctly.

Recovery steps for repeated prompts or lost connectivity

  1. Record what happened: Note the macOS version, client name and version, exact prompt text, and whether the issue occurred on launch, during service installation, or when enabling TUN. Hide subscription URLs, tokens, and account details before sharing screenshots.
  2. Turn off TUN in the current client: Let the client restore routes normally, then check whether connectivity returns.
  3. Turn off the system proxy: Check the Proxies page for the current network service. If the app quit unexpectedly and left a local proxy configured after its listener stopped, your browser may keep sending requests to a port with nothing listening.
  4. Disable conflicting components one at a time: Temporarily disconnect other VPNs, disable verified filters if needed, then test with one proxy client running. Don’t delete all network configurations at once.
  5. Repair the affected component: Use the service repair option for helper errors, inspect the specific item for Keychain errors, and check the relevant approval record for system extension errors. Keep a working Profile and adjust the configuration instead.

Before switching clients, turn off the old client’s system proxy and TUN, then use its uninstall service option to remove its helper component. Dragging the app to the Trash may not remove system extensions, VPN configurations, or background services; likewise, don’t delete components you can’t identify.