2026년 10월, PHP 보안 이슈와 보안 대책2026년 10월 PHP 생태계에서 가장 중요한 사건은 두 건의 치명적 원격 코드 실행 취약점, 이른바 PHP2Shell의 공개와 긴급 패치이다. 두 취약점은 모두 CVSS v4.0 기준 9.2점으로 평가되었으며, 인증 없이 원격에서 코드를 실행할 수 있다는 점에서 파급력이 컸다 1. PHP 프로젝트는 2026년 10월 21일 PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35을 배포하여 두 취약점을 수정하였다 2. 이후 미국 CISA는 2026년 10월 26일 두 CVE를 Known Exploited Vulnerabilities 목록에 등재하였으며, 연방 기관 패치 기한을 10월 29일로 설정하였다 3. 따라서 이 보고서의 핵심 결론은 단순하다. 지원 버전 사용자는 즉시 패치하고 워커를 재시작해야 하며, 패치만으로 끝나지 않고 침해 여부 점검과 설정 강화가 병행되어야 한다.
PHP2Shell은 PHP 코어에 존재한 두 취약점을 묶어 부르는 명칭이다. 대상은 CVE-2026-109618과 CVE-2026-109619이며, 각각 CVSS v4.0 9.2점, Critical 등급이다 1. 유럽연합 기관 공동 성명도 두 취약점이 인증 없이 원격에서 악성 코드를 실행할 수 있게 한다고 경고하였다 4. 연구는 Calif, OpenAI, Wiz가 수행하였으며, Wiz는 프론티어 AI 모델이 복잡한 익스플로잇 체인을 현실적으로 만드는 데 기여했다고 설명하였다 5.
CVE-2026-109618은 메모리 부족(OOM) 처리 중 발생하는 메모리 손상을 통한 원격 코드 실행 취약점이다 2. PHP는 설정된 memory_limit를 초과하면 longjmp()로 요청 처리를 중단하는데, 이 중단이 내부 데이터가 부분적으로만 초기화된 시점에 일어나면 정리 과정이 유효하지 않은 데이터를 유효한 것처럼 처리할 수 있다 2. 특히 multipart 업로드 파싱은 본문 크기보다 훨씬 많은 힙 메모리를 소비하게 만들 수 있으며, 중첩된 빈 파일 필드가 여러 메타데이터 트리를 만들게 한다는 분석이 있다 6.
CVE-2026-109619는 오래된 전역 상태를 통한 원격 코드 실행 취약점이다 2. 요청이 소유한 내부 상태가 메모리가 해제된 뒤에도 남아 있고, 같은 워커가 처리하는 이후 요청이 정상 초기화가 이를 재설정하기 전에 그 오래된 상태를 사용할 수 있다 2. 확인된 초기 경로에는 세션 업로드 진행(session upload progress) 처리와 특정 초기화 진단이 포함되며, PHP 8.5에서는 치명적 오류 백트레이스 경로도 확인되었다 6.
PHP는 웹 요청을 처리하는 모든 설치가 위험 대상이라고 밝혔으며, PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed를 명시하였다 2. 그중 mod_php가 가장 위험도가 높은 설정으로 평가되었는데, 이는 인증되지 않은 요청이 애플리케이션 코드 실행 전에 입증된 경로를 유발할 수 있기 때문이다 2. 다만 다른 SAPI가 안전하다는 의미는 아니며, FPM에 대해서도 오래된 상태 경로를 통한 RCE가 확인되었다 6.
Wiz는 WordPress, Drupal, Joomla의 최신 컨테이너 이미지에서 인증 없는 원격 코드 실행을 시연하였으며, 취약점은 애플리케이션 코드가 아니라 PHP 자체에 있다고 강조하였다 5. 또한 Wiz는 단순한 Hello World 애플리케이션도 취약할 수 있다고 밝혔고, 코드 실행 없이도 PHP 워커 메모리에서 비밀번호, 토큰, API 키 같은 민감 데이터를 읽을 수 있음을 시연하였다 5. Wiz는 최소 하나의 취약점이 PHP 5.4까지 거슬러 올라가는 모든 버전에 영향을 미친다고 밝혔다 5.
PHP 보안팀은 2026년 10월 20일 사전 공지를 하였고, 10월 21일 패치를 배포하였다 2. 원래 일정보다 하루 앞당겨진 배경에는 정보 유출이 있었다. Dark Reading 보도에 따르면 PHP는 당초 10월 22일 공개를 예정하였으나, embargo가 깨지면서 PoC 도구와 재현 주장이 등장하였다 7. 유출은 방어자에게는 준비 시간을 앞당기는 효과가 있었지만, 공격자에게도 조기 경고를 제공하였다는 평가가 함께 제시되었다 7.
공개 직후부터 공격 시도가 관측되었다. Hack The Box 정리에서는 Patchstack의 호스팅 파트너들이 10월 21일 실제 악용 사건을 보고하였고, Cloudflare도 공격 트래픽과 방어 우회용 변형 페이로드를 보고하였다고 전한다 6. 다만 같은 정리에서는 당시까지 검증된 성공적 침해가 확립되지 않았다는 점도 함께 구분하였다 6. 이후 CISA는 2026년 10월 26일 두 CVE를 KEV에 추가하였고, 연방 기한은 10월 29일이었다 3. KEV 등재는 실제 악용 증거가 있다는 취지의 신호로 해석되며, 패치 지연의 위험을 크게 높인다.
2026년 10월 23일 PHP는 CVE-2026-115560에 대한 정보성 권고를 발표하였다. 이 벡터는 10월 21일 긴급 릴리스로 수정되지 않았으며, PHP는 이를 흔하지 않은 RCE 벡터로 설명하였다 2. 발생 조건은 세 가지가 동시에 충족되어야 한다. session.serialize_handler가 설정에서 php_binary 또는 php_serialize로 되어 있고, 애플리케이션이 session_start() 전에 ini_set()으로 이를 php로 바꾸며, 세션 업로드 진행이 켜져 있어야 한다 8. PHP가 제시한 완전한 보호 조치는 session.upload_progress.enabled=0으로 설정하고 모든 워커를 재시작하는 것이다 8. 따라서 10월 21일 패치를 적용했다고 해서 세션 관련 위험이 완전히 끝났다고 단정해서는 안 된다.
PHP2Shell만을 보면 PHP 보안이 갑자기 악화된 것처럼 보일 수 있으나, 최근 2년의 흐름은 런타임 메모리 안전성과 확장 기능, 오래된 실행 방식이 반복적으로 문제 되었다는 점이다.
시기 및 식별자 | 유형 | 핵심 내용 |
|---|---|---|
2024년, CVE-2024-4577 | PHP-CGI 인자 주입, CVSS 9.8 | Windows에서 PHP-CGI를 사용할 때 특정 코드 페이지의 Best-Fit 변환 때문에 공격자가 PHP 옵션으로 해석되는 입력을 전달할 수 있었다 9. 패치는 PHP 8.3.8, 8.2.20, 8.1.29에서 제공되었다 9. |
2025년 7월, CVE-2025-1735 | pgsql 확장 오류 검사 누락 | PostgreSQL 확장 이스케이프 과정에서 오류 검사가 빠져 SQL 인젝션과 충돌 위험이 있었다 10. 수정 버전은 8.1.33, 8.2.29, 8.3.23, 8.4.10 이전 버전이 대상이었다 10. |
2025년 7월, CVE-2025-6491 | SOAP NULL 포인터 역참조 | SOAP 관련 NULL 포인터 역참조로 서비스 거부 위험이 제기되었다 10. |
2025년 7월, CVE-2025-1220 | SSRF 관련 | SUSE 보안 공지에 따르면 CVE-2025-1220, CVE-2025-1735, CVE-2025-6491이 함께 수정되었으며, CVE-2025-1220은 호스트명의 null 바이트 종료와 관련되었다 11. |
2026년 7월 30일, CVE-2026-17543 | PostgreSQL 확장 SQL 인젝션 |
|
2026년 7월 30일, CVE-2026-17544 | BCMath 경계 밖 쓰기 |
|
2026년 7월 30일, CVE-2026-7260 | Phar 스택 오버플로 | Phar가 원형 심볼릭 링크를 깊이 제한 없이 따라가며 재귀가 무한히 이어져 스택이 고갈될 수 있었다 12. |
이 표가 주는 교훈은 명확하다. PHP 보안 이슈는 특정 프레임워크의 버그가 아니라, 런타임과 확장, 설정 조합에서 반복적으로 발생한다. 따라서 프레임워크 업데이트만으로는 충분하지 않으며, PHP 자체와 배포 패키지를 함께 관리해야 한다.
2026년 11월 기준 PHP 프로젝트가 지원하는 분기는 8.2, 8.3, 8.4, 8.5이다 13. 보안 지원 종료일은 8.2가 2026년 12월 31일, 8.3이 2027년 12월 31일, 8.4가 2028년 12월 31일, 8.5가 2029년 12월 31일이다 13. 특히 8.2는 보고서 작성 시점으로부터 약 7주 뒤에 보안 지원이 종료되므로, 8.2.35로 패치했더라도 이후에는 별도 LTS나 업그레이드 계획이 필요하다. 8.1 이하는 이미 공식 보안 업데이트 대상이 아니며, PHP2Shell 대응에서도 정상 릴리스가 아니라 제한적 소스 백포트만 제공되었다 2.
가장 완전한 수정은 PHP를 8.5.12, 8.4.27, 8.3.36, 8.2.35 중 해당 분기로 업데이트하는 것이다 2. 배포 패키지를 사용한다면 배포판 백포트가 포함된 패키지를 확인해야 하며, 버전 배너만으로는 백포트 여부를 알 수 없다는 점을 Hack The Box 정리도 강조하였다 6. 패치 후에는 PHP 워커를 반드시 재시작하거나 교체해야 하며, FPM 풀, Apache, 컨테이너, Supervisor 등 PHP를 로드하는 모든 프로세스를 대상으로 해야 한다.
CERT-EU는 패치가 불가능할 경우 인터넷에 노출된 애플리케이션을 공개 네트워크에서 격리하는 방안을 권고하였다 2. 임시 완화는 완전한 수정이 아니라는 전제가 중요하다.
대상 CVE | 임시 완화 | 한계 |
|---|---|---|
CVE-2026-109618 |
| 근본적인 할당 실패 경로는 남을 수 있으며, 제한 없는 할당은 가용성 위험을 높인다 2. |
CVE-2026-109618 |
| 우회 가능성을 완전히 제거하지 못한다. |
CVE-2026-109619 | 요청 파싱 전에 적용되는 | 확인된 세션 경로는 차단하지만 다른 변형까지 막지 못한다 2. |
CVE-2026-109619, PHP 8.5 |
| 확인된 치명적 백트레이스 경로만 차단한다 2. |
CVE-2026-115560 |
| 다음 정규 버그픽스 릴리스까지 유지해야 한다. |
또한 RLIMIT_AS나 RLIMIT_DATA를 사용하면 취약한 할당 실패를 유발할 수 있으므로, 가용성 경계로는 컨테이너나 cgroup 메모리 제한을 사용하고 가능하면 해당 워커만 종료하는 정책을 적용하라는 권고가 있다 2.
패치만 하고 끝내서는 안 된다. 공개 전부터 악용 시도가 보고되었기 때문에, 패치 전에 이미 침해가 발생했을 가능성을 검토해야 한다. 점검 대상은 다음과 같다.
2026년 10월 17일 이후 로그를 우선 검토하고, 보관된 로그가 허용하면 더 앞선 기간도 확인한다. PHP2Shell 관련 탐지 정리에서는 10월 17일 이후 텔레메트리 검토를 권고하였다 14.
비정상적인 multipart POST, PHP_SESSION_UPLOAD_PROGRESS 필드 조합, 비정상적인 요청 크기나 버스트, 메모리 제한 오류 뒤의 HTTP 500 반복을 찾는다 15.
비정상적으로 크거나 손상된 PHPSESSID 응답 쿠키, 설명되지 않는 PHP 워커 churn을 확인한다. Wiz도 같은 신호를 제시하였다 5.
업로드, 캐시, 임시, 테마·플러그인 폴더에 새로 생기거나 변경된 .php, .phtml, .phar 파일이 있는지 확인한다. 클라우드 컨설팅 정리도 이 경로를 점검 대상으로 제시하였다 3.
웹 서버 워커가 셸, 인터프리터, 다운로드 도구를 실행하는지, 의심스러운 아웃바운드 연결이 있는지 확인한다. K7 Labs 권고도 같은 프로세스 기반 지표를 제시하였다 16.
웹셸이 의심되면 해당 파일을 삭제하는 것만으로 충분하지 않다. 자격 증명, API 키, 세션 비밀값 교체와 함께 전체 침해 범위 조사가 필요하다. Wiz가 메모리 노출로 비밀번호와 토큰, API 키가 유출될 수 있다고 밝힌 점도 이 판단의 근거이다 5.
런타임 강화는 PHP2Shell 같은 런타임 취약점을 직접 막지 못하지만, 애플리케이션 침해 이후의 파급을 줄인다. 핵심은 애플리케이션 코드가 ini_set()으로 덮어쓰지 못하도록 php_admin_value와 php_admin_flag로 강제하는 것이다. Stack Harbor 런타임 강화 가이드는 php.ini 설정은 ini_set()으로 우회될 수 있지만 php_admin_*는 애플리케이션 코드에서 변경할 수 없다고 설명한다 17.
설정 | 권고 | 이유 |
|---|---|---|
|
| 엔진 수준에서 함수 테이블에서 제거되어 애플리케이션 코드가 호출할 수 없게 된다 17. |
| 앱 디렉터리, | 파일 접근 범위를 제한하지만, 심볼릭 링크 우회와 일부 확장 우회 가능성을 고려해야 한다 17. |
|
| 원격 파일 포함(RFI) 경로를 줄인다 17. |
| Off 17 |
|
세션 |
| 세션 고정과 쿠키 탈취 위험을 줄인다 17. |
리소스 제한 |
| 과도한 업로드와 장시간 실행으로 인한 DoS 및 악용 여지를 줄인다. |
SQL 인젝션 방지에는 PDO 또는 MySQLi의 프리페어드 스테이트먼트를 사용하고, SQL 코드와 사용자 데이터를 분리한다. 2026년 가이드도 같은 방식을 제시하였다 19.
비밀번호는 평문이 아니라 password_hash()로 저장하고, Argon2id를 사용하는 것이 2026년 기준 권고이다 19.
출력 인코딩에는 htmlspecialchars()를 사용하고, 컨텍스트에 맞는 인코딩을 적용한다.
파일 업로드는 확장자만 믿지 않고 finfo로 실제 MIME을 확인하고, 크기를 제한하며, 웹 루트 밖에 저장하고, 실행 불가능한 방식으로 서빙한다. 업로드 가이드는 여러 검증 층을 결합할 것을 권고하였다 20.
CSRF 토큰, 권한 검사, 세션 재생성, 보안 헤더를 기본으로 적용한다.
PHP 보안은 런타임만으로 끝나지 않는다. Composer 의존성은 별도 관리가 필요하다. composer audit는 composer.lock을 읽어 Packagist 보안 권고 데이터베이스와 비교하며, Composer 2.4부터 내장되었다 21. CI에서 composer audit를 게이트로 사용하고, 버려진 패키지도 함께 점검하는 것이 바람직하다. 2026년 5월에는 Packagist의 패키지 8개가 침해되어 악성 코드가 설치 과정에 실행되었다는 보고도 있었다 22. 따라서 의존성 업데이트를 자동화하되, 변경 내역과 권고 데이터베이스를 함께 검토해야 한다.
단계 | 확인 항목 |
|---|---|
1. 인벤토리 | 모든 서버, 컨테이너, 호스팅, 내장 PHP 제품에서 실제 동작 중인 PHP 버전과 SAPI를 확인한다. |
2. 패치 | 해당 분기의 수정 버전으로 업데이트하고, 배포판 백포트가 있는지 확인한다. |
3. 재시작 | FPM, Apache, 컨테이너 등 PHP를 로드한 모든 워커를 재시작한다. |
4. 세션 완화 |
|
5. 침해 점검 | 10월 17일 이후 로그, 웹셸 파일, 프로세스 실행, 아웃바운드 연결을 검토한다. |
6. 비밀값 교체 | 침해가 의심되면 자격 증명, API 키, 세션 비밀값을 교체한다. |
7. 강화 |
|
8. 수명 주기 | 8.2 사용자는 2026년 12월 31일 보안 지원 종료 전에 8.3 이상으로 업그레이드 계획을 확정한다. |
9. 지속 관리 |
|
최근 PHP 보안 이슈의 중심은 PHP2Shell이며, 이는 단순한 애플리케이션 버그가 아니라 PHP 런타임의 메모리 안전성 문제였다. 패치는 이미 제공되었고, CISA KEV 등재로 실제 악용 위험도 확인되었다. 그러나 패치만으로 충분하지 않다. 세션 업로드 진행과 관련된 후속 벡터, EOL 버전의 지원 종료, 의존성 공급망 위험까지 함께 관리해야 한다. 가장 현실적인 전략은 패치와 재시작을 즉시 수행하고, 침해 여부를 점검한 뒤, 런타임 강화와 애플리케이션 기본기를 지속 운영에 편입하는 것이다.
1 HackerOne — Critical PHP Vulnerabilities: What Security Teams Need to Know
2 CERT-EU — Critical Vulnerabilities in PHP
3 Cloudek — PHP2Shell: what to patch and how to check for web shells
4 European Commission — Joint statement on critical PHP vulnerabilities
5 Wiz — PHP2Shell: AI uncovers critical RCE vulnerabilities affecting 70% of the Internet
6 Hack The Box — War Room: PHP Core “PHP2Shell” RCE (CVE-2026-109618 / CVE-2026-109619)
7 Dark Reading — 'PHP2Shell' Bugs Signal Red Alert for Security Industry
8 Safeguard — PHP CVE-2026-115560: unpatched session upload progress RCE explained
9 The Trust Observatory — CVE-2024-4577 Exploitation Surges as PHP CGI Flaw Becomes Persistent Mass Campaign
10 SecurityOnline — PHP Flaws: CVE-2025-1735 (SQLi/Crash) & CVE-2025-6491 (SOAP DoS) Threaten PHP Apps
11 SUSE — Security update for php8
12 Linux Compatible — PHP 8.2.33, 8.3.33, 8.4.24, and 8.5.9 Updates: Fix 3 CVEs in Fedora and RHEL Packages
13 MIS Services — PHP End of Life: Supported Versions & Upgrade Guide
14 CS Zone — PHP2Shell Vulnerability: Critical PHP RCE Alert
15 Kaspersky — PHP2Shell: What we know about the threat two weeks later
16 K7 Labs — Security Advisory - PHP2Shell: Critical Remote Code Execution Vulnerabilities Affecting PHP Servers
17 Stack Harbor — PHP runtime security hardening: disable_functions, open_basedir, and more
19 CopyProgramming — Avoiding SQL Injection in Password Fields: PHP Best Practices for 2026
20 DEV — Secure File and Photo Upload Validation in PHP: Beyond Checking the Extension
21 Safeguard — composer audit Guide (2026): Audit PHP Composer Dependencies
22 CloudHim — PHP Supply Chain Attacks Are Rising. Here Is What Composer Actually Catches