취약점 개요
- CVE ID: CVE-2026-48907
- 위험도: CVSS 4.0 기준 10.0 (Critical)
- 영향 버전: JCE 2.9.99.4 및 이전 버전
- 패치 버전: JCE 2.9.99.5 및 2.9.99.6 (권장)
- 취약점 유형: CWE-284 (Improper Access Control)
- 상태: Actively Exploited (CISA KEV 등록됨)
서론
Joomla의 가장 널리 사용되는 에디터 확장인 JCE(Joomla Content Editor)에서 2026년 6월 3일 발견된 CVE-2026-48907은 인증되지 않은 원격 코드 실행(RCE) 취약점으로, CVSS 4.0 기준 최고 위험도 10.0점을 기록했습니다. 이 취약점은 CISA KEV(Known Exploited Vulnerabilities) 카탈로그에 2026년 6월 16일 현지시간으로 등록되었으며, 실제 악용 사례가 이미 확인되어 조직 간 우선적 대응이 필요합니다.
특히 이번 공격은 로그인 없이 자동화된 도구로 전파되고 있어, 공용 가입이 없는 사이트도 안전하지 않습니다. Joomla 프로젝트의 공식 확장 디렉토리(extensions.joomla.org)가 이 취약점으로 인해 503 유지보수 페이지로 대체되는 사례가 발생한 바 있어, 보안 관리자들의 주의가 요구됩니다.
본론
1. 기술적 배경 및 취약점 원인
1.1 취약점 개요
- CVE ID: CVE-2026-48907
- 위험도: CVSS 4.0 기준 10.0 (Critical)
- 영향 버전: JCE 2.9.99.4 및 이전 버전
- 패치 버전: JCE 2.9.99.5 및 2.9.99.6 (권장)
- 취약점 유형: CWE-284 (Improper Access Control)
1.2 기술적 메커니즘 (3단계 연계 취약점)
이 취약점은 단일 버그가 아니라 세 가지 독립적인 취약점이 동시에 존재할 때만 악용 가능한 연계(Chain) 구조입니다.
약점 1: 인증 누락 (Missing Authorization)
엔드포인트: /index.php?option=com_jce&task=profiles.import
문제점: CSRF 토큰 확인만 수행, 인증 검증 누락
영향: 공개 페이지에 포함된 CSRF 토큰을 수집하면 비인증 상태로 접근 가능
JCE는 프로필 가져오기(Import) 기능에서 Joomla의 Session::checkToken()만 확인합니다. 이 CSRF 토큰은 모든 공개 페이지의 HTML 메타태그나 JavaScript 변수에 포함되어 있어, 공격자가 메인 페이지에서 쉽게 추출할 수 있습니다.
약점 2: 파일 확장자 검증 누락
처리 함수: JceModelProfile::import()
문제점: File::makeSafe()만 사용, 확장자 검증 없음
영향: .xml.php, .phtml 등 이중 확장자 허용
Joomla의 File::makeSafe() 함수는 파일명에서 불법 문자(공백, null 바이트, 쉘 메타문자 등)를 제거하지만, 확장자는 검증하지 않습니다. 따라서 evil.xml.php와 같은 이중 확장자가 문제없이 통과됩니다.
약점 3: 안전하지 않은 업로드 플래그 ($allow_unsafe = true)
호출: File::upload($source, $destination, false, true)
문제점: Joomla의 확장자 블랙리스트 비활성화
영향: .php, .php5, .phtml 등 실행 파일 직접 업로드 가능
Joomla의 File::upload()는 기본적으로 위험한 확장자(.php, .php3-7, .phtml, .exe 등)를 차단합니다. 하지만 4번째 인자인 $allow_unsafe를 true로 설정하면 이 보호 기능이 비활성화됩니다.
2. 공격 시나리오
2.1 공격 흐름 (3단계 HTTP 요청)
# 단계 1: CSRF 토큰 획득
GET /
→ 응답에서 csrf.token 추출 (예: "abcdef1234567890abcdef1234567890")
# 단계 2: 악성 프로필 업로드
POST /index.php?option=com_jce&task=profiles.import
Content-Type: multipart/form-data
--boundary
Content-Disposition: form-data; name="profile_file"
filename="nuclei-deadbeef.xml.php"
Content-Type: application/xml
<?php echo 45*69; ?> # 테스트 페이로드
--boundary--
→ 200 OK, 파일이 /tmp/ 폴더에 저장
# 단계 3: 업로드된 PHP 파일 실행
GET /tmp/nuclei-deadbeef.xml.php
→ 응답: "3105" (RCE 성공 확인)
2.2 실제 악용 시나리오
- 웹쉘 업로드: 공격자는 악성 XML 프로필을 업로드하여 PHP 업로드를 허용하는 프로필을 생성
- 백도어 설치: 해당 프로필을 사용하여 웹쉘(예:
shell.php) 업로드 - 지속적 접근: 업로드된 웹쉘을 통해 시스템 제어권 확보, 추가 백도어 설치, 데이터베이스 다운로드
3. 현재 악용 현황
3.1 CISA KEV 카탈로그 등록
- 등록일: 2026년 6월 16일
- 마감일: 2026년 6월 19일 (3일 이내 조치 권고)
- 상태: 악용 중(Actively Exploited)
- 랜섬웨어 연관성: 미확인
3.2 공개 익스플로잇 상황
- PoC 공개: 2026년 6월 9일 GitHub에 작동하는 익스플로잇 공개
- https://github.com/webshellseo8/CVE-2026-48907-Unauthenticated-RCE-in-JCE
- https://github.com/ywh-jfellus/CVE-2026-48907
- Nuclei 템플릿: ProjectDiscovery Nuclei에 공개 템플릿 존재
- https://github.com/projectdiscovery/nuclei-templates/pull/16380
- 자동화 공격: 인증 없이 전체 인터넷에 대한 자동 스캔 및 공격 진행 중
3.3 실제 피해 사례
- Joomla 공식 사이트 피해:
- extensions.joomla.org (공식 확장 디렉토리)
- community.joomla.org (커뮤니티 사이트)
- certification.joomla.org (인증 사이트)
- → 모두 503 유지보수 페이지로 대체됨
- mysites.guru 보고서:
- 2026년 6월 9일 기준 수백 개 사이트에서 감지
- 향후 며칠 내 수천 개로 확대 예상
4. 한국 내 사용 현황
4.1 Joomla CMS 한국 내 도입 현황
정확한 통계는 없으나, 한국 내 Joomla 사용 사례는 주로 다음 분야에서 확인됩니다:
- 중소기업 홈페이지: 웹 에이전시를 통해 구축된 사이트
- 정부/공공기관: 일부 지자체 및 공공기관 구형 사이트
- 교육 기관: 대학/학교 웹사이트 (Joomla 3.x 유지 사례)
- 클라우드 호스팅: 공유 호스팅 환경에서의 자동 설치 사례
4.2 JCE 확장 사용 추정
JCE는 Joomla 생태계에서 가장 많이 설치된 에디터로 알려져 있습니다. mysites.guru에 따르면:
- "JCE는 가장 인기 있는 Joomla 에디터이자 가장 많이 설치된 확장 중 하나"
- 한국 내 Joomla 사이트의 상당수가 JCE를 사용할 가능성 높음
5. 패치 및 완화 조치
5.1 공식 패치 (JCE 2.9.99.5 및 2.9.99.6)
JCE 2.9.99.5 (2026년 6월 3일 릴리스):
// Fix 1: 인증 검증 추가
$user = Factory::getUser();
if (!$user->authorise('core.manage', 'com_jce')) {
throw new Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}
// Fix 2: 확장자 화이트리스트 검증
$extension = PATHINFO($name, PATHINFO_EXTENSION);
if (strtolower($extension) !== 'xml') {
$app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_INVALID_FILE'), 'error');
return false;
}
// Fix 3: $allow_unsafe 플래그 제거
File::upload($source, $destination, false); // true → false로 변경
JCE 2.9.99.6 (2026년 6월 8일 릴리스):
- 전체 코드베이스 감사 및 보안 강화
- 파일 크기 제한 (512KB)
- XXE 공격 방어 (PHP 7.x용)
- XML 필드 허용목록(allowlist) 적용
5.2 레거시 시스템을 위한 무료 패치
JCE 2.9.99.6은 다음 요구사항이 필요합니다:
- PHP: 7.4 이상
- Joomla: 3.10 이상
만약 이 조건을 충족할 수 없는 경우:
- 대상: JCE 2.7.x, 2.8.x, 2.9.x
- 패치 패키지: https://www.joomlacontenteditor.net/downloads/editor/security-patch
- 주의사항:
- 취약점만 닫힘, 추가 보안 강화 미포함
- 이미 침해된 사이트는 정화되지 않음
- 임시 조치로, 장기적으로 지원 버전으로 마이그레이션 필요
5.3 웹 서버 수준 완화 조치
Apache httpd.conf 또는 .htaccess:
<Directory /var/www/html/tmp>
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
</Directory>
Nginx nginx.conf:
location ~* ^/tmp/.*\.php$ {
deny all;
}
PHP-FPM php.ini:
open_basedir = /var/www/html:/tmp:/usr/share/php
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
5.4 WAF 룰
ModSecurity:
SecRule REQUEST_URI "@contains /index.php?option=com_jce&task=profiles.import" \
"id:1000010,phase:1,deny,status:403,msg:'CVE-2026-48907: JCE Profile Import'"
AWS WAF:
{
"Name": "CVE-2026-48907-JCE-Profile-Import",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "CVE-2026-48907-JCE"
},
"Statement": {
"ByteMatchStatement": {
"FieldToMatch": {
"UriPath": {}
},
"PositionalConstraint": "CONTAINS",
"SearchString": "/index.php?option=com_jce&task=profiles.import",
"TextTransformations": [
{"Type": "NONE"}
]
}
}
}
결론:
CVE-2026-48907은 Joomla 생태계에 큰 충격을 준 치명적인 취약점입니다. CVSS 10.0의 최고 위험도, CISA KEV 카탈로그 등록, 자동화된 악용 도구의 공개, 그리고 실제 피해 사례(Joomla 공식 사이트 포함)가 모두 종합적으로 볼 때, 3일 이내(CISA 마감일 기준) 패치가 필수적입니다.
특히 이번 공격은 인증 없이 진행되므로, "우리 사이트는 공용 가입이 없어서 안전하다"는 생각은 위험합니다. 공격 도구는 전체 인터넷에 대해 자동으로 스캔을 진행하고 있으며, 도달 가능한 모든 JCE 설치를 목표로 합니다.
JCE는 수많은 사이트에서 사용되는 인기 확장이므로, 한국 내 Joomla 사이트 운영자들은 즉시 버전 확인과 패치를 진행해야 합니다. 이미 침해된 사이트에서는 패치만으로는 부족하며, 전체 시스템 정제 작업이 추가로 필요합니다.
대응 방안:
| 위협 레벨 | 즉시 대응 (24시간 이내) | 단기 대응 (72시간 이내) | 장기 대응 (1주 이내) |
|---|---|---|---|
| Critical (JCE 2.9.99.4 이하) | 1. 웹 서버 액세스 로그에서 task=profiles.import 확인2. 의심스러운 프로필 및 파일 백업 3. 웹 서버에서 /tmp/ 디렉토리 PHP 실행 차단 4. WAF 룰 적용 |
1. JCE 2.9.99.6으로 업데이트 2. 의심스러운 프로필 삭제 3. 웹쉘 및 백도어 파일 삭제 4. 모든 비밀번호 변경 5. 전체 서버 멀웨어 스캔 |
1. 포렌식 조사 및 침해 범위 파악 2. 보안 사고 대응 프로세스 개선 3. 정기적 보안 감사 도입 4. 관제 시스템 강화 |
| Medium (JCE 2.9.99.5) | 1. JCE 2.9.99.6으로 즉시 업데이트 2. 로그 검토 |
1. 보안 설정 검토 2. 추가 보안 강화 적용 |
1. 보안 정책 업데이트 |
| Low (JCE 2.9.99.6) | 1. 보안 설정 검토 | 1. 보안 강화 적용 | 1. 정기적 패치 관리 |
실무적 대응 체크리스트:
[ ] 1단계: 즉시 확인 (1시간 이내)
- [ ] JCE 버전 확인 (Extensions → Manage → Manage)
- 관리자 패널: Extensions → Plugins → System - JCE
- 또는 FTP로
/plugins/system/jce/jce.xml확인 - [ ] 웹 서버 액세스 로그 검색
grep "task=profiles.import" /var/log/apache2/access.log | head -20 grep "task=profiles.import" /var/log/nginx/access.log | head -20 - [ ] /tmp/, /images/, /media/ 폴더에서 의심스러운 PHP 파일 검색
find /var/www/html/tmp -name "*.php" -type f find /var/www/html/images -name "*php*" -type f find /var/www/html/media -name "*php*" -type f
[ ] 2단계: 침해 여부 확인 (2시간 이내)
- [ ] JCE 프로필 검사
- Components → JCE Editor → Editor Profiles
- 내가 만들지 않은 프로필 확인 (예: J940401, J938560, "Pwned")
- ordering 값이 -99999인 프로필 확인
- php, phtml, txt 업로드 허용 여부 확인
- [ ] 데이터베이스에서 의심스러운 관리자 확인
SELECT id, username, name FROM #__users WHERE gid > 2;
[ ] 3단계: 패치 및 완화 (4시간 이내)
- [ ] JCE 2.9.99.6으로 업데이트
- 다운로드: https://www.joomlacontenteditor.net/downloads/editor/pro/latest?catid=131
- 확장 매니저를 통한 업데이트 또는 수동 업로드
- [ ] 레거시 시스템인 경우 무료 패치 적용
- https://www.joomlacontenteditor.net/downloads/editor/security-patch
- [ ] 웹 서버 설정 수정
- /tmp/ 디렉토리에서 PHP 실행 차단
- Apache/Nginx 설정 재로드
[ ] 4단계: 정화 작업 (24시간 이내)
- [ ] 의심스러운 JCE 프로필 삭제
- Components → JCE Editor → Editor Profiles
- 의심스러운 프로필 선택 후 Delete
- [ ] 의심스러운 파일 삭제
- images/, media/, tmp/, libraries/ 폴더에서 의심스러운 PHP 파일 삭제
- .xml.php, webshell, shell_exec, eval(gzinflate) 패턴 파일 검색
- [ ] 모든 비밀번호 변경
- Joomla 관리자 계정
- 데이터베이스 비밀번호
- 호스팅/FTP 계정
- 재사용된 다른 사이트 비밀번호
[ ] 5단계: 검증 및 사후 조치 (48시간 이내)
- [ ] 전체 파일 시스템 멀웨어 스캔
# clamav 사용 예시 freshclam clamscan -r /var/www/html --infected --log=/tmp/clamscan.log # 또는 호스팅 제공자의 스캔 서비스 요청 - [ ] 패치 후 로그 모니터링 (최소 1주일)
task=profiles.import요청이 차단되었는지 확인- 새로운 의심스러운 활동 없는지 확인
- [ ] 보안 사고 보고서 작성
- 침해 시점 파악 (로그 기준)
- 영향 범위 식별
- 대응 조치 기록
- 향후 예방 계획
[ ] 6단계: 장기적 예방 (1주 이내)
- [ ] 정기적 업데이트 정책 수립
- 보안 패치는 7일 이내 적용
- 주별 업데이트 점검 일정 수립
- [ ] 보안 모니터링 강화
- WAF/IPS 로그 모니터링
- 파일 무결성 모니터링 도입
- 비정상적인 관리자 계정 생성 알림
- [ ] Joomla/JCE 버전 관리
- PHP 7.4+, Joomla 3.10+ 이상 유지
- 지원 종료 버전 마이그레이션 계획 수립
참고자료:
- CVE 공식: https://nvd.nist.gov/vuln/detail/CVE-2026-48907
- CISA KEV 카탈로그: https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- JCE 공식 보고서: https://www.joomlacontenteditor.net/news/jce-security-update-and-a-free-patch-for-older-sites
- JCE 변경 로그: https://www.joomlacontenteditor.net/support/changelog/editor
- YesWeHack 기술 분석: https://www.yeswehack.com/news/rce-joomla-content-editor-extension
- mysites.guru 실제 사례: https://mysites.guru/jce-hack/
- PoC (GitHub):
- https://github.com/webshellseo8/CVE-2026-48907-Unauthenticated-RCE-in-JCE
- https://github.com/ywh-jfellus/CVE-2026-48907
- Nuclei 템플릿: https://github.com/projectdiscovery/nuclei-templates/pull/16380
- CISA BOD 26-04: https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk
- CISA 포렌식 요구사항: https://www.cisa.gov/news-events/directives/bod-26-04-implementation-guidance-prioritizing-security-updates-based-risk
부록: 의심스러운 파일 패턴
다음 패턴을 포함하는 파일은 즉시 검토해야 합니다:
// 웹쉘 패턴
eval(gzinflate(base64_decode(
shell_exec(
system(
passthru(
exec(
proc_open(
popen(
assert(
create_function(
// JCE 해킹 관련 파일명
*.xml.php
*nuclei*
*pwned*
*Nxploited*
webshell.php
shell.php
backdoor.php
c99.php
r57.php
본 콘텐츠는 AI 기술로 생성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하시면 댓글을 통해 소중한 의견 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!