こんにちは、私はRHEL OSでWebアプリケーションをホストするnginxサーバーを使用しており、強制モードでselinuxを使用しています。
アプリケーションへのアクセス中に502の無効なゲートウェイエラーが発生し、監査と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がトリガーされます。