

PHP(PHP: Hypertext Preprocessor의 재귀 약자)는 주로 웹 개발에 사용되는 무료 오픈소스 서버 측 스크립팅 언어입니다. 웹 기술 추적 기관인 W3Techs에 따르면, PHP는 프로그래밍 언어를 식별할 수 있는 모든 웹사이트의 약 70%에서 실행되는 것으로 알려져 있습니다.
PHP2Shell은 PHP 인터프리터 자체의 두 가지 중대한 결함으로, 각각 CVSS v4.0 점수가 9.2입니다. 두 결함 모두 인증되지 않은 공격자가 애플리케이션 코드가 실행되기 전에 단일 또는 쌍의 웹 요청으로 웹 서버에서 코드를 실행할 수 있게 합니다.
- CVE-2026-109618은 PHP의 메모리 부족 처리를 악용합니다.
- CVE-2026-109619는 동일한 워커에서 이전의 실패한 요청으로부터 남겨진 상태를 악용합니다.
버그가 WordPress, Drupal 또는 Magento가 아닌 PHP 자체에 있기 때문에, 영향을 받는 서버의 모든 도달 가능한 PHP 엔드포인트(로그인 페이지, 정적 양식 및 상태 확인 포함)가 노출됩니다.
지난 10년간의 모든 PHP 릴리스가 영향을 받습니다(5.4까지 거슬러 올라갑니다). 수정된 버전은 8.5.12, 8.4.27, 8.3.36, 8.2.35입니다. PHP 8.1 이상은 최소한의 소스 백포트만 제공됩니다.
PHP2Shell 공개 타임라인
두 가지 중대한 PHP 취약점인 CVE-2026-109618과 CVE-2026-109619는 비공개 연구에서 활발한 악용까지 며칠 만에 진행되었습니다. 다음은 사건의 타임라인입니다.
- 2026년 8월: Calif는 LLM 지원 감사 중에 첫 번째 원격 코드 실행(RCE) 경로를 발견하고 PHP에 보고합니다. Wiz는 독립적으로 결함을 발견하고 PHP에 보고합니다.
- 2026년 10월 초: Cloudflare는 웹 애플리케이션 방화벽(WAF) 보호 구축을 시작합니다.
- 2026년 10월 17일: AWS는 계획된 조정된 공개 4일 전 Amazon MadPot에 대한 첫 번째 알려진 악용 시도를 보고합니다.
- 2026년 10월 20일: PHP의 두 가지 중대한 원격 코드 취약점인 CVE-2026-109618과 CVE-2026-109619의 세부 정보가 PHP 재단에서 계획한 2026년 10월 22일 조정된 공개 전에 유출되었습니다.
- 2026년 10월 21일: PHP 재단은 취약점을 조기에 공식 공개하고 모든 사용자에게 업데이트를 권고합니다. 영향을 받는 소프트웨어 버전에 대한 긴급 업데이트는 같은 날 나중에 배포됩니다.
- 2026년 10월 21일 이후: 연구원들이 광범위한 악용 시도를 보고합니다.
환경에서 PHP2Shell 활동을 검색하는 방법은?
Sumo Logic을 사용하여 PHP2Shell 활동을 검색해 보겠습니다. 각 활동 유형에 대해 두 가지 검색을 찾을 수 있습니다. 하나는 다양한 유형의 원본 로그에 대한 검색이고, 다른 하나는 정규화된 레코드에 대한 검색입니다. Sumo Logic Cloud SIEM을 사용하는 고객의 경우입니다.
시작하기 전에 두 가지 참고 사항이 있습니다.
- 원본 로그 검색은 조정이 필요합니다. 원본 로그 검색 예제에는 Apache 액세스 로그와 같은 로그 소스 유형에 특정한 구문 분석 작업이 포함됩니다. 또한 로그 소스를 온보딩할 때 할당하는 로그 분류(예:
_sourceCategory=linux/system webserver)로 범위를 지정합니다. 여기에 포함된 원본 로그 검색 예제를 사용하려면 환경에 맞게 사용자 정의해야 할 가능성이 높습니다. - 레코드 검색은 작성된 그대로 작동합니다. Sumo Logic Cloud SIEM 정규화된 스키마를 기반으로 하므로 수정 없이 사용할 수 있습니다.
이러한 검색은 초기 악용 후 웹 서버의 동작을 찾습니다. 악용 페이로드를 포함할 수 있는 HTTP 트랜잭션을 검색하지 않습니다. 많은 경우 웹 애플리케이션 방화벽과 같은 보안 제품이 인터넷에 노출된 웹 서버 “앞에” 있으며, 이러한 제품은 HTTP 분석을 사용한 웹 서버 악용 주변에 자체 탐지 세트를 갖게 됩니다. 이러한 제품의 텔레메트리는 상관관계, 경고 및 추가 분석을 위해 Sumo Logic으로 수집되어야 합니다.
이 블로그의 탐지 엔지니어링 초점은 초기 악용 및 성공적인 공격으로부터의 후속 활동과 관련된 웹 서버의 동작 관찰에 있습니다. 이러한 관찰은 다른 보안 제품의 텔레메트리와 상관관계를 지을 수 있습니다.
웹 서버 오류의 급증을 찾으세요
PHP2Shell 취약점은 PHP 오류 처리의 결함에서 비롯되므로 악용 시도는 웹 서버의 오류로 표시됩니다. Sumo Logic의 timeslice 검색 연산자를 사용하면 웹 서버의 오류 활동에 급증이 있었는지 쉽게 평가할 수 있습니다.
아래 예제에서는 시간당 서버 측 오류(500-599 범위의 HTTP 응답 코드를 생성하는 오류) 수를 계산합니다. 결과에서 급증을 시각적으로 스캔할 수 있습니다.
예제 1: (Syslog 래핑된) Apache 액세스 로그
(_sourceCategory=linux/system webserver_system=apache webserver_farm=* OR _sourceCategory=linux/syslog) httpd-access HTTP (50* OR 51* OR 52* OR 53* OR 54* OR 55* OR 59*)
| parse "httpd-access: *" as mesg nodrop
| parse regex field=mesg "^(?<src_ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(?<vhost>\S+)" nodrop
| parse regex field=mesg "\"(?<method>[A-Z]+)\s(?<uri>\S+)\sHTTP\/[\d\.]+\"\s(?<status_code>\d+)\s(?<size>[\d-]+)" nodrop
| where !isNull(status_code) and status_code >= 500 and status_code <= 599
| timeslice 1h
| count by _timeslice, _sourceHost
| sort by _timeslice, _count desc
예제 2: Sumo Logic Cloud SIEM 레코드
아래 쿼리는 배포에서 web_servers 또는 http_servers 표준 일치 목록이 생성되고 채워져 있는지 여부에 따라 달라집니다.
_index=sec_record*
| where http_response_statusCode >= 500 and http_response_statusCode <= 599
| where jsonArrayContains(listMatches, "web_servers") or jsonArrayContains(listMatches, "http_servers")
| timeslice 1h
| count by _timeslice, dstDevice_ip
| sort by _timeslice, _count desc

