로그인 실패 화면 하나가 원격 코드 실행으로 걸어간 여정 — XSS2Shell

로그인 실패 화면 하나가 원격 코드 실행으로 걸어간 여정 — XSS2Shell

분류: CVE · 웹·서버 · RCE · CVE-2026-64638 [정보성]

덱. 워드프레스 코어의 확장 취약점인 XSS2Shell(CVE-2026-64638)은 개별적으로 보면 낮은 심각도인 결함 여러 개가 이어져, 결국 무인증 원격 코드 실행(RCE)까지 도달하는 사례입니다. 시작은 로그인 실패 화면에 뜨는 문구 하나였습니다.

리드

보안 평가에서 흔히 하는 실수는 결함을 하나씩 따로 떼어 “이 정도는 위험도가 낮다”고 판단하는 것입니다. 그런데 파서·DOM·인증 메커니즘·API가 서로 맞물리는 실제 애플리케이션에서는, 낮은 심각도 결함 여러 개가 순서대로 이어지면 전혀 다른 그림이 나옵니다. XSS2Shell은 그 조합의 교과서적인 사례입니다.

핵심 사실 요약

  • CVE-2026-64638(XSS2Shell)은 워드프레스 코어의 확장 취약점으로, 개별 결함은 낮은 심각도지만 워드프레스 기본 동작(default behavior)과 맞물려 무인증 원격 코드 실행에 이릅니다. 발견자는 PWN.AI로 알려져 있습니다.
  • 코드는 워드프레스 초기 버전부터 존재해온 것으로 알려져 있으며, 이번 패치 백포트는 4.7 이후 유지보수 브랜치까지만 적용됐습니다. 그 결과 사실상 유지보수되는 워드프레스 설치 전반(추정 약 5억 사이트)에 영향을 줄 수 있는 범위였습니다. 실제 공격 실증 범위는 6.4~7.0.2로 알려졌고, 취약점은 7.0.3에서 패치됐습니다. CVSS 4.0 기준 8.9(High)로 알려져 있습니다.
  • 진입점은 워드프레스 로그인 페이지(wp-login.php)입니다. 로그인이 실패하면 사용자가 입력한 아이디를 화면에 다시 보여주는데, 이 값이 문자열 조합 함수로 반사됩니다.
  • 1단계 — 파서 차이(parser differential). 사용자가 입력한 아이디에 꺾쇠와 태그명 사이에 공백을 넣은 < area 형태의 페이로드를 넣으면, sanitize_user()wp_strip_all_tags()(내부적으로 PHP strip_tags() 사용) 단계는 이를 무해한 텍스트로 취급해 통과시킵니다. 그런데 이후 단계인 wp_kses_post()는 같은 문자열을 허용 마크업으로 해석합니다. 두 단계가 같은 문자열을 서로 다르게 읽는 이 간극 때문에, 결과적으로 공격자가 제어하는 DOM 요소가 무인증 로그인 실패 화면에 그대로 삽입됩니다.
  • 2단계 — DOM clobbering. 로그인 페이지의 자바스크립트(user-profile.js)는 특정 DOM 요소가 있을 것으로 기대하고 동작하는데, 앞 단계에서 주입된 요소가 이 기대를 “덮어써서” 페이지 내부에서 참조하는 변수(ajaxurl 등)를 공격자가 원하는 값으로 바꿔치기합니다.
  • 3단계 — SOME/JSONP 우회. 바꿔치기된 값을 발판 삼아, 보안 연구자 Paulos Yibelo가 2022년 정리한 SOME(Same-Origin Method Execution) 기법과 워드프레스 REST API의 JSONP 지원·_envelope=1 파라미터가 401 응답을 200으로 감싸 일부 보호를 우회하는 특성을 결합해, 관리자 컨텍스트에서 동작을 유발하고 관리자 Application Password를 탈취합니다.
  • 상승 조건(정확히). 무인증 XSS 자체는 로그인 실패 페이지에서 자동 실행되지만, RCE로 이어지려면 (1) 관리자가 이미 로그인돼 있고 (2) 공격자 페이지에서 명시적 상호작용(클릭 1회 등 시연)이 필요합니다. 완전한 제로클릭 RCE는 아닙니다.
  • 성공 시 wp-config.php의 DB 자격증명 노출, 영구 관리자 계정 생성, PHP 워커 권한으로의 OS 명령 실행까지 이어질 수 있는 것으로 설명됩니다.

대응방안

  1. 근본. 영향받는 워드프레스 코어를 패치 버전(7.0.3 이상)으로 업데이트합니다.
  2. 차선. 관리자 계정에는 항상 관리 세션을 유지한 채 출처가 불분명한 링크를 클릭하지 않는 것이 실질적 완화선이 됩니다. 로그인 실패 페이지로의 비정상 반복 요청을 제한하는 것도 도움이 됩니다.
  3. 탐지 관점. 로그인 실패 시 반사되는 사용자 입력값에 꺾쇠·공백이 섞인 비정상 패턴, 그리고 관리자 세션에서 발생한 예상치 못한 Application Password 생성 이력을 모니터링합니다.

짧은 논평

이 사례에서 가장 중요한 교훈은, 개별 컴포넌트를 따로 평가해서는 안 된다는 점입니다. 파서·DOM·자바스크립트 동작·REST API·인증 메커니즘·관리 기능이 서로 상호작용할 때, 개별 저심각도 결함이 결합해서 치명적 영향을 낼 수 있습니다. 이는 저희가 다른 사례에서 반복해서 짚는 “필터를 우회하기 위해 여러 취약점 클래스를 넘나들며 재조합한다”는 원리와 같은 맥락입니다. 하나의 결함이 아니라 결함들 사이의 상호작용을 보는 시각이 필요합니다.

References / 참고자료

  1. PWN.AI, “XSS2Shell” — 이 글이 재구성한 원 분석. 취약점 체인 전체(파서 차이×DOM clobbering×SOME/JSONP)를 다룸. https://pwn.ai/blog/xss2shell
  2. Paulos Yibelo, SOME(Same-Origin Method Execution) 관련 2022년 리서치 — XSS2Shell 체인의 3단계가 기반한 선행 연구.

*이 글은 위 원 분석을 우리 관점에서 다시 쓰고 짧은 논평을 더한 정보성 초안입니다. 특정 문장·페이로드를 그대로 옮기지 않았습니다. *