— PHP부터 React·Next.js(React2Shell)까지, 웹 프레임워크의 ‘입구’를 노리는 최신 공격과 완벽 대응 가이드
“우리 회사는 프론트엔드에 React와 Next.js를 쓰고 있어 PHP와는 무관한데, 왜 PHP2Shell 취약점을 알아야 할까요?”
지난 2026년 10월 21일, 전 세계 웹 생태계를 지탱하는 PHP 엔진에서 치명적인 원격 코드 실행(RCE) 취약점인 PHP2Shell(CVE-2026-109618, CVE-2026-109619)이 공개되었습니다. 흥미로운 점은 이 취약점이 발표된 직후, PHP를 전혀 사용하지 않는 수많은 React·Next.js 및 Java 기반 웹 서비스에도 관련 공격 패킷이 무차별적으로 쏟아졌다는 사실입니다. 심지어 이 공격 패킷 속에는 Next.js 환경을 노리는 React2Shell(CVE-2025-55182) 공격 구문까지 함께 들어 있었습니다.

[그림 1] 자동화 스캐닝 봇 – 대상 서버의 기술 스택을 가리지 않고 공격 패킷을 동시에 던지는 자동화 스캐닝 봇
이번 글에서는 먼저 PHP2Shell이 어떻게 개발자의 코드가 실행되기도 전에 서버를 장악하는지 알기 쉽게 파헤쳐 봅니다. 나아가 우리에게 익숙한 React·Next.js 환경을 위협하는 React2Shell 취약점과 무차별 스캐너를 어떻게 원천 차단할 수 있는지 실무 방어 전략을 상세히 공유합니다.
1. PHP2Shell이란 무엇인가? (내 코드가 안전해도 뚫리는 이유)
과거의 웹 해킹은 주로 개발자가 짠 코드의 빈틈을 노렸습니다. 예를 들어 게시판에 이미지 파일 대신 해킹 프로그램(웹셸)이 올라가도록 검사를 빼먹은 경우가 대표적입니다.
하지만 PHP2Shell은 개발자가 만든 코드가 아니라, PHP 엔진 자체의 설계 결함입니다.
건물 보안에 비유해 보겠습니다. 예전 해킹이 사무실 안쪽의 잠기지 않은 문(개발자 코드)을 열었다면, PHP2Shell은 1층 로비 안내 데스크 직원(PHP 엔진)이 방문객의 택배 상자(HTTP 요청)를 뜯어보다가 과부하로 쓰러진 틈을 타 건물 마스터키를 훔치는 것과 같습니다.
| 구분 | CVE-2026-109618 | CVE-2026-109619 |
|---|---|---|
| 핵심 원인 | 메모리 부족(OOM) 발생 시 비정상 탈출 및 미초기화 데이터 정리 중 손상 | 미처 지우지 못한 이전 요청의 전역 포인터(메모리) 재참조 |
| 취약점 분류 | 예외 처리 결함 (CWE-755) | Use-After-Free (CWE-416) |
| 위험도 | CVSS v4.0 9.2 (Critical) | CVSS v4.0 9.2 (Critical) |
| 패치 완료 버전 | PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 | PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 |
두 취약점 모두 메모리 고갈(OOM)로 인한 비상 탈출에서 시작되며, 당해 요청이 종료되는 시점에 바로 메모리 손상이 발생하느냐(CVE-2026-109618), 아니면 정리 루틴이 생략되어 남은 기록을 다음 요청에서 재참조하느냐(CVE-2026-109619)로 구분됩니다. 실제 해킹에서는 두 결함이 맞물려 1단계(직원을 쓰러뜨림)와 2단계(남아 있는 기록을 훔침)로 이어지는 하나의 공격 사슬로 작동합니다.
2. PHP2Shell 동작 원리: 식당 테이블로 이해하는 3단계 공격
PHP 서버는 성능을 높이기 위해 한 명의 담당 직원(Worker 프로세스)이 여러 손님(HTTP 요청)을 순서대로 계속 맞이하는 구조로 일합니다. 공격자는 바로 이 점을 노려 세 단계로 서버를 속입니다.

