在标准 Linux 文件系统中,哪些常见目录是全局可写的默认情况下?
/tmp
/etc
/var
/proc
/bin
/boot
/....
....
为什么它们是世界可写的?这会带来安全风险吗?
答案1
唯一的FHS 强制要求通常全局可写的目录是/tmp
和/var/tmp
。在这两种情况下,这是因为它们旨在存储任何人都可以创建的临时文件。
同样常见的是/dev/shm
,作为临时文件系统(由 RAM 支持的文件系统),用于快速访问进程之间共享的中型数据,或者只是创建保证在重新启动时销毁的文件。
还可能有/var/mail
或/var/spool/mail
,有时还有其他假脱机程序目录。这些用于在处理邮件之前暂时保存邮件。它们并不总是全局可写的,具体取决于所使用的工具。当它们存在时,这是因为用户工具可以在那里创建文件以供守护程序处理。
所有这些目录通常都有粘性位( t
) 设置,表示只有文件或目录的所有者才能移动或删除其中的文件。
以任何用户身份运行的任何程序都可以在这些目录中创建文件,并且就其特定数据的安全性而言,由创建程序执行正确的操作。除了有人可能填满文件系统之外,不存在特别普遍的安全问题,但程序有很大的空间出错。
曾经有过一些动作面向特定于服务的/tmp
目录。这些避免了可能出现的一些潜在错误,因此对于程序使用目录的方式来说,没有错误并不那么重要。
您可以通过以下方式找到系统上的全局可写目录:
find / -maxdepth 3 -type d -perm -777
答案2
/tmp
、/var/tmp
、 和/var/lock
默认情况下是全局可写的。可能会提供符号链接,例如/usr/tmp
→ /var/tmp
,以与旧应用程序兼容。
/tmp
并且/var/tmp
是世界可写的,因为它们可供任何用户用于任何临时存储。 /var/lock
是全局可写的,因此以任何用户身份运行的任何进程都可以在中央位置创建锁定文件。
是否存在安全风险?不,但有点是。
所有这些目录的权限都是1777
,其中前导1
是粘性位。这意味着虽然任何人都可以在这些世界可写目录中创建文件,但只有所有者才能删除他/她自己的文件(当然,root 用户也可以)。
不安全的临时文件创建可能会产生潜在的安全风险。由于这些目录是免费的,用户需要采取预防措施以确保他们创建的文件实际上是新文件,而不是打开可能由恶意用户植入的现有文件或符号链接。如果文件是使用正确的技术创建的,例如open(…, O_EXCL)
或mkstemp(3)
,那么就可以避免这样的风险。
答案3
/tmp
这是有风险的,因为您需要添加额外的代码才能安全地使用它。显然这一点被忽视了。
史蒂夫·肯普 (Steve Kemp) 给出了最近的一个例子。 http://blog.steve.org.uk/sometimes_reading_code_makes_you_scream_.html
./mgmt/tools/SysAPI.cc: tmp = fopen("/tmp/shadow", "w"); ./mgmt/tools/SysAPI.cc: system("/bin/mv -f /tmp/shadow /etc/shadow");
如果您(攻击者)在第二行之前替换 /tmp/shadow,您就可以替换每个人的密码。 (我猜攻击要求您在第一行之前创建文件,并使该文件可全局写入)。
Linux 上的 Systemd 允许通过隔离许多系统服务的 /tmp 来缓解此类漏洞。 (除了“滥用 /tmp 作为 IPC 套接字和其他通信原语的位置”的情况)。
在 Fedora Linux 中 -http://fedoraproject.org/wiki/Features/ServicesPrivateTmp
答案4
要查找世界可写目录,您可以使用
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
对于文件,将类型更改为f
对于符号链接,输入l
设置粘滞位:
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print0| xargs -0 chmod +t