Leadaxe:singbox-launcher 经典 TUN 在 macOS 上自 v2.1.0 起就起不来

在「macOS 27:TUN 自 v2.1.0 起不启动」问题(仍 open)中,Leadaxe 称原因已找到并在 macOS 26.7 上复现:与 macOS 27 无关,经典 TUN 不带服务时自 v2.1.0 起在任意 macOS 版本上都起不来。他确认了提问者的推断链 AuthorizationExecuteWithPrivileges → /usr/bin/env -i → /bin/sh -c:特权启动给工具 euid 0 而 real uid 仍是用户,并在环境里放入 _BASH_IMPLICIT_DASH_PEE=-p,Apple 的 bash 把它读作 -p 标志因而不放弃权限;v2.1.0 在 shell 前加了 env -i,把该变量连同整个环境一起清掉,启动 shell 因此丢失 root。他给出实测 uid 对照(/bin/sh -c 为 euid 0、real 501;env -i 加 /bin/sh -c 为 501/501;env -i 加 /bin/bash -p -c 为 0/501)。他称修复会进入下一个启动器版本,但经典 TUN 的实际启动尚未用它跑过、只量了 shell 权限;发布前可用带服务模式(lxd --service=install)或启动器 v2.0.2,手动创建的 classic.log 可以保留。最新正式版 v2.3.3(2026-09-28)尚未包含该修复。

作者原文

Причина найдена и воспроизведена на macOS 26.7. Команды из предыдущего комментария запускать не нужно.

Дело не в macOS 27: classic TUN без службы не стартует на macOS начиная с v2.1.0 на любой версии системы. Ваша гипотеза про цепочку AuthorizationExecuteWithPrivileges → /usr/bin/env -i → /bin/sh -c верна.

Привилегированный запуск отдаёт инструменту euid 0 при real uid пользователя и кладёт в окружение переменную _BASH_IMPLICIT_DASH_PEE=-p. bash от Apple читает её как флаг -p и не сбрасывает права. В v2.1.0 перед шеллом появился env -i, он стирает эту переменную вместе с остальным окружением, и шелл старта теряет root.

Замеры uid шелла под тем же вызовом:

| Вызов | euid | real uid |
|---|---|---|
| /bin/sh -c (v2.0.2) | 0 | 501 |
| env -i PATH=… /bin/sh -c (v2.1.0–v2.3.3) | 501 | 501 |
| env -i PATH=… /bin/bash -p -c (исправление) | 0 | 501 |

Исправление войдёт в следующую версию лаунчера. Старт classic TUN с ним ещё не прогонялся, измерены только права шелла.

До выхода версии работают два пути: режим со службой (lxd --service=install) или лаунчер v2.0.2.

Файл classic.log, созданный вручную, можно оставить: исправленный лаунчер примет его как есть.