[그림 2] PHP2Shell 3단계 메모리 공격 흐름 – 첫 번째 요청으로 메모리 정리를 방해하고, 두 번째 요청에서 제어권을 빼앗는 PHP2Shell의 핵심 흐름
1단계: 겹겹이 포갠 빈 상자로 직원 멘탈 터뜨리기 (CVE-2026-109618)
공격자는 빈 상자 안에 작은 상자를 수십 겹으로 포갠 것처럼 복잡하게 얽힌 데이터(files[a][b][c]…)를 보냅니다.
- 전송된 데이터 크기는 작지만, PHP 직원이 이 상자를 하나씩 풀어서 정리하다 보면 순식간에 허용된 메모리 한계(memory_limit)를 넘기게 됩니다.
- 메모리가 바닥나면 직원은 하던 일을 즉시 멈추고 비상 탈출(zend_bailout)을 해버립니다.
2단계: 치우다 만 테이블 기록 방치하기 (Dangling Pointer 발생)
문제는 직원이 너무 급하게 비상 탈출을 하느라, 원래 손님이 나갈 때 지웠어야 할 수첩 기록(전역 상태 포인터)을 지우지 못하고 그대로 남겨둔다는 점입니다.
- 첫 번째 요청이 끝나면서 테이블 위의 음식(실제 메모리 데이터)은 치워졌습니다.
- 하지만 직원의 수첩에는 여전히 “1번 테이블에 손님의 주문서(PS(id) 등)가 놓여 있음”이라고 잘못 적혀 있습니다.
3단계: 빈자리에 가짜 명령서를 올려 제어권 빼앗기 (CVE-2026-109619)
공격자는 곧바로 두 번째 손님으로 위장해 같은 직원에게 들어갑니다.
- 그리고 방금 비워진 1번 테이블 자리에 자신이 조작한 가짜 시스템 명령서를 슬쩍 올려놓습니다.
- 직원은 수첩에 적힌 옛날 기록만 믿고 1번 테이블의 가짜 명령서를 정상 데이터로 착각해 그대로 실행합니다. 로그인도 없이 서버 제어권(RCE)이 넘어가는 순간입니다.
3. 왜 React·Next.js 서버에도 이 공격이 들어올까? (feat. React2Shell)
그렇다면 PHP를 쓰지 않는 우리 서비스에는 왜 이 시점에 공격 요청이 늘어났을까요? 최근의 해킹 봇(Scanner)은 “상대방이 무엇으로 만들어졌는지 확인하고 공격하는 것”이 아니라, “유행하는 모든 공격 도구를 한 바구니에 담아 무차별로 던지고 보는 방식”으로 움직이기 때문입니다.
실제로 대형 취약점이 공개될 때마다 웹 서버 앞단에 찍히는 자동화 봇의 공격 세트는 놀라울 정도로 일정한 패턴을 보입니다.
- 프레임워크 입구 찔러보기 (React2Shell & PHP2Shell): 대상 서버가 Next.js인지 PHP인지 구분하지 않고, React 서버 컴포넌트를 노리는 위조 요청과 PHP 설정 확인 페이지(/phpinfo.php 등) 탐색을 동시에 던집니다.
- 환경 설정 파일 훑기 (.env 탐색): 프레임워크별 폴더 경로(/.env, /next/.env, /laravel/.env, /api/.env 등)를 사전에 등록해 두고 짧은 시간 안에 수백 번씩 찔러봅니다.
- 클라우드 열쇠 찾기: 구글 클라우드나 AWS, 파이어베이스의 인증 키 파일(service-account.json, .git/config 등)이 실수로 열려 있는지 확인합니다.
React·Next.js 개발자가 꼭 알아야 할 ‘React2Shell (CVE-2025-55182)’
특히 자동화 봇들이 PHP2Shell 정찰과 함께 단골로 던지는 공격이 바로 React2Shell(CVE-2025-55182)입니다.
2025년 12월에 공개된 이 취약점은 React 서버 컴포넌트(RSC)의 원격 코드 실행 취약점입니다. Next.js 등에서 화면과 서버가 통신할 때 쓰는 서버 액션 헤더(Next-Action)를 가짜 값으로 위조하고, 기형적으로 부풀린 본문 데이터를 함께 전송하는 방식을 씁니다.
흥미롭게도 PHP2Shell과 React2Shell은 공격 철학이 똑같습니다.
- PHP2Shell: 개발자 코드가 실행되기 전, PHP 엔진이 멀티파트 폼 데이터를 해석하는 입구를 공격합니다.
- React2Shell: 비즈니스 로직이 실행되기 전, React 서버가 Next-Action 헤더와 직렬화된 데이터를 해석하는 입구를 공격합니다.
즉, 요즘 공격자들은 개발자가 짠 로그인이나 권한 체크 로직을 정면으로 뚫으려 하지 않고, 프레임워크가 데이터를 읽어 들이는 ‘번역기(Parser)’ 자체를 망가뜨려 서버 권한을 훔치는 데 집중하고 있습니다.
4. 취약점을 완벽히 피하는 실무 방어 전략
원리를 알았으니 이제 우리 서비스를 지킬 차례입니다. React·Next.js 환경과 PHP 환경, 그리고 공통 인프라에서 즉시 적용해야 할 방어법을 정리했습니다.

