Linux exploit 利用漏洞的原理概览
Exploit 的本质是“把程序从设计好的安全边界中‘带出来’”:在用户态或内核态触发缺陷,打破权限隔离与内存安全,让代码或数据按照攻击者的意图执行或改写。常见路径包括:内存破坏导致任意代码执行(如栈/堆溢出、UAF)、逻辑缺陷绕过权限检查、以及配置错误被滥用获得高权限。内核态提权往往通过修改进程的cred 结构或污染关键文件的可写映射来拿到root;用户态则常借助SUID/GUID、sudo 误配、Cron/服务可写脚本等配置问题完成提权。
典型利用路径与原理
-
内核内存破坏类
- 栈/堆溢出、越界写等破坏内核栈或对象布局,绕过canary/SLUB等防护后劫持控制流;在 x86_64 上通过swapgs; iretq从内核态“安全返回”到用户态着陆点,继续执行提权后的代码。常见思路是泄露canary与内核基址,构造ROP链在内核态调用commit_creds(prepare_kernel_cred(0))获取 root,再返回用户态起 shell。若SMEP/SMAP开启,则需改用内核 ROP 或ret2user(在内核态直接执行用户态准备的函数指针)来规避执行/访问用户页的限制。
-
逻辑漏洞类
- 不靠内存破坏,而是通过条件竞争、未初始化、参数校验不严等逻辑问题获得越权。例如CVE-2021-4034(pkexec):利用execve 时 argc 为 0导致argv 与 envp 连续布局的特性,配合环境变量与 GCONV 机制加载恶意模块,诱导 pkexec 以 root 身份执行任意代码。另一类是CVE-2022-0847(Dirty Pipe):利用 pipe 缓冲区标志位残留,使写入绕过页缓存保护,污染只读文件(如**/etc/passwd**)页面缓存实现提权。更通用的思路是Dirty Cred:用高权限的credential/file对象与低权限对象“交换”,把进程权限直接“换”成 root,甚至可绕过部分CFI等缓解。
-
配置错误类(非漏洞,但常被当作“利用面”)
- SUID/GUID 程序滥用:如 find、vim、bash 等被设置 SUID 时,普通用户执行可获得文件属主权限;结合 GTFOBins 可快速逃逸到 root shell。
- sudo 误配:如 NOPASSWD: ALL 或允许执行受限命令,直接以 root 身份运行任意命令。
- Cron/系统服务可写脚本:低权限可写计划任务或服务脚本,等待 root 定时执行时注入反向 shell。
- 信息收集常用命令:uname -a、cat /etc/os-release、find / -perm -u=s -type f 2>/dev/null、sudo -l -U 。
从触发到提权的通用步骤
- 信息收集与可达性确认:查看内核/发行版版本、已安装软件与权限配置,定位潜在攻击面(内核 LPE、SUID、sudo、Cron、服务)。
- 触发缺陷与稳定复现:构造输入或操作序列,使目标进入可利用状态(如溢出覆盖返回地址、竞争窗口命中、环境变量被错误解析)。
- 绕过防护与地址解析:泄露canary/ASLR基址,处理NX/SMEP/SMAP/KASLR;必要时用ROP/ret2usr或内核 gadget 完成关键调用。
- 权限提升动作:内核态调用commit_creds(prepare_kernel_cred(0))或“交换 credential”;用户态通过SUID/sudo/Cron执行高权限命令或脚本。
- 稳定着陆与清理:正确恢复寄存器与栈,回到用户态执行**/bin/sh**,并尽量清除痕迹以降低被检测概率。
防护要点
- 及时更新与补丁管理:内核与关键组件保持最新稳定版,必要时启用内核热补丁减少重启窗口。
- 加固内核运行时:开启并保持KASLR、SMEP、SMAP、NX等缓解;限制dmesg/内核符号泄露(如 kernel.dmesg_restrict、kernel.kptr_restrict),减少信息泄露面。
- 最小权限与能力化:清理不必要的SUID/SGID,优先用capabilities细粒度授权;审计sudoers,禁止 NOPASSWD 滥用。
- 文件与任务安全:严控**/etc/passwd、/etc/shadow、/etc/sudoers等关键文件权限;审查Cron**与系统服务脚本的属主与可写性,避免被低权限篡改。
- 运行时隔离与监控:容器/虚拟化环境使用no-new-privileges、drop capabilities等;部署完整性监控/入侵检测与集中审计,缩短攻击驻留时间。