为什么你拿到的webshell环境的/tmp目录和正常用户的/tmp目录不一样?这一切都是因为Systemd的PrivateTmp机制

为什么www-data的tmp目录和正常用户的tmp不一样?

因为经常使用/tmp路径用于webshell的临时操作目录,所以有时候会发现webshell拿到的/tmp目录的文件和正常用户(ubuntu、root…)看到的目录不一样。

www-data:

image-20250417011421551

ubuntu:

image-20250417011456991

原因就是PrivateTmp机制。

PrivateTmp机制

PrivateTmpsystemd 提供的一种 进程隔离机制,主要用于增强服务的安全性。它的核心功能是 为服务提供一个私有的 /tmp/var/tmp 目录,防止不同服务之间(或服务与系统之间)通过临时文件互相干扰或攻击。

查看privatetmp模式是否启用:

1
sudo systemctl show apache2 | grep PrivateTmp

image-20250417012158469

PrivateTmp=yes 时,systemd 会为该服务 创建一个私有的 /tmp/var/tmp 目录,而不是直接使用系统的 /tmp

这个私有目录 只有该服务能访问,其他服务或用户无法直接访问(除非有 root 权限)。

这就导致了普通用户创建的/tmp目录下的文件在全局 /tmp 下可见。

www-data 看到的 /tmp 是其私有的 /tmp,因此 ls -al /tmp 看不到全局 /tmp/test

PrivateTmp的工作原理

当服务启动时,systemd 会在 /tmp/systemd-private-<随机ID>-<服务名>/ 下创建私有临时目录。

用root身份可以访问此目录

image-20250417013109214

image-20250417013125799

创建目录后,systemd会通过 Linux 命名空间(Namespace)和挂载点(Mount),让服务进程看到的 /tmp/var/tmp 指向这些私有目录。

PrivateTmp的用途

  1. 增强安全性
    • 防止恶意服务通过 /tmp 读取或篡改其他服务的临时文件(如敏感数据、会话信息)。
    • 避免临时文件竞争攻击。
  2. 避免冲突
    • 不同服务可能使用相同的临时文件名(如 temp.txt),PrivateTmp 可以防止它们互相覆盖。
  3. 符合最小权限原则
    • 服务只能访问自己的临时文件,不能影响系统全局 /tmp

其他注意事项

几乎所有主流的现代 Linux 发行版都默认使用 systemd 作为初始化系统(init)和服务管理器,支持 PrivateTmp 机制。

CentOS 7 及更高版本 默认使用 systemd,因此 支持 PrivateTmp 机制
CentOS 6 及更早版本 使用传统的 SysVinit,**没有 systemd,也没有 PrivateTmp**。