核心是精准识别三类风险路径:世界可写文件、组可写但组成员不受控、SUID/SGID且可写;需分层过滤排除白名单、聚焦高危类型、结合上下文判断,而非简单用find -perm -o=w粗暴扫描。

要通过自动化脚本发现全盘所有对“公开可写”的文件(即任意用户可写、无权限保护的敏感文件),核心是精准识别三类典型风险路径:世界可写(other-writable)文件、组可写但组成员不受控(如 group=users / group=wheel 且未严格管理)、以及 SUID/SGID 且可写(易被篡改提权)。下面给出实用、可落地的审计思路和脚本框架。
一、定位真正“公开可写”的文件(非仅看权限位)
不能只用 find / -type f -perm -o=w 2>/dev/null 粗暴匹配——这会误报大量系统正常日志或临时文件,且漏掉“组可写+宽松组策略”这类真实风险。应分层过滤:
-
排除常见安全白名单路径:如
/proc、/sys、/dev、/run、/var/log/journal等伪文件系统或受 systemd 控制的目录; -
聚焦高危类型文件:优先检查可执行文件(
-perm -u=x,g=x,o=x)、shell 配置(*.sh、.bashrc、.profile)、服务配置(/etc/systemd/system/*.service、/etc/init.d/*)、crontab 相关路径(/var/spool/cron/、/etc/crontab); -
识别“逻辑公开”场景:例如文件属组为
users或wheel且该组包含大量普通用户(可通过getent group users检查成员数),此时-perm -g=w也等效于公开可写。
二、推荐轻量级审计脚本结构(Bash)
以下脚本不依赖外部工具,兼容主流 Linux 发行版,输出带上下文的风险项:
#!/bin/bash
# save as: audit-world-writable.sh
TARGET_DIRS=("/etc" "/usr/local/bin" "/opt" "/home" "/var/www")
EXCLUDE_FS="proc|sys|dev|run|cgroup|debugfs|securityfs"
EXCLUDE_PATHS="/var/log/journal|/tmp|/var/tmp|/var/cache"
<p>for dir in "${TARGET_DIRS[@]}"; do
[[ -d "$dir" ]] || continue
find "$dir" -xdev -type f ( \
-perm -o=w -o ( -perm -g=w -group users -o -group wheel ) ) \
-not -path "<em>/.</em>" \
-print0 2>/dev/null | \
while IFS= read -r -d '' file; do</p><h1>跳过挂载点和已知白名单路径</h1><pre class="brush:php;toolbar:false;">if echo "$file" | grep -qE "$EXCLUDE_PATHS"; then continue; fi
if stat -f -c "%T" "$file" 2>/dev/null | grep -qE "$EXCLUDE_FS"; then continue; fi
# 排除明显无害的可写文件(如日志轮转中)
if [[ "$(basename "$file")" =~ ^[a-zA-Z0-9._-]+\.log$ ]]; then
if grep -q "rotates?" /etc/logrotate.conf 2>/dev/null; then continue; fi
fi
# 输出:文件路径 + 权限 + 所有者 + 组 + 是否可执行
printf "%s | %s | %s:%s | %s\n" \
"$file" \
"$(stat -c "%A" "$file" 2>/dev/null)" \
"$(stat -c "%U" "$file" 2>/dev/null)" \
"$(stat -c "%G" "$file" 2>/dev/null)" \
"$(if [ -x "$file" ]; then echo "EXEC"; else echo "-"; fi)"done done | sort -u
三、增强判断:结合进程与服务上下文
单看文件权限不够,需关联运行时行为。例如:
- 若某可写脚本被
systemd timer定期调用(查systemctl list-timers --all),则风险极高; - 若 Web 目录下存在 world-writable PHP/Python 文件,且 Apache/Nginx 以低权限用户运行,则可能被上传后执行;
- 检查
find /etc/cron* -type f -perm -o=w 2>/dev/null—— crontab 文件本身可写等于 root 权限任你调度。
四、后续动作建议
发现结果后不要直接批量 chmod,先人工验证:
- 用
ls -lL确认是否符号链接(避免误改目标); - 查
lsof +D /path/to/file看是否被进程占用; - 对服务配置类文件,用
systemd-analyze verify xxx.service或nginx -t验证语法; - 修改前备份:
cp file{,.bak.$(date +%s)}; - 长期建议启用
auditd监控关键路径写操作:aureport -m -i | grep "comm=touch\|comm=cp"。
不复杂但容易忽略:真正的“公开可写”不是权限数字游戏,而是谁有能力写 + 写了能干什么。脚本只是筛子,结论得靠人来判。

















