지난달 21일 PHP 재단이 긴급 보안 패치를 배포했습니다. 인증 없이 원격에서 서버를 장악할 수 있는 취약점 두 건이었습니다. 묶어서 부르는 이름이 PHP2Shell입니다.
영향 범위는 PHP 5.4부터 8.5까지입니다. WordPress, Drupal, Joomla처럼 PHP 위에서 도는 사이트와 PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed가 모두 해당됩니다.
서버의 PHP 버전이 8.2.35, 8.3.36, 8.4.27, 8.5.12보다 낮다면 지금 올려야 합니다. 이 네 버전이 두 취약점을 고친 배포판입니다. 패치가 나온 뒤에도 버전을 올리지 않은 서버는 그대로 공격 대상입니다.
CVE-2026-109618은 메모리 부족(OOM) 처리 중 내부 요청 데이터가 일부만 초기화된 상태에서 정리 루틴이 잘못된 데이터를 유효한 것으로 받아들이는 결함입니다. CVE-2026-109619는 요청이 소유한 내부 상태가 메모리 해제 뒤에도 남아, 같은 워커가 처리하는 다음 요청이 초기화 전에 그 값을 쓰는 결함입니다.
둘 다 CVSS 9.2에 원격 코드 실행입니다. PHP 재단은 mod_php에서 위험이 가장 크다고 밝혔습니다. 애플리케이션 코드가 실행되기 전에 공격 요청이 처리되기 때문입니다.

AI가 찾았고, 유출이 패치를 앞당겼다
발견 경로가 이번 사건의 성격을 보여줍니다. 보안 업체 Calif가 8월 11일 OpenAI의 Patch the Planet 작업 중 이 결함을 찾았고, Wiz가 8월 19일 AI 보조 도구로 독립 발견했습니다. OpenAI도 9월 18일 추가 공격 경로를 보고했습니다.
원래는 조율된 공개 일정이 있었습니다. 그런데 10월 20일 CVE 번호가 온라인에 먼저 돌았고, 배포 시각과 심각도(CVSS 10.0)까지 틀린 정보였습니다. PHP 재단은 일정을 하루 앞당겨 10월 21일 패치를 냈습니다.
공격 시도는 그 전부터 있었습니다. 아마존 위협 인텔리전스는 10월 17일 상용 익명화 네트워크에서 들어온 익스플로잇 시도를 기록했습니다. CISA는 10월 26일 두 취약점을 실제 악용된 취약점 목록에 올렸습니다.
피해는 방화벽 같은 에지 장비에서 먼저
팔로알토 네트웍스는 10월 29일 기준 자사 텔레메트리에서 노출된 PHP 인스턴스가 2,260만 개로 잡혔다고 밝혔습니다. 그중 일부 PAN-OS 방화벽이 실제로 뚫렸습니다. 중국 연계 조직이 PHP2Shell과 리눅스 커널 권한 상승 취약점 Fragnesia를 연쇄해 루트 권한 웹셸을 심은 사례로, 수백 대 중 25대 이상이 확인됐습니다.
팔로알토는 관리 인터페이스를 인터넷에 노출한 고객이 전체의 0.02% 수준이라며 해당 고객에게 개별 통보했다고 설명했습니다. PAN-OS 12.2, 12.1, 11.2, 11.1, 10.2에 패치가 나왔습니다.
WordPress 쪽은 아직 확정 침해가 없습니다. 워드펜스 운영사인 Defiant는 10월 28일까지 WordPress 사이트 침해 사례를 확인하지 못했고, 관련 요청 7만7,000건을 2,000개 이상 IP에서 받았다고 밝혔습니다. 성공률이 낮은 이유는 익스플로잇이 서버의 ASLR, PHP 빌드, 확장 모듈, 메모리 한도에 맞춰 조정돼야 하기 때문입니다.

