Selinux:php-fpm 的 type=anom_abend,访问应用程序时出现错误 502

Selinux:php-fpm 的 type=anom_abend,访问应用程序时出现错误 502

您好,我正在使用 nginx 服务器,该服务器在 RHEL 操作系统中托管一个 Web 应用程序,并在强制模式下使用 selinux。

在访问应用程序时,我收到 502 bad gateway 错误,在检查审核和 php 错误日志时,我发现正在发生的事情,因为我是 selinxu 概念的新手,所以我不知道发生了什么。

禁用 selinux 即将模式设置为许可时,我可以访问该应用程序。

审计日志输出

type=anom_abend msg=audit(1631601740.012:8181): auid=4294967295 uid=48 gid=48 ses=4294967295 subj=system_u:system_r:httpd_t:s0 pid=13287 comm="php-fpm" reason="memory violation" sig=11

/var/log/php-fpm/error.log 输出

[14-Sep-2021 02:58:54] WARNING: [pool www] child 14636 exited on signal 11 (SIGSEGV) after 644.841338 seconds from start
[14-Sep-2021 02:58:54] NOTICE: [pool www] child 16740 started

Nginx 版本

[user@redhat7 html]$ nginx -v
nginx version: nginx/1.20.1

php-fpm 版本

[user@redhat7 html]$ php-fpm --version
PHP 7.3.29 (fpm-fcgi) (built: Jun 29 2021 09:30:31)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.29, Copyright (c) 1998-2018 Zend Technologies

奇怪的问题:-

我正在使用一个读取共享内存的自定义库,并且该库加载了 php-fpm。事实证明,在打印数据结构后,要么执行 std 输出,要么将其写入文件,然后才导致内存损坏。

奇怪的是,如果我只是访问从共享内存中读取的数据成员,就像看到了爆炸而不是破坏。例如;-

ptr->member1; // no issue
ptr->member2; // no issue

cout<<ptr->member1; // memory voilation , oh no!!!!!

答案1

问题似乎是不允许 fpm 进程访问另一个进程的共享内存。

通过将 selinux 置于宽容模式,您应该能够使用该实用程序进行审核,以显示您需要将哪些规则添加到相应的 selinux 策略文件中以允许进程运行audit2allow

对于图书馆“奇怪”行为的解释有点令人费解。你拥有的图书馆必须是编译的,并且编译器足够聪明,可以理解这条指令

ptr->member1;

什么也没做。因此,除非您显式关闭所有编译器优化(也许,即使您这样做了),否则该指令很可能会被从编译器流中编辑出来。访问时的 SIG11 异常终止是编译器无法也没有意识到的副作用。

编译器是足够聪明,知道这也没有任何作用,除非您稍后用于a某些用途:

int a = ptr->member1 + ptr->member2;

但是,如果您向标准输出写入一些内容,那么这是一种无法绕过的效果,并且该代码将被执行 - 触发信号 11。

相关内容