PHP2Shell(CVE-2026-109618, CVE-2026-109619)은 PHP 런타임 자체에서 나온 치명적인 원격 코드 실행 취약점입니다. 인증 없이 원격에서 코드를 실행할 수 있고, 실제 공격에도 쓰였습니다. PHP로 돌아가는 서버를 운영한다면 버전부터 봐야 합니다. 아래 내용은 2026-10-30 기준입니다.
한눈에 보기
- 취약점: CVE-2026-109618, CVE-2026-109619. 인증 없이 원격 코드 실행. CVSS 4.0 점수 9.2
- 수정 버전: 8.5.12, 8.4.27, 8.3.36, 8.2.35
- 바로 못 올리는 시스템, PHP 8.1 이하: CISA는 패치할 때까지 오프라인 전환을 권고
- 완전한 해결: 업데이트뿐. PHP 권고의 완화 설정은 완전한 해결이 아님
- 호스팅 서비스만 쓰는 경우: 티스토리나 네이버 블로그라면 직접 할 일이 없음. 웹호스팅이면 호스팅 업체 공지 확인
어떤 취약점인가
PHP 공식 보안 권고는 2026-10-21에 나왔습니다(CVE-2026-109618 권고, CVE-2026-109619 권고). 미국 CISA는 2026-10-26에 이 취약점을 KEV에 올렸습니다. KEV는 실제로 악용되는 취약점 목록입니다.
원리는 이 정도만 알면 됩니다.
- CVE-2026-109618: 메모리 부족 오류를 처리하는 중에 요청 메모리가 잘못된 상태로 남습니다. 정리 과정에서 그 메모리를 건드립니다.
- CVE-2026-109619: 이전 요청의 상태가 워커에 남습니다. 다음 요청이 이미 해제된 메모리를 참조합니다. 흔히 use-after-free라고 부르는 문제입니다.
실행 방식에 따라 위험한 정도가 다릅니다. Apache mod_php는 앱 코드가 실행되기 전 단계에서도 공격이 가능합니다. 기본 설정에서 원격 코드 실행이 검증됐습니다. PHP-FPM은 CVE-2026-109618의 완전한 익스플로잇이 시연되지는 않았습니다. 하지만 CVE-2026-109619의 세션 업로드 진행 경로는 FPM에서도 원격 코드 실행이 검증됐습니다. 공격자가 얻는 권한은 웹 워커 계정입니다.
영향을 받는 환경
CISA 안내에 따르면 웹 요청을 처리하는 모든 PHP 설치가 영향을 받습니다.
- Apache mod_php (PHP 측은 이 방식을 가장 위험하다고 봅니다)
- PHP-FPM
- php-cgi
- FrankenPHP
- LiteSpeed
CISA는 PHP가 다른 소프트웨어의 구성 요소인 경우가 많아서 바로 눈에 안 띌 수 있다고도 짚습니다. 내가 PHP를 설치한 기억이 없어도 쓰는 제품 안에 들어 있을 수 있다는 뜻입니다.
내 서버가 해당되는지 확인하기
터미널에서 버전을 봅니다.
# 터미널에서 쓰는 PHP 버전
php -v
# 웹 요청을 처리하는 PHP-FPM 버전
# 배포판에 따라 실행 파일 이름에 버전이 붙습니다 (예: php-fpm8.3 -v)
php-fpm -v
여기서 끝내면 안 됩니다. 터미널의 PHP와 웹에서 도는 PHP가 다를 수 있습니다. 웹 서버가 실제로 쓰는 버전이 헷갈리면 phpinfo() 페이지를 잠깐 만들어 확인합니다. 내용은 한 줄입니다.
<?php phpinfo();
서버 정보가 그대로 보이는 페이지이므로 확인한 뒤 바로 삭제합니다.
버전 번호를 볼 때 주의할 점이 두 가지 있습니다.
- 리눅스 배포판 패키지는 버전 번호가 그대로인 채 수정만 백포트될 수 있습니다. 번호가 낮아 보여도 이미 고쳐졌을 수 있으니 배포판 보안 공지를 확인합니다.
- 도커 이미지와 번들 제품은 따로 확인합니다. 앞에서 본 CISA 말대로 다른 소프트웨어의 구성 요소로 들어 있을 수 있습니다.
어떤 버전으로 올려야 하나
| 쓰는 계열 | 수정 버전 |
|---|---|
| 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 이하 | 수정 버전 없음(지원 종료). CISA는 패치 전까지 오프라인 전환 권고 |
업데이트한 뒤에는 PHP-FPM이나 Apache를 재시작합니다. 그리고 위 방법으로 실제 버전을 다시 확인합니다. 패키지만 올리고 재시작하지 않으면 확인이 끝난 게 아닙니다.
업데이트가 바로 안 될 때
CISA는 바로 업데이트하지 못하는 시스템도 패치 전까지 오프라인 전환을 권합니다. 아래 설정은 PHP 권고에 나온 완화책이고 완전한 해결이 아닙니다.
memory_limit=-1을 관리자 설정으로 강제합니다. CVE-2026-109618용이고 완전한 완화는 아닙니다. 메모리 제한이 사라지는 부작용은 감안해야 합니다.session.upload_progress.enabled=0으로 끕니다. CVE-2026-109619의 세션 경로용입니다. PHP는 이 기능을 안 쓴다면 패치 후에도 꺼 두는 게 좋겠다고 언급합니다.- PHP 8.5는
fatal_error_backtraces=0도 설정합니다. - 멀티파트를 안 쓰는 서비스라면 앞단에서 차단합니다.
- CISA는 WAF가 일부 보호를 할 수 있다고 봅니다.
바꾼 뒤에는 모든 워커를 재시작합니다. error_reporting을 바꾸거나 @를 붙이거나 display_errors를 끄는 건 보호가 되지 않습니다.
침해 흔적도 봐야 합니다. CISA는 PHP 워커 프로세스가 셸을 실행하거나 도구를 내려받는지 모니터링하라고 안내합니다.
실제 공격 사례
Dream Research 보고(2026-10-26 게시, 10-29 갱신)에 실제 공격이 나옵니다. Unit 42가 공격자 도구와 결과를 독립적으로 검증했습니다.
공격자는 PHP2Shell 맞춤 익스플로잇과 리눅스 커널 권한 상승 취약점 Fragnesia(CVE-2026-46300)를 묶었습니다. 표적은 Palo Alto Networks PAN-OS 방화벽 중 관리 인터페이스가 인터넷에 노출된 장비입니다.
숫자로 보면 이렇습니다. 약 19,000대를 찾았고 약 5,000대가 응답했습니다. 미국, 일본, 대만, 한국으로 국가를 좁히고 버전으로 걸러 240대를 추렸습니다. 그중 24대에서 루트를 얻었고, 내부 관리 서버 1대를 더해 25대입니다. 한국도 대상 국가에 들어 있습니다.
피해는 방화벽에서 끝나지 않았습니다. 미국 정부 관련 조직의 내부망 AD까지 접근했습니다. LDAP 서비스 계정 비밀번호를 복호화했고 전체 사용자와 그룹을 열거한 것이 확인됐습니다. 비밀번호 살포, 백도어 계정, SAML 키 추출은 성공했는지 확인되지 않았습니다.
공격 인프라에는 Claude Code가 설치되어 있었고 DeepSeek과 Kimi 설정도 있었습니다. 다만 Dream은 AI가 코드를 썼다는 직접 증거는 없다고 밝혔습니다. 코드 구조 등을 근거로 AI 보조 개발을 추정할 뿐입니다. Dream은 중국 연계 정황을 제시했지만 이름 붙은 특정 공격 조직으로 귀속하지는 않았습니다.

