PHP, 메모리 오류 악용한 원격 코드 실행 취약점 2건 수정
Calif 연구원 Ryan Austin은 LLM을 조사 보조 도구로 활용해 PHP의 메모리 오류와 요청 정리 과정에서 원격 코드 실행으로 이어지는 경로를 찾았습니다. PHP는 2026년 10월 21일 취약점 두 건을 수정했으며, 하나는 mod_php의 요청 시작 단계에서, 다른 하나는 같은 워커의 후속 요청에서 조건에 따라 악용될 수 있습니다.
본문
PHP 프로젝트는 2026년 10월 21일 메모리 오류와 요청 간 상태 잔존을 악용하는 원격 코드 실행 취약점 두 건을 수정했습니다. Calif 연구원 Ryan Austin은 LLM을 조사 보조 도구로 활용해 PHP의 메모리 할당과 요청 정리 과정에서 공격 경로를 찾았습니다.
불완전한 자료구조를 정상 데이터처럼 처리한 오류
PHP는 애플리케이션 코드가 실행되기 전 요청 본문을 읽어 폼 값과 파일 업로드 정보를 내부 자료구조에 담습니다. 2020년 버그 보고서 #78876은 긴 multipart 입력이 메모리 부족을 일으키고 임시 파일 정리를 누락시킬 수 있다고 지적했습니다. 당시에는 요청 실패나 정리 문제로 여겨졌고, 원격 코드 실행으로 이어지는 구체적인 경로는 확인되지 않았습니다. PHP Foundation은 2024년 외부 보안 감사에서도 같은 메모리 문제의 징후를 찾았지만, 그때는 구체적인 악용 경로가 나오지 않았다고 설명했습니다.
Calif의 분석은 요청 본문보다 PHP 내부 자료구조가 더 많은 메모리를 차지할 수 있다는 점에서 출발했습니다. 빈 파일 업로드 항목도 PHP의 $_FILES에 여러 메타데이터 항목을 만들고, 필드 이름을 중첩하면 그 구조가 각 항목에 반복됩니다. Calif는 기본 설정 사례에서 요청 본문이 8MiB보다 작아도 내부 자료구조가 기본 메모리 한도인 128MiB를 넘을 수 있다고 설명했습니다.
취약점 CVE-2026-109618의 핵심은 메모리 부족으로 할당이 실패하는 순간 내부 자료구조가 미완성 상태가 된다는 점입니다. PHP는 해시 테이블에 새 항목을 추가할 때 사용 중인 항목 수를 먼저 늘린 뒤 키 메모리를 할당합니다. 할당에 실패하면 항목 초기화가 끝나기 전에 실행이 중단되지만, 요청 종료 절차는 늘어난 항목 수를 믿고 해당 항목을 정상 데이터처럼 처리할 수 있습니다. 그 결과 메모리가 손상돼 원격 코드 실행으로 이어집니다.
이 요청 시작 단계의 입력 처리 경로는 Apache의 mod_php에서 애플리케이션 코드가 실행되기 전에 도달할 수 있으며, PHP Foundation은 기본 설정에서 원격 코드 실행을 재현했다고 밝혔습니다. PHP-FPM은 요청 시작이 실패하면 해당 워커를 종료하므로 이와 같은 시작 단계의 정리 경로가 이어지지 않습니다. PHP의 공식 취약점 권고는 이 구체적인 경로와 별개로 FPM의 애플리케이션별 경로를 설명합니다.
다음 요청까지 남는 전역 상태
CVE-2026-109619은 한 요청에서 만든 상태를 PHP 워커가 초기화하지 못한 채 보유하고, 같은 워커가 처리하는 다음 요청이 그 상태를 사용하는 문제입니다. 치명적 오류가 정리 작업을 건너뛰면 요청 메모리는 해제되더라도 전역 상태는 그 메모리를 가리킬 수 있습니다. 후속 요청이 이를 읽거나 해제하면 use-after-free가 발생합니다. 두 요청이 같은 워커에서 처리돼야 공격 경로가 성립합니다.
mod_php에서는 세션 업로드 진행 기능이 요청 본문을 읽는 중 애플리케이션 코드보다 먼저 세션 상태를 만들 수 있습니다. 요청 시작 중 오류가 나면 모듈 정리가 생략될 수 있지만 요청 메모리는 해제되고 Apache 워커는 다음 요청을 처리합니다. 이때 남은 세션 상태가 이후 요청에서 사용될 수 있습니다.
PHP-FPM에서 Calif가 보고한 경로는 다릅니다. 요청 시작을 마친 뒤 애플리케이션이 세션 데이터를 해석하거나 unserialize()를 실행하는 과정에서 오류가 나면 디코더 상태를 정리하지 못할 수 있습니다. 이 경우 워커는 살아남습니다. 이어지는 multipart 요청의 세션 업로드 진행 처리가 일반적인 초기화보다 먼저 실행돼 남은 디코더 상태를 사용할 수 있습니다. 따라서 이 FPM 경로에는 공격자가 도달할 수 있는 애플리케이션 코드 경로가 필요합니다.
AI를 보조 도구로 쓴 취약점 조사
Calif 연구원 Ryan Austin은 PHP의 과거 메모리 한도 취약점을 알고 있었고, 그 이력을 바탕으로 조사 방향을 정했습니다. Calif 기술 보고서에 따르면 그는 LLM에 메모리 한도를 넘기는 입력을 찾도록 요청하고, 메모리 할당과 치명적 오류 처리, 요청 종료 과정을 살폈습니다. 이후 불완전한 상태가 만들어지는 지점과 정리 코드가 이를 처리하는 방식을 연결해 실제 악용 경로를 확인했습니다. Austin은 초기 발견에 특별한 테스트 장치나 일반에 공개되지 않은 모델이 필요하지 않았다고 밝혔습니다. PHP Foundation은 Calif 외에도 OpenAI와 Wiz의 보고가 대응에 기여했다고 기록했습니다.
PHP는 두 취약점을 PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35에서 수정했습니다. CVE-2026-109618 패치는 메모리 부족 때 실행을 즉시 벗어나 불완전한 상태를 남기던 방식을 바꿨습니다. PHP는 안전한 가상 머신 지점에서 지연된 메모리 부족 오류를 처리하고, 더 높은 메모리 임계값에 도달하면 프로세스를 종료합니다. CVE-2026-109619 패치는 요청 메모리를 참조하는 더 넓은 범위의 상태가 다음 요청에 남지 않도록 초기화합니다.
PHP Foundation은 메모리 관리와 오류 처리가 거의 모든 요청에 쓰이는 엔진의 중심부라 호환성을 유지하면서 수정하기 어려웠다고 설명했습니다. 수정 과정에는 하위 호환성 문제, 서비스 거부 위험, 서드파티 확장 기능의 변경 가능성이 고려됐습니다. IEEE Spectrum은 네 명의 엔지니어가 약 두 달 동안 패치를 개발했다고 전했습니다. PHP의 정규 보안 지원은 8.1 이하 버전에서 끝났지만, 이번 문제에 대해서는 PHP 보안팀이 7.4·8.0·8.1용 소스 역이식 패치를 제공했습니다. 일부 배포판과 장기 지원 업체도 수정 사항을 패키지에 반영했으므로 해당 버전의 실제 수정 여부는 공급처에 따라 다릅니다.
자료: IEEE Spectrum, PHP Foundation, PHP 공식 보안 권고, Calif / 정리·해설: Trawling
참고 자료
- The PHP2Shell Vulnerability Heralds Cybersecurity Hell
- Today's PHP Security Release, and How We're Strengthening PHP Security — The PHP Foundation — Supporting, Advancing, and Developing the PHP Language
- PHP2Shell by Calif Research
- PHP: News Archive - 2026
- RCE via OOM corruption · Advisory · php/php-src · GitHub
- RCE via stale global state · Advisory · php/php-src · GitHub