1. 핵심 요약
2026년 10월 21일(한국시간 23:00), PHP가 인증 절차 없이 원격에서 코드가 실행될 수 있는 심각한 취약점 2건에 대한 보안 업데이트를 공개했습니다. PHP 엔진 자체의 결함이므로 응용프로그램이나 플러그인으로는 막을 수 없으며, 서버의 PHP를 최신 버전으로 업데이트 하는 것으로 해결 가능합니다. 해당 취약점은 ‘PHP2Shell’로 통용되고 있습니다. (RCE는 Remote Code Execution, 공격자가 원격에서 임의의 코드를 실행하는 것을 의미합니다.)
| 구분 | 내용 |
| 취약점 | CVE-2026-109618, CVE-2026-109619 (통칭 PHP2Shell) |
| 심각도 | 치명적(Critical) 등급, CVSS v4.0 기준 9.2점 (2건 동일) |
| 공격 방식 | 인증 없이 원격에서 코드 실행(RCE). 정상 HTTP 요청만으로 공격 가능 |
| 영향 대상 | Apache mod_php, PHP-FPM, php-cgi, FrankenPHP, LiteSpeed 등 모든 웹 PHP |
| 해결 | PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 이상으로 업데이트 후 전 워커 재시작 |
| 근거 | PHP 공식 보안 권고(2026-10-21) |
1-1. 지금 해야 할 일
- 즉시 업데이트 : PHP 버전을 확인(php -v)하고 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 이상으로 업데이트한 뒤, 모든 PHP 워커(FPM, Apache)를 재시작합니다.
- 완화, 분리 : 즉시 업데이트가 어려우면 5장의 임시 완화 조치를 적용하고, 외부에 노출된 PHP 서비스는 일시 분리를 검토합니다.
- EOL 조치 : PHP 8.1 이하는 지원이 종료(EOL)되었으므로 지원 버전으로 업그레이드합니다.
- 로그 점검 : 패치 전후 웹서버, FPM 로그에서 이상 요청, 오류 반복 여부를 점검합니다.
주의가 필요한 이유 (4가지)
|
1-2. 취약점 발견 배경
이 결함들은 수십 년간 PHP에 존재해 왔으나, 악용을 입증하려면 매우 복잡한 분석 과정이 필요해 오랫동안 드러나지 않았습니다. 그러나 최근 보안 연구 과정에서 프런티어 AI 모델을 활용하면서 이러한 분석 장벽이 크게 낮아졌고, 오래된 결함의 악용 가능성이 확인된 것으로 알려졌습니다.
AI가 보안 연구에 활용되는 흐름이 확대됨에 따라, 그동안 드러나지 않았던 잠재적 결함이 추가로 확인될 가능성에 대비할 필요가 있습니다.
2. 취약점 상세
취약점은 원인은 다르지만, 두 건 모두 이미 해제된 메모리를 참조하는 Use-After-Free로 이어져 원격 코드 실행을 가능하게 합니다.
2-1. CVE-2026-109618 (OOM 메모리 손상)
| 항목 | 내용 |
| 분류 | Improper Handling of Exceptional Conditions (CWE-416 Use After Free 외) |
| 설명 | 메모리가 부족해 작업을 급히 중단할 때, 아직 정리되지 않은 메모리를 종료 절차가 정상으로 착각해 손상이 발생합니다. |
| 공격 방법 | multipart 요청을 조작해 메모리를 고갈시킵니다. 특히 mod_php 환경에서는 애플리케이션 코드가 실행되기 전 단계에서 영향을 받는 것으로 확인되었습니다. |
| GHSA | GHSA-w8hw-w9fx-j79w |
2-2. CVE-2026-109619 (오염된 전역 상태)
| 항목 | 내용 |
| 분류 | Use After Free (CWE-416 외) |
| 설명 | 한 요청이 남긴 내부 상태가 초기화되지 않은 채, 같은 워커가 처리하는 다음 요청에서 그대로 재사용되어 메모리 오류가 발생합니다. |
| 공격 방법 | 오류를 유발하는 요청(생산자)과, 다음 요청에서 그 낡은 상태를 읽는 요청(소비자)을 조합합니다. 세션 업로드 진행률 기능이 대표 경로입니다. |
| GHSA | GHSA-6wmf-4rv5-p3rp |
참고 : 오류 숨김 설정만으로는 차단되지 않음
|
3. 영향 범위 및 패치 버전
3-1. 영향받는 버전 및 패치 버전
※ 두 취약점(CVE-2026-109618, CVE-2026-109619)의 영향 버전과 해결 버전은 동일합니다. (PHP 공식 기준)
| PHP 브랜치 | 영향을 받는 버전 | 해결 버전 | 비고 |
| PHP 8.5 | 8.5.12 미만 | 8.5.12 이상 | 현재 안정 버전 |
| PHP 8.4 | 8.4.27 미만 | 8.4.27 이상 | - |
| PHP 8.3 | 8.3.36 미만 | 8.3.36 이상 | - |
| PHP 8.2 | 8.2.35 미만 | 8.2.35 이상 | 2026-12-31 지원 종료 |
| PHP 8.1 이하 | 지원 종료(EOL) | 지원 버전으로 업그레이드 | 백포트 또는 상위 버전 |
3-2. 실행 환경(SAPI)별 위험도
※ SAPI(Server API)는 PHP가 웹서버와 연동되어 요청을 처리하는 방식을 의미합니다.
| 실행 환경 | 위험도 | 설명 |
| Apache mod_php | 가장 높음 | 애플리케이션 코드 실행 이전 단계에서 영향을 받음(원격 코드 실행 확인) |
| FrankenPHP | 높음 | mod_php와 유사한 구조로 영향을 받을 가능성이 있음 |
| PHP-FPM | 높음 | 정상 시작 이후 일부 경로에서 영향 확인(세션 관련 원격 코드 실행 확인) |
| LiteSpeed(LSAPI) | 중간 | FPM 유사, 애플리케이션별 공격 가능 |
| php-cgi | 해당 | 웹 요청 처리 환경으로 영향 범위 포함 |
※ 유출된 공격 도구는 PHP 5.4 이후 전 버전에서 동작한다고 주장하므로, 보유한 모든 PHP 설치를 점검 대상으로 봅니다.
4. 업데이트 방법
환경에 맞는 방법으로 업데이트한 뒤, 반드시 모든 PHP 워커를 재시작해야 패치가 적용됩니다.
4-1. 경로별 업데이트 방법
| 구분 | 방법 |
| 배포판 패키지(권장) | 벤더가 사전에 패치를 받았으므로 패키지로 갱신합니다. (apt upgrade / dnf update / yum update) |
| 공식 소스 및 바이너리 | php.net에서 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 이상 소스나 바이너리를 받아 교체합니다. |
| EOL(8.1 이하) | 지원 버전으로 업그레이드하는 것이 원칙이나, 불가 시 벤더 백포트 또는 PHP 보안팀 7.4/8.0/8.1 백포트로 빌드합니다. |
| remirepo 사용자 | 당일 업데이트가 제공되지 않으므로, 배포판 패키지나 소스 빌드로 전환을 권고합니다. |
4-2. 업데이트 순서
| 단계 | 작업 내용 |
| 1. 현황 파악 | php -v / php-fpm -v로 웹에서 동작하는 버전과 실행 환경을 전수 조사 |
| 2. 백업 | 현재 PHP 패키지와 설정 백업, 개발/스테이징에서 먼저 적용해 영향 확인 |
| 3. 패치 적용 | 8.5.12/8.4.27/8.3.36/8.2.35 이상으로 업데이트, 확장 모듈 호환성 확인 |
| 4. 워커 재시작 | FPM: systemctl restart php-fpm / mod_php: apache, httpd 재시작 (재시작하지 않으면 패치가 적용되지 않음) |
| 5. 검증 | php -v로 버전 확인, 주요 기능과 가용성 점검, 로그 모니터링 |
5. 임시 완화 조치
완화책은 완전한 해결이 아닙니다. PHP 공식 권고는 업데이트가 가장 확실한 해결책임을 안내하고 있습니다. 아래는 즉시 업데이트가 어려울 때의 임시 수단이며, 이후 업데이트로 마무리하는 것이 바람직합니다. |
5-1. CVE-2026-109618 (OOM) 완화
- 메모리 제한 해제 : memory_limit=-1을 애플리케이션이 덮어쓸 수 없게 강제 설정(php_admin_value)하고 전 워커 재시작
- 요청 크기 축소 : post_max_size를 보수적으로 설정(업로드 불필요 시 8M, 필요 시 32M), upload_max_filesize는 더 작게
- 프론트 제한 : 웹서버, 프록시에서 요청 크기, 필드 수, 헤더 수, 중첩 깊이 제한, multipart 미사용 시 차단
- 금지 : RLIMIT_AS, RLIMIT_DATA는 오히려 문제 경로를 유발할 수 있어 사용하지 않습니다
5-2. CVE-2026-109619 (전역 상태) 완화
- 세션 기능 차단 : session.upload_progress.enabled=0 설정(php.ini, FPM pool) 후 전 워커 재시작. ini_set(), .user.ini 불가
- 8.5 추가 설정 : PHP 8.5는 fatal_error_backtraces=0 설정 후 전 워커 재시작
- 오류 경로 제거 : 요청별(.htaccess 등) 잘못되거나 deprecated된 설정 제거, 공격자가 유발 가능한 Fatal error, 시간초과 제거
6. 점검 및 사고 대응
6-1. 점검 항목
| 구분 | 점검 내용 |
| 자산 식별 | 모든 PHP 호스트의 버전, 실행 환경(SAPI) 전수 파악, 외부 노출, mod_php 우선 |
| 로그 점검 | 대상 스크립트 실행 전 반복되는 경고, Fatal 오류, ‘Maximum execution time exceeded’ 반복 여부 |
| 비정상 요청 | Content-Length 없는 multipart, 과도한 헤더, part, 중첩 필드를 가진 요청 |
| 웹셸 점검 | 웹 루트, 업로드 경로의 비인가 PHP 파일, 예약작업(cron), 비정상 프로세스, 외부 연결 |
※ 로그에 기록이 없다는 것이 안전을 보장하지는 않습니다. 구성과 애플리케이션 흐름 점검을 병행합니다.
6-2. 침해 시 대응
- 격리 및 보존 : 이상 징후가 있는 서버는 네트워크에서 분리하고, 로그와 변경 이력, 생성 파일을 증거로 보존합니다.
- 자격정보 교체 : 서버에서 접근 가능했던 DB 접속정보, API 키, 인증서는 유출 가능성을 전제로 교체합니다.
- 재발 방지 : 패치 후에도 일정 기간 이상 요청, 신규 파일 생성, 비정상 로그인을 모니터링합니다.
※ 운영 시스템에 직접 공격 코드를 시험하지 마십시오. 재현과 검증은 분리된 환경에서 수행합니다.
7. 타임라인 및 참고 자료
7-1. 주요 경과
| 일시(UTC) | 내용 |
| 10-20 | PHP RCE 2건 관련 정보가 패치 공개 전 외부에 먼저 알려짐 |
| 10-20 | PHP 보안팀, 10/21 14:00 UTC 긴급 보안 릴리스 예고 (CVSS 9.2) |
| 10-21 | 관련 공격 시도 보고, 일부 CDN 사업자가 WAF 규칙 배포 |
| 10-21 14:00 | PHP 8.5.12/8.4.27/8.3.36/8.2.35 패치 공개 (한국시간 23:00) |
※ 한국시간(KST)은 UTC+9입니다. 세부 시각은 출처에 따라 차이가 있을 수 있습니다.
7-2. 참고 자료
[1] PHP 공식 보안 권고
[2] GitHub Security Advisory (CVE-2026-109618)
[3] GitHub Security Advisory (CVE-2026-109619)
※ 본 보고서는 PHP 공식 보안 권고 및 GitHub Security Advisory를 기반으로 작성되었습니다.
8. 용어 설명
보고서에 사용된 주요 약어와 전문 용어를 쉽게 풀어 정리했습니다.
8-1. 보안, 취약점 관련 용어
| 용어 | 설명 |
| RCE | Remote Code Execution. 공격자가 원격에서 서버에 임의의 코드를 실행하는 것. 이번 취약점의 핵심 위험입니다. |
| CVE | Common Vulnerabilities and Exposures. 공개된 보안 취약점에 부여하는 국제 표준 식별 번호입니다. |
| CVSS | Common Vulnerability Scoring System. 취약점의 심각도를 0~10점으로 평가하는 국제 기준. 9.0 이상은 치명적(Critical)입니다. |
| CWE | Common Weakness Enumeration. 취약점의 원인이 되는 소프트웨어 약점 유형을 분류한 체계입니다. |
| GHSA | GitHub Security Advisory. GitHub가 운영하는 보안 권고 체계로, 취약점의 상세 내용을 공개합니다. |
| Use-After-Free | 이미 해제(반환)된 메모리를 다시 참조하면서 발생하는 오류. 이번 두 취약점의 공통 원인입니다. |
| WAF | Web Application Firewall. 웹 애플리케이션을 겨냥한 공격 요청을 걸러내는 보안 장비나 서비스입니다. |
| CDN | Content Delivery Network. 여러 지역에 분산된 서버로 웹 콘텐츠를 빠르게 전달하는 서비스. WAF 같은 보안 기능을 함께 제공하기도 합니다. |
| AI | Artificial Intelligence(인공지능). 본문의 프런티어 AI 모델은 현재 가장 앞선 성능을 가진 대규모 AI 모델을 말합니다. |
8-2. PHP, 서버 환경 용어
| 용어 | 설명 |
| PHP | PHP: Hypertext Preprocessor. 웹사이트 개발에 널리 쓰이는 서버 측 프로그래밍 언어입니다. |
| SAPI | Server API. PHP가 웹서버와 연동되어 요청을 처리하는 방식을 말합니다. (mod_php, FPM 등) |
| mod_php | Apache 웹서버에 PHP를 모듈 형태로 포함해 실행하는 방식. 이번 취약점에서 위험도가 가장 높은 환경입니다. |
| FPM (PHP-FPM) | FastCGI Process Manager. PHP 요청을 처리하는 프로세스(워커)를 별도로 두고 관리하는 실행 방식. 본문의 FPM과 PHP-FPM은 같은 의미입니다. |
| php-cgi, FrankenPHP, LiteSpeed | PHP를 웹에서 실행하는 그 밖의 방식과 서버들입니다. |
| LSAPI | LiteSpeed Server API. LiteSpeed 웹서버가 PHP와 연동하는 전용 방식입니다. |
| 워커(Worker) | 요청을 처리하는 PHP 실행 단위(프로세스). 패치 후 재시작이 필요합니다. |
| EOL | End of Life. 공식 보안 지원이 종료된 상태. PHP 8.1 이하가 해당합니다. |
| LTS | Long-Term Support. 장기 지원을 제공하는 배포판이나 공급업체를 말합니다. |
| 백포트(Backport) | 최신 버전의 보안 수정 사항을 지원이 종료된 이전 버전에 옮겨 적용하는 것입니다. |
| remirepo | 자원봉사자가 운영하는 PHP 패키지 저장소(rpms.remirepo.net)입니다. |
8-3. 설정, 기타 용어
| 용어 | 설명 |
| HTTP | HyperText Transfer Protocol. 웹 브라우저와 웹서버가 데이터를 주고받는 통신 규약입니다. |
| API | Application Programming Interface. 프로그램 간 연결 규격이며, API 키는 이 연결에 쓰는 인증 정보입니다. |
| DB | Database. 데이터를 체계적으로 저장하고 관리하는 시스템입니다. |
| OOM | Out Of Memory. 메모리 부족 상태. CVE-2026-109618의 공격 조건과 관련됩니다. |
| multipart | multipart/form-data. 파일 업로드에 쓰이는 HTTP 요청 형식입니다. |
| memory_limit, post_max_size | PHP 설정값으로, 각각 요청당 사용 가능한 메모리 한도와 전송 가능한 요청 크기 한도입니다. |
| session.upload_progress | 업로드 진행 상황을 세션에 기록하는 PHP 기능. CVE-2026-109619의 공격 경로입니다. |
| .htaccess | Apache에서 디렉터리 단위로 설정을 적용하는 파일입니다. |
| RLIMIT_AS, RLIMIT_DATA | 운영체제의 프로세스 메모리 제한 설정(Resource Limit). 이번 취약점에서는 사용하지 않도록 권고됩니다. |
| UTC, KST | UTC는 협정 세계시, KST는 한국 표준시(UTC+9)입니다. |