PHP-FPM 보안 취약점 CVE-2019-11043 NGINX로 해결
PHP-FPM 취약점인 CVE-2019-11043은 PHP-FPM을 사용하여 PHP 페이지를 실행하는 웹 사이트에 영향을 줄 수 있습니다.
NGINX는 in-process PHP Runtime을 갖고 있지 않기 때문에 PHP-FPM 사용이 특히 NGINX 기반의 웹사이트에서 보편적입니다.
대신, NGINX는 애플리케이션 서버와 PHP-FPM과 같은 프로세스 매니저를 위한 Reverse Proxy로 작동합니다.
이 취약점은 NGINX가 아닌 PHP‑FPM 자체에 존재합니다. 따라서 유일한 보장된 해결책은 패치된 버전 (또는 이후 버전)으로 업그레이드하는 것입니다. PHP 7.1.33, PHP 7.2.24 또는 PHP 7.3.11을 사용해야합니다.
목차
1. PHP-FPM 취약점의 특성
2. 취약점 완화 방법
2-1. try_files 지시문
3. 타 PHP 관리 프로세스 사용
1. PHP-FPM 취약점의 특성
NGINX는 FastCGI 프로토콜을 사용하여 PHP‑FPM과 통신합니다. 각 FastCGI 메시지는 환경 변수 세트를 포함하며, 이 중 하나인 PATH_INFO는 다른 요청 매개변수에서 유도됩니다. 그러나 이 값이 예기치 않게 비어있으면 PHP‑FPM 바이너리에서 최종적으로 메모리 손상을 초래할 수 있습니다. 이 상황을 이용하여 PHP‑FPM 바이너리에서 로컬 서버에서 임의의 명령을 실행할 수 있습니다.
이 취약점은 일반적인 NGINX 구성에서 발생할 수 있습니다.
이 경우 NGINX는 fastcgi_split_path_info
지시문에서 정규식을 사용하여 요청 URI를 두 부분으로 분할합니다.
취약점을 유발하는 한 가지 방법은 URI Request에 줄바꿈 (%0a) 또는 캐리지 리턴 (%0d) 문자를 포함시키는 것입니다.
그리고 이 문자는 정규식에서 올바르게 처리되지 않습니다.
2. PHP-FPM 취약점 완화 방법
위에서 언급한 대로 이 취약점을 해결하는 유일한 방법은 패치된 PHP 버전 (또는 이후 버전)으로 업그레이드 하는 것입니다. PHP 7.1.33, PHP 7.2.24 또는 PHP 7.3.11을 사용해야 합니다.
PHP 바이너리를 즉시 업그레이드할 수 없는 경우, 아래와 같은 몇 가지 부분적인 완화 조치를 취할 수 있습니다.
2-1. tri_files 지시문
다양한 예시에서 try_files 지시문을 NGINX 구성에 추가하여 $uri 변수가 파일(즉, PHP 스크립트)로 해석되는지 확인하고 그렇지 않으면 코드 404(Not Found)로 요청을 거부하는 것을 제안하고 있습니다.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
try_files $uri =404;
#...
}
참고: 이러한 완화 조치는 NGINX와 PHP-FPM 이 동일한 도큐먼트 루트(docroot)를 공유하는 동일한 호스트에서 작동할 때만 작동합니다.
PHP 구성은 상위 애플리케이의 요구에 따라 다양합니다. 이러한 변경 사항을 테스트하여 애플리케이션에 영향을 미치지 않는지 확인하십시오.
3. 타 PHP 관리 프로세스 사용
PHP 어플리케이션을 실행하기 위해 PHP-FPM 에 의존하는 것보다 NGINX Unit을 사용하는 것이 좋습니다.
NGINX Unit은 고성능의 오픈소스 어플리케이션 서버 및 프로세스 매니저로 PHP 이외에도 여러 가지 언어와 프레임워크를 지원합니다. 부하에 대응하여 PHP 어플리케이션을 자동으로 확장할 수 있으며, 서로 다른 PHP 런타임을 사용하는 어플리케이션을 동시에 실행할 수 있습니다. 우리는 이것을 무료로 제공하며, 바이너리, 소스 및 도커 이미지를 제공합니다.
WordPress와 같은 인기있는 High-Traffic PHP 애플리케이션을 위한 NGINX Unit 구성 및 운영 방법에 대한 설명서는 NGINX Unit 문서를 참조하십시오.