flawopen.com/Incidents/wordpress-stored-xss-admin-session-campaign-october-2026
WordPress 저장형 XSS 캠페인: 플러그인 두 개와 하나의 지속성 체인
Patchstack은 WordPress의 저장형 XSS 두 건을 통해 동일한 침해 후 임플란트를 사용하려는 시도를 관찰했습니다. 두 플러그인을 업데이트하고 지속성을 조사하세요. 패치만으로 이미 침해된 사이트가 정리되지는 않습니다.[1], [2], [3], [4], [5]
관리자가 나중에 읽는 공개 제안함 두 개를 떠올려 보세요. 사이트가 메모를 일반 텍스트가 아니라 실행 가능한 마크업으로 저장하면, 관리자가 열 때 브라우저 권한으로 동작할 수 있습니다. 캠페인 보고서는 서로 다른 두 플러그인 취약점이 진입점으로 쓰였고, 이후 업데이트 뒤에도 접근을 유지하려는 시도가 있었다고 설명합니다.[1], [8], [9]
핵심 개념 및 용어
저장형 XSS- 공격자가 제어하는 텍스트를 저장한 뒤 브라우저에서 실행 가능한 마크업으로 표시하는 취약점입니다. 이 사례에서는 WordPress 관리 화면의 표시 맥락이 중요했습니다.[2], [3], [8], [9]
동일 출처 세션- 브라우저는 동일 출처 요청에 사이트 세션을 자동으로 포함합니다. 해당 사이트 출처에서 이미 실행 중인 스크립트는 HttpOnly 쿠키를 읽지 않고도 페이지를 통해 동작할 수 있습니다.[1], [17], [18]
지속성- 초기 취약점을 수정한 뒤에도 남는 접근 수단입니다. 승인되지 않은 계정이나 파일이 예이며, 업데이트만으로 이런 변경이 제거되지는 않습니다.[1]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-79
- OWASP Top 10:2025 — A05:2025 Injection
사고 타임라인
Patchstack은 동일한 침해 후 단계가 WPC Product Bundles를 거쳐 먼저, Ninja Forms를 거쳐 다음 날 사용된 시도를 관찰했다고 보고했습니다. 분석은 10월 6일 공개됐습니다.[1]
단계별 공격 실행 흐름
소스 코드 비교: 취약한 구현 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>";
}엔지니어링 및 시스템 보안 강화 체크리스트
- ✓CVE-2026-93836을 해결하려면 WPC Product Bundles를 최소 8.6.7로 업데이트하세요. 2026년 10월 11일 확인 당시 WordPress.org의 최신 버전은 8.7.4였습니다. 8.7.3 변경 기록에도 저장형 XSS 보강이 언급됐지만 이 CVE와 연결되지는 않았습니다. 최신 버전을 설치하세요. CVE-2026-94504를 해결하려면 Ninja Forms를 최소 3.15.4로 업데이트하세요. 2026년 10월 11일 확인 당시 최신 버전은 3.15.5였습니다. 3.15.5 변경 기록에는 Paragraph Text (Rich Text) 제출 내용에 대한 별도의 저장형 XSS 보강이 있으며, 이는 3.15.4의 CVE 수정과 구분해야 합니다. 모든 운영 사이트에서 설치된 두 플러그인의 버전을 확인하세요.[2], [3], [4], [5]
- ✓취약한 버전이 노출됐다면 복구를 선언하기 전에 조사하세요. 데이터베이스의 관리자 계정과 대시보드를 대조하고 must-use 플러그인을 포함해 예상하지 못한 플러그인을 확인하세요.[1]
- ✓웹, WordPress, 호스팅 로그에서 예상하지 못한 관리자 작업, 플러그인 설치, 주문이나 양식 제출을 보는 동안 발생한 변경을 찾으세요.[1]
- ✓FlawOpen 운영 지침: 신뢰할 수 있는 사고 대응 절차로 무단 접근을 제거하세요. 봉쇄 후 권한이 높은 자격 증명과 WordPress 인증 salt를 교체하고 사이트에서 접근할 수 있는 다른 비밀 정보도 검토하세요.
- ✓FlawOpen 운영 지침: 정상 백업을 보관하고 서비스 복구 전에 데이터베이스, 플러그인 파일, 결제/양식 흐름을 검증하세요. 업데이트만으로 지속성이 제거됐다고 볼 수 없습니다.
출처
- Patchstack — Four ways back in: the WordPress XSS campaign that hides its own admin account (2026-10-06)
- CVE-2026-93836 — CVE record (Wordfence CNA)
- CVE-2026-94504 — CVE record (Wordfence CNA)
- WPC Product Bundles for WooCommerce — WordPress.org changelog
- Ninja Forms — WordPress.org changelog
- Patchstack — WPC Product Bundles advisory
- NCSA Qatar — Cybersecurity advisories (October 7, 2026)
- Wordfence CNA — CVE-2026-93836 vulnerability record
- Wordfence CNA — CVE-2026-94504 vulnerability record
- CVE-2026-93836 — WPC Product Bundles 8.6.5 source pointer: class-woosb.php
- CVE-2026-93836 — WPC Product Bundles 8.6.5 source pointer: class-backend.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: Submission.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: Textarea.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: admin submission template
- Ninja Forms 3.15.3 to 3.15.4 changeset referenced by CVE-2026-94504
- Ninja Forms 3.15.4 소스 수정 — Textarea::admin_form_element()
- MDN — 동일 출처 정책