直接关闭敏感目录执行权的关键是清除文件自身x权限并启用noexec挂载选项:前者阻止./script.sh类直接调用,后者从内核层禁止该分区任何文件被execve()加载执行,无论权限如何;需配合umask或默认ACL确保新文件无x位。
直接关闭敏感目录的执行权,不能只靠 chmod 去掉目录本身的 x 权限——因为目录的执行权(即 x 位)实际控制的是“能否进入该目录或访问其子项”,而非运行脚本。真正阻止脚本执行,关键在文件自身的执行位和挂载层面的行为约束。
x 决定能否 cd 进入、能否 ls 列出内容(配合 r)、能否访问其下的文件 x 权限,以及所在文件系统是否允许执行
所以加固重点是两层:
./script.sh 类直接调用 noexec 挂载选项:从内核层禁止该分区上任何文件被当作程序加载执行,无论权限如何/tmp、/var/www/uploads、/home 等目录,推荐组合操作临时生效(测试用):
sudo mount -o remount,noexec,nosuid,nodev /tmpsudo mount -o remount,noexec,nosuid,nodev /var/www/uploads
永久生效(写入 /etc/fstab):
找到对应挂载行(如 /tmp 对应的 UUID 或设备),在 options 字段追加 noexec,nosuid,nodev,例如:
UUID=1234abcd /tmp ext4 defaults,noexec,nosuid,nodev 0 2
然后重挂载:sudo mount -o remount /tmp
同时清理已有脚本的执行位(防绕过):
find /tmp -type f ( -name "*.sh" -o -name "*.py" -o -name "*.pl" ) -exec chmod a-x {} ;
noexec 的实际效果边界./a.out、./deploy.sh、/tmp/malware 直接执行 .pyc)等被 execve() 加载 python3 /tmp/exploit.py —— 因为解释器是 /usr/bin/python3(在其他挂载点,且有 x),它读取并解释源码,不触发目标文件的 exec 行为 sh /tmp/script.sh —— 同理,sh 是合法执行程序,它只是把目标当文本读取所以 noexec 是基础防线,不是万能锁;若需拦截解释器调用,得结合 SELinux 策略、rbac 或容器隔离。
/etc/profile.d/secure.sh)中设:umask 027 → 新建普通文件默认 640,目录默认 750,无 x 给 group/other setfacl -d -m u::rw-,g::r--,o::--- /var/www/uploads
不复杂但容易忽略。