안녕하세요, 저는 RHEL OS에서 웹 애플리케이션을 호스팅하는 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을 트리거합니다.