2026년 6월 16일, CISA는 Joomla CMS 편집기 확장 플러그인인 JCE(Joomla Content Editor)에서 발견된 취약점을 알려진 익스플로잇 취약점(KEV) 카탈로그에 등재했다. 은 접근 제어 결함이다. 인증이 전혀 필요 없는 공격자가 단 3개의 HTTP 요청만으로 PHP 웹셸을 서버에 심고 원격 명령을 실행할 수 있다.
CVSS 4.0 기준 최고점인 10.0이 부여됐고, 공개 PoC가 공식 어드바이저리와 동시에 GitHub에 올라왔다. 패치를 적용했어도 배포 당일부터 자동화 공격에 노출됐다는 뜻이다.
CVE
CVSS 4.0
CVSS 3.1
10.0 CRITICAL
9.8 CRITICAL
영향 범위
안전 버전
CISA KEV 등재
JCE 1.0.0 ~ 2.9.99.4
2.9.99.7
2026-06-16
같은 결함에 CVSS 3.1은 9.8, CVSS 4.0은 만점인 10.0을 매겼다. CVSS 4.0이 '인증 불필요'와 '완전한 원격 코드 실행'이 하나로 이어지는 조합을 더 무겁게 반영한 결과다. 방어 측에는 인증 경계 하나에 기대던 가정이 통째로 사라졌다는 뜻이다.
배경: 편집기 플러그인이 왜 위험한가
Joomla는 WordPress에 이어 전 세계에서 두 번째로 많이 쓰이는 CMS 플랫폼이다. JCE는 기본 편집기를 대체하는 Joomla 생태계의 사실상 표준 플러그인으로, 가장 널리 설치된 편집기 확장 중 하나다.
편집기 플러그인이 공격 표면이 되는 구조적 이유가 있다. 편집기는 이미지·미디어 파일을 서버에 업로드하는 기능을 본질적으로 가져야 한다. 그래서 편집기 확장은 어떤 파일을 허용할지 정하는 자체 업로드 정책을 들고 다닌다. 이번 취약점은 그 업로드 경로에서 인증 검사가 빠지고, 동시에 업로드 정책 자체를 외부에서 바꿀 수 있게 열린 것이다.
웹셸이 심기면 PHP 코드가 웹 서버 프로세스 권한으로 실행된다. 이 권한이면 사이트 설정 파일에 담긴 데이터베이스 자격증명을 읽고, 콘텐츠를 변조하며, 서버 구성에 따라 같은 호스트의 다른 사이트나 내부망으로 이동하는 거점이 된다. 단순 정보 유출이 아니라 서버 장악의 시작점이라는 뜻이다.
JCE는 PHP 7.4 이상, Joomla 3.10 이상 환경에서 구동된다. 리눅스 웹 서버를 대상으로 한 공격이 주로 확인되고 있으며, 자동화 스캔 캠페인이 인터넷 전체를 대상으로 취약한 설치를 탐색하고 있다.
메커니즘: 3개 HTTP 요청으로 웹셸 삽입
YesWeHack과 lilting.ch의 독립적인 기술 분석에 따르면, 이 공격은 세 단계로 작동한다. 각 단계는 별도 취약점이 아니라 하나의 핸들러에서 발생하는 설계 결함들이 연쇄 작용한 결과다.
1단계 — CSRF 토큰 수집: 공격자는 Joomla 사이트 공개 페이지의 HTML을 파싱해 CSRF 토큰을 추출한다. 이 토큰은 로그인 없이 누구나 얻을 수 있다.
2단계 — 악성 프로파일 주입: 핵심 결함은 /index.php?option=com_jce&task=profiles.import 엔드포인트에 있다. 이 핸들러는 에디터 프로파일을 XML 형식으로 가져오는 기능을 제공한다. 결함은 두 층위로 나뉜다.
핸들러 자체의 고정 결함: 이 엔드포인트는 CSRF 토큰만 검증할 뿐 사용자 인증 여부를 전혀 확인하지 않는다. 토큰만 있으면 비로그인 공격자도 프로파일을 등록할 수 있다.
프로파일이 켜는 결함: JCE는 어떤 파일을 업로드할지 결정하는 정책을 프로파일 설정에 담아 둔다. 임포트는 그 정책 데이터 자체를 외부 입력으로 덮어쓴다. 악성 프로파일이 allow_unsafe=true 플래그를 담아 들어오면, Joomla 기본 확장자 블랙리스트가 그대로 풀린다.
설정을 데이터로 다루는 구조이기 때문에, 정책 파일을 임포트하는 행위가 곧 보안 정책을 바꾸는 행위가 된다. 그 결과 이중 확장자(.xml.php 등)로 위장한 PHP 파일이 검증을 통과한다.
3단계 — 웹셸 실행: 확장자 제한이 풀린 상태에서 업로드된 PHP 파일은 공개 접근이 가능한 미디어 경로에 저장된다. 이후 그 파일에 대한 HTTP 요청 하나로 PHP 코드가 웹 서버 권한으로 실행된다.
이 결함 조합이 주는 교훈은 단일 CVE를 넘는다. 편집기 확장은 업로드 기능을 필수로 갖고, 무엇을 허용할지에 대한 자체 정책을 들고 다니며, 그 정책을 임포트·익스포트로 외부에 노출하는 경우가 많다. 업로드 게이트와 그 게이트를 여는 열쇠(정책)가 같은 컴포넌트 안에 함께 있으면, 열쇠를 외부에서 바꿀 수 있는 순간 게이트는 의미를 잃는다. CMS 편집기 확장이 반복적으로 공격 표면이 되는 구조적 이유다.
실제로 JCE는 2015년 같은 결함 클래스를 한 번 겪었다. 는 이미지 업로드 경로에 .php 확장자 파일을 올릴 수 있게 해 임의 파일 업로드를 허용했다. 11년이 지나 은 '편집기 업로드 + 확장자 검증 우회'라는 같은 패턴이 무인증 정책 임포트라는 더 정교한 형태로 되돌아온 셈이다.
악용 전개: 디스클로저부터 KEV까지
패치(6월 3일)부터 CISA KEV 등재(6월 16일)까지 13일이 걸렸다. PoC가 어드바이저리와 동시에 배포됐으므로 공격자들은 단 13일 만에 공개 무기화 도구를 확보했다. CISA KEV 등재 이후 취약한 JCE 설치를 노린 자동화 스캔 캠페인이 광범위하게 활성화됐다.
패치 버전과 관련한 주의 사항이 있다. 2.9.99.5가 최초 수정 버전이며, 2.9.99.6은 XML 처리 추가 강화를 포함했지만 회귀 버그가 발견됐다. 현재 권장 버전은 2.9.99.7이다.
탐지 관점: 공격이 남기는 흔적
이 공격의 탐지를 어렵게 만드는 요인이 있다. profiles.import 요청은 형태상 일반 관리 HTTP 요청과 구별하기 어렵고, 악성 파일은 정상 미디어 디렉터리에 착지하기 때문이다. 단일 요청만 보면 정상 운영과 구분되지 않는다는 점이 핵심이다. 그러나 공격은 세 개의 탐지 레이어에서 반드시 흔적을 남긴다.
웹 서버 로그 분석:
정상적인 Joomla 사이트에서 profiles.import 엔드포인트로 향하는 비인증 POST 요청은 발생하지 않는다. 이 요청 직후 plugin.rpc 엔드포인트로 200 응답을 받는 파일 업로드가 연속으로 기록된다면 공격 흔적이다. 단일 요청이 아니라 토큰 수집·프로파일 임포트·업로드가 짧은 시간에 순서대로 이어지는 패턴이 식별의 열쇠다. 일부 공격 도구는 URL에 id=RCExxx 형태의 공격자 식별자를 포함한다.
데이터베이스 쿼리:
lilting.ch 분석에 따르면 악성 에디터 프로파일은 일관된 패턴을 보인다. wf_profiles 테이블에 다음 특징을 가진 프로파일이 있다면 침해 흔적으로 본다.
자동 생성된 이름: 대문자 J + 6자리 숫자 (예: J940401)
Pwned 같은 라벨 또는 음수 정렬 값(-99999)
PHP 확장자가 허용 목록에 포함됨
웹 로그는 시간이 지나면 순환되어 사라지지만, 이 DB 흔적은 공격자가 정리하지 않는 한 남는다. 사후 침해 판정에서 가장 신뢰할 수 있는 레이어인 이유다.
파일시스템 탐색:
웹셸 주요 착지 경로:
tmp/ · images/ · media/ · libraries/joomla/
이 경로에는 gzip 압축 후 base64로 인코딩된 PHP 코드나 이중 확장자 파일이 남는다. 공격자가 확장자 제한을 무력화한 결과물이 이런 형태로 떨어지기 때문이다. Nxploited 같은 마커 파일의 존재도 침해 지표다.
T1505.003: Server Software Component: Web Shell (지속성)
T1059.004: Command and Scripting Interpreter: Unix Shell (명령 실행)
T1083: File and Directory Discovery (정찰)
한국 관점
Joomla는 한국의 정부기관·교육기관·기업 웹사이트에서도 활용되고 있다. JCE 플러그인은 한국어 환경에서도 기본 편집기로 사용되는 경우가 많다. CISA KEV 등재 이후 자동화 스캐닝은 특정 지역을 가리지 않으므로, 국내 Joomla 운영자 역시 동일한 위협에 노출돼 있다.
단 3개 HTTP 요청이면 충분하다는 이 공격의 간결함이 자동화 캠페인을 가능하게 만든 핵심이다. JCE 버전 확인 없이 운영 중인 사이트는 현재도 스캔 대상에 포함된다. 2.9.99.7 미만 버전이라면 wf_profiles 테이블과 미디어 디렉터리에 이미 공격 흔적이 남아 있을 수 있다.