□ 개요
보안업체 데브코어(DEVCORE)는 PHP의 원격 코드 실행 취약점(CVE-2024-4577)을 발견하여 PHP 공식 팀에 보고하였다. 웹 생태계에서 PHP는 널리 사용되고 있고, 익스플로잇 난이도가 낮아 취약점의 심각도는 초고위험도(CVSS 점수 9.8)로 분류되었다. 이 문제는 PHP 공식 팀에 즉시 보고되었으며, PHP 공식 팀은 2024년 6월 6일에 패치를 출시했다.
□ PHP 원격 코드 실행 취약점
CVE-2024-4577 취약점은 PHP의 CGI 모드에서 Windows의 “Best-Fit” 기능이 잘못된 인코딩 변환을 일으켜 발생하는 원격 코드 실행(RCE) 취약점이다. Windows 운영체제에서 PHP가 CGI 모드로 실행되거나 XAMPP와 같은 개발 환경에서 기본 설정으로 PHP 바이너리가 노출된 경우에 취약하다. 이 취약점을 악용하면 공격자는 조작된 URL 매개변수를 통해 임의의 코드를 실행할 수 있다.
현재까지 확인된 바에 따르면, 특정 시스템 로캘(중국어 번체 및 간체, 일본어)을 사용하는 경우에 익스플로잇이 가능한 것으로 알려져 있으나, 다른 로캘도 상황에 따라 영향을 받을 가능성을 배제할 수 없으므로, 패치 버전으로 업데이트할 것을 권고한다.
□ 영향받는 버전
영향을 받는 버전 |
패치 버전 |
PHP 5, PHP 7, PHP 8.0 |
End-of-Life (EOL) (보안 패치 및 업데이트 지원되지 않음) |
PHP 8.1.0 ~ PHP 8.1.28 |
8.1.29 |
PHP 8.2.0 ~ PHP 8.2.19 |
8.2.20 |
PHP 8.3.0 ~ PHP 8.3.7 |
8.3.8 |
□ 기술적 분석
CVE-2024-4577 취약점의 근본적인 원인은 PHP의 문자 인코딩 변환 과정에서 Windows 운영 체제의 "Best-Fit" 기능이 부적절하게 처리되어 발생한다. Windows의 “Best-Fit” 기능은 소프트 하이픈(0xAD)과 같은 특정 유니코드 문자를 일반 하이픈(0x2D)으로 해석한다. 이러한 잘못된 해석으로 인해 공격자는 PHP 프로세스에 추가 명령줄 인수를 삽입하여 임의의 코드를 실행할 수 있다. 해당 취약점의 경우 PoC 코드가 공개된 상태이며, 익스플로잇 난이도도 낮은 것으로 확인이 되어 실제 공격에 사용될 가능성이 높아 주의가 필요하다.
아래 그림은 URL 매개변수를 조작하여 임의의 코드를 실행하는 공격의 예시이다.
[그림 1] 익스플로잇 예시
URL 매개변수로 전달된 소프트 하이픈(0xAD)은 일반 하이픈(0x2D)으로 해석되어 PHP 서버에서는 이를 추가 명령줄 인수로 인식하게 된다. 따라서, 최종적으로 PHP 서버에서는 아래와 같은 명령이 실행된다.
php-cgi.exe -d allow_url_include=1 -d auto_prepend_file=php://input |
해당 명령이 실행되면, PHP 설정이 변경되어 HTTP Body로 전달받은 데이터가 PHP 코드로 실행된다. [그림 1]의 공격 예시에서는 “Cyberone MIR” 문자열의 MD5 해시를 계산하는 PHP 코드가 실행되어 그 결과가 출력된 것을 알 수 있다.
□ PoC Test
CVE-2024-4577 취약점에 영향을 받는 환경을 구축하여 PoC 테스트를 진행해 보았다.
구분 |
내용 |
운영체제 |
Windows 10 |
시스템 로캘 |
중국어 번체, 일본어 |
XAMPP 및 PHP 버전 |
XAMPP for Windows 8.2.12 (PHP 8.2.12) |
[표 1] 테스트 환경
공격 시나리오는 타겟 시스템에서 계산기가 실행되도록 하고, 익스플로잇 성공 여부를 확인하기 위해 웹페이지에 “Success” 문자열을 출력하도록하는 것이다. 사용된 PoC는 다음과 같다.
구분 |
내용 |
URL |
http://{Target IP}/php-cgi/php-cgi.exe?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input |
HTTP Body |
php system('calc');echo "Success";?>
|
[표 2] 테스트에 사용한 PoC
해당 PoC를 이용해 공격을 진행한 결과, 웹페이지에는 “Success” 문자열이 출력되었다. 이는 공격자가 HTTP Body로 전송한 PHP 코드가 타겟 시스템에서 실행되었다는 것을 의미하며, 공격이 성공했음을 알 수 있다.
[그림 2] 계산기를 실행하고 ”Success” 문자열을 출력하는 공격 패킷
최종적으로, 공격 대상 시스템에서는 계산기가 실행된 것을 확인할 수 있었다.
[그림 3] 피해 시스템에서 계산기가 실행된 화면
□ 취약점 악용 사례
최근 Imperva Threat Research에서는 "TellYouThePass" 랜섬웨어 캠페인에서 CVE-2024-4577 취약점을 악용하는 활동을 보고했다. TellYouThePass는 2019년부터 윈도우 및 리눅스 시스템을 대상으로 유포되고 있는 랜섬웨어이다.
공격자는 CVE-2024-4577의 알려진 익스플로잇을 활용하여 피해 시스템이 mshta를 통해 악성 hta 파일을 실행하도록 하였다. mshta는 윈도우에 기본적으로 존재하는 LOL(Living Off the Land) 바이너리로써, 공격자들이 원격지에 호스팅되어 있는 악성 hta 파일을 실행하기 위해 악용하는 바이너리 중 하나이다. Imperva에서 공유한 실제 공격에 사용된 익스플로잇 코드는 다음과 같다. 해당 공격이 성공하면, 최종적으로 피해 시스템에서는 악성 hta 파일(dd3.hta)이 실행된다.
[그림 4] 공격에 사용된 익스플로잇 코드 (출처 : imperva)
mshta에 의해 실행되는 악성 hta 파일(dd3.hta)에는 VBScript가 포함되어 있다. VBScript에는 "TellYouThePass" 랜섬웨어의 바이너리 바이트가 base64로 인코딩 된 형태로 존재한다.
[그림 5] dd3.hta (출처 : imperva)
해당 VBScript가 실행되면 base64 디코딩 과정을 거쳐 메모리에 "TellYouThePass" 랜섬웨어의 바이너리 바이트가 로드되어 실행된다. 메모리에서 실행되는 "TellYouThePass" 랜섬웨어는 .NET 변종으로 확인되며, C2 서버 IP는 하드코딩되어 있다.
[그림 6] 하드코딩 되어 있는 C2 서버 IP (출처 : imperva)
피해 시스템 내 파일들이 암호화된 후에는 복호화 안내를 위한 랜섬노트가 웹 루트 디렉토리에 "READ_ME10.html" 파일명으로 생성된다.
[그림 7] 랜섬노트 생성 (출처 : imperva)
□ 완화 방안
(1) 최신 PHP 버전(8.3.8, 8.2.20, 8.1.29)으로 업그레이드
(2) 업데이트가 불가능한 경우에는 다음과 같은 조치를 통해 임시 완화
- Rewrite 규칙을 사용하여 공격을 차단
RewriteEngine On RewriteCond %{QUERY_STRING} ^%ad [NC] RewriteRule .? - [F,L] |
- Windows용 XAMPP를 사용하는 경우, 설정 파일에서 PHP CGI 디렉토리 노출 제거
설정 파일(C:/xampp/apache/conf/extra/httpd-xampp.conf)에서 아래 행을 찾아 주석 처리 ScriptAlias /php-cgi/ "C:/xampp/php/" # ScriptAlias /php-cgi/ "C:/xampp/php/" |
□ 참고 자료
[1] https://socradar.io/critical-rce-vulnerability-cve-2024-4577-in-php-on-windows-patch-now-available/
[3] https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/
[4] https://medium.com/@bobcristello/critical-php-flaw-puts-windows-servers-at-rce-risk-2e54d826095c
[5] https://nvd.nist.gov/vuln/detail/CVE-2024-4577
보안관제센터 MIR Team