그림 1: 웹 서버 오류 활동 급증
웹 서버 프로세스가 셸을 생성하는 경우 식별
공격자가 PHP2Shell을 성공적으로 악용하면 웹 서버 또는 PHP 프로세스의 자식 프로세스를 통해 악성 코드를 실행할 수 있습니다. 아래 쿼리는 Windows 및 Linux 환경 모두에서 전체 OS 셸을 시작하는 일반적인 웹 서버 프로세스를 식별합니다.
예제 1: Windows 프로세스 로그
_sourceCategory ="windows/eventlogs"
| parse "<EventID>*</EventID>" as eventId
| where eventId = "4688"
| parse "<Data Name='ParentProcessName'>*</Data>" as parentBaseImage nodrop
| parse "<Data Name='NewProcessName'>*</Data>" as baseImage nodrop
| parse "<Data Name='CommandLine'>*</Data>" as commandLine nodrop
| parse "<Data Name='SubjectUserName'>*</Data>" as user_username nodrop
| parse "<Data Name='SubjectDomainName'>*</Data>" as user_domain nodrop
| parse regex "<Computer>(?<device_hostname>[^<]+)</Computer>" nodrop
| where parentBaseImage matches /(?i).*(w3wp\.exe|httpd\.exe|nginx\.exe|php-cgi\.exe|tomcat\.exe)$/
| where baseImage matches /(?i).*(cmd\.exe|powershell\.exe|bitsadmin\.exe|pwsh\.exe|powershell_ise\.exe)$/
| fields device_hostname, user_domain, user_username, parentBaseImage, baseImage, commandLine
예제 2: Sumo Logic Cloud SIEM 레코드
_index=sec_record*
| where parentBaseImage matches /(?i).*(w3wp\.exe|httpd\.exe|nginx\.exe|php-cgi\.exe|tomcat\.exe|\/httpd|\/nginx|\/php-cgi|\/tomcat|\/apache2|\/apache)$/
| where baseImage matches /(?i).*(cmd\.exe|sh\.exe|bash\.exe|powershell\.exe|bitsadmin\.exe|pwsh\.exe|powershell_ise\.exe|\/bash|\/sh|\/dash|\/zsh|\/ksh|\/csh|\/python3?|\/perl)$/
| fields device_hostname, device_ip, user_username, parentBaseImage, baseImage, commandLine

