Привет, я использую сервер nginx, на котором размещено веб-приложение в ОС RHEL с 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. Выяснилось, что после печати структуры данных либо вывод ее на стандартный вывод, либо запись в файл, только она вызывает эти нарушения памяти.

Странно, если я просто получаю доступ к элементу данных, который был прочитан из общей памяти, например, не видно дуновения. Например;-

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

cout<<ptr->member1; // memory voilation , oh no!!!!!
1
Aryaman Gupta 28 Окт 2021 в 11:06
Недостаточно журналов, чтобы можно было диагностировать проблему. У нас нет других AVC в журнале аудита?
 – 
jsbillings
16 Сен 2021 в 01:46
Есть журналы avc, но это происходит только тогда, когда я пытаюсь получить доступ к приложению, размещенному на nginx, и все, если я снова получаю то же сообщение журнала
 – 
Aryaman Gupta
16 Сен 2021 в 13:38
Это захватывающая проблема. Грязный хак :: setsebool -P httpd_execmem 1 :: отсюда: bugzilla.redhat.com/ show_bug.cgi?id=1507287 Пожалуйста, прочтите обсуждение.
 – 
K-att-
27 Окт 2021 в 10:42
@ K-att - все тот же журнал Audi даже после установки упомянутого вами логического значения.
 – 
Aryaman Gupta
28 Окт 2021 в 10:59
Вы используете php-opcache? Подсказка: bugzilla.redhat.com/show_bug.cgi?id=1722502 " 2 возможное исправление: 1/среда выполнения - изменить предоставленную по умолчанию конфигурацию на opcache.huge_code_pages=0 (что может позволить пользователю включить ее....) 2/время сборки - добавить параметр сборки --disable-huge-code-pages - очистить конфигурацию В обоих случаях требуется изменение конфигурации" bugzilla.redhat.com/show_bug.cgi ?id=1670386
 – 
K-att-
28 Окт 2021 в 11:56

1 ответ

Проблема, похоже, в том, что процессу fpm не разрешен доступ к общей памяти другого процесса.

Переведя selinux в разрешающий режим, вы сможете получить аудит, чтобы показать вам, какое правило вам нужно добавить в соответствующий файл политики selinux, чтобы разрешить запуск процесса, с помощью утилиты audit2allow.

Объяснение «странного» поведения библиотеки несколько запутано. Имеющаяся у вас библиотека должна быть скомпилирована, и компилятор достаточно умен, чтобы понять, что эта инструкция

ptr->member1;

Ничего не делает. Таким образом, есть вероятность, что инструкция редактируется вне потока компилятора, если вы явно не отключите все оптимизации компилятора (и, возможно, даже если вы это сделаете). Ошибка SIG11 при доступе — это побочный эффект, о котором компилятор не может и не знает.

Компилятор также достаточно умен, чтобы понять, что это тоже ничего не делает, если вы позже не используете a для чего-то:

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

Но если вы что-то пишете в stdout, тогда это эффект, который нельзя обойти, и этот код выполняется, запуская сигнал 11.

0
LSerni 2 Ноя 2021 в 01:05