PHP2Shell 정리: AI가 찾은 PHP 원격 코드 실행 취약점과 패치 방법

PHP2Shell은 PHP 런타임에서 발견된 치명적 취약점 두 개, CVE-2026-109618과 CVE-2026-109619를 함께 부르는 이름입니다. 로그인하지 않은 공격자도 웹 서버에서 코드를 실행할 수 있습니다. PHP 프로젝트는 2026년 10월 21일 PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35를 내놓아 이를 고쳤습니다. Calif, Wiz, OpenAI 연구진이 공격 경로를 찾아냈고 상당 부분은 AI 모델이 거들었습니다. 일부는 OpenAI의 'Patch the Planet' 프로그램 안에서 이뤄졌습니다. Amazon은 이 취약점이 이미 "광범위하게 악용되고 있다"고 밝혔습니다. 웹 서버에서 PHP를 쓰고 있다면 오늘 바로 업데이트해야 합니다.
취약점은 PHP 자체의 메모리 관리와 오류 처리에 있습니다. 특정 프레임워크와 상관이 없어서 WordPress, Drupal, Laravel, 직접 만든 앱이 모두 똑같이 노출됩니다. Tenable이 인용한 W3Techs 자료를 보면 서버 측 언어가 확인되는 웹사이트의 약 69%가 PHP를 씁니다.
핵심 요약
- PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 중 하나로 올리세요. 공식 보안 공지는 업데이트만이 완전한 해결책이라고 적고 있습니다. PHP 8.1 이하는 최소한의 소스 백포트만 제공됩니다.
- 웹 요청을 처리하는 모든 PHP 환경이 대상입니다. PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed가 모두 포함됩니다. 그중 mod_php가 가장 위험합니다. 인증 없는 요청 하나로 애플리케이션 코드가 돌기도 전에 공격이 시작될 수 있습니다.
- Calif는 취약한 코드 경로가 2012년에 나온 PHP 5.4.0까지 거슬러 올라간다고 봅니다.
- 익스플로잇 개발의 상당 부분을 AI가 맡았습니다. Wiz는 자체 보안 에이전트 Wiz Atlas에 Gemini 4 Argon과 GPT-5.6 Sol을 붙여 썼습니다. OpenAI와 언론 보도에 따르면 Calif는 GPT-5.6 Sol을 썼습니다.
- 엠바고는 지켜지지 않았습니다. Amazon은 공개 나흘 전인 10월 17일에 공격 시도를 포착했고 Cloudflare도 패치가 나오기 전에 공격 트래픽을 확인했습니다.
CVE-2026-109618과 CVE-2026-109619는 어떤 취약점인가
PHP는 요청을 처리하는 동안 내부 상태를 들고 있습니다. 두 취약점 모두 조작된 요청으로 이 상태를 망가뜨리고 이를 코드 실행으로 이어 가는 방식입니다.
| CVE-2026-109618 | CVE-2026-109619 | |
|---|---|---|
| 공지 제목 | OOM 손상을 통한 RCE | 남아 있는 전역 상태를 통한 RCE |
| GitHub 공지 | GHSA-w8hw-w9fx-j79w | GHSA-6wmf-4rv5-p3rp |
| 원인 | 메모리 부족(OOM) 처리 도중 요청 데이터가 반쯤 초기화된 채 중단되고 정리 단계가 이 데이터를 정상으로 취급 | 치명적 오류 뒤에도 전역 상태가 이미 해제된 메모리를 가리키고 같은 워커의 다음 요청이 이를 사용(use-after-free) |
| 발생 방식 | 조작한 multipart 업로드로 post_max_size 안에서 메모리를 한계까지 끌어올림 | 한 요청이 상태를 심고 같은 워커의 다음 요청이 이를 사용. 기본으로 켜져 있는 세션 업로드 진행률 기능으로 재현됨 |
| 심각도(PHP 기준) | CVSS v4.0 9.2 | CVSS v4.0 9.2 |
| 확인된 RCE | Apache mod_php, 앱 코드 실행 전 | Apache mod_php. 세션 업로드 경로는 PHP-FPM에서도 검증됨 |
RCE는 원격 코드 실행을 뜻합니다. 공격자의 코드가 웹 서버 권한으로 돌기 때문에 보통 사이트 파일과 DB 접속 정보는 물론 그 계정이 닿는 모든 곳까지 손이 갑니다. GitHub 공지를 보면 두 번째 취약점으로는 비밀번호나 토큰 같은 메모리 내용이 새어 나갈 수도 있습니다.
심각도 점수는 평가 주체마다 다릅니다. PHP는 두 취약점 모두 CVSS v4.0 9.2로 평가했습니다. PHP Foundation은 공개 전에 돌던 10.0이 잘못된 값이라고 설명했습니다. Red Hat은 보안 공지에서 'Important' 등급을 매겼습니다. RHEL이 기본으로 쓰는 PHP-FPM 환경에서는 공격이 "실제로는 어렵다"고 봤기 때문입니다.
AI는 PHP2Shell을 어떻게 찾았나
근본 원인은 예전부터 있었습니다. PHP Foundation에 따르면 2024년 Quarkslab 감사(OSTIF가 조직하고 독일 Sovereign Tech Agency가 자금 지원)에서 나온 다른 문제를 고치던 코어 개발자가 메모리 부족 문제의 첫 징후를 발견했습니다. 하지만 구체적인 공격 방법을 찾은 사람이 없었고 수정안마다 다른 곳을 깨뜨리는 바람에 작업이 멈췄습니다. Foundation은 이 지연을 "보안팀의 의사결정 방식과 자원 부족이 함께 만든 구조적 실패"라고 인정했습니다.
AI가 들어오자 몇 주 만에 실제 공격이 가능한 버그가 됐습니다. PHP Foundation, Calif, Wiz, AWS의 기록을 합친 타임라인입니다.
| 날짜(2026년, UTC) | 사건 |
|---|---|
| 연초 | Alpha-Omega가 Anthropic Claude Mythos로 PHP를 스캔 |
| 6월 22일 | OpenAI, Patch the Planet 출범 |
| 7월 30일 | Calif가 Patch the Planet의 일환으로 PHP 감사 시작 |
| 8월 1일 | Calif가 여러 RCE 경로 발견 |
| 8월 11일 | Calif와 OpenAI가 같은 근본 원인을 PHP에 보고 |
| 8월 19~21일 | Wiz가 첫 버그를 찾고 Drupal과 WordPress에서 RCE 확인 |
| 8월 24일 | Wiz가 PHP에 보고 |
| 9월 18일 | OpenAI가 추가 공격 경로 보고 |
| 10월 17일 | AWS 허니팟이 PHP2Shell 공격 시도 기록 |
| 10월 20일 15:00경 | 잘못된 공개 시각과 CVSS 점수가 붙은 채 CVE 번호가 온라인에 유출 |
| 10월 20일 19:30 | PHP가 사전 공지를 내고 공개를 하루 앞당김 |
| 10월 20일 20:00경 | Calif가 실수로 PoC 영상을 공개. 곧 삭제했지만 이미 복사본이 퍼짐 |
| 10월 21일 03:02 | Cloudflare가 무료 요금제를 포함한 전 요금제에 WAF 규칙 적용 |
| 10월 21일 07:41 | Chainguard가 수정본 이미지를 먼저 게시해 엠바고 위반 |
| 10월 21일 14:00 | 조율된 공개와 릴리스 |
Wiz는 자체 보안 에이전트인 Wiz Atlas에 Google의 Gemini 4 Argon과 GPT-5.6 Sol을 함께 썼고 "특히 Gemini 4가 익스플로잇 개발과 패치 검증에 크게 기여했다"고 밝혔습니다. Wiz는 AI 이전에는 이런 수작업을 구현하기 어렵고 규모를 키우기는 더 어려웠지만 이제 그 장벽이 사라졌다고 설명합니다. LLM이 익스플로잇을 PHP 버전, 설정, 메모리 배치에 맞춰 고쳐 주기 때문입니다. Gemini 4 Argon에 대해서는 Gemini 4 Argon 벤치마크 분석에서 자세히 다뤘습니다.
Calif의 기술 문서는 모델 이름을 밝히지 않고 일반에 공개된 모델과 'audit buddy' 에이전트를 썼다고만 적었습니다. GPT-5.6 Sol이라는 이야기는 OpenAI와 TechCrunch에서 나왔습니다. Calif는 WordPress, Drupal, Joomla, MediaWiki, Magento, Nextcloud, Laravel 등을 상대로 인증 없는 공격을 시연했습니다. 그러면서도 "간단한 프롬프트만으로 '모든 버그'를 찾아내는 모델은 없다"고 선을 그었습니다.
AI가 만든 보고서도 홍수처럼 밀려듭니다. PHP 보안팀은 7월 1일 이후 CVE 15건을 공개했고 무효이거나 중복이거나 재현되지 않는 보고를 100건 넘게 처리했습니다. Foundation은 OpenAI의 Daybreak Red로 보고와 익스플로잇을 검증하지만 모든 결정과 패치 작성은 사람이 한다고 설명했습니다.
OpenAI의 Patch the Planet이란
Patch the Planet은 OpenAI 프로그램입니다. AI 모델로 널리 쓰이는 오픈소스 프로젝트의 취약점을 찾아 고칩니다. 2026년 6월 22일 OpenAI의 보안 사업 Daybreak 아래에서 Trail of Bits와 함께 시작했습니다. SiliconANGLE은 출범 당시 cURL, Go, Python을 포함한 30개 이상 프로젝트가 참여하고 모든 발견 사항은 메인테이너에게 전달되기 전에 사람 보안 엔지니어가 검토한다고 보도했습니다.
OpenAI는 10월 21일 'Patch the Planet: global response coordination as agents uncover vulnerabilities'라는 글을 냈습니다. 이 글에서 OpenAI는 메인테이너, 연구자, 보안 업체가 모인 연합을 두 달간 이끌며 수정을 준비했다고 적었습니다. 이번 PHP 사례는 '방어자의 창(Defender's Window)', 즉 공격자가 악용하기 전에 방어자가 패치할 수 있는 시간의 예로 들었습니다. PPC Land와 Gizmodo에 따르면 OpenAI는 필수 서비스를 지키지만 자원이 부족한 조직에 10억 달러 규모의 Daybreak 이용권을 지원하기로 했습니다. 현금 대신 도구 이용권으로 주는 방식입니다.
AI가 공격자보다 먼저 찾았다는 OpenAI의 주장은 앞서 본 AWS와 Cloudflare의 관측과 맞지 않습니다. PHP Foundation은 공개 시점에 작동하는 익스플로잇을 알지 못했다고만 밝혔습니다.
OpenAI는 Codex 스킬 묶음인 openai/php2shell-checker도 공개했습니다. HTTP 헤더나 php -v로 PHP 버전을 확인해 OK, VULNERABLE, UNKNOWN 중 하나를 알려 줍니다. 침해 흔적을 찾는 도구는 아닙니다. README는 "UNKNOWN이 패치됐다는 뜻은 아니다"라고 경고합니다.
영향받는 버전과 수정 버전
| 브랜치 | 수정 | 참고 |
|---|---|---|
| PHP 8.5 | 8.5.12 | 당장 패치가 어렵다면 fatal_error_backtraces=0도 설정 |
| PHP 8.4 | 8.4.27 | |
| PHP 8.3 | 8.3.36 | |
| PHP 8.2 | 8.2.35 | 2026년 12월 31일 지원 종료 |
| PHP 7.4, 8.0, 8.1 | 소스 백포트만 | 공식 바이너리 없음. 배포판이나 LTS 벤더에 확인 |
| PHP 5.4~7.3 | PHP 측 수정 없음 | 업그레이드하거나 Ubuntu Pro 같은 벤더 지원 활용 |
배포판 패키지는 자체 버전 번호를 쓰기 때문에 업스트림 번호만 보고 판단하면 안 됩니다. Ubuntu CVE 페이지를 보면 Ubuntu 24.04의 수정 패키지는 8.3.6-0ubuntu0.24.04.13입니다. 보안 트래커를 보면 Debian은 bookworm과 trixie용 수정을 내놓았습니다. 공지는 자원봉사로 운영되는 rpms.remirepo.net 저장소에는 공개 당일 업데이트가 없을 것이라고도 알렸습니다.
지금 해야 할 일
- 웹 트래픽을 처리하는 PHP 런타임을 모두 찾으세요.
php -v는 CLI 버전만 보여 줍니다. FPM이나 Apache는 다른 바이너리를 쓸 수 있습니다.phpinfo()나 패키지 관리자로 확인하고 컨테이너와 CI 이미지, 관리형 호스팅도 빠뜨리지 마세요. - 수정 버전이나 배포판 패키지로 업데이트한 뒤 PHP-FPM 풀, Apache, 오래 떠 있는 워커를 재시작하세요.
- 관리형 호스팅이라면 PHP 런타임 패치 여부를 업체에 확인하세요. Cloudflare 공지도 "웹사이트 코드나 플러그인을 업데이트하는 것만으로는 해결되지 않는다"고 강조합니다.
- 로그는 공개일이 아니라 10월 17일부터 살펴보세요. AWS는
PHP_SESSION_UPLOAD_PROGRESS가 들어간 POST 요청을 로그에서 찾고 서버에서 예상치 못한 프로세스 실행이나 파일 변경이 있었는지 점검하라고 권합니다. Wiz는 비정상적으로 크거나 깨진PHPSESSID쿠키, multipart 요청 직후 반복되는 메모리 한도 오류나 HTTP 500을 경고 신호로 꼽습니다. - 패치할 수 없을 때를 두고 영국 NCSC는 "완전히 조치할 수 있을 때까지 시스템을 오프라인으로 전환하는 것을 고려하라"고 권고합니다. TechCrunch 보도로는 미국 NSA도 비슷하게 권고했습니다.
당장 패치할 수 없을 때의 임시 조치
PHP 공지는 아래 설정이 "특정 공격 경로의 노출을 줄일 뿐 설치를 안전하게 만들지는 않는다"고 분명히 적어 두었습니다.
- CVE-2026-109618: 앱이 덮어쓸 수 없는 방식(FPM 풀이나 Apache 설정의
php_admin_value등)으로memory_limit=-1을 설정하세요.post_max_size는 낮게(업로드가 없으면 8M, 필요하면 32M) 유지하고upload_max_filesize는 그보다 작게 두세요. 메모리는 컨테이너나 cgroup 한도로 묶으세요.RLIMIT_AS나RLIMIT_DATA는 오히려 취약한 메모리 할당 실패를 일으킬 수 있으니 쓰지 마세요. - CVE-2026-109619:
session.upload_progress.enabled=0을php.ini, FPM 풀, 서버 설정 중 한 곳에 넣고 모든 워커를 재시작하세요.ini_set()이나.user.ini로는 안 됩니다. PHP 8.5라면fatal_error_backtraces=0도 설정하세요. error_reporting,display_errors,@연산자로 오류를 숨기는 것은 소용이 없습니다.
Cloudflare는 10월 21일 무료 요금제를 포함해 WAF가 있는 모든 요금제에 방어 규칙을 적용했습니다. 다만 공격자들이 이미 페이로드를 바꿔 가며 우회를 시도하고 있다고 경고했습니다. 유료 고객은 Managed Ruleset이 차단 모드로 동작하는지 확인하세요. WAF로 시간은 벌 수 있지만 업데이트를 대신하지는 못합니다.
PHP2Shell은 얼마나 심각한가
평가는 엇갈립니다. Calif와 Wiz는 인기 앱을 상대로 인증 없는 코드 실행을 시연했고 AWS와 Cloudflare는 실제 공격을 확인했습니다. 영국과 EU 당국은 패치되지 않은 시스템의 오프라인 전환을 검토하라고 권고했습니다. 반면 개발자 Elias Taylor는 이번 사태가 Log4Shell급은 아니라고 주장합니다. 공개 후 약 10시간 동안 일반 PHP 설치에서 작동하는 공개 익스플로잇이 없었고 초기 PoC 상당수는 서버에 다른 취약점이 이미 있다는 전제를 깔고 있었다고 지적합니다.
두 이야기 모두 사실일 수 있습니다. 공개된 익스플로잇 코드는 처음에 엉성했지만 AI의 도움을 받은 숙련된 팀은 몇 달 전부터 작동하는 익스플로잇을 갖고 있었습니다. PHP Foundation도 이 격차 때문에 일하는 방식을 바꾸고 있습니다. AI 보안 엔지니어(Volker Dusch)를 상주시키고 보고 처리와 보안 강화(하드닝)를 맡을 인력 두 명을 새로 들였습니다. 보안 수정은 합의제 대신 다수결로 정하고 모든 플랫폼에서 CI와 같은 새니타이저 빌드를 갖춥니다. Foundation은 이런 작업에 기업, 호스팅 업체, 클라우드, 정부가 자금을 대 달라고 요청하고 있습니다.
자주 묻는 질문
WordPress도 PHP2Shell 영향을 받나요?
PHP가 패치되지 않았다면 영향을 받습니다. 취약점이 PHP 자체에 있어서 WordPress나 플러그인을 업데이트해도 해결되지 않습니다. Calif와 Wiz 모두 WordPress를 대상으로 공격을 시연했습니다. PHP를 8.5.12, 8.4.27, 8.3.36, 8.2.35로 올리거나 호스팅 업체에 런타임 패치 여부를 확인하세요.
PHP-FPM은 CVE-2026-109618·109619에서 안전한가요?
아닙니다. PHP는 PHP-FPM을 영향 대상으로 명시했습니다. 메모리 부족 익스플로잇은 mod_php에서 확인됐지만 CVE-2026-109619의 GitHub 공지를 보면 세션 업로드 진행률 경로는 PHP-FPM에서도 검증됐습니다. Red Hat은 자사 기본 FPM 구성에서 공격이 더 어렵다고 봤을 뿐, 불가능하다고 하지는 않았습니다.
PHP2Shell은 실제로 악용되고 있나요?
그렇습니다. AWS는 공개 나흘 전인 2026년 10월 17일에 공격 시도를 기록했고 지금은 광범위하게 악용되고 있다고 밝혔습니다. Cloudflare도 고객을 노린 공격 트래픽을 보고했습니다. 10월 17일 이후 로그를 점검하세요.
PHP2Shell은 누가 발견했나요?
첫 징후는 2024년 Quarkslab 감사 중에 PHP 코어 개발자가 발견했습니다. 2026년에는 OpenAI Patch the Planet에 참여한 Calif, OpenAI Codex Security 팀, Wiz Research가 AI의 도움을 받아 실제 공격 경로를 보고했습니다. PHP Foundation, Calif, Wiz가 밝힌 내용입니다.
PHP 8.1이나 7.4에서 업그레이드할 수 없다면요?
PHP는 이 브랜치들의 새 릴리스를 더 이상 내지 않습니다. 보안팀이 7.4, 8.0, 8.1용 최소 소스 백포트를 공개했고 Debian이나 Ubuntu 같은 배포판은 자체 패키지에 수정을 백포트합니다. 그동안 공지의 임시 조치를 적용하고 지원되는 브랜치로 옮길 계획을 세우세요.
출처
- PHP: Security release and pre-announcement, October 2026 (php.net 뉴스 아카이브)
- PHP Foundation: Today's PHP security release, and how we're strengthening PHP security
- GitHub 보안 공지 GHSA-w8hw-w9fx-j79w (CVE-2026-109618)
- GitHub 보안 공지 GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)
- Calif: PHP2Shell
- Wiz Research: PHP2Shell
- AWS Security Blog: PHP2Shell exploitation prior to public disclosure
- Cloudflare: WAF protection for the PHP vulnerabilities
- UK NCSC: Critical security issue affecting PHP
- Red Hat: RHSB-2026-013
- Ubuntu: CVE-2026-109618
- Debian 보안 트래커: CVE-2026-109618
- GitHub: openai/php2shell-checker
- OpenAI: Patch the Planet: global response coordination as agents uncover vulnerabilities
- SiliconANGLE: OpenAI expands Daybreak with Patch the Planet
- TechCrunch: OpenAI, Google's Wiz find ancient PHP holes
- Tenable: PHP2Shell FAQ
- PPC Land: OpenAI says GPT-5.6 Sol found a PHP flaw before attackers did
- Gizmodo: OpenAI wants to Patch the Planet
- Elias Taylor: There isn't an easy exploit for this PHP vulnerability