그림 2: nginx에서 시작된 셸 찾기
웹 서버 프로세스가 일반적인 웹 셸 명령을 실행하는 경우 찾기
웹 서버는 전체 OS 셸을 통하지 않고 셸 명령을 직접 실행할 수도 있습니다. 아래 쿼리는 웹 서버 프로세스의 자식 프로세스로 실행되는 일반적인 검색, 자격 증명 수집 및 유출 명령을 식별합니다.
예제 1: Windows 프로세스 로그
_sourceCategory ="windows/eventlogs"
| parse "<EventID>*</EventID>" as eventId
| where eventId = "4688"
| parse "<Data Name='ParentProcessName'>*</Data>" as parentBaseImage nodrop
| parse "<Data Name='NewProcessName'>*</Data>" as baseImage nodrop
| parse "<Data Name='CommandLine'>*</Data>" as commandLine nodrop
| parse "<Data Name='SubjectUserName'>*</Data>" as user_username nodrop
| parse "<Data Name='SubjectDomainName'>*</Data>" as user_domain nodrop
| parse regex "<Computer>(?<device_hostname>[^<]+)</Computer>" nodrop
| where parentBaseImage matches /(?i).*(w3wp\.exe|httpd\.exe|nginx\.exe|php-cgi\.exe|tomcat\.exe|apache).*/
| where commandLine matches /(?i).*(whoami|net user |ping |systeminfo |netstat |arp -a|ipconfig |ifconfig |curl |wget ).*/
| fields device_hostname, user_domain, user_username, parentBaseImage, baseImage, commandLine
예제 2: Sumo Logic Cloud SIEM 레코드
_index=sec_record*
| where parentBaseImage matches /(?i).*(w3wp\.exe|httpd\.exe|nginx\.exe|php-cgi\.exe|tomcat\.exe|apache|\/httpd|\/nginx|\/php-cgi|\/tomcat|\/apache2).*/
| where commandLine matches /(?i).*(whoami|net user |ping |systeminfo |netstat |arp -a|ipconfig |ifconfig |curl |wget |id |uname |cat \/etc\/passwd|nc -).*/
| fields device_hostname, device_ip, user_username, parentBaseImage, commandLine

