nosuid通过让内核忽略文件的setuid/setgid位,使程序始终以执行者身份运行而非文件所有者身份,从而阻断SUID提权;需配合noexec、nodev使用,并仅适用于/tmp、数据盘等非系统目录。

用 mount -o nosuid 挂载分区,能直接让该分区上所有 setuid/setgid 程序失效——普通用户即使运行了 root 权限的二进制文件(比如 /data/exp),也不会切换到 root 身份,而是以当前用户身份运行,从而阻断常见提权路径。
nosuid 是怎么挡住提权的
Linux 中 SUID 位(如 -rwsr-xr-x)的作用是:执行者以文件所有者身份运行程序。攻击者常靠它调用 bash、find 或自编译 exp 获取 root shell。而 nosuid 告诉内核:“别管这个文件有没有 s 位,一律按执行者自己的权限来”。哪怕 /mnt/data/shell 是 root:root 且带 SUID,挂载时加了 nosuid,运行它就只是普通用户进程,无法提权。
怎么临时启用 nosuid(测试用)
对已挂载的分区,直接 remount 加选项:
- sudo mount -o remount,nosuid /mnt/data
- 验证是否生效:运行一个带 SUID 的测试程序(如
cp /bin/bash /mnt/data/mysh && chmod u+s /mnt/data/mysh),再执行/mnt/data/mysh -p—— 若返回的仍是普通用户 shell(不是#提示符),说明 nosuid 已起作用
怎么永久生效(生产环境必须)
编辑 /etc/fstab,找到对应分区那一行,在第 4 字段(options)里加入 nosuid:
- 原内容:
/dev/sdb1 /mnt/data ext4 defaults 0 2 - 修改后:
/dev/sdb1 /mnt/data ext4 defaults,nosuid 0 2 - 保存后执行 sudo mount -a 重载配置,无需重启
搭配 noexec 和 nodev 效果更稳
单用 nosuid 只防 SUID 提权,但攻击者还可能通过直接执行恶意二进制或伪造设备节点突破。建议组合使用:
-
noexec:禁止直接运行任何可执行文件(如
./exp) -
nodev:不解析设备文件,防止在挂载点下创建
/mnt/data/evil_device并用于攻击 - fstab 示例:
/dev/sdb1 /mnt/data ext4 defaults,nosuid,noexec,nodev 0 2
注意:不要对 /、/usr、/bin 等系统目录加这些选项,否则系统命令会失效。适用场景明确——数据盘、上传目录、/tmp、用户家目录下的临时子目录等非系统路径。


















