
PHP 8.4.26 - 치명적 - 원격 - OOM longjmp - CVE-2026-109618 PHP2Shell. 인증되지 않은 청크 분할 멀티파트 요청이 Apache mod_php에서 애플리케이션 코드보다 먼저 memory_limit에 도달함. 8.4.27과 실험실 환경 비교. 권고안 RCE 추정.
인터넷상의 누구든 비밀번호 없이 브라우저와 동일한 방식으로 여러분의 PHP 사이트와 통신할 수 있습니다. 마지막으로 영향을 받는 PHP 버전에서는, 애플리케이션이 시작되기 전에 엔진이 요청을 읽는 도중 메모리가 고갈되도록 만드는 조작된 파일 업로드 요청을 보낼 수 있습니다. 그러면 PHP는 요청이 절반만 구성된 상태에서 해당 작업에서 빠져나옵니다. PHP Group은 이렇게 절반만 구성된 상태의 정리가 웹 워커로서의 원격 코드 실행으로 이어질 수 있음을 보여주었습니다. 이 랩은 Apache mod_php 8.4.26에서 메모리 고갈 점프를 입증하고, 8.4.27이 동일한 요청을 정상적으로 완료함을 입증합니다.
분류: OOM longjmp / 요청 시작 중단 도달 범위: 원격
PHP 8.4.26 (php:8.4.26-apache) 대 패치된 8.4.27 - php.net
Apache mod_php는 요청 시작이 실패한 경우에도 항상 요청 종료를 실행합니다. CVE-2026-109618은 HashTable 버킷이 이미 teardown에 노출된 상태에서 rfc1867 파싱 중 memory_limit에 대한 longjmp()입니다. 이 랩은 사용 가능한 Content-Length가 없고 memory_limit=8M에서 약 3000개의 추가 파트 헤더를 가진 청크된 multipart/form-data POST입니다. 8.4.26은 Fatal error: Allowed memory size ... in Unknown on line 0을 반환합니다. 8.4.27은 alive 마커를 반환하고 index.php를 실행합니다. 트리거 이후의 워커 GET은 양쪽 모두에서 여전히 200입니다. Apache 워커로서의 권고된 RCE는 GHSA에서 추론됩니다.
| ID | CVE-2026-109618 |
| 권고 | GHSA-w8hw-w9fx-j79w |
| 분류 | OOM longjmp / 요청 시작 중단 (권고된 RCE 추론됨) |
| 도달 범위 | 원격 (인증되지 않은 HTTP) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | 치명적: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| 제품 | PHP |
| 영향받음 | PHP 8.2 8.2.35 이전, 8.3 8.3.36 이전, 8.4 8.4.27 이전, 8.5 8.5.12 이전 (랩 고정 8.4.26) |
| 수정됨 | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (2026년 10월 21일) |
| 인증 | 없음 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
형제: CVE-2026-109619 stale worker-global UAF (PHP2Shell 쌍).
| 방법 | 싱크 | 권한 |
|---|---|---|
Transfer-Encoding: chunked, 다수의 추가 파트 헤더, 유한한 memory_limit을 가진 인증되지 않은 POST multipart/form-data | php_request_startup 중 rfc1867 파싱 / zend_bailout longjmp | 가용성 (랩 입증): 8.4.26에서 index.php 이전에 요청 시작 중단 (Unknown on line 0). 무결성 (추론됨): 종료 시 절반만 초기화된 $_POST/$_FILES를 순회; 벤더는 Apache 워커로서의 RCE를 보여주었음 (공식 이미지에서 www-data). 정찰 (추론됨): 남은 요청 힙 노출. |
| 8.4.27에서 동일한 트리거 | 지연된 소프트 OOM | 종료됨 (랩 입증): HTTP 200 alive 마커, files=1, 워커 유지. |
| 트리거 이후 GET | 워커 여전히 살아 있음 | 랩 입증: 이 고정 버전은 SIGSEGV가 발생하지 않았고 zend_mm_heap corrupted를 기록하지 않았음. |
로그인, 애플리케이션 라우트, 사용자 정의 .so, 리버스 셸 | 해당 없음 | 종료됨. RIP 제어 시도 없음. |
랩 입증 vs 추론됨: 8.4.26 vs 8.4.27 OOM-longjmp 차이는 랩 입증됨. 워커 사망 UAF와 RCE는 GHSA-w8hw-w9fx-j79w에서 추론됨. FPM은 일반적으로 시작 실패 시 자식을 종료함; 이 CVE에 대해 벤더는 완전한 FPM 익스플로잇을 보여주지 않았음.
요구 사항: Apache apache2handler. 유한한 memory_limit (-1로 설정하지 말 것; 그것이 완화책임). 멀티파트 파싱 활성화. 공식 php:8.4.26-apache 대 php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
또는 cd lab && ./run.sh. 루프백 127.0.0.1:18220 (8.4.26) 대 127.0.0.1:18221 (8.4.27). Compose 프로젝트 cve-2026-109618. Witness CVE-2026-109618-OOM-WITNESS. 마지막 줄:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
승인된 실험실 전용입니다. 루프백과 통신합니다.
PHP 8.4.27(또는 8.2.35 / 8.3.36 / 8.5.12)로 업데이트하세요. 이 패치는 OOM longjmp()를 다음 VM 안전 지점에서의 지연된 소프트 OOM으로 대체하고, 더 높은 임계값을 넘으면 하드 _exit()를 수행합니다(31c0ea7). 그때까지는: 애플리케이션이 재정의할 수 없는 관리자 memory_limit=-1; post_max_size를 낮게 유지; 멀티파트 파트와 헤더에 상한 설정. RLIMIT_AS 또는 RLIMIT_DATA를 사용하지 마세요.
Abraxas Labs [email protected]