关键在于切断“低权限进程→高权限执行”的跃迁路径:①严控suid/sgid文件;②阻断ld_preload等环境变量注入;③启用yama、no_new_privs及selinux/apparmor;④降权运行服务账户。

防止恶意程序利用本地漏洞提权,关键在于切断“低权限进程→高权限执行”的跃迁路径,而不是只盯着某个漏洞补丁。本地提权(LPE)攻击往往不依赖远程入口,而是通过已有的用户会话、服务缺陷或内核机制缺陷,在系统内部完成权限升级。以下四类措施最直接有效:
严格管控特权程序与SUID/SGID文件
恶意程序常借道合法的高权限程序(如find、mount、sudo)触发提权链。必须主动清理和约束:
- 定期扫描并移除非业务必需的SUID/SGID文件:
find /usr/bin /bin /usr/local/bin -type f -perm -6000 2>/dev/null | xargs ls -l - 对确需保留的(如
/usr/bin/passwd),检查其是否硬编码依赖路径:readelf -d /usr/bin/passwd | grep 'NEEDED\|RPATH',避免因环境变量污染被劫持 - 禁用无明确用途的SUID位,例如
chmod u-s /usr/bin/crontab(若业务不需普通用户编辑crontab)
阻断环境变量与动态加载注入
LD_PRELOAD、PATH、IFS等变量是本地提权高频跳板,尤其在脚本调用或服务启动时被滥用:
- 在全局Shell初始化文件(如
/etc/profile.d/security.sh)中强制清空危险变量:unset LD_PRELOAD LD_LIBRARY_PATH LD_AUDIT IFS - 对以root身份运行的服务脚本,禁止使用
system()或exec("sh -c ...")拼接用户输入;改用绝对路径+显式参数,例如/bin/sh -c '/bin/ls -l "$1"' -- "$safe_arg" - 确认内核对SUID程序已默认忽略LD_*变量(现代Linux默认启用),但普通特权进程仍需手动防护
启用内核级进程隔离机制
仅靠用户态限制不够,需借助内核安全模块从底层抑制非法进程控制行为:
- 启用YAMA LSM:在
/etc/sysctl.conf中添加kernel.yama.ptrace_scope = 2,禁止非子进程ptrace附加,阻断gdb/strace类调试注入和进程内存篡改 - 对关键服务进程设置
NO_NEW_PRIVS标志(如通过prctl(PR_SET_NO_NEW_PRIVS, 1)或容器runtime配置),使其fork出的子进程无法获得额外权限 - 在支持环境下启用SELinux或AppArmor策略,限制特权进程可访问的文件路径、网络端口及系统调用范围
限制服务账户权限与运行上下文
很多提权源于服务以SYSTEM或root身份运行,却处理不受信输入:
- 将Web服务、数据库、中间件等降权运行:创建专用低权限系统用户(如
www-data、mysql),禁止登录、不分配shell(/usr/sbin/nologin) - 禁用服务账户的交互式登录能力,删除
/etc/passwd中对应用户的密码字段(设为*或!) - Windows服务器上,禁用服务账户的“以服务方式登录”以外的用户权限,并关闭SeDebugPrivilege等高危特权











