2020 年,有人在 GitHub 上提出了一个问题:What is uscwoap? macOS 早已切换到 zsh,那么为什么 com.apple.xpc.uscwoap 仍然会调用 Bash?
一条回复展示了该任务的配置。它设置了 BootShell 标志,并将全部三个标准流连接到控制台。基于此,评论者推测该任务可能参与从单用户模式启动系统的过程。
com.apple.xpc.uscwoap 的配置位于系统 LaunchDaemons 目录中。相关字段如下所示:
Label = com.apple.xpc.uscwoap
BootShell = true
ProcessType = Interactive
Program = /bin/bash
ProgramArguments = [bash, -sh]
StandardInPath = /dev/console
StandardOutPath = /dev/console
StandardErrorPath = /dev/console
该任务属于 launchd 的系统域,且未指定以权限较低账户运行的设置,因此 Bash 以 root 身份运行。StandardInPath 将其标准输入连接到 /dev/console。Bash 会将从此设备接收到的输入解释为命令。
登录到活动图形控制台的非管理员账户可以通过 launchd 的任务控制接口启动此任务,而无需管理员凭据。由此产生的 Bash 进程以 UID 0 运行。尽管设置了 BootShell 标志,此启动路径在普通桌面会话中同样可用。
root shell 从 /dev/console 接收命令。在此图形登录会话中,该设备归非管理员账户所有,而从中读取命令的 Bash 进程却以 root 身份运行。因此,一条权限边界将输入来源与执行输入的进程分隔开来。
终端输出与终端输入队列的用途不同:前者用于显示文本,后者则保存等待程序读取的字符。因此,能够影响输入队列的进程就能影响 Bash 从标准输入读取的内容。
TIOCSTI 是一种终端接口,通过向输入队列插入字符来模拟输入。在受影响的版本上,以当前控制台用户账户运行的进程可以利用此机制影响 /dev/console 上的输入。由系统任务启动的 root shell 会从同一设备读取这些字符。
Bash 将这些字符解释为命令,并以其自身的 root 权限执行它们。此输入路径不会对提供字符的进程执行管理员授权检查,从而使得来自非特权用户的输入能够变成以 root 身份执行的命令。
Apple 为此问题分配了 CVE-2026-112445,但未在其安全公告中包含该标识符。遗漏的原因尚不清楚。
macOS 27.2 移除了 com.apple.xpc.uscwoap 配置。