워드프레스 서버 PHP2Shell 긴급 보안 업데이트
2026년 10월 21일, PHP에서 인증 없이 원격 코드를 실행할 수 있는 치명적인 PHP2Shell 취약점이 공개되었다. 워드프레스를 비롯한 PHP 기반 웹사이트에 영향을 줄 수 있으며, 워드프레스 자체를 업데이트하는 것만으로는 해결되지 않는다. 이번 글에서는 PHP2Shell 취약점의 원리와 위험성을 살펴보고, 실제 Debian 12 서버에서 PHP 보안 업데이트를 적용하고 정상적으로 패치되었는지 확인한 과정을 기록한다.
워드프레스 운영자와 PHP2Shell 취약점
2026년 10월 21일 늦은 밤, 블로그 포스팅을 마치고 잠깐 한숨을 돌리려 네이버에 접속한 본 필자는 아래 제목의 뉴스 기사를 보고 머리털이 쭈뼛 서는 느낌을 받았다.
세계 웹사이트 70% 사용 PHP서 보안 결함…각국 해킹 비상
2026년 10월 21일, PHP 개발팀은 외부 공격자가 웹 서버에서 임의의 코드를 실행할 수 있는 치명적인 보안 취약점 두 가지를 공개하고 긴급 보안 업데이트를 배포했다. PHP2Shell이라고 이름 붙은 이 취약점은 두 가지 취약점 모두 CVSS v4.0 기준 9.2점(Critical)으로 평가되었다.
PHP는 워드프레스(WordPress)를 비롯한 수많은 웹 애플리케이션의 기반이 되는 서버 측 스크립트 언어다. PHP2Shell은 워드프레스의 특정 플러그인이나 테마에서 발생한 문제가 아니라 워드프레스를 실행하는 PHP 엔진 자체의 취약점이다.
즉, 워드프레스를 업데이트한다고 해서 해결되는 문제가 아니라 서버에서 실행되는 PHP 버전을 확인하고 보안 수정 버전으로 업데이트해야 한다.
본 글에서는 PHP2Shell 취약점의 원인과 위험성을 간략히 알아보고, 방금 전 본 필자의 Debian 12 서버에서 PHP를 업데이트한 과정과 적용 여부를 확인하는 방법을 공유한다.
PHP2Shell 취약점이란 무엇이며 어떤 문제가 발생하는가?
PHP2Shell은 PHP의 메모리 관리 및 HTTP 요청 처리 과정에서 발견된 두 가지 보안 취약점을 통칭한다. 2026년 10월 21일 PHP 개발팀이 발표한 취약점은 다음과 같다.
| 취약점 | 내용 | 위험도 |
|---|---|---|
| CVE-2026-109618 | 메모리 부족(OOM) 처리 및 요청 종료 과정의 메모리 손상 | CVSS 9.2 |
| CVE-2026-109619 | 이전 요청의 내부 상태가 다음 요청에서 재사용되는 문제 | CVSS 9.2 |
CVE-2026-109618 – 메모리 부족 처리 과정의 취약점
PHP는 웹 요청을 처리하면서 필요한 메모리를 할당하고 사용하는데, 메모리 부족(Out of Memory, OOM)이 발생했을 때 PHP 내부의 요청 데이터가 완전히 초기화되지 않은 상태로 실행 흐름이 중단될 수 있다.
이후 요청을 정리하는 과정에서 불완전한 데이터를 정상적인 데이터로 취급하면서 메모리 손상이 발생할 가능성이 있다. 공격자는 이러한 문제를 악용해 서버에서 임의의 코드를 실행할 수 있다.
메모리를 PHP가 작업할 때 사용하는 책상이라고 생각해 보자. PHP는 요청을 처리하기 위해 책상 위에 필요한 자료를 쭉 펼쳐 놓는다. 그런데 작업 도중 책상에 공간이 부족해지면(Out of Memory, OOM), PHP가 작업을 중단하고 자료를 정리하는 과정에서 문제가 발생할 수 있다. 다음 작업을 할 때 책상에 남아 있는 종이 부스러기를 정상적인 자료로 취급하는 것이다.
공격자는 이러한 오류를 의도적으로 유발하여 PHP의 메모리를 손상시키고, 최악의 경우 서버에서 임의의 코드를 실행할 수 있다.
CVE-2026-109619 – 이전 요청의 내부 상태가 남는 취약점
PHP-FPM이나 Apache의 PHP 실행 환경에서는 하나의 프로세스가 여러 HTTP 요청을 순차적으로 처리할 수 있는데, 요청이 종료되면 해당 요청에서 사용한 데이터는 적절하게 정리되어야 한다.
하지만 이 취약점에서는 이전 요청의 전역 상태가 해제된 메모리를 가리키는 상태로 남을 수 있다. 이후 같은 프로세스가 새로운 요청을 처리하면서 이전 요청의 잘못된 메모리 상태를 참조하면 메모리 손상이나 원격 코드 실행으로 이어질 수 있다.
다시 책상의 예를 들자면, 첫 번째 요청에 대한 데이터는 1번 서랍에, 두 번째 요청에 대한 데이터는 2번 서랍에 넣어 두었다는 포스트잇을 붙여 놓고 필요한 작업을 진행했다.
그런데 첫 번째 작업을 다 마치고 1번 서랍을 비운 다음에 포스트잇을 제대로 떼지 않은 경우가 생긴다. 두 번째 작업을 시작한 PHP가 이 정보를 잘못 참조하면, 이미 치워진 자료가 여전히 그 자리에 있다고 착각하고 접근하게 된다. 문제는 그 서랍이 이미 다른 용도로 사용되고 있을 수도 있다는 점이다. 이 때문에 메모리 손상이나 정보 노출이 발생할 수 있다.
한마디로 설명하자면, 외부 침입자가 내 워드프레스 서버의 PHP를 통해 할 수 있는 온갖 짓거리를 할 수 있게 된다는 것이다. 내 글이 날아가거나 DB를 탈취당하는 것은 물론, 스팸 메일을 뿌리거나 다른 사이트를 공격하는 거점으로 악용될 수도 있다는 소리다.
PHP2Shell 취약점 해결 방법은?
이건 워드프레스를 업데이트한다고 해결되는 문제가 아니다. 워드프레스가 사용하는 PHP 엔진 자체의 취약점이기 때문에 서버에 설치된 PHP를 보안 수정 버전으로 업데이트해야 한다.
PHP 개발팀이 2026년 10월 21일 배포한 보안 수정 버전은 다음과 같다.
- PHP 8.5 : 8.5.12 이상
- PHP 8.4 : 8.4.27 이상
- PHP 8.3 : 8.3.36 이상
- PHP 8.2 : 8.2.35 이상
PHP 8.1 이하 버전은 PHP 프로젝트의 공식 지원이 종료된 상태이므로, 지원되는 PHP 버전으로 업그레이드하는 것이 좋다. 다만 Debian 등 일부 리눅스 배포판에서는 기존 PHP 버전에 보안 패치만 적용한 백포트(Backport) 패키지를 제공할 수 있으므로, 해당 배포판의 보안 업데이트 적용 여부를 확인해야 한다.
PHP2Shell 보안 업데이트 및 적용 절차
호스팅 업체에서 제공하는 워드프레스를 사용하고 있다면 패치 적용 여부를 업체에 확인하면 된다. 하지만 본 필자처럼 직접 서버를 운영하는 경우에는 PHP를 직접 업데이트해야 한다. Debian 12에서 필자가 실제로 업데이트한 과정을 공유한다.
Step 1. APT UPDATE
이 보안 패치는 2026년 10월 21일에 배포되었다. 따라서 아직 업데이트하지 않았다면 패치가 적용되기 전의 PHP 패키지를 사용하고 있을 가능성이 높다. 일반적으로는 현재 사용 중인 PHP 버전부터 확인한 다음 진행하겠지만, 이번에는 그 과정을 건너뛰고 바로 업데이트를 진행한다.
eqmaker@debian:~$ sudo apt update Get:1 http://security.debian.org/debian-security bookworm-security InRelease [34.8 kB] Hit:2 http://deb.debian.org/debian bookworm InRelease (... 중략 ...) Get:8 https://packages.sury.org/php bookworm/main amd64 Packages [290 kB] Fetched 1,240 kB in 1s (1,360 kB/s) Reading package lists... Done Building dependency tree... Done Reading state information... Done 246 packages can be upgraded. Run 'apt list --upgradable' to see them. eqmaker@debian:~$
이 과정에서 일부 저장소의 GPG 키가 만료되어 패키지 목록을 갱신할 수 없는 경우가 있다. Sury PHP 저장소에서 서명 키 오류가 발생한다면 APT 업데이트 오류 해결: Sury GPG 키 갱신을 참고하여 저장소의 서명 키를 갱신하면 된다.
Step 2. PHP 보안 업데이트 실행
저장소를 갱신했으면 바로 업데이트를 진행한다.
eqmaker@debian:~$ sudo apt-get upgrade Reading package lists... Done (... 중략 ...) The following packages will be upgraded: apache2 apache2-bin (... 중략 ...) php-bz2 php-curl php-gd php-intl php-mbstring php-mysql php-symfony-cache-contracts php-symfony-deprecation-contracts php-symfony-service-contracts php-twig php-xml php-zip php8.2 php8.2-bz2 php8.2-cli php8.2-common php8.2-curl php8.2-gd php8.2-intl php8.2-mbstring php8.2-mysql php8.2-opcache php8.2-readline php8.2-xml php8.2-zip php8.3 php8.3-cli php8.3-common php8.3-curl php8.3-fpm php8.3-gd php8.3-intl php8.3-mbstring php8.3-mysql php8.3-opcache php8.3-readline php8.3-xml php8.3-zip php8.4-bz2 php8.4-cli php8.4-common php8.4-curl php8.4-gd php8.4-intl php8.4-mbstring php8.4-mysql php8.4-opcache php8.4-phpdbg php8.4-readline php8.4-xml php8.4-zip (... 중략 ...) After this operation, 1,716 kB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 http://security.debian.org/debian-security bookworm-security/main amd64 linux-libc-dev amd64 6.1.190-1 [2,409 kB] (... 중략 ...) Get:10 https://packages.sury.org/php bookworm/main amd64 php8.2-zip amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [26.3 kB] Get:11 https://packages.sury.org/php bookworm/main amd64 php8.2-xml amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [114 kB] Get:12 https://packages.sury.org/php bookworm/main amd64 php8.2-readline amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [12.6 kB] Get:13 https://packages.sury.org/php bookworm/main amd64 php8.2-opcache amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [346 kB] Get:14 https://packages.sury.org/php bookworm/main amd64 php8.2-mysql amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [118 kB] Get:15 https://packages.sury.org/php bookworm/main amd64 php8.2-mbstring amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [444 kB] Get:16 https://packages.sury.org/php bookworm/main amd64 php8.2-intl amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [138 kB] Get:17 https://packages.sury.org/php bookworm/main amd64 php8.2-gd amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [29.0 kB] Get:18 https://packages.sury.org/php bookworm/main amd64 php8.2-curl amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [36.0 kB] Get:19 https://packages.sury.org/php bookworm/main amd64 php8.2-bz2 amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [10.7 kB] Get:20 https://packages.sury.org/php bookworm/main amd64 libapache2-mod-php8.2 amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [1,697 kB] Get:21 https://packages.sury.org/php bookworm/main amd64 php8.2-cli amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [1,755 kB] Get:22 https://packages.sury.org/php bookworm/main amd64 php8.2-common amd64 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78 [695 kB] Get:23 https://packages.sury.org/php bookworm/main amd64 php8.3-zip amd64 8.3.36-1+0~20261021.88+debian12~1.gbp250f7c [27.4 kB] Get:24 https://packages.sury.org/php bookworm/main amd64 php8.3-xml amd64 8.3.36-1+0~20261021.88+debian12~1.gbp250f7c [119 kB] Get:25 https://packages.sury.org/php bookworm/main amd64 php8.3-readline amd64 8.3.36-1+0~20261021.88+debian12~1.gbp250f7c [12.6 kB] (... 생략 ...)
PHP 관련 패키지가 모두 2026년 10월 21일에 빌드된 버전으로 다운로드되고 있음을 알 수 있다. 필자의 경우 PHP 관련 주요 패키지가 다음 버전으로 업데이트되었다.
php8.2-cli: 8.2.35php8.2-common: 8.2.35libapache2-mod-php8.2: 8.2.35php8.3-cli: 8.3.36php8.3-common: 8.3.36libapache2-mod-php8.3: 8.3.36php8.3-fpm: 8.3.36php8.4-cli: 8.4.27php8.4-common: 8.4.27
apt-get upgrade는 PHP 이외의 패키지도 업데이트하므로, 다른 서버에서 PHP2Shell 패치만을 목적으로 실행할 경우 변경 범위를 충분히 검토해야 한다.
Step 3. 설치 확인과 재부팅
PHP는 하나의 서버에 여러 버전이 설치되어 있을 수 있다. 서버에 설치된 모든 PHP의 버전을 확인하여 보안 업데이트가 정상적으로 적용되었는지 확인한다.
eqmaker@debian:~$ php8.2 -v PHP 8.2.35 (cli) (built: Oct 21 2026 08:17:45) (NTS) Copyright (c) The PHP Group Zend Engine v4.2.35, Copyright (c) Zend Technologies with Zend OPcache v8.2.35, Copyright (c), by Zend Technologies eqmaker@debian:~$ php8.3 -v PHP 8.3.36 (cli) (built: Oct 21 2026 08:22:00) (NTS) Copyright (c) The PHP Group Zend Engine v4.3.36, Copyright (c) Zend Technologies with Zend OPcache v8.3.36, Copyright (c), by Zend Technologies eqmaker@debian:~$ php8.4 -v PHP 8.4.27 (cli) (built: Oct 21 2026 08:21:27) (NTS) Copyright (c) The PHP Group Built by Debian Zend Engine v4.4.27, Copyright (c) Zend Technologies with Zend OPcache v8.4.27, Copyright (c), by Zend Technologies
확인 결과 모두 PHP2Shell 취약점이 수정된 2026년 10월 21일 버전으로 업데이트되었다. 하지만 실제 웹 서버에서 사용하는 PHP 버전과 다를 수 있으므로 이어서 Apache 모듈 및 PHP-FPM 패키지도 확인한다.
eqmaker@debian:~$ dpkg-query -W php8.2-common php8.3-common php8.4-common libapache2-mod-php8.2 libapache2-mod-php8.3 php8.3-fpm
libapache2-mod-php8.2 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78
libapache2-mod-php8.3 8.3.36-1+0~20261021.88+debian12~1.gbp250f7c
php8.2-common 8.2.35-1+0~20261021.94+debian12~1.gbp8bff78
php8.3-common 8.3.36-1+0~20261021.88+debian12~1.gbp250f7c
php8.3-fpm 8.3.36-1+0~20261021.88+debian12~1.gbp250f7c
php8.4-common 8.4.27-1+0~20261021.57+debian12~1.gbp7636b9
Apache용 PHP 모듈과 PHP-FPM, 그리고 나머지 주요 PHP 패키지도 업데이트되었다.
보안 업데이트를 실제 웹 서비스에 반영하려면 사용 중인 서버를 재시작해 준다. PHP 실행 방식에 따라 Apache 또는 PHP-FPM 서비스만 재시작해 줘도 되기는 하지만, 아무래도 이런 유형의 업데이트는 서버 자체를 재부팅해 주는 것이 여러모로 마음이 놓이는 법이다.
sudo systemctl reboot nowStep 4. 최종 점검
워드프레스 관리자 페이지에 접속해 도구 → 사이트 건강 → 정보 → 서버 → PHP 버전 항목을 확인한다.
여기에 표시된 PHP 버전이 앞서 확인한 보안 수정 버전 이상이라면 해당 워드프레스 사이트에도 PHP2Shell 보안 패치가 적용된 것으로 판단할 수 있다. 하나의 서버에서 여러 워드프레스 사이트를 운영한다면 사이트마다 PHP 실행 버전이 다를 수 있으므로 각각 확인하는 것이 좋다.
참고 자료
FAQ
- PHP2Shell 취약점이란 무엇인가?
- PHP의 메모리 관리 및 HTTP 요청 처리 과정에서 발견된 두 가지 보안 취약점(CVE-2026-109618, CVE-2026-109619)을 통칭한다. 공격자가 인증 없이 웹 서버에서 임의의 코드를 실행할 수 있는 원격 코드 실행(RCE) 취약점으로, CVSS v4.0 기준 9.2점의 치명적인 위험도를 가진다.
- PHP2Shell 취약점은 워드프레스도 영향을 받는가?
- 그렇다. PHP2Shell은 워드프레스 자체가 아닌 PHP 실행 엔진의 취약점이므로, 취약한 PHP 버전을 사용하는 워드프레스 사이트도 영향을 받을 수 있다. 워드프레스 코어나 플러그인을 최신 버전으로 유지하더라도 PHP가 취약하다면 안전하다고 할 수 없다.
- PHP2Shell 취약점은 워드프레스를 업데이트하면 해결되는가?
- 아니다. PHP2Shell은 PHP 엔진 자체의 취약점이므로 서버에 설치된 PHP를 보안 수정 버전으로 업데이트해야 한다. PHP 8.2는 8.2.35, PHP 8.3은 8.3.36, PHP 8.4는 8.4.27, PHP 8.5는 8.5.12 이상의 버전이 필요하다. 단, 리눅스 배포판에서 별도의 보안 패치를 백포트한 경우에는 해당 배포판의 보안 공지를 기준으로 판단해야 한다.
- Debian에서 PHP2Shell 보안 업데이트는 어떻게 하는가?
- Debian에서는
sudo apt update명령으로 패키지 목록을 갱신한 다음,sudo apt-get upgrade명령으로 업데이트할 수 있다. 다만 이 명령은 PHP뿐 아니라 다른 시스템 패키지도 업데이트하므로 실제 설치 결과를 확인해야 한다. - PHP 보안 업데이트 후 서버를 재부팅해야 하는가?
- 반드시 서버 전체를 재부팅해야 하는 것은 아니다. PHP 실행 방식에 따라 Apache 또는 PHP-FPM 서비스를 재시작하면 보안 업데이트를 반영할 수 있다. 다만 시스템 라이브러리와 주요 서비스까지 함께 업데이트했다면 서버 재부팅을 고려할 수 있다.
- PHP2Shell 보안 패치가 정상적으로 적용되었는지 어떻게 확인하는가?
- 서버에서는
php -v또는php8.3 -v와 같은 명령으로 PHP 버전을 확인할 수 있다. 다만 명령행 PHP와 웹 서버에서 사용하는 PHP 버전은 다를 수 있다. 워드프레스에서는 관리자 페이지의 도구 → 사이트 건강 → 정보 → 서버 → PHP 버전에서 실제 사용 중인 PHP 버전을 확인하고 보안 수정 버전과 비교하면 된다.