2026년 10월, PHP 보안 이슈와 보안 대책

iam 2026.11.08 3
목록

6af0852599ac7.png2026년 10월, PHP 보안 이슈와 보안 대책

Executive Summary

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. 따라서 이 보고서의 핵심 결론은 단순하다. 지원 버전 사용자는 즉시 패치하고 워커를 재시작해야 하며, 패치만으로 끝나지 않고 침해 여부 점검과 설정 강화가 병행되어야 한다.

1. 2026년 10월 핵심 사건: PHP2Shell

1.1 개요와 식별자

PHP2Shell은 PHP 코어에 존재한 두 취약점을 묶어 부르는 명칭이다. 대상은 CVE-2026-109618과 CVE-2026-109619이며, 각각 CVSS v4.0 9.2점, Critical 등급이다 1. 유럽연합 기관 공동 성명도 두 취약점이 인증 없이 원격에서 악성 코드를 실행할 수 있게 한다고 경고하였다 4. 연구는 Calif, OpenAI, Wiz가 수행하였으며, Wiz는 프론티어 AI 모델이 복잡한 익스플로잇 체인을 현실적으로 만드는 데 기여했다고 설명하였다 5.

1.2 CVE-2026-109618: OOM 처리 과정의 메모리 손상

CVE-2026-109618은 메모리 부족(OOM) 처리 중 발생하는 메모리 손상을 통한 원격 코드 실행 취약점이다 2. PHP는 설정된 memory_limit를 초과하면 longjmp()로 요청 처리를 중단하는데, 이 중단이 내부 데이터가 부분적으로만 초기화된 시점에 일어나면 정리 과정이 유효하지 않은 데이터를 유효한 것처럼 처리할 수 있다 2. 특히 multipart 업로드 파싱은 본문 크기보다 훨씬 많은 힙 메모리를 소비하게 만들 수 있으며, 중첩된 빈 파일 필드가 여러 메타데이터 트리를 만들게 한다는 분석이 있다 6.

1.3 CVE-2026-109619: 오래된 전역 상태

CVE-2026-109619는 오래된 전역 상태를 통한 원격 코드 실행 취약점이다 2. 요청이 소유한 내부 상태가 메모리가 해제된 뒤에도 남아 있고, 같은 워커가 처리하는 이후 요청이 정상 초기화가 이를 재설정하기 전에 그 오래된 상태를 사용할 수 있다 2. 확인된 초기 경로에는 세션 업로드 진행(session upload progress) 처리와 특정 초기화 진단이 포함되며, PHP 8.5에서는 치명적 오류 백트레이스 경로도 확인되었다 6.

1.4 영향 범위와 SAPI별 위험도

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.

2. 공개 과정과 실제 악용 정황

2.1 공개 일정과 유출

PHP 보안팀은 2026년 10월 20일 사전 공지를 하였고, 10월 21일 패치를 배포하였다 2. 원래 일정보다 하루 앞당겨진 배경에는 정보 유출이 있었다. Dark Reading 보도에 따르면 PHP는 당초 10월 22일 공개를 예정하였으나, embargo가 깨지면서 PoC 도구와 재현 주장이 등장하였다 7. 유출은 방어자에게는 준비 시간을 앞당기는 효과가 있었지만, 공격자에게도 조기 경고를 제공하였다는 평가가 함께 제시되었다 7.

2.2 악용 시도와 CISA KEV 등재

공개 직후부터 공격 시도가 관측되었다. Hack The Box 정리에서는 Patchstack의 호스팅 파트너들이 10월 21일 실제 악용 사건을 보고하였고, Cloudflare도 공격 트래픽과 방어 우회용 변형 페이로드를 보고하였다고 전한다 6. 다만 같은 정리에서는 당시까지 검증된 성공적 침해가 확립되지 않았다는 점도 함께 구분하였다 6. 이후 CISA는 2026년 10월 26일 두 CVE를 KEV에 추가하였고, 연방 기한은 10월 29일이었다 3. KEV 등재는 실제 악용 증거가 있다는 취지의 신호로 해석되며, 패치 지연의 위험을 크게 높인다.

2.3 CVE-2026-115560: 패치로 닫히지 않은 후속 벡터

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일 패치를 적용했다고 해서 세션 관련 위험이 완전히 끝났다고 단정해서는 안 된다.

3. 2025년부터 2026년 중반까지의 관련 취약점 맥락

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 인젝션

