최근 보고된 취약점인 CVE-2019-11043은 PHP 페이지를 실행하는 데 PHP‑FPM을 사용하는 웹사이트에 영향을 줄 수 있습니다. NGINX에는 프로세스 내 PHP 런타임이 없기 때문에 NGINX 기반 웹사이트에서는 PHP‑FPM을 사용하는 경우가 특히 많습니다. 대신 NGINX는 애플리케이션 서버와 PHP‑FPM 같은 프로세스 관리자를 위한 리버스 프록시 역할을 합니다.
이 취약점은 NGINX가 아닌 PHP‑FPM 자체에 있으므로, 유일하게 확실한 해결 방법은 사용 중인 PHP 버전을 패치된 릴리스(또는 그 이후 버전)로 업그레이드하는 것입니다: PHP 7.1.33, PHP 7.2.24, 또는 PHP 7.3.11.
취약점의 특성은 무엇인가요?
NGINX는 FastCGI 프로토콜을 사용하여 PHP‑FPM과 통신합니다. 각 FastCGI 메시지에는 일련의 환경 변수가 포함됩니다. 그중 하나인 PATH_INFO는 다른 요청 매개변수에서 파생됩니다. 이 값이 예기치 않게 비어 있으면 궁극적으로 PHP‑FPM 바이너리의 메모리 손상이 발생할 수 있습니다. 이 상황을 악용하면 PHP‑FPM 바이너리가 로컬 서버에서 임의의 명령을 실행하도록 할 수 있습니다.
이 취약점은 일반적인 NGINX 구성에서 발생할 수 있습니다. 이 구성에서는 NGINX가 fastcgi_split_path_info 지시문의 정규식을 사용하여 요청 URI를 두 부분으로 분할합니다. 이 취약점을 유발하는 한 가지 방법은 요청 URI에 줄 바꿈 문자(%0a) 또는 캐리지 리턴 문자(%0d)를 삽입하는 것입니다. 이렇게 삽입된 문자는 정규식에서 올바르게 처리되지 않습니다.
취약점 완화
앞서 언급했듯이, 이 취약점을 확실하게 해결할 수 있는 유일한 방법은 사용 중인 PHP 버전을 패치된 릴리스(또는 그 이후 버전)로 업그레이드하는 것입니다: PHP 7.1.33, PHP 7.2.24, 또는 PHP 7.3.11.
PHP 바이너리를 즉시 업그레이드할 수 없는 경우, 다음과 같은 몇 가지 부분적인 완화 조치를 취할 수 있습니다:
- 여러 출처에서는 NGINX 설정에
try_files지시어를 추가하여$uri변수가 파일(PHP 스크립트)을 가리키는지 확인하고, 그렇지 않으면404(찾을수 없음)코드로 요청을 거부할 것을 제안했습니다:
location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
try_files $uri =404;
#...
}- 이 완화 조치는 NGINX와 PHP‑FPM이 동일한 호스트에서 같은 문서 루트(docroot)를 공유하는 경우에만 작동합니다. PHP 구성은 업스트림 애플리케이션의 요구 사항에 따라 달라질 수 있습니다. 이와 같은 변경 사항이 애플리케이션에 영향을 미치지 않는지 테스트하여 확인하세요.
- F5 BIG-IP ASM(Application Security Manager)을 사용하여 애플리케이션을 보호하십시오. 기존의 “명령 실행(Command Execution)” 및 “서버 측 코드 삽입(Server Side Code Injection)” 시그니처 세트에는 이 PHP‑FPM 취약점을 탐지하고 악용하려는 대부분의 시도를 차단하는 공격 시그니처가 포함되어 있습니다.편집자 주 – 이 블로그가 게시된 이후 F5 보안 팀은 이 취약점에 특화된 추가 시그니처를 출시했습니다. 자세한 내용은 F5 DevCentral에서 확인하십시오.
- 의심스러운
%0a또는%0d문자가 포함된 요청을 차단하도록 ModSecurity 규칙을 추가합니다:
SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:lowercase,deny"- 이 해결 방법은 취약점에 대한 Wallarm의 최초 보고서에 설명되어 있습니다. 이 방법은 오탐을 유발할 수 있으며, 공격자가 취약점을 악용할 다른 방법을 찾아낼 가능성도 있습니다.
다른 PHP 프로세스 관리자 사용
PHP‑FPM에 의존하는 대신 NGINX Unit을 사용하여 PHP 애플리케이션을 실행할 수 있습니다. NGINX Unit은 PHP뿐만 아니라 다양한 언어와 프레임워크를 지원하는 고성능 오픈 소스 애플리케이션 서버이자 프로세스 관리자입니다. 부하에 따라 PHP 애플리케이션을 자동으로 확장하고, 서로 다른 PHP 런타임을 사용하는 애플리케이션을 동시에 실행할 수 있습니다. 당사는 바이너리, 소스 및 Docker 이미지를 무료로 제공합니다.
인기 있고 트래픽이 많은 PHP 기반 애플리케이션인 WordPress용 NGINX Unit을 구성하고 운영하는 방법은 NGINX Unit 설명서를 참조하세요. 이 배포에서는 NGINX Unit 1.11.0 이상에서 제공되는 정적 파일 제공 지원 기능을 활용합니다.
작성자 소개

관련 블로그 게시물
시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.
F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.
Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.
진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.
NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.
Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.