NOW Briefing
The Events Calendar 역직렬화 RCE 취약점 (CVE-2026-78006)
■ 개요
The Events Calendar는 워드프레스 사이트에 행사 일정과 달력 화면을 추가하는 플러그인으로, 60만 개가 넘는 사이트에서 활성 상태입니다. StellarWP가 배포하는 이 플러그인의 6.17.4 이하 버전에는 취약점(CVE-2026-78006)이 있어, 로그인하지 않은 방문자가 이벤트 글에 남긴 댓글만으로 서버에서 임의 코드를 실행할 수 있습니다. 국내에서도 워드프레스 이용자를 대상으로 하는 블로그가 이 플러그인을 무료 이벤트 달력 도구로 소개하고 있습니다.
승인되지 않은 댓글도 워드프레스가 작성자에게 돌려주는 승인 전 미리보기 주소에서 그대로 화면에 그려집니다. 이벤트 상세 페이지가 그 댓글 영역을 편집기의 콘텐츠 단위인 '블록'으로 해석하면서 공격자가 끼워 넣은 위젯 블록이 처리됩니다. 관리자의 댓글 승인이나 다른 사용자의 조작은 필요하지 않고, 이벤트 글에 댓글이 활성화돼 화면에 표시되기만 하면 조건이 성립합니다.
보도에 따르면 Wordfence 위협 인텔리전스 팀이 운영하는 취약점 탐지 시스템 Argus가 8월 21~22일 두 개의 독립적인 공격 경로를 찾아냈고, StellarWP는 8월 24일 보고를 확인한 뒤 9월 10일 6.17.4.1을 배포했습니다. CVE는 9월 12일 공개됐으며, 현재 GitHub에는 공격 흐름을 자동화한 PoC 코드가 올라와 있습니다. 보안 매체 보도에 따르면 Wordfence는 9월 15일 기준 최근 24시간 동안 이 취약점을 노린 공격 1,113건을 차단했다고 밝혔습니다. 다만 같은 시기의 다른 보도와 공개된 악용 예측 지표에서는 광범위한 악용 정황이 언급되지 않아, 실제 악용 범위를 두고 출처마다 서술이 갈립니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-78006 (승인 대기 댓글에 실린 위젯 블록의 역직렬화) |
| CVSS 점수 | CVSS v3.1 9.8 |
| 취약점 유형 | CWE-502, 신뢰할 수 없는 데이터의 역직렬화(PHP 객체 주입) |
| 영향/위험 | • 인증 없이 서버에서 임의 코드 실행 가능 • PoC 코드 기준 관리자 계정 생성·웹셸 업로드 기능 포함 • 보안 매체 보도 기준 공격 시도 차단 사례 보고 |
| 취약 버전 | The Events Calendar 6.17.4 이하 |
| 패치 버전 | 6.17.4.1 |
■ 기술 분석
이벤트 상세 페이지를 그리는 V2 템플릿은 댓글 영역 HTML을 버퍼에 담은 뒤 워드프레스의 블록 파서 함수 do_blocks()에 통과시킵니다. 댓글 본문에 들어 있던 블록 주석 wp:legacy-widget(구형 위젯을 블록 편집기에 붙여넣을 때 쓰는 마크업)도 이때 함께 해석됩니다. 승인 대기 댓글은 워드프레스가 돌려주는 unapproved·moderation-hash 쿼리 파라미터가 붙은 주소로 작성자 본인이 즉시 열람할 수 있어, 공격자는 자기 댓글을 스스로 렌더링시킬 수 있습니다.
플러그인은 복사·붙여넣기된 위젯 설정을 되살리려고 블록 속성 instance에 담긴 base64 문자열을 꺼내 검사합니다. 6.17.4 이하에서 이 검사를 맡는 메서드 Service_Provider::enable_rendering_widget_copied()는 문자열을 클래스 복원이 차단된 제한 모드로 역직렬화해 평범한 배열인지 확인합니다. 검사를 통과하면 제출된 원본 바이트에 그대로 wp_hash() 서명을 붙여 블록에 되돌려 놓습니다. 워드프레스 코어는 이후 그 서명만 확인하고 같은 문자열을 제한 없이 역직렬화합니다.
검증과 서명이 같은 바이트의 서로 다른 해석에 적용되기 때문에, 검사 단계에서 배열로 보이던 입력이 코어 단계에서는 PHP 객체로 복원될 수 있습니다. CVE 설명은 검사 단계의 사전 파싱 과정에서 PHP 매직 메서드가 먼저 호출될 수 있다고 지적합니다. 복원된 객체는 플러그인 내부 클래스인 Lazy_Post_Collection 등을 엮은 가젯 체인(이미 존재하는 클래스의 정상 동작을 이어 붙여 공격 동작을 만드는 기법)을 거쳐 운영체제 명령 실행까지 이어질 수 있습니다.
아래는 6.17.4 태그의 src/Tribe/Views/V2/Widgets/Service_Provider.php에서 enable_rendering_widget_copied()가 검사를 통과한 직후 서명을 붙이는 부분입니다.
$serialized_instance = base64_decode( $instance['encoded'] );
// Skip instances that do not pass validation.
if ( ! $this->is_safe_widget_instance( $serialized_instance ) ) {
return $parsed_block;
}
$instance['hash'] = wp_hash( $serialized_instance );
$parsed_block['attrs']['instance'] = $instance;
return $parsed_block;
}
StellarWP는 6.17.4.1 태그의 같은 파일, 같은 메서드를 아래와 같이 고쳤습니다. 검사를 통과한 데이터를 다시 직렬화한 뒤 encoded와 hash를 모두 교체하므로, 서명이 붙는 바이트에는 공격자가 넣은 객체 표현이 남을 수 없습니다.
// Skip instances that do not pass validation.
$safe_instance = $this->get_safe_widget_instance( base64_decode( $instance['encoded'] ) );
if ( null === $safe_instance ) {
return $parsed_block;
}
$instance['encoded'] = base64_encode( $safe_instance );
$instance['hash'] = wp_hash( $safe_instance );
관련 취약점
같은 댓글 렌더링 경로를 공유하는 두 번째 취약점 CVE-2026-78159도 함께 공개됐습니다. 6.17.3 이하에서는 위젯의 클래스 목록에 객체 대신 평범한 배열을 넣어 객체 검사를 통과할 수 있습니다. 이후 배열 값을 호출 가능한 대상으로 판단해 그대로 실행하는, 위젯 클래스 목록 처리 메서드 Element_Classes::parse_array() 지점까지 도달합니다. 이 취약점은 6.17.4에서 수정됐으므로 6.17.4.1로 올리면 두 건이 함께 해소됩니다.
■ PoC
공개 PoC는 GitHub 저장소에 파이썬 스크립트 한 개로 올라와 있습니다. 대상 사이트에서 이벤트 글을 찾고, 조작한 위젯 블록이 담긴 댓글을 등록한 뒤, 승인 대기 미리보기 주소로 결과를 확인하는 흐름을 자동화합니다. 코드에는 관리자 계정 생성과 웹셸(웹 요청으로 서버 명령을 실행하는 악성 스크립트) 업로드, 여러 대상 동시 처리 기능도 포함돼 있습니다. PoC 코드는 본문에 싣지 않았으며, 원문은 참고 자료의 링크에서 확인할 수 있습니다.
⚠️ WARN
이 스크립트는 로그인 자격증명 없이 동작하도록 작성돼 있고, 공격이 성공하면 관리자 계정과 웹셸이 남을 수 있습니다.
패치 이전에 이벤트 댓글이 열려 있던 사이트는 차단 기록이 없더라도 침해 가능성을 전제로 점검해야 합니다.
■ 탐지 및 점검
• 관리자 화면의 플러그인 목록에서 The Events Calendar 버전이 6.17.4.1 이상인지 확인합니다. 네 자리 릴리스라 6.17.4와 혼동하기 쉬우므로 마지막 자리까지 대조해야 합니다.
• tribe_events 게시물에 달린 댓글을 승인 여부와 관계없이 전수 조회해 본문에 wp:legacy-widget 문자열이 포함된 항목을 찾습니다. 스팸·휴지통 상태의 댓글도 함께 확인해야 합니다.
• 웹 서버 액세스 로그에서 wp-comments-post.php로 POST한 IP가 곧바로 unapproved와 moderation-hash 파라미터가 붙은 이벤트 페이지를 요청한 흐름을 추적합니다.
• 패치를 적용하기 전 기간에 새로 만들어진 관리자 권한 계정과 wp-content 하위에 추가·변경된 PHP 파일의 타임스탬프를 점검합니다.
■ 대응 방안
• The Events Calendar를 6.17.4.1 이상으로 즉시 업데이트합니다. 자동 업데이트를 꺼 둔 사이트에서는 버전이 그대로 남으므로 적용 결과를 직접 확인해야 합니다.
• 즉시 업데이트가 어렵다면 이벤트 글의 댓글 기능을 끄거나 이벤트 상세 페이지에 댓글 영역이 표시되지 않도록 설정해 공격 경로를 먼저 닫습니다.
• 패치 전에 이벤트 댓글이 공개돼 있던 사이트는 침해 가능성을 전제로 관리자 계정, 새로 설치된 플러그인·테마, wp-content 내 신규 PHP 파일을 우선 조사합니다.
• 침해 흔적이 확인되면 웹셸과 비인가 관리자 계정을 제거한 뒤 관리자 비밀번호, 데이터베이스 접속 정보, 외부 연동 API 키를 재발급합니다.
• 보도 기준 Wordfence는 유료 사용자용 방화벽 규칙을 8월 22일 적용했고 무료 사용자용 규칙은 9월 21일 배포할 예정이므로, 그 이전에는 웹 방화벽(WAF) 차단에 기대지 말고 패치와 댓글 차단을 먼저 적용해야 합니다.
💡 TIP
위젯 블록이 담긴 댓글을 지우는 것만으로는 이미 실행된 코드의 결과가 사라지지 않습니다.
댓글 삭제와 별개로 파일과 계정 점검을 함께 진행해야 합니다.
[참고 자료]
• Wordfence 취약점 정보 — The Events Calendar <= 6.17.4 미인증 PHP 객체 주입
• The Events Calendar 6.17.4 소스 — Views/V2/Widgets/Service_Provider.php
• The Events Calendar 6.17.4.1 소스 — Views/V2/Widgets/Service_Provider.php
• The Events Calendar 6.17.3 소스 — Tribe/Utils/Element_Classes.php
• WordPress.org 플러그인 페이지 — The Events Calendar 변경 이력
• securityonline.info — The Events Calendar 취약점 실제 악용 보도
• Cybersecurity News — 60만 개 사이트에 영향을 준 플러그인 취약점 보도