그림 3: Internet Information Server의 자식 프로세스로 실행되는 원격 wget 명령
Sumo Logic Cloud SIEM 탐지
Sumo Logic Cloud SIEM에는 웹 셸 활동을 탐지하고 PHP2Shell에 의해 성공적으로 악용된 웹 서버를 식별하는 데 도움이 되는 여러 기본 제공 규칙이 있습니다. 규칙의 탐지 이론은 위에서 설명한 쿼리와 동일합니다. 즉, 웹 서버 프로세스의 비정상적인 자식 프로세스와 웹 서버의 오류율 급증입니다.
다음 탐지를 통해 잠재적 침해를 조사할 수 있습니다.
| Cloud SIEM 규칙 ID | 규칙 이름 |
|---|---|
| MATCH-S00164 | 웹 서버에서 생성된 의심스러운 셸 |
| MATCH-S00174 | 일반적인 웹 셸 명령을 실행하는 웹 서비스 |
| MATCH-S00539 | 의심스러운 프로세스를 실행하는 웹 서버* |
| OUTLIER-S00036 (신규) | 소스 IP의 HTTP 서버 오류 급증 |
| OUTLIER-S00037 (신규) | 대상 IP의 HTTP 서버 오류 급증 |
앞서 언급했듯이 CHAIN 규칙을 생성하여 성공적인 PHP2Shell 악용에 대한 더 높은 충실도의 탐지를 구축할 수 있습니다. CHAIN 규칙은 엔티티에 대한 PHP2Shell의 엣지 디바이스 관찰(예: WAF 알림)을 위의 표에 있는 웹 셸 탐지 로직과 연관시킵니다.
이러한 규칙을 사용하려면 표준 매치 리스트를 생성하고 채워야 합니다. MATCH-S00539는 “web_servers” 매치 리스트를 사용하여 웹 서버의 프로세스 실행으로 탐지 범위를 제한합니다.
OUTLIER-S00036 및 OUTLIER-S00037은 서버 측 오류를 추적하기 위해 “web_servers” 또는 “http_servers” 매치 리스트가 필요합니다. 매치 리스트를 생성하고 채우는 방법을 알아보세요.
PHP2Shell 수정 및 완화 권장 사항
PHP 그룹의 지침은 명확합니다. 지금 업데이트하세요.
“위험에 처한 대상: 웹 요청을 제공하는 모든 PHP 설치(PHP-FPM, mod_php가 포함된 Apache, php-cgi, FrankenPHP 및 LiteSpeed 포함). 특히 mod_php의 위험이 가장 높으며, 인증되지 않은 요청이 애플리케이션 코드가 실행되기 전에 공격을 트리거할 수 있는 악용이 입증되었습니다.” PHP 그룹의 전체 공지사항을 여기에서 읽어보세요.
커뮤니티 분석에 따르면 성공적인 악용으로 공격자는 웹 서버 사용자 컨텍스트에서 명령 실행 권한을 얻을 수 있습니다. 이를 통해 웹 셸을 배포하고, 구성 파일에서 API 및 데이터베이스 자격 증명을 수집하며, 내부 네트워크로 이동할 수 있습니다.
즉시 업데이트하는 것이 권장됩니다. 아직 업데이트할 수 없다면 위의 검색 및 탐지를 사용하여 영향을 받는 서버에서 성공적인 악용을 나타내는 악용 후 활동을 모니터링하세요.
아직 Cloud SIEM을 사용하지 않고 있으며 이러한 위협을 탐지하고 대응하는 데 어떻게 도움이 될 수 있는지 알고 싶다면 데모를 예약하여 자세히 알아보세요.
참고 자료 및 추가 리소스
NIST 취약점 정보
PHP의 지침
사이버 보안 커뮤니티 리소스 및 보고서
- https://calif.io/php2shell/
- https://www.wiz.io/blog/php2shell-php-rce
- https://www.huntress.com/blog/php2shell-leaked-critical-php-vulnerabilities
- https://www.crowdstrike.com/en-us/blog/crowdstrike-protects-customers-from-php-rce-zero-days/
- https://thehackernews.com/2026/10/someone-tried-to-exploit-php2shell-4.html
- https://openai.com/index/coordinated-disclosure-of-critical-vulnerabilities/
- https://aws.amazon.com/blogs/security/amazon-threat-intelligence-identifies-php2shell-exploitation-prior-to-public-disclosure-in-madpot/
- https://blog.checkpoint.com/security/php2shell-what-we-know-about-the-leaked-critical-php-vulnerabilities-cve-2026-109618-cve-2026-109619/
- https://blog.cloudflare.com/php-vulnerabilities-waf-protection
- https://research.jfrog.com/post/php2shell-all-you-need-to-know-about-cve-2026-109618-and-cve-2026-109619/
- https://www.reuters.com/technology/what-is-php-why-did-it-take-government-websites-offline-2026-10-21/



