
DX Security — Extend Abuse 방어 v1.0.0 안내서
PHP 5.6+ · IIS / Apache / Nginx 완전 호환 코어 DxExtend 수정 없음 — 훅으로만 동작
목차
1. DXCMS Extend 구조 이해
Extend는 DXCMS의 실행 흐름에 개입하는 확장 기능입니다. Hook과 달리 코드 등록 없이 파일을 폴더에 넣으면 자동으로 실행됩니다.
extend/
top/ ← CMS 초기화 완료 직후 (DB·세션·인증·플러그인 로드 후)
middle/ ← 라우팅 확정 후, 핸들러 실행 전
bottom/ ← 렌더링 완료 후 (출력 버퍼 비우기 전)
실행 순서: 파일명 오름차순
01_init.php → 02_log.php → 10_custom.php → 90_monitor.php
Extend vs Plugin vs Hook
| 구분 | 등록 방법 | 실행 시점 | 위험도 |
|---|---|---|---|
| Plugin | dx_register_plugin() | 전체 요청 | 중간 |
| Hook | dx_add_hook() | 특정 이벤트 | 중간 |
| Extend | 파일 배치 | 자동 실행 | 높음 |
Extend는 파일만 넣으면 자동 실행되므로 Hook보다 더 직접적인 공격 경로가 됩니다.
2. 코어 DxExtend 분석
코어가 이미 잘 하는 것
private function safeExec($file, $context, $slot)
{
// 경로 검증 — extendRoot 밖의 파일 실행 차단
$realFile = realpath($file);
$realExtend = realpath($this->extendRoot);
if (strpos($realFile, $realExtend . '/') !== 0) {
dx_log('[DxExtend] 보안 차단: ' . $file, 'warning');
return; // 차단
}
// 에러 격리 — 한 파일 오류가 전체 CMS를 멈추지 않음
set_error_handler(...);
try {
extract($context, EXTR_SKIP);
include $file;
} catch (Exception $e) { ... }
restore_error_handler();
}
| 항목 | 코어 | 평가 |
|---|---|---|
| 경로 검증 | realpath() + extendRoot 경계 | ✅ |
| 에러 격리 | set_error_handler + try/catch | ✅ |
| .disabled 파일 제외 | glob('*.php')만 실행 | ✅ |
| 위험 함수 탐지 | 없음 | ❌ |
| 파일 무결성 | 없음 | ❌ |
| 실행 횟수 제한 | 없음 | ❌ |
| Priority 보호 | 없음 | ❌ |
| 감사 로그 | 없음 | ❌ |
3. 이 플러그인의 역할
코어 DxExtend를 수정하지 않고 dx_extend_top 훅에서 Extend 파일 정적 분석·Integrity 검사·감사 로그를 수행합니다.
4. 설치 방법
(DXCMS 루트)/
└── plugins/
└── dx-security-extend/
├── manifest.php
└── plugin.php
관리자 → 플러그인 → dx-security-extend → 활성화
5. 방어층 상세 설명
EX1. 위험 함수 정적 분석
Extend 파일에서 위험 함수 사용을 탐지합니다.
탐지 대상:
shell_exec, exec, system, passthru
proc_open, popen
eval
assert($code) (코드 실행 형태)
include($_GET/POST/REQUEST/COOKIE...) (동적 include)
require($_GET/POST/REQUEST/COOKIE...) (동적 require)
base64_decode + eval 조합
탐지 시점: 서버 시작 시 1회 (static 캐시)
처리: DANGEROUS_PATTERN 로그
EX2. 파일 Integrity 검사
Extend 파일이 설치 후 변조되지 않았는지 MD5 해시로 확인합니다.
첫 실행 시:
모든 Extend 파일 MD5 해시 계산
data/cache/extend_hashes.php 저장
이후 실행마다:
현재 해시 vs 저장 해시 비교
변경 시 → INTEGRITY_CHANGED 로그
EX3. 실행 횟수 제한
최대 Extend 파일 수: 50개 (DX_EXTEND_MAX_FILES)
top + middle + bottom 합산
초과 시 → FILE_COUNT_EXCEEDED 로그
bottom 실행 완료 후:
getExecuted() 실제 실행 수 확인
50 초과 → INVOCATION_LIMIT_EXCEEDED 로그
EX4. Priority 보호 구간 탐지
파일명 번호로 실행 순서를 제어하는 DXCMS 구조에서 보호 구간을 탐지합니다.
보호 구간: 01~09 (코어/보안 전용)
사용자 Extend 권장: 10 이상
코어 파일 목록:
top/: 01_darkmode_early.php, 05_activity_monitor.php,
50_board_fields.php, 90_market_guard.php
middle/: 01_visit_tracker.php, 10_email_verify_gate.php
bottom/: 01_session_rescue_gc.php, 02_darkmode_engine.php
탐지 조건:
01~09 번호대 파일 + 코어 파일이 아님
→ PRIORITY_RANGE_INTRUSION 로그
EX5. Context 변조 탐지
코어 safeExec()는 extract($context, EXTR_SKIP)을 사용합니다. EXTR_SKIP이 있으므로 기존 변수는 덮어쓰지 않지만, Extend 파일이 실행 중 Context 변수를 직접 수정하는 것은 여전히 가능합니다. 이 플러그인은 Context 변조 시도를 정적 분석으로 탐지합니다.
EX6. Extend 감사 로그
요청 시작 시:
모든 Extend 파일 스캔 (EX1~EX4)
관리자 설정 페이지 진입 시:
전체 Extend 파일 수 기록
→ EXTEND_AUDIT 로그
Plugin 활성화/비활성화 시:
자동으로 PI 플러그인과 연계 기록
6. 보안 로그 읽는 법
이벤트 타입
| 타입 | 의미 |
|---|---|
EX:DANGEROUS_PATTERN |
위험 함수 탐지 |
EX:INTEGRITY_CHANGED |
파일 해시 변경 탐지 |
EX:FILE_COUNT_EXCEEDED |
최대 파일 수 초과 |
EX:INVOCATION_LIMIT_EXCEEDED |
실행 횟수 초과 |
EX:PRIORITY_RANGE_INTRUSION |
보호 구간 파일명 사용 |
EX:EXTEND_AUDIT |
관리자 페이지 Extend 현황 |
로그 예시
# 위험 함수 탐지
[2026-09-03 09:00:01][EX:DANGEROUS_PATTERN][IP:-][...][UID:0][URI:-]
slot=top file=10_my_extend.php patterns=shell_exec,eval
# Integrity 변조
[2026-09-03 14:22:10][EX:INTEGRITY_CHANGED][IP:121.131.x.x][...][UID:1][URI:/admin]
slot=top file=01_darkmode_early.php
# 보호 구간 침범
[2026-09-03 16:45:03][EX:PRIORITY_RANGE_INTRUSION][IP:-][...][UID:0][URI:-]
slot=top file=05_evil_extend.php prefix=05 protected_max=09
# Extend 현황 감사
[2026-09-03 20:11:44][EX:EXTEND_AUDIT][IP:121.131.x.x][...][UID:1][URI:/admin/setting]
top=4 middle=2 bottom=2
7. 보안 강점 요약
| 위협 | 결과 | 방어 레이어 |
|---|---|---|
| 악성 Extend에 shell_exec 포함 | DANGEROUS_PATTERN 로그 | EX1 |
| 악성 Extend에 eval 포함 | DANGEROUS_PATTERN 로그 | EX1 |
| Extend 파일 변조 | INTEGRITY_CHANGED 로그 | EX2 |
| Extend 파일 폭탄 (50개 이상) | FILE_COUNT_EXCEEDED 로그 | EX3 |
| 보호 구간 파일명 사용 (01~09) | PRIORITY_RANGE_INTRUSION 로그 | EX4 |
| 정상 Extend 실행 | 영향 없음 | ✅ |
| 코어 경로 탈출 시도 | 코어 DxExtend가 차단 | 코어 ✅ |
8. 개발자 API 가이드
새 Extend 파일 배포 전 스캔
// 배포 전 위험 패턴 확인
$issues = dx_extend_scan_file('/path/to/my_extend.php', 'top');
if (!empty($issues)) {
echo '위험 패턴 발견: ' . implode(', ', $issues);
}
Extend 파일 Integrity 해시 확인
// 현재 해시 조회
$hash = dx_extend_integrity_hash('top', '01_my_extend.php');
echo $hash;
실행된 Extend 목록 확인
// 현재 요청에서 실행된 Extend 목록
$executed = dx_extend_get_executed();
foreach ($executed as $item) {
echo $item['slot'] . '/' . $item['file'];
}
Extend 파일 권장 파일명
사용자 Extend는 10 이상 번호 사용 권장:
10_my_feature.php 일반 기능
20_my_log.php 로깅
50_my_api.php API 확장
80_my_monitor.php 모니터링
01~09는 코어/보안 전용:
01_darkmode_early.php (코어)
05_activity_monitor.php (코어)
DX Security — Extend Abuse 방어 v1.0.0 — DesignOneX https://designonex.com
라이선스
디자인원엑스 라이선스 참고
https://designonex.com/notice/view/1787577858493247