pg_insert(), pg_update(), pg_select(), pg_delete()의 이스케이프 처리가 standard_conforming_strings=on 기본값에서 백슬래시를 이스케이프하지 않아 SQL 탈출이 가능하였다 12.

2026년 7월 30일, CVE-2026-17544

BCMath 경계 밖 쓰기

bccomp()에서 스케일 조정 시 변수 하나만 조정되어 버퍼를 초과하는 복사가 발생할 수 있었다 12. PHP 8.4와 8.5에만 해당하였다 12.

2026년 7월 30일, CVE-2026-7260

Phar 스택 오버플로

Phar가 원형 심볼릭 링크를 깊이 제한 없이 따라가며 재귀가 무한히 이어져 스택이 고갈될 수 있었다 12.

이 표가 주는 교훈은 명확하다. PHP 보안 이슈는 특정 프레임워크의 버그가 아니라, 런타임과 확장, 설정 조합에서 반복적으로 발생한다. 따라서 프레임워크 업데이트만으로는 충분하지 않으며, PHP 자체와 배포 패키지를 함께 관리해야 한다.

4. 지원 버전과 수명 주기 리스크

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.

5. 보안 대책

5.1 최우선 조치: 패치와 워커 재시작

가장 완전한 수정은 PHP를 8.5.12, 8.4.27, 8.3.36, 8.2.35 중 해당 분기로 업데이트하는 것이다 2. 배포 패키지를 사용한다면 배포판 백포트가 포함된 패키지를 확인해야 하며, 버전 배너만으로는 백포트 여부를 알 수 없다는 점을 Hack The Box 정리도 강조하였다 6. 패치 후에는 PHP 워커를 반드시 재시작하거나 교체해야 하며, FPM 풀, Apache, 컨테이너, Supervisor 등 PHP를 로드하는 모든 프로세스를 대상으로 해야 한다.

5.2 패치가 즉시 어려운 경우의 임시 완화

CERT-EU는 패치가 불가능할 경우 인터넷에 노출된 애플리케이션을 공개 네트워크에서 격리하는 방안을 권고하였다 2. 임시 완화는 완전한 수정이 아니라는 전제가 중요하다.

대상 CVE

임시 완화

한계

CVE-2026-109618

php_admin_value로 memory_limit=-1을 강제하고, 풀·디렉터리·애플리케이션 설정이 유한 제한을 복원하지 않는지 확인한 뒤 워커 재시작 2

근본적인 할당 실패 경로는 남을 수 있으며, 제한 없는 할당은 가용성 위험을 높인다 2.

CVE-2026-109618

post_max_size를 낮게 설정하고, 웹 서버나 프록시에서 디코드된 요청 크기, multipart 파트 수, 헤더 수, 중첩 깊이를 제한 2

우회 가능성을 완전히 제거하지 못한다.

CVE-2026-109619

요청 파싱 전에 적용되는 php.ini, FPM 풀, 서버 설정에서 session.upload_progress.enabled=0으로 설정하고 워커 재시작 2

확인된 세션 경로는 차단하지만 다른 변형까지 막지 못한다 2. ini_set()과 .user.ini는 너무 늦다 2.

CVE-2026-109619, PHP 8.5

fatal_error_backtraces=0을 관리 방식으로 설정하고 워커 재시작 2

확인된 치명적 백트레이스 경로만 차단한다 2.

CVE-2026-115560

session.upload_progress.enabled=0으로 설정하고 워커 재시작 8

다음 정규 버그픽스 릴리스까지 유지해야 한다.

또한 RLIMIT_AS나 RLIMIT_DATA를 사용하면 취약한 할당 실패를 유발할 수 있으므로, 가용성 경계로는 컨테이너나 cgroup 메모리 제한을 사용하고 가능하면 해당 워커만 종료하는 정책을 적용하라는 권고가 있다 2.

5.3 침해 여부 점검

패치만 하고 끝내서는 안 된다. 공개 전부터 악용 시도가 보고되었기 때문에, 패치 전에 이미 침해가 발생했을 가능성을 검토해야 한다. 점검 대상은 다음과 같다.

5.4 런타임 강화

