为什么www-data的tmp目录不一样?
为什么你拿到的webshell环境的/tmp目录和正常用户的/tmp目录不一样?这一切都是因为Systemd的PrivateTmp机制!
为什么www-data的tmp目录和正常用户的tmp不一样?
因为经常使用/tmp路径用于webshell的临时操作目录,所以有时候会发现webshell拿到的/tmp目录的文件和正常用户(ubuntu、root…)看到的目录不一样。
www-data:
ubuntu:
原因就是PrivateTmp机制。
PrivateTmp机制
PrivateTmp
是 systemd
提供的一种 进程隔离机制,主要用于增强服务的安全性。它的核心功能是 为服务提供一个私有的 /tmp
和 /var/tmp
目录,防止不同服务之间(或服务与系统之间)通过临时文件互相干扰或攻击。
查看privatetmp模式是否启用:
1 | sudo systemctl show apache2 | grep PrivateTmp |
当 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身份可以访问此目录
创建目录后,systemd会通过 Linux 命名空间(Namespace)和挂载点(Mount),让服务进程看到的 /tmp
和 /var/tmp
指向这些私有目录。
PrivateTmp的用途
- 增强安全性
- 防止恶意服务通过
/tmp
读取或篡改其他服务的临时文件(如敏感数据、会话信息)。 - 避免临时文件竞争攻击。
- 防止恶意服务通过
- 避免冲突
- 不同服务可能使用相同的临时文件名(如
temp.txt
),PrivateTmp
可以防止它们互相覆盖。
- 不同服务可能使用相同的临时文件名(如
- 符合最小权限原则
- 服务只能访问自己的临时文件,不能影响系统全局
/tmp
。
- 服务只能访问自己的临时文件,不能影响系统全局
其他注意事项
几乎所有主流的现代 Linux 发行版都默认使用 systemd
作为初始化系统(init)和服务管理器,支持 PrivateTmp
机制。
CentOS 7 及更高版本 默认使用 systemd
,因此 支持 PrivateTmp
机制。
但 CentOS 6 及更早版本 使用传统的 SysVinit
,**没有 systemd
,也没有 PrivateTmp
**。