noexec和nosuid是linux中用于降低提权与代码执行风险的关键挂载选项:noexec阻止挂载点内可执行文件运行,nosuid使suid/sgid权限位失效;二者常组合用于/tmp等非信任路径,是纵深防御的重要补充。

Linux中noexec和nosuid是两个关键的挂载选项,它们通过限制文件系统上特定行为来降低提权与代码执行风险,是纵深防御的重要实践。
noexec:阻止可执行文件运行
启用noexec后,该挂载点下的二进制文件(如/bin/bash、自编译程序)无法被直接执行。系统调用execve()会返回EACCES错误。它不阻止脚本解释器读取内容,但能有效遏制恶意可执行文件在临时目录或用户挂载点中运行。
- 典型适用场景:挂载
/tmp、/var/tmp、用户家目录下的Downloads等临时或非信任存储位置 - 注意:某些应用(如Java、Node.js)可能依赖动态加载本地库或生成并执行临时代码,开启前需验证兼容性
- 设置方式:
mount -o remount,noexec /tmp或在/etc/fstab中添加noexec到对应挂载项的选项字段
nosuid:禁用SUID/SGID权限位效果
nosuid使文件系统上的SUID(set-user-id)和SGID(set-group-id)位失效。即使一个程序被设置了-rwsr-xr-x权限,当它位于nosuid挂载点时,执行时不会切换到文件所有者或所属组身份,而是以当前用户身份运行。
- 主要防范:攻击者上传恶意SUID程序(如自制
passwd或sudo替代品)试图提权 - 常见部署位置:
/tmp、/dev/shm、外部USB设备、网络共享(NFS/CIFS)挂载点 - 不影响已存在于根文件系统等可信路径下的合法SUID程序(如
/usr/bin/sudo),因其挂载选项独立生效
组合使用与注意事项
在多数安全加固场景中,noexec,nosuid常成对出现,尤其用于隔离不可信输入来源的挂载点。二者互不依赖,可单独启用,但协同使用覆盖更广的攻击面。
- 不能替代访问控制(如ACL、SELinux/AppArmor),而是补充层;例如,
noexec防执行但不防读取,仍需配合nodev防止设备文件滥用 - 某些容器运行时(如Docker)默认为容器卷启用
noexec,nosuid,nodev,体现其通用价值 - 修改
/etc/fstab后建议用findmnt -t ext4或mount | grep "noexec"确认实际生效状态,避免配置遗漏
合理使用noexec和nosuid不需要改动应用程序逻辑,也不影响系统核心功能,却能显著抬高本地提权与恶意代码落地的门槛。











