php79 / stack

PHP 5.3 ~ 8.2 + Nginx + Let's Encrypt + MariaDB + 앱 자동 설치
https://www.php79.com
MIT License
89 stars 32 forks source link

nginx + php-fpm 조합의 CVE-2019-11043 취약점 테스트 #63

Closed ibin79 closed 4 years ago

ibin79 commented 4 years ago

취약점 정보

https://www.tenable.com/blog/cve-2019-11043-vulnerability-in-php-fpm-could-lead-to-remote-code-execution-on-nginx

취약점 발생 조건

nginx + php-fpm 기반의 PHP7 이상 모든 버전 해당. (2019-10-24 업그레이드된 7.1.33 / 7.2.24 / 7.3.11 은 패치됨)

단, 특정 nginx fastcgi 설정에서만 문제 발생.

취약점 테스트 툴

https://github.com/neex/phuip-fpizdam

취약점 테스트 툴 검증

테스트 툴의 예제대로 nginx 설정을 변경하여 취약점이 발생하는 것 확인.

# ./phuip-fpizdam http://dev71-bug.php79.net/script.php
2019/10/28 11:54:45 Base status code is 200
2019/10/28 11:54:45 Status code 502 for qsl=1745, adding as a candidate
2019/10/28 11:54:45 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]
2019/10/28 11:54:46 Attack params found: --qsl 1735 --pisos 216 --skip-detect
2019/10/28 11:54:46 Trying to set "session.auto_start=0"...
2019/10/28 11:54:46 Detect() returned attack params: --qsl 1735 --pisos 216 --skip-detect <-- REMEMBER THIS
2019/10/28 11:54:46 Performing attack using php.ini settings...

서버 CPU 자원이 증가하며, 공격받은 해당 PHP FPM 프로세스는 웹페이지를 열때도 다음 경고가 발생함. (재시작 전까지...)

image

1차 분석 결과

취약점 발생한 nginx 설정을 하나씩 수정하며 취약점이 발생하지 않는 조건을 찾음.

./phuip-fpizdam http://dev71-bug.php79.net/script.php
2019/10/28 11:35:39 Base status code is 200
2019/10/28 11:35:39 Detect() returned error: no qsl candidates found, invulnerable or something wrong

다음 2가지 조건을 모두 만족해야 취약점이 발생.

  1. try_files $uri =404; 없어야 함. -> stack 은 모든 설정에서 이미 선언었으므로 취약하지 않음.

  2. fastcgi_param PATH_INFO $fastcgi_path_info; 있어야 함. -> stack 은 모든 설정에서 없으므로 취약하지 않음.

stack 설정 참고 : https://github.com/php79/stack/blob/master/apps/fastcgi-php.conf#L5

1차 결론

php79/stack 으로 기본 구성된 nginx + php-fpm 조합에서는 취약점이 적용되지 않습니다. 단, 위 설정을 임의로 수정/추가한 경우는 취약할 수 있습니다.

혹 잘못된 내용이 있다면 이슈 등으로 알려주세요.


관련 링크

ibin79 commented 4 years ago

공개된 취약점 스캔툴로 무단 스캐닝 사례 발견됨


2019/10/26 04:55:35 [error] 12673#12673: *274767664 limiting requests, excess: 10.191 by zone "req_php", client: *.*.*.*, server: *****, request: "GET /index.php/PHP%0Ais_the_shittiest_lang.php?QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
hot5g commented 4 years ago

수고 많으십니다... 본문 내용을 보면 현재 7.1.32 버전은 업데이트를 해야겠군요.

ibin79 commented 4 years ago

네. PHP 7.1 이상은 업데이트를 권장하고요.

단, nginx 에서 fastcgi 설정 부분에 try_files $uri =404; 설정이 있다면, 해당 취약점은 문제없는것으로 1차 확인되었습니다.

ibin79 commented 4 years ago

PHP 7.0 remi 저장소에서 백포팅하여 지원됨

http://rpms.remirepo.net/enterprise/7/php70/x86_64/repoview/php-fpm.html

Changelog by Remi Collet (2019-10-22):

https://centos.pkgs.org/7/remi-x86_64/php70-php-cli-7.0.33-14.el7.remi.x86_64.rpm.html

업데이트 방법

# yum update php70*

=====================================================================

  WARNING : PHP 7.0 have reached its "End of Life" in
  December 2018. Even, if this package includes some of
  the important security fix, backported from 7.1, the
  UPGRADE to a maintained version is very strongly RECOMMENDED.

=====================================================================
  Verifying  : php70-php-devel-7.0.33-14.el7.remi.x86_64        

# cd /root/stack/
# ./apache-to-nobody.sh 

php79 stack version 1.1.0

### PHP FPM 로그/세션 디렉토리의 소유자/그룹을 apache 에서 nobody 로 변경합니다. ###

  - yum update 를 통해 php-fpm 이 업데이트된 후, 이 스크립트를 실행해주시면 됩니다.
    참고) https://github.com/php79/stack/issues/12

변경할 디렉토리/파일:
/var/opt/remi/php70/lib/php/opcache
/var/opt/remi/php70/lib/php/session
/var/opt/remi/php70/lib/php/wsdlcache
/var/opt/remi/php70/log/php-fpm

위 디렉토리/파일의 소유자/그룹을 nobody 로 변경하시겠습니까? [n/Y] y