[그림 3] 웹 서버 3단계 다계층 방어 전략 – 스캐너의 정찰부터 런타임 취약점 악용까지 단계별로 끊어내는 다계층 방어 구조
① React·Next.js 환경을 위한 방어 (React2Shell 및 스캐너 차단)
React와 Next.js를 도입해 운영하는 웹 서비스 환경이라면 아래 사항을 반드시 점검해야 합니다.
- 프레임워크 보안 패치 유지: CVE-2025-55182(Next.js 관련 CVE-2025-66478 포함) 패치가 완료된 최신 안정 버전의 React 및 Next.js 패키지로 업데이트합니다. 특히 Next.js는 React를 프레임워크 내부에 직접 내장(Vendoring)하므로 일반 의존성 스캐너가 취약 버전을 놓칠 수 있어 Next.js 자체 버전을 반드시 확인해야 합니다.
- 사용하지 않는 Next-Action 요청 차단: 프로젝트에서 Next.js의 서버 액션(Server Actions) 기능을 전혀 쓰지 않고 별도의 백엔드 API(Spring Boot 등)와 통신한다면, 외부에서 들어오는 Next-Action 헤더 요청은 100% 공격 또는 스캐닝입니다. 앞단 프록시나 Next.js 미들웨어에서 이를 즉시 차단하도록 설정합니다.

② PHP 운영 환경을 위한 방어 (PHP2Shell 원천 차단)
사내 레거시 시스템이나 외부 홈페이지 등에서 PHP를 운영 중이라면 다음 조치가 필수입니다.
- 엔진 보안 업데이트 및 재시작 (최우선): 패치가 완료된 PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 이상 버전으로 즉시 업데이트합니다. 업데이트 후에는 반드시 php-fpm이나 웹 서버를 재시작해야 메모리에 새 엔진이 올라갑니다.
- php.ini 설정으로 공격 연결고리 끊기: 당장 업데이트가 어렵다면, 공격자가 수첩 기록을 남길 때 악용하는 업로드 진행률 기능을 끄고 상자 겹쳐 쌓기 횟수를 줄여야 합니다.

③ 앞단 웹 서버(Nginx·WAF)에서 스캐너 입구컷 하기
자동화 봇이 짧은 시간에 수백 번씩 .env나 phpinfo.php를 찔러보는 것을 애플리케이션 서버까지 도달하게 두면 불필요한 서버 자원이 낭비됩니다. 가장 앞단에 있는 Nginx나 클라우드 웹 방화벽(WAF)에서 정찰 요청과 과도한 요청 빈도(Rate Limit)를 먼저 잘라내는 것이 좋습니다.

5. 마치며: 우리 서비스의 기술 스택만 보지 않는 공격자들
이번 PHP2Shell 사태와 React2Shell 스캐닝 사례가 주는 메시지는 명확합니다. 공격자는 우리 회사가 PHP를 쓰는지, React·Next.js를 쓰는지, 혹은 Spring Boot를 쓰는지 친절하게 확인한 뒤에 공격하지 않습니다.
“우리는 PHP 안 쓰니까 괜찮아”라고 넘기기보다, 새로운 취약점 경보가 울렸을 때 우리 웹 서버 앞단에는 어떤 정찰 패킷이 들어오고 있는지 점검하고, 프레임워크의 버전과 입구 방어선을 최신 상태로 유지하는 것이 가장 확실한 보안 전략입니다. 당사는 앞으로도 최신 보안 위협을 빠르게 분석하여 더욱 안전하고 신뢰할 수 있는 서비스 환경을 만들어 나가겠습니다.
6. 참고 자료 (References)
- PHP2Shell (CVE-2026-109618 / CVE-2026-109619) 관련 자료
- PHP Official GitHub Security Advisory: [GHSA-w8hw-w9fx-j79w](https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w) & [GHSA-6wmf-4rv5-p3rp](https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp) (2026. 10. 21)
- 미국 사이버보안 및 인프라 보안국(CISA): [Known Exploited Vulnerabilities (KEV) Catalog – CVE-2026-109618 / CVE-2026-109619](https://www.cisa.gov/news-events/alerts/2026/10/26/cisa-adds-two-known-exploited-vulnerabilities-catalog) (2026. 10. 26)
- Calif & Wiz Research: [PHP2Shell: A tale of two PHP remote vulnerabilities](https://calif.io/php2shell/) (2026. 10. 21)
- AhnLab ASEC 블로그: [PHP2Shell (CVE-2026-109618, CVE-2026-109619) 원격 코드 실행 취약점 분석 및 탐지](https://asec.ahnlab.com/ko/95955/) (2026. 10)
- React2Shell (CVE-2025-55182) 및 웹 프레임워크 보안 자료
- National Vulnerability Database (NVD) & React2Shell Advisory: [CVE-2025-55182 (CVE-2025-66478) React Server Components RCE Detail](https://react2shell.com/) (2025. 12)
- 한국인터넷진흥원(KISA) 보호나라: [보안 권고문 및 웹 서버 취약점 점검 가이드](https://www.boho.or.kr/)