최근 보고된 취약점인 CVE-2019-11043 은 PHP 페이지를 실행하기 위해 PHP‑FPM을 사용하는 웹사이트에 영향을 미칠 수 있습니다. NGINX 기반 웹사이트에서는 PHP‑FPM 사용이 특히 일반적입니다. 그 이유는 NGINX에 프로세스 내 PHP 런타임이 없기 때문입니다. 대신 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 바이너리를 즉시 업그레이드할 수 없는 경우, 다음과 같은 부분적인 완화책을 취할 수 있습니다.
다양한 소스에서 $uri
변수가 파일(PHP 스크립트)로 확인되는지 확인하고 코드로 요청을 거부하기 위해 NGINX 구성에 try_files
지시문을 추가하는 것이 제안되었습니다. 404
(
찾을 수 없음)
그렇지 않은 경우:
위치 ~ [^/]\.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)을 사용하여 애플리케이션을 보호하세요 . 기존의 "명령 실행" 및 "서버 측 코드 삽입" 시그니처 세트에는 이 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‑FPM에 의존하기보다는 NGINX Unit을 사용하여 PHP 애플리케이션을 실행할 수 있습니다. NGINX Unit은 PHP 외에도 다양한 언어와 프레임워크를 지원하는 고성능 오픈 소스 애플리케이션 서버 및 프로세스 관리자입니다. 부하에 따라 PHP 애플리케이션을 자동으로 확장하고, 서로 다른 PHP 런타임을 사용하는 애플리케이션을 동시에 실행할 수 있습니다. 우리는 바이너리, 소스, Docker 이미지를 무료로 제공합니다.
WordPress(대중적이고 트래픽이 많은 PHP 기반 애플리케이션)용 NGINX Unit을 구성하고 운영하는 방법에 대한 지침은 NGINX Unit 설명서를 참조하세요. 이 배포는 NGINX Unit 1.11.0 이상에서 정적 파일 제공에 대한 지원을 활용합니다.
"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."