▲ PHP2Shell 공격 사례 흐름
Unit 42가 권하는 조치는 세 가지입니다. 인터넷에 노출된 관리 인터페이스를 없애고, 접근을 신뢰하는 내부 IP로 제한하고, PAN-OS 수정 버전을 적용합니다. 해당 버전은 벤더 권고에서 확인합니다.
규모를 보여 주는 수치도 두 개 있습니다. Palo Alto Networks 설명으로는 자사 전체 설치 기반 중 약 0.02%가 관리 인터페이스를 인터넷에 열어 두었고 영향을 받았습니다. PHP 쪽은 Cortex Xpanse 기준으로 잠재적으로 취약한 노출 인스턴스가 2,260만 개 이상입니다.
마무리
PHP 서버를 운영한다면 할 일은 단순합니다. 웹에서 실제로 도는 버전을 확인하고, 수정 버전으로 올리고, 재시작하고, 다시 확인합니다. 바로 못 올리는 시스템이나 PHP 8.1 이하에 대한 CISA 권고는 패치할 때까지 오프라인 전환입니다. 완화 설정을 걸어 뒀다고 끝난 게 아닙니다.
이 글은 AI(Claude)가 공식 자료를 확인해 초안을 쓰고, 제가 읽고 검토해 발행했습니다. 글에 들어간 도식도 AI와 함께 만들었습니다.
'IT 팁' 카테고리의 다른 글
| 엑셀 유닉스 타임(Epoch) 변환 총정리: 초·밀리초·역변환·구글 시트 (0) | 2026.11.09 |
|---|