php-fpm与SELinux权限困惑:为何可执行/bin_sh?
问题解答
你的疑问核心在于SELinux默认策略中对httpd_t域的权限配置,主要遗漏了以下几个关键机制:
httpd_t域默认允许执行bin_t类型程序
SELinux默认策略里,httpd_t域拥有对bin_t类型可执行文件的execute权限。这是因为很多合法Web应用需要调用系统工具(比如脚本处理、日志生成),所以策略默认放开了这个权限。你可以通过以下命令验证规则:sesearch -s httpd_t -t bin_t -c file -p execute -A未触发强制域转换
php-fpm运行在httpd_t域,当它调用/bin/sh时,SELinux没有强制要求子进程切换到其他受限域(比如shell_exec_t)。默认情况下,子进程会继承父进程的httpd_t域,而httpd_t本身被允许执行bin_t类型的/bin/sh,所以shell进程能正常运行并执行命令。httpd相关SELinux布尔值可能处于开启状态
系统默认可能开启了部分放宽httpd权限的布尔值,比如httpd_enable_cgi(允许httpd执行CGI脚本)、httpd_execmem(允许httpd使用可执行内存)等,这些布尔值进一步降低了限制。你可以用以下命令查看当前布尔值状态:getsebool -a | grep httpdwebshell的安全上下文合法
你的webshell使用了httpd_sys_content_t上下文,httpd_t域对该上下文的文件拥有读取和执行权限,所以php-fpm能正常解析并执行webshell中的代码,进而调用system()函数触发系统命令执行。
测试建议
如果想要强化限制,可以尝试:
- 关闭
httpd_enable_cgi布尔值:setsebool -P httpd_enable_cgi off - 查看SELinux审计日志确认规则细节:
ausearch -m avc -ts recent - 调整webshell的上下文为非httpd可执行类型(比如
user_home_t),测试是否会被拒绝
内容的提问来源于stack exchange,提问作者cider
相关产品推荐
相关产品推荐