40년 된 빚이 청구서로 온 이유
IEEE 스펙트럼은 이 사건을 기술 부채의 청구서로 읽습니다. PHP 런타임은 C로 쓰였고, 수십 년간 호환성을 위해 낡은 동작을 안고 갔습니다. 그 위에 프레임워크와 CMS가 겹겹이 쌓였습니다. 결함 하나가 뚫리면 그 위에 얹힌 계정과 데이터베이스, 결제 정보까지 한 번에 넘어가는 구조입니다.
AI는 그 층을 빠르게 훑습니다. 문제는 발견 속도가 패치 속도보다 빨라졌다는 점입니다. 8월에 발견된 결함이 10월에 공개되기까지 두 달이 걸렸고, 그 사이 정보가 새면서 일정이 앞당겨졌습니다.
오래된 버전을 쓰는 쪽이 더 위험합니다. PHP 8.1 이하는 지원이 끝났습니다. PHP 재단은 7.4와 8.0, 8.1용 최소 백포트를 소스로 제공했지만, 배포판 벤더가 패키지를 내놓지 않으면 직접 빌드해야 합니다.
이번 사건에서 눈에 띄는 대목은 양쪽이 같은 도구를 썼다는 점입니다. 발견 단계에서는 Wiz가 AI 보조 도구로 결함을 찾아냈고, OpenAI는 자사 사이버 연구팀을 동원해 공격 경로를 검증했습니다. 반대로 팔로알토 방화벽을 뚫은 조직도 AI의 도움을 받아 PHP2Shell과 커널 취약점을 연쇄했다고 보안 업체들이 전했습니다.
결과적으로 취약점 공개와 악용 사이의 간격이 거의 사라졌습니다. 예전에는 패치가 나온 뒤 몇 주씩 여유가 있었습니다. 이번에는 패치 당일부터 스캔이 시작됐고, CISA가 5일 만에 실제 악용 목록에 올렸습니다.
업데이트가 어려우면 최소한 이것부터
PHP 재단이 안내한 완화책입니다. 메모리 부족 경로를 막으려면 memory_limit를 -1로 두고, 애플리케이션이 다시 유한값을 넣지 않는지 확인해야 합니다. 파일 업로드가 필요 없으면 post_max_size를 8M, 필요하면 32M로 낮춥니다.
전역 상태 경로에는 session.upload_progress.enabled=0을 php.ini나 FPM 풀 설정에 넣고 모든 워커를 재시작합니다. PHP 8.5라면 fatal_error_backtraces=0도 함께 둡니다.

확인은 간단합니다. 서버에 접속할 수 있으면 php -v 한 줄로 버전이 나옵니다. 호스팅을 쓰면 관리 화면의 PHP 버전 설정에서 확인하고 바꿀 수 있습니다. WordPress 코어는 자동으로 올라가지만, PHP 버전은 호스팅 계정 설정이라 직접 손대야 하는 경우가 많습니다.
완화책은 우회로가 아니라 시간을 버는 조치입니다. PHP 재단도 완전한 해결은 업데이트뿐이라고 못 박았습니다.
원문 반응
GeekNews에 옮겨진 해커뉴스 댓글에서는 25년간 웹 개발을 해온 사람의 자책이 눈에 띕니다. 업계가 근본 원인을 고치지 않고 그 위에 구조물을 덧대 결함을 감춰 왔고, 무어의 법칙 덕분에 성능을 희생한 채 1990년대 기술 위에 겹겹이 얹어도 굴러갔다는 겁니다.
같은 댓글은 PHP를 20년 넘게 비웃으면서도 여전히 웹의 상당 부분을 PHP가 돌린다고 지적합니다. 보안이 중요한 런타임을 여전히 C와 setjmp/longjmp로 구현하고 있다는 점도 문제로 꼽습니다.
정리하면, 이번 사건의 교훈은 AI가 무섭다는 것이 아닙니다. AI가 찾는 속도만큼 패치와 업그레이드 속도를 맞춰야 한다는 것입니다. 서버를 직접 운영한다면 오늘 PHP 버전부터 확인하십시오.
[한성] PNY GeForce RTX 5080 OC D7 16GB Triple Fan
로켓배송으로 바로 받기이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.