런타임 강화는 PHP2Shell 같은 런타임 취약점을 직접 막지 못하지만, 애플리케이션 침해 이후의 파급을 줄인다. 핵심은 애플리케이션 코드가 ini_set()으로 덮어쓰지 못하도록 php_admin_value와 php_admin_flag로 강제하는 것이다. Stack Harbor 런타임 강화 가이드는 php.ini 설정은 ini_set()으로 우회될 수 있지만 php_admin_*는 애플리케이션 코드에서 변경할 수 없다고 설명한다 17.

설정

권고

이유

disable_functions

exec, shell_exec, system, passthru, proc_open, popen 등 셸 실행 함수를 비활성화 17

엔진 수준에서 함수 테이블에서 제거되어 애플리케이션 코드가 호출할 수 없게 된다 17.

open_basedir

앱 디렉터리, /tmp, 필요한 공유 경로로 제한 17

파일 접근 범위를 제한하지만, 심볼릭 링크 우회와 일부 확장 우회 가능성을 고려해야 한다 17.

allow_url_fopen, allow_url_include

allow_url_include은 절대 켜지 않고, allow_url_fopen도 필요 없으면 Off 17

원격 파일 포함(RFI) 경로를 줄인다 17.

expose_php

Off 17

X-Powered-By에서 PHP 버전 노출을 제거한다 17.

세션

cookie_httponly=On, cookie_secure=On, cookie_samesite=Strict, use_strict_mode=On 17

세션 고정과 쿠키 탈취 위험을 줄인다 17.

리소스 제한

max_execution_time, post_max_size, upload_max_filesize, max_file_uploads를 업무에 맞게 제한 17

과도한 업로드와 장시간 실행으로 인한 DoS 및 악용 여지를 줄인다.

5.5 애플리케이션 보안 기본기

5.6 의존성과 공급망 관리

PHP 보안은 런타임만으로 끝나지 않는다. Composer 의존성은 별도 관리가 필요하다. composer audit는 composer.lock을 읽어 Packagist 보안 권고 데이터베이스와 비교하며, Composer 2.4부터 내장되었다 21. CI에서 composer audit를 게이트로 사용하고, 버려진 패키지도 함께 점검하는 것이 바람직하다. 2026년 5월에는 Packagist의 패키지 8개가 침해되어 악성 코드가 설치 과정에 실행되었다는 보고도 있었다 22. 따라서 의존성 업데이트를 자동화하되, 변경 내역과 권고 데이터베이스를 함께 검토해야 한다.

6. 운영 체크리스트

단계

확인 항목

1. 인벤토리

모든 서버, 컨테이너, 호스팅, 내장 PHP 제품에서 실제 동작 중인 PHP 버전과 SAPI를 확인한다.

2. 패치

해당 분기의 수정 버전으로 업데이트하고, 배포판 백포트가 있는지 확인한다.

3. 재시작

FPM, Apache, 컨테이너 등 PHP를 로드한 모든 워커를 재시작한다.

4. 세션 완화

session.upload_progress.enabled=0을 서버 설정으로 적용하고, CVE-2026-115560 조건에 해당하는 코드가 있는지 검색한다.

5. 침해 점검

10월 17일 이후 로그, 웹셸 파일, 프로세스 실행, 아웃바운드 연결을 검토한다.

6. 비밀값 교체

침해가 의심되면 자격 증명, API 키, 세션 비밀값을 교체한다.

7. 강화

php_admin_* 강제, disable_functions, open_basedir, 세션 쿠키, 업로드 검증을 적용한다.

8. 수명 주기

8.2 사용자는 2026년 12월 31일 보안 지원 종료 전에 8.3 이상으로 업그레이드 계획을 확정한다.

9. 지속 관리

composer audit, 의존성 업데이트, 로그 모니터링, WAF 규칙을 정기 운영에 편입한다.

Conclusion

최근 PHP 보안 이슈의 중심은 PHP2Shell이며, 이는 단순한 애플리케이션 버그가 아니라 PHP 런타임의 메모리 안전성 문제였다. 패치는 이미 제공되었고, CISA KEV 등재로 실제 악용 위험도 확인되었다. 그러나 패치만으로 충분하지 않다. 세션 업로드 진행과 관련된 후속 벡터, EOL 버전의 지원 종료, 의존성 공급망 위험까지 함께 관리해야 한다. 가장 현실적인 전략은 패치와 재시작을 즉시 수행하고, 침해 여부를 점검한 뒤, 런타임 강화와 애플리케이션 기본기를 지속 운영에 편입하는 것이다.

Sources

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

목록으로