DXCMS PHP2Shell 대응 패치 내역
v4 (2026-10-22): 공유 호스팅에서 업로드가 막힌 사례가 보고되어 자동 적용을 기본 꺼짐으로 바꾸고, 형식 검사를 선택 기능으로 낮추고, 적용 직후 실제 업로드 시험과 자동 해제를 추가했습니다. 원인은 아직 확정되지 않았습니다(5절 참고).
작성일: 2026-10-22 · 대상: DXCMS (PHP 5.6 ~ 8.x) · 배포 파일: dxcms-php2shell-emergency.zip
1. 배경과 근거
2026-10-21 PHP 공식 보안 공지로 두 취약점이 공개되었습니다.
| 항목 | CVE-2026-109618 | CVE-2026-109619 |
|---|---|---|
| 공식 권고문 | GHSA-w8hw-w9fx-j79w | GHSA-6wmf-4rv5-p3rp |
| 제목 | OOM(메모리 부족) 손상을 통한 원격 코드 실행 | 남은 전역 상태를 통한 원격 코드 실행 |
| 심각도 | CVSS 4.0 9.2 | CVSS 4.0 9.2 |
| 원인 | 메모리 부족을 longjmp()로 처리하면서 요청 메모리가 반쯤 초기화된 채 남음 |
워커의 전역 변수가 해제된 요청 메모리를 가리킨 채 남음 |
| 공격 경로 | 비정상 multipart/form-data 요청 (길이 정보 없음/사용 불가, 파트별 헤더 무제한, 빈 파일 필드, 깊은 중첩 필드명) | PHP 8.5의 fatal_error_backtraces, 세션 업로드 진행(session.upload_progress) |
| 가장 위험한 환경 | Apache mod_php (완전한 원격 코드 실행 검증) | mod_php, PHP-FPM 모두 확인 |
| PHP-FPM | 요청 시작 실패 시 워커 종료, 완전한 공격은 제시되지 않음 | upload_progress 경로 확인 |
공식 수정 버전: 8.2.35, 8.3.36, 8.4.27, 8.5.12 (php.net ChangeLog 8.5.12)
공식 결론: 완전한 해결은 PHP 업그레이드뿐입니다. 아래 설정은 일부 경로만 줄이는 보조 수단입니다.
지원 종료 버전 (8.1 이하, 5.6 포함)
공식 권고문은 8.2 이상만 영향 범위로 확인했습니다. 8.1 이하는 PHP가 더 이상 수정하지 않으며, 영향 여부가 공식적으로 확인되지 않았습니다. 같은 구조가 있을 가능성은 있으나 확인된 사실은 아닙니다. 따라서 영향이 있다고 가정하고 대응하는 것이 안전합니다. 배포판·호스팅 업체가 백포트 패치를 냈는지 확인하세요.
2. 정정 사항
초기에 "설정으로는 완화할 수 없다"고 판단했던 것은 언론 기사만 보고 한 잘못된 판단이었습니다. 공식 권고문(GHSA-6wmf-4rv5-p3rp)은 session.upload_progress.enabled=0을 CVE-2026-109619의 부분 완화로 명시합니다. 단, CVE-2026-109618은 이 설정으로 막히지 않습니다.
3. 변경된 파일
| 파일 | 내용 |
|---|---|
core/Php2Shell.php |
판정·완화 로직 전체 (클래스 DxPhp2Shell) |
admin/security-emergency/index.php |
관리자 화면 (긴급 보안) |
extend/top/06_php2shell.php |
부팅 시 자동 보호 호출, 관리자 상단 배너, 사이드바 메뉴 |
4. 기능 상세
4.1 버전 판정 (공식 목록 내장)
- 내장 수정 버전: 8.2.35 · 8.3.36 · 8.4.27 · 8.5.12. 관리자가 직접 입력할 필요가 없습니다.
- 새 계열(8.6 등)은 관리자 화면 "새 수정 버전 추가"에서 입력할 수 있습니다.
- 판정 결과
| 상태 | 의미 |
|---|---|
| patched (수정 버전 사용 중) | 해당 계열의 수정 버전 이상 |
| vulnerable | 8.2~8.5 중 수정 버전 미만 |
| eol | 8.1 이하. 업스트림 수정 없음, 영향 여부는 공식 확인 범위 밖 |
| unknown | 목록에 없는 더 높은 계열 |
- 종합 표시:
ok/exposed(업그레이드 필요) /partial(upload_progress만 꺼져 있어 일부 경로만 완화) /eol/unknown - 취약 버전은 완화를 켜 두어도 "안전"으로 표시하지 않고 "업그레이드 필요(일부 경로만 완화)"로 표시합니다.
- 5.6~9.0 사이 17개 버전으로 판정표를 검증했습니다 (수정 버전 직전은 취약, 수정 버전은 패치됨, 8.1 이하는 eol).
4.2 실행 방식별 위험 안내
권고문에 적힌 내용만 요약해 표시합니다. 실행 방식(mod_php / PHP-FPM·CGI·IIS FastCGI / 기타)에 따라 위험 수준과 문구가 달라집니다. 권고문에서 검증되지 않은 방식은 "판단할 수 없으니 업그레이드하세요"로 표시합니다.
4.3 권고문이 언급한 설정값 표시
memory_limit, post_max_size, max_input_vars, max_input_nesting_level, max_file_uploads, session.upload_progress.enabled, fatal_error_backtraces, log_errors의 현재 적용값을 보여 줍니다. 서버마다 적정값이 달라 자동으로 바꾸지 않습니다.
4.4 적용 방식 (v4: 관리자가 "적용"을 눌러야 켜짐)
v3까지는 설치만 하면 자동으로 서버 파일을 수정했습니다. 공유 호스팅(cafe24)에서 파일 업로드가 막혔다는 보고가 있었고, 서버마다 부작용을 예측할 수 없어 v4부터 새로 적용하는 것은 관리자가 "적용"을 눌렀을 때만 합니다.
- 이미 이 모듈의 블록이 있는 사이트는 최신 정의로 자동 갱신됩니다. 이전 버전의 더 공격적인 규칙(형식 검사)은 이때 제거됩니다.
- 적용 대상: Apache 계열(
.htaccess), PHP-FPM·CGI(.user.ini).
적용되는 설정
- 세션 업로드 진행 끄기 (
session.upload_progress.enabled=0) — CVE-2026-109619 부분 완화..htaccess(mod_php) /.user.ini(FPM·CGI). 적용 후 PHP 워커 재시작 필요,.user.ini는 최대 약 5분 뒤 반영. .user.ini외부 노출 차단.- 형식 검사 (선택, 기본 꺼짐): Content-Length 없는/chunked multipart POST를 403으로 차단. 프록시·CDN 구성에 따라 업로드가 막힐 수 있어 기본은 꺼 둡니다.
4.5 적용 후 자동 검사와 되돌리기
- 사이트 응답 검사 (서버 측):
.htaccess수정 전후로 사이트 자신에게 요청해, 새로 5xx가 되면 원래 파일로 복구합니다. (자기 호출이 불가능한 환경은 "검사 불가"로 기록) - 업로드 시험 (브라우저 측, v4 신규): "적용"을 누르면 관리자 화면이 300KB 파일을 실제 업로드 경로로 전송해 PHP까지 도달하는지 확인합니다. 통과하면 "업로드 시험 통과", 실패하면 방금 적용한 설정을 자동으로 모두 해제하고 이유를 보여 줍니다. 호스팅 방화벽·프록시 등 사용자 서버의 실제 경로를 그대로 지나가므로 서버 측 검사로는 못 잡는 문제를 잡습니다.
- 복구 후에는 관리자가 다시 "적용"을 누르기 전까지 재시도하지 않습니다.
- 적용 전 기존 파일은
data/security/에 백업합니다. 이 폴더는 외부 접근이 차단됩니다.
4.6 IIS 처리
- IIS는 서버 파일(
web.config)을 자동으로 수정하지 않습니다 (사용자 요청). - 관리자 화면의 "IIS 설정 예시"는 직접 붙여 넣는 용도로만 제공됩니다.
4.7 선택 기능: multipart 주소 제한 (기본 꺼짐)
- 허용 주소 외의 multipart POST를 403으로 차단합니다. 기본 허용: 글쓰기·수정,
/api/upload,/auth/mypage,/admin. 추가 허용 주소를 관리자 화면에서 넣을 수 있습니다. - 기본으로 꺼 둔 이유: 허용 주소(글쓰기 등)가 방문자에게 열려 있어 공격 차단 효과가 작고, 플러그인 업로드 주소를 DXCMS가 알 수 없어 정상 업로드가 막힐 위험이 있습니다.
4.8 관리자 화면
- 관리자 상단 배너: 위험도별 문구(업그레이드 필요 / 일부 경로만 완화 / 지원 종료 확인 필요). 수정 버전을 쓰는 서버에서는 표시되지 않습니다.
- 사이드바 "긴급 보안" 메뉴에서 상태 확인, 적용/해제, 형식 검사 켜기·끄기, 주소 제한 설정, 새 수정 버전 추가가 가능합니다.
- "호스팅·서버 관리자에게 보낼 문장"을 복사용으로 제공합니다.
- 쓰기 권한이 없으면 직접 붙여 넣을 내용을 보여 줍니다.
5. 테스트 결과
| 항목 | 환경 | 결과 |
|---|---|---|
| 버전 판정 17개 케이스 | PHP 8.3 CLI | 통과 |
| 정상 multipart 업로드 | 실제 Apache 2.4 | 200 |
| chunked multipart | 실제 Apache | 403 |
| Content-Length 없는 multipart (원시 소켓) | 실제 Apache | 403 |
| 일반 폼 POST, chunked 일반 POST, GET, HTTP/1.0 업로드 | 실제 Apache | 영향 없음 (200) |
| 잘못된 설정 적용 시 자동 복구 | 실제 Apache | 500 감지 후 원본 복구, 기록 남음 |
| 올바른 설정 적용 | 실제 Apache | 정상 적용, 사이트 정상 |
| 구버전 블록 → 새 블록 교체 | 파일 시뮬레이션 | 교체 후 나머지 내용 보존, .user.ini 생성, 백업 생성 |
| 관리자 화면 렌더링 | 화면 코드 단독 실행 | 문구·표시 정상 |
배포 v10.3.0에 패치 적용 후 /api/upload 이미지 업로드 |
Apache 2.4 + PHP 8.3 CGI | 적용 전·후 모두 성공 (공유 호스팅 업로드 실패는 재현되지 않음) |
| 새로 적용은 "적용" 클릭 시에만 | 같은 환경 | 클릭 전에는 .htaccess·.user.ini 변경 없음 |
| 이전 버전 블록 자동 갱신 | 같은 환경 | 형식 검사 규칙이 제거된 최신 블록으로 교체 |
| 업로드 시험 통과 경로 | 실제 Chromium으로 관리자 화면에서 "적용" 클릭 | "업로드 시험 통과" 표시 |
| 업로드 시험 실패 경로 | 일부러 multipart를 막는 규칙을 넣고 "적용" 클릭 | 403 감지 → 블록과 .user.ini 자동 제거, 안내 표시 |
미해결: cafe24 공유 호스팅의 업로드 실패
- 사용자 보고: 배포 버전에 적용하면 파일 업로드가 모두 막히고, 글쓰기(텍스트)는 됨.
- Apache + PHP-CGI 재현 환경에서는 재현되지 않았습니다. 원인(형식 검사 규칙, 호스팅 방화벽,
.user.ini등)은 확정하지 못했습니다. - v4는 이 가능성들을 줄이는 방향(기본 꺼짐 + 실제 업로드 시험 + 자동 해제)으로 바꾼 것이며, 원인 확정을 위해서는 실패한 요청의 주소·상태 코드·응답 본문이 필요합니다.
미확인 환경
- mod_php 서버, PHP-FPM, nginx, IIS, Synology, 공유 호스팅에서는 직접 돌려보지 못했습니다. 이 환경의 안내는 권고문 내용을 보여 주는 수준입니다.
- 로그인한 실제 관리자 화면에서의 확인은 하지 못했습니다.
- PHP 5.6 환경에서의 실행은 확인하지 못했습니다. 코드는 5.6 호환 문법(
array()등)으로 작성했습니다.
6. 한계
- DXCMS 코드로는 PHP 엔진 내부의 취약점을 막을 수 없습니다. 이 취약점은 PHP가 요청 본문을 읽는 단계에서 일어나며, 그때는 DXCMS 코드가 실행되기 전입니다.
- 설정으로 CVE-2026-109618을 완전히 막을 수 없습니다. 형식 검사는 권고문이 지적한 경로 중 하나만 줄입니다.
- nginx·IIS처럼 설정 파일이 사이트 폴더 밖에 있는 환경은 자동 적용이 안 됩니다.
- 위 모든 보호는 보조 수단입니다. 완전한 해결은 PHP 업그레이드입니다.
7. 설치 방법
압축을 사이트 루트에 덮어씁니다. 설치 후 관리자 "긴급 보안" 화면에서 "적용"을 눌러야 서버 파일이 수정됩니다.
core/Php2Shell.php
admin/security-emergency/index.php
extend/top/06_php2shell.php
적용 후 업로드 시험 결과가 화면에 표시됩니다. 해제하려면 관리자 화면 "긴급 보안"에서 "모두 해제"를 누릅니다 (자동 재적용도 함께 멈춥니다).
8. 출처
- PHP 8.5.12 ChangeLog: https://www.php.net/ChangeLog-8.php
- GHSA-w8hw-w9fx-j79w (CVE-2026-109618): https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w
- GHSA-6wmf-4rv5-p3rp (CVE-2026-109619): https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp