FlawOpen

flawopen.com/Incidents/wordpress-stored-xss-admin-session-campaign-october-2026

● WordPress plugin installations (campaign observations attributed to Patchstack) · CVE-2026-93836 · 2026-10-04 · CVSS 7.2 · 높음
보안 연구 · FlawOpen

WordPress 저장형 XSS 캠페인: 플러그인 두 개와 하나의 지속성 체인

Patchstack은 WordPress의 저장형 XSS 두 건을 통해 동일한 침해 후 임플란트를 사용하려는 시도를 관찰했습니다. 두 플러그인을 업데이트하고 지속성을 조사하세요. 패치만으로 이미 침해된 사이트가 정리되지는 않습니다.[1], [2], [3], [4], [5]

💡 알기 쉬운 설명 (ELI5)

관리자가 나중에 읽는 공개 제안함 두 개를 떠올려 보세요. 사이트가 메모를 일반 텍스트가 아니라 실행 가능한 마크업으로 저장하면, 관리자가 열 때 브라우저 권한으로 동작할 수 있습니다. 캠페인 보고서는 서로 다른 두 플러그인 취약점이 진입점으로 쓰였고, 이후 업데이트 뒤에도 접근을 유지하려는 시도가 있었다고 설명합니다.[1], [8], [9]

핵심 개념 및 용어

저장형 XSS
공격자가 제어하는 텍스트를 저장한 뒤 브라우저에서 실행 가능한 마크업으로 표시하는 취약점입니다. 이 사례에서는 WordPress 관리 화면의 표시 맥락이 중요했습니다.[2], [3], [8], [9]
동일 출처 세션
브라우저는 동일 출처 요청에 사이트 세션을 자동으로 포함합니다. 해당 사이트 출처에서 이미 실행 중인 스크립트는 HttpOnly 쿠키를 읽지 않고도 페이지를 통해 동작할 수 있습니다.[1], [17], [18]
지속성
초기 취약점을 수정한 뒤에도 남는 접근 수단입니다. 승인되지 않은 계정이나 파일이 예이며, 업데이트만으로 이런 변경이 제거되지는 않습니다.[1]
CVSS 점수 출처
Wordfence CNA 기록은 각 CVE의 CVSS 3.1 점수를 7.2로 지정합니다. Patchstack의 WPC Product Bundles 권고문에는 7.1이 표시됩니다. 이 문서는 CVE 기록 점수를 사용하고 출처를 명시합니다.[2], [3], [6]
소스 코드 참조
Wordfence CNA 참조는 검증, 저장, 관리자 화면 렌더링 경로와 관련된 WPC Product Bundles 및 Ninja Forms의 버전 고정 파일을 가리킵니다. 이는 조사용 코드 참조이며 검증된 패치 diff가 아닙니다. 위 PHP 코드는 출력 인코딩을 설명하는 예시로, 플러그인 코드를 재구성한 것이 아닙니다.[8], [9], [10], [11], [12], [13], [14], [15], [16]

프레임워크 매핑

사고 타임라인

2026-09-21 / 2026-09-22

Wordfence CNA 기록의 공개일은 9월 21일이지만 Patchstack은 취약점이 9월 22일 공개됐다고 설명합니다. 출처 간 하루 차이가 있습니다. CVE 기록은 각각 8.6.6 및 3.15.3까지의 영향을 받는 플러그인 버전을 표시합니다.[2], [3], [8], [9], [1]

2026-10-04~2026-10-05

Patchstack은 동일한 침해 후 단계가 WPC Product Bundles를 거쳐 먼저, Ninja Forms를 거쳐 다음 날 사용된 시도를 관찰했다고 보고했습니다. 분석은 10월 6일 공개됐습니다.[1]

단계별 공격 실행 흐름

단계 1

서로 다른 저장형 XSS 진입점 두 개

Patchstack에 따르면 캠페인은 WPC Product Bundles의 CVE-2026-93836과 Ninja Forms의 CVE-2026-94504를 사용했습니다. 별개의 취약점이며 후속 활동이 공통되어 보고서에서 함께 다룹니다.[1], [2], [3], [8], [9]

단계 2

저장된 콘텐츠를 관리자가 열기

제출 데이터는 저장된 뒤 주문 또는 양식 제출의 관리 화면에 표시됩니다. 출력 처리가 안전하지 않으면 마크업으로 실행될 수 있으며, 관리자의 페이지 방문이 브라우저 실행 맥락을 제공합니다.[1], [8], [9], [10], [11], [12], [13], [14]

단계 3

스크립트가 사이트 맥락을 상속

WordPress 출처에서 실행되는 코드는 관리자의 기존 세션으로 동일 출처 요청을 보낼 수 있습니다. HttpOnly는 쿠키 기밀성을 보호하지만 이미 같은 출처에서 실행 중인 코드의 세션 사용을 막지 못합니다.[1], [17], [18]

단계 4

후속 접근은 취약점 수정 후에도 남을 수 있음

Patchstack은 플러그인 설치와 추가 지속성을 시도한 정황을 보고했습니다. 이는 캠페인 관찰 결과이지 모든 대상의 성공을 확인한 것은 아닙니다. 업데이트는 취약한 진입점을 닫지만 이미 발생한 변경을 되돌리지는 않습니다.[1], [4], [5]

소스 코드 비교: 취약한 구현 vs 보안 패치

이 코드는 일반적인 예시가 아니라 Ninja Forms의 Textarea::admin_form_element()에 적용된 소스 코드 변경입니다. 3.15.3은 저장된 제출 내용을 textarea의 HTML 본문에 그대로 삽입했지만, 3.15.4는 출력 전에 esc_textarea()를 적용합니다. 따라서 이 문맥에서 내용이 마크업으로 해석되는 경계를 막습니다. 이 예시는 CVE-2026-94504의 Ninja Forms 경로만 설명하며 CVE-2026-93836에 대한 WPC Product Bundles 수정은 아닙니다. 다른 HTML 문맥에는 각 문맥에 맞는 이스케이프 함수를 사용하세요.[13], [15], [16]

취약한 구현
public function admin_form_element( $id, $value )
{
    return "<textarea class='widefat' name='fields[$id]'>$value</textarea>";
}
보안 강화 패치
public function admin_form_element( $id, $value )
{
    return "<textarea class='widefat' name='fields[$id]'>" . esc_textarea( $value ) . "</textarea>";
}

엔지니어링 및 시스템 보안 강화 체크리스트

출처