DXCMS v10.3.3 패치 내역
버전 제안: 10.3.3. 보내 주신 패치 안에 이미 v10.3.1(게시판 도메인별 스킨), v10.3.2(뷰 카테고리) 표기가 있어서 그 다음 번호입니다. 호환을 깨는 변경은 없습니다. 새 DB 컬럼 1개(boards.skin_map)만 있습니다.
변경 내용
| 구분 |
내용 |
파일 |
| 기능 (v10.3.1) |
게시판 스킨을 접속 도메인별로 저장·적용. 글·DB는 공유, 스킨만 도메인별. 지정이 없으면 기본 스킨 |
extend/top/04_board_site_skin.php(신규), admin/boards/index.php, core/router/Router.php, core/api/post_row.php, install/migrate.php |
| 수정 (v10.3.2) |
글 보기 화면의 모바일 카테고리 바가 목록과 같은 계층 구조로 표시되고, 하위 카테고리 그룹이 펼쳐짐 |
themes/default/board/basic/view.php, boards/skins/gallery/view.php, themes/default/layout/_main.php |
| 수정 |
SNS 가입 흐름: 이메일 인증 화면에 SNS 가입 버튼 추가, 인증 완료 상태에서는 가입 화면의 SNS 버튼 숨김 |
core/auth/email-verify.php, core/auth/register.php |
| 수정 |
마이페이지·내 댓글·친구 소식·포인트 내역 정렬을 created_at DESC, id DESC로 |
core/auth/mypage.php, core/DxFriend.php, core/DxPoint.php |
| 수정 |
경험치 로그 테이블(exp_log)이 없어도 댓글·글쓰기가 500으로 끝나지 않고 건너뜀(로그 기록) |
core/DxPoint.php |
| 수정 |
검색어에 따옴표·특수문자가 있어도 오류 없이 검색(한글 유지, 따옴표 구문 검색 유지) |
core/search/handler.php |
| 개선 |
썸네일을 WebP로 생성(GD에 WebP가 없으면 기존 jpg/png). 기존 캐시도 인식 |
core/DxThumb.php |
| 보안 |
PHP2Shell(CVE-2026-109618/109619) 점검·부분 완화 모듈. 관리자가 "적용"을 눌러야 서버 파일 수정, 적용 직후 업로드 시험, 실패 시 자동 해제 |
core/Php2Shell.php, admin/security-emergency/index.php, extend/top/06_php2shell.php |
합치면서 바로잡은 것 (그대로 덮어쓰면 문제가 되는 부분)
install/migrate.php (도메인 스킨 패치): 10.3.0보다 오래된 기준으로 만들어져 있어, 그대로 덮으면 v10.2.0 visit_logs 유입경로 컬럼 마이그레이션 블록이 사라지고 소셜 마스킹 로그 개선도 이전 상태로 돌아갑니다. 10.3.0 파일에 skin_map 블록만 추가해서 합쳤습니다.
core/DxPoint.php: core.zip(exp_log 보호)과 mypage-sort(정렬)가 같은 파일을 각자 수정해, 나중에 덮은 쪽만 남습니다. 두 변경을 모두 넣어 합쳤습니다.
core/auth/mypage.php: mycomments-sort는 mypage-sort에 포함됩니다. mypage-sort 쪽만 사용했습니다.
core.zip 경로: DxPoint.php, search/handler.php가 압축 루트에 있어 core/ 아래로 넣어야 합니다. 합친 압축에서는 올바른 경로입니다.
core/api/post_row.php: 패치본은 줄바꿈이 CRLF에서 LF로 바뀌어 전체 파일이 변경된 것처럼 보입니다. 실제 변경은 1줄이라 원본 줄바꿈을 유지한 채 그 1줄만 반영했습니다.
검증
- 변경된 14개 PHP 파일 문법 검사 통과.
- 10.3.0 배포본에 합쳐 Apache 2.4 + PHP 8.3 CGI에서 첫 화면, 로그인, 회원가입, 검색(따옴표·괄호 포함), 게시판 목록이 모두 200으로 열림.
- 미확인: 도메인별 스킨 저장·적용, WebP 썸네일 생성, SNS 가입 화면, 뷰 카테고리 바는 이 환경에서 화면까지 확인하지 못했습니다. 기존에 직접 확인하신 것으로 알고 합쳤습니다.
적용 순서
DXCMS_v10.3.3_changed-files.zip을 사이트 루트에 덮어쓰기 (version.php 포함, 10.3.3)
install/migrate.php 실행 (boards.skin_map 추가)
- 관리자 "긴급 보안"에서 PHP 버전 상태 확인
DXCMS PHP2Shell 대응 패치 내역
| 항목 |
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 경로 확인 |
한계
- DXCMS 코드로는 PHP 엔진 내부의 취약점을 막을 수 없습니다. 이 취약점은 PHP가 요청 본문을 읽는 단계에서 일어나며, 그때는 DXCMS 코드가 실행되기 전입니다.
- 설정으로 CVE-2026-109618을 완전히 막을 수 없습니다. 형식 검사는 권고문이 지적한 경로 중 하나만 줄입니다.
- nginx·IIS처럼 설정 파일이 사이트 폴더 밖에 있는 환경은 자동 적용이 안 됩니다.
- 위 모든 보호는 보조 수단입니다. 완전한 해결은 PHP 업그레이드입니다.