1. 한 줄 요약: "로그인도 없이 서버를 열어젖히는 열쇠가 나왔다"
2026년 10월 21일, PHP에서 원격 코드 실행이 가능한 심각한 보안 취약점 2개가 공식 공개됐습니다. 별도의 로그인 절차 없이 서버에서 악성 코드를 실행할 수 있는 결함이고, 실제 공격 시도까지 포착되자 일부 기관과 기업은 웹사이트 운영을 일시 중단했습니다. 보안업계는 이 사태에 PHP2Shell이라는 이름을 붙였어요. PHP로 '쉘(shell, 서버 명령창)'을 딴다는 뜻이니, 이름부터 불길하죠.
2. 사건의 발단: 예고편은 있었는데, 스포일러가 먼저 터졌다
PHP 개발진은 치명적인 보안 업데이트를 21일 UTC 14시(한국 시간 23시)에 배포하겠다고 미리 알렸습니다. 해커 뉴스에서는 취약점 정보가 곧 공개된다는 유출 글이 올라왔다고 합니다.
원래 시나리오는 이랬어요.
- 패치 배포 시간을 미리 공지합니다.
- 서버 관리자들이 대비할 시간을 법니다.
- 정해진 시간에 패치와 상세 내용을 동시에 공개합니다.
그런데 공식 공개 전에 PoC 시연 영상과 패치가 적용된 바이너리가 먼저 유출됐고, 이를 바탕으로 한 PoC(공격 증명 코드)가 빠르게 퍼졌다고 합니다. PHP 재단은 일부 보안업체가 사전 합의를 일방적으로 어겼다며 공개 비판하기도 했습니다. 약속된 개봉 시간 전에 영화 결말이 SNS에 도배된 셈이에요. 😇
3. 도대체 무슨 취약점? (최대한 쉽게)
취약점은 2개이고, 둘 다 메모리 관리 실수라는 점이 공통점입니다. 두 취약점 모두 CVSS 9.2점(Critical)을 받았습니다.
① CVE-2026-109618: 짐 싸다 말고 뛰쳐나간 문제
PHP는 메모리가 초과되면 급히 현재 작업에서 빠져나옵니다. 그런데 할당한 컨텍스트가 완전히 초기화되기 전에 빠져나오면, 초기화되지 않은 메모리가 그대로 남아 원격 코드 실행으로 이어질 수 있습니다. 이사 짐을 싸다 말고 뛰쳐나갔는데, 그 방에 낯선 사람이 들어와 물건을 마음대로 쓰는 상황이라고 보면 됩니다.
② CVE-2026-109619: 이미 철거한 건물 주소로 택배가 온다 (Use-After-Free)
예외 처리 뒤에 전역 포인터가 이미 해제된 메모리 주소를 그대로 가리키고 있어서(댕글링 포인터) 원격 코드 실행이 가능해집니다. 폐업한 가게 주소가 간판에 남아 있는데, 그 자리에 다른 사람이 들어와 손님을 받는 격이죠.
4. 왜 이렇게 난리일까? "내 코드는 안전한데?"가 통하지 않는다
가장 무서운 점은 PHP 엔진 자체의 문제라는 겁니다. 애플리케이션 코드와 관계없이 PHP 버전만으로 영향을 받고, 인증 없이 원격 코드를 실행하거나 프로세스 메모리를 읽어낼 수 있습니다. 아무리 코드를 깔끔하게 짜도 소용이 없습니다.
- 영향 버전: PHP 8.2, 8.3, 8.4, 8.5가 영향을 받습니다. PHP 8.1 이하는 공식 지원이 끝났지만, 사안이 심각해 7.4, 8.0, 8.1용 최소 소스 패치가 별도로 공개됐습니다.
- 영향 환경: PHP-FPM, php-cgi는 물론 FrankenPHP, LiteSpeed 등 웹 요청을 처리하는 사실상 모든 운영 환경이 해당됩니다.
- "70%"의 의미: Cloudflare와 Wiz는 PHP가 전 세계 웹사이트의 약 70%에서 쓰인다고 설명했습니다. 70%가 전부 뚫린다는 뜻은 아니고, 그만큼 잠재적 파급력이 크다는 뜻이에요.
5. 사건의 진행: 점검 공지가 쏟아진 이틀
- 10월 21일: Cloudflare가 임시조치로 관련 WAF 규칙을 무료 플랜을 포함한 모든 이용자에게 열었고, 이미 초기 단계의 공격을 감지했다고 밝혔습니다.
- 10월 21일 밤 23시(KST): 취약점 상세 정보와 패치 버전이 공개됐습니다.
- 그 직후: 카페24와 가비아 같은 웹호스팅 업체가 긴급 패치 작업을 공지했고, 국내외 많은 사이트가 점검에 들어갔습니다.
- 10월 22일 12시: KISA가 사이버위기 경보 단계를 '관심'에서 '주의'로 올렸습니다.
- 해외: CERT-EU, 호주 ACSC, 일본 당국 등이 패치가 나오는 즉시 업데이트하라고 권고했습니다.
6. 우리 일상에 미친 영향: 게임 점검, 커뮤니티 먹통
나무위키 정리를 보면 일본 게임·서비스 쪽 점검이 특히 많았습니다. PHP를 많이 쓰는 일본과 유럽 사이트가 주로 영향을 받았고, 한국은 Java 비중이 높아 상대적으로 영향이 적다고 합니다. 그래도 국내 커뮤니티에는 파장이 있었어요. 디시인사이드는 이미지·동영상 업로드가 제한됐다가 순차적으로 복구됐고, 그누보드처럼 PHP 기반 솔루션을 쓰는 소규모 커뮤니티도 영향을 받았다고 합니다.
사소한 해프닝도 있었습니다. 일본의 'PHP문예문고'는 "그 PHP와 아무 관계가 없다"고 올렸다가, 자사 홈페이지가 PHP 기반이라 점검에 들어가면서 글을 정정했다고 합니다. 안타깝지만 웃음이 나오네요. 😅
낡은 PHP 버전을 쓰던 서비스 중에는 업데이트 비용을 감당하느니 아예 운영을 종료하는 사례도 나왔습니다. 업데이트를 미뤄온 대가가 이렇게 돌아온 거죠.
7. 지금 해야 할 일: 이것만은 꼭!
① PHP를 패치된 버전으로 업데이트하세요
수정 버전은 8.5.12, 8.4.27, 8.3.36, 8.2.35입니다. 업데이트 후에는 Apache나 PHP-FPM 같은 PHP 실행 서비스를 반드시 재시작해야 합니다. 설치만 하고 재시작을 안 하면 아직 구버전이 돌고 있을 수 있어요.
② 웹호스팅을 쓴다면 업체 공지부터 확인하세요
워드프레스나 그누보드를 호스팅에 올려 쓴다면 서버 PHP는 호스팅 업체가 관리합니다. 패치가 끝났는지 공지를 확인하세요.
③ 당장 패치가 어렵다면 임시 완화부터
- session.upload_progress.enabled를 0으로 바꾸고 모든 작업 프로세스를 재시작합니다.
- session.auto_start = On인 서버는 위 설정을 꺼도 취약한 것으로 확인됐으니 이 옵션도 함께 꺼야 합니다.
- 메모리 초과 쪽 취약점에는 memory_limit을 -1로 설정하고 post_max_size를 줄이는 방법이 권고됐습니다.
다만 이건 어디까지나 임시 방편입니다. 보안업체 Xint도 이를 부분 완화로 분류했어요.
④ WAF 같은 방어막을 켜두세요
Cloudflare처럼 관련 차단 규칙을 제공하는 WAF를 쓰면 패치까지 시간을 벌 수 있습니다.
⑤ 이미 뚫렸을 가능성도 점검하세요
이 취약점은 애플리케이션 아래 단계에서 동작해서 앱 로그에는 흔적이 거의 남지 않습니다. PHP와 웹서버 로그를 봐야 하고, 공격이 실패해도 흔적은 남습니다. 아래 징후를 확인해 보세요.
- 비정상적인 multipart 요청 직후 메모리 초과 에러나 HTTP 500이 반복되는 경우
- 응답의 PHPSESSID 쿠키 값이 비정상적으로 길거나 깨진 경우
- 원인 모를 PHP 워커 재시작이 급증한 경우
보안업체 스틸리언은 취약 여부를 확인할 수 있는 무료 온라인 점검 서비스(stealien.com/php2shell)를 내놨습니다. 내 사이트 주소를 넣고 한번 돌려볼 만합니다.
8. 이번 사태가 남긴 교훈
- "공개 시간 지켜주세요." 패치 공개 전에 분석 자료가 퍼지면 방어하는 쪽의 시간이 사라집니다.
- 지원 종료 버전은 시한폭탄입니다. 8.1 이하는 원래 보안 지원이 끝난 버전이라, 이번처럼 예외적 백포트가 없었다면 방법이 없었어요.
- "우리 코드는 안전하니까"는 통하지 않습니다. 런타임, 서버 같은 밑바닥 소프트웨어도 정기적으로 챙겨야 합니다.
- 자동 업데이트와 공지 구독을 켜두세요. 이번 사태에서는 몇 시간이 승부를 갈랐습니다.
- 백업은 오프라인에도 하나 더 두세요. 침해가 의심되면 비밀번호와 API 키 교체까지 고려해야 합니다.
📌 참고 자료
- PHP.net 보안 공지 (Critical remote code execution vulnerabilities, update now)
- The PHP Foundation 블로그 (Today's PHP Security Release, and How We're Strengthening PHP Security)
- KISA 보호나라 (PHP 제품 보안 업데이트 권고, 사이버위기 경보 단계 상향)
- Cloudflare 블로그 (PHP vulnerabilities WAF protection)
- Xint(Theori) PHP2Shell 긴급 대응 방안
- 스틸리언 PHP2Shell 점검 서비스: stealien.com/php2shell
- 카페24·가비아 PHP 긴급 보안 패치 공지
이 글은 2026년 10월 23일경까지의 보도를 바탕으로 작성되었으며, 상황은 계속 변할 수 있습니다.
'Web > JavaScript' 카테고리의 다른 글
| [Svelte] SvelteKit v3 (0) | 2026.10.09 |
|---|---|
| [Next.js] Layout으로 공통 화면 구성하기 (3) | 2024.02.17 |
| [Next.js] Routing using App Router (0) | 2024.02.04 |
| [Typescript] Module System (0) | 2023.08.09 |
| [Svelte] Template Syntax (1) | 2022.12.10 |
댓글