防范恶意进程父子注入提权的核心是切断进程信任关系与权限继承路径,而非仅堵单一入口;需从suid/sgid程序防护、环境变量限制、绝对路径调用、yama lsm、no_new_privs、selinux/apparmor及ebpf监控等多层协同防御。

防范恶意进程通过父子进程注入提权,核心不是堵住某一个“入口”,而是切断攻击链中依赖的进程信任关系与权限继承路径。这类攻击(如利用SUID程序+环境变量劫持、LD_PRELOAD注入、或子进程被父进程误信执行恶意代码)之所以得手,往往因为系统缺乏对进程创建行为、权限跃迁和上下文继承的主动约束。
明确父子进程提权的关键风险点
攻击者常利用以下三个环节实现注入式提权:
- SUID/SGID程序被诱导加载恶意库:例如普通用户执行 /usr/bin/find(SUID root),若其调用动态链接器且 LD_LIBRARY_PATH 或 LD_PRELOAD 被污染,就可能加载攻击者控制的 .so 文件,以root权限执行任意代码;
- shell派生子进程时继承危险环境变量:如 PATH 被篡改为包含攻击者目录,导致 execve() 执行了假的 ls、sh 等命令;
- 特权父进程启动子进程未清理环境或未显式指定绝对路径:例如一个root服务调用 system("ping $HOST"),而 $HOST 可控,就可能触发命令注入并继承root权限。
配置运行时进程行为约束策略
仅靠日志审计远远不够,需在进程创建阶段施加控制:
-
禁用非必要SUID/SGID文件:定期扫描并清理无业务依据的SUID程序:
find /usr/bin /bin /usr/local/bin -type f -perm -6000 2>/dev/null | xargs ls -l
对确需保留的(如 passwd、sudo),确保其不解析用户可控环境变量(可通过 readelf -d binary | grep 'NEEDED\|RPATH' 检查是否硬编码依赖路径); -
限制LD_PRELOAD等危险变量传递:在系统级Shell初始化文件(如 /etc/profile.d/security.sh)中加入:
unset LD_PRELOAD LD_LIBRARY_PATH LD_AUDIT
对SUID程序,内核默认已忽略这些变量,但普通root进程仍可能受影响; -
强制使用绝对路径调用关键命令:在脚本或服务配置中避免 system()、popen() 等函数直接拼接变量,改用完整路径+显式参数,例如用
/bin/ping -c 1 "$clean_host"替代system("ping $HOST");
启用内核级进程上下文隔离机制
Linux提供了成熟机制阻止低权限进程“借壳”提升权限:
-
启用YAMA LSM(Linux Security Module):编辑 /etc/sysctl.conf,添加:
kernel.yama.ptrace_scope = 2
该设置禁止非子进程的ptrace附加(阻断gdb/strace类调试注入),同时限制非特权进程无法attach到其他用户进程; -
配置NO_NEW_PRIVS标志:对关键服务(如Web服务器worker进程),在启动时通过 prctl(PR_SET_NO_NEW_PRIVS, 1) 或 systemd service文件中设置:
NoNewPrivileges=true
这能防止该进程及其所有子进程获得额外权限(即使执行SUID二进制也不会提升EUID); - 启用SELinux或AppArmor策略:为高风险服务定义最小权限域,例如限制httpd进程不得执行execve()调用非白名单路径下的二进制,或禁止其修改环境变量;
建立进程血缘监控与异常识别规则
光靠静态配置不够,需动态感知异常父子关系:
-
部署eBPF实时监控工具:使用 bpftrace 或 Tracee 记录 execve() 调用链,重点关注:
– real UID ≠ effective UID 的进程启动事件
– 父进程为root但子进程由普通用户触发的场景
– LD_* 变量非空且子进程为SUID程序的情况; -
结合auditd做审计强化:在 /etc/audit/rules.d/critical.rules 中添加:
-a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec-a always,exit -F arch=b64 -S execve -F euid!=uid -k priv_drop_or_raise
配合 ausearch -k priv_drop_or_raise 可快速定位权限变更行为; - 定期比对进程树快照:用 pstree -p 或 ps -eo pid,ppid,user,comm,args 生成基线,结合脚本检测是否存在“普通用户→root子进程→可疑网络连接”的异常链路。











