find不能用-perm /7000搜高风险空目录,因SUID对目录无效,仅SGID(2000)或Sticky(1000)有意义;正确命令是find / -xdev -type d ( -perm -2000 -o -perm -1000 ) -empty 2>/dev/null。

不能直接用 find -perm /7000 搜索“高风险空目录”——因为特殊权限位(SUID/SGID/Sticky)本身**不作用于目录的空/非空状态**,且SUID 对目录完全无效,SGID 和 Sticky 才可能出现在目录上。所谓“高风险空目录”,实际是指:设置了 SGID 或 Sticky 位、但内部无文件、却可能被滥用的目录(例如被误配为 world-writable + sticky 的临时目录)。
先明确:哪些特殊位能出现在目录上?
– SUID(4000)对目录无意义,Linux 忽略它,ls -l 中不会显示,find -perm /4000 查到的只是带 SUID 的可执行文件,不是目录。
– SGID(2000)可用于目录:新创建的文件/子目录自动继承父目录的组(常用于协作目录)。
– Sticky(1000)仅用于目录:如 /tmp,确保用户只能删除自己创建的文件。
搜索真正有意义的“带特殊位的空目录”
要找的是:同时满足两个条件的目录: ① 权限中包含 SGID(2000)或 Sticky(1000)位; ② 是空目录(不含任何文件、子目录、隐藏文件)。
推荐命令:
- 查所有带 SGID 位的空目录:
find / -xdev -type d -perm -2000 -empty 2>/dev/null - 查所有带 Sticky 位的空目录:
find / -xdev -type d -perm -1000 -empty 2>/dev/null - 查两者任一(SGID 或 Sticky)的空目录:
find / -xdev -type d \( -perm -2000 -o -perm -1000 \) -empty 2>/dev/null
说明:
– -xdev 防止跨文件系统(跳过 /proc、/sys、挂载点等);
– -perm -2000 表示“必须有 SGID 位”,不是“只要含 SGID 位”(/2000 是“或”逻辑,会误匹配普通 755 目录);
– -empty 精确匹配空目录(不含 . 开头的隐藏项);
– 2>/dev/null 屏蔽权限不足的报错。
为什么不用 /7000?
-perm /7000 是“按位或”匹配,意思是“只要权限中任意一位(4000 或 2000 或 1000)被置位就命中”。但:
– 它会把 drwxr-xr-x(即 755)也当成匹配——因为 755 的八进制值是 755,二进制末12位不含高位,但 /7000 实际检测的是高4位,而 755 的高位为 0,所以不会误匹配;不过更关键的是:
– 它无法区分“只设了 SGID”和“SGID+Sticky 同时设”,也无法排除 SUID(尽管目录上无效);
– 更重要的是:/7000 会漏掉权限如 2755(SGID+rw-r-xr-x)或 1777(Sticky+rw-rw-rw-)这类常见组合——因为 /7000 要求至少一个高位为 1,而 2755 的高位是 2,符合;但语义模糊,不如 -perm -2000 明确。
发现后该怎么做?
对搜出的目录,快速评估风险:
- 运行
ls -ld /path/to/dir,看其他用户(others)是否有写权限(w):
– 若是drwxrwsrwt(即 3777)且 world-writable → 高风险(如配置错误的共享 tmp);
– 若是drwxr-s---(2750)且组内可控 → 通常安全。 - 检查是否属于服务目录(如
/var/tmp,/run/user),避免误删; - 确认是否由包管理器或系统服务创建(
rpm -qf或dpkg -S),不要随意改权限。


















