
CVE-2026-12227에 대한 개념 증명 및 기술 분석으로, WordPress Visual Composer 플러그인(<=45.16.0)의 인증되지 않은 LFI로 파일 포함 및 RCE가 가능합니다.
CVE-2026-12227은 WordPress용 Visual Composer Website Builder 플러그인에서 발생하는 치명적인(CVSS 9.8) 인증되지 않은 로컬 파일 포함(LFI) 취약점으로, 45.16.0 이하의 모든 버전에 영향을 미칩니다. 이 결함은 vcv-template 파라미터에 존재하며, 공격자가 서버의 임의 파일을 포함하고 실행할 수 있도록 허용합니다. 이는 민감한 데이터 노출, 접근 제어 우회, 또는 서버 환경이 잘못 구성된 경우 완전한 원격 코드 실행(RCE)으로 이어질 수 있습니다.
CVE-2026-12227
9.8/10
Visual Composer Website Builder 플러그인 (45.16.0 버전까지)
근본 원인: 이 취약점은 CWE-98: PHP 프로그램의 Include/Require 문에 대한 파일 이름의 부적절한 제어(흔히 PHP 원격 파일 포함이라고 함)로 분류됩니다. 이는 PageTemplatesController.php 파일, 구체적으로 viewPageTemplate() 함수 내의 논리 결함에서 비롯되며, 이 함수는 인증 확인 없이 WordPress의 template_include 필터에 우선순위 11로 연결됩니다.
핵심 문제는 "검증 후 변형(validate-then-mutate)" 결함입니다:
검증(원시 입력에 대해): 코드는 먼저 사용자가 제공한 vcv-template 파라미터의 원시 값에 대해 WordPress의 validate_file() 함수를 호출합니다. 이 함수는 ...와 같은 리터럴 디렉터리 순회 시퀀스를 포함하는 경로를 거부하도록 설계되었습니다. 이 단계에서 악성 입력 theme:.theme:./.theme:./.theme:./wp-links-opml.php는 리터럴 ..을 포함하지 않으므로 검증을 통과합니다.
변형(검증 후): 검증 직후, 코드는 템플릿 유형이 vc-custom-layout인지 그리고 값에 theme: 문자열이 포함되어 있는지 확인합니다. 그렇다면 str_replace('theme:', '', $current['value'])를 수행하여 값에서 theme:의 모든 항목을 제거합니다.
싱크: 변형된 값은 이후 locate_template()에 전달되며, 이 함수는 경로를 확인하고 파일을 포함합니다. theme: 문자열이 제거되었기 때문에 조각난 순회 시퀀스가 융합되어 ../../../../wp-links-opml.php와 같은 유효한 경로를 생성하며, 이는 최종 형태로 검증된 적이 없습니다.
공격 표면: 공격 벡터: 네트워크(AV:N) — 이 취약점은 HTTP/HTTPS를 통해 직접 도달할 수 있습니다.
인증: 필요 없음(PR:N) — 인증되지 않은 취약점입니다. 모든 원격 공격자가 유효한 계정 없이 트리거할 수 있습니다.
사용자 상호작용: 필요 없음(UI:N).
영향받는 구성 요소: WordPress용 Visual Composer Website Builder 플러그인.
취약한 파라미터: vcv-template 파라미터로, vcv-template-type 파라미터와 함께 사용됩니다.
트리거 조건: 플러그인이 WordPress 사이트에 설치되어 활성화되어 있어야 하며, 프런트엔드 페이지가 Visual Composer로 구축되어 있어야 합니다(즉, 정상적인 퍼머링크가 존재해야 함).
익스플로잇 참고 사항: 영향: 이 결함은 인증되지 않은 공격자가 서버의 임의 로컬 파일을 포함하고 실행할 수 있도록 허용합니다. 포함된 PHP 파일이 실행되기 때문에 이는 원격 코드 실행(RCE)으로 이어질 수 있으며, 서버의 기밀성, 무결성, 가용성을 완전히 침해할 수 있습니다.
익스플로잇 기법: 공격자는 근본 원인에서 설명한 대로 theme: 접두사를 사용하여 검증을 우회하는 악성 vcv-template 값을 작성하여 이를 악용할 수 있습니다. 예를 들어, 요청은 다음과 같을 수 있습니다: POST /?vcv-template-type=vc-custom-layout&vcv-template=theme:.theme:./.theme:./.theme:./wp-links-opml.php.
RCE 에스컬레이션: LFI 자체는 치명적이지만, RCE를 달성하는 것은 종종 서버 환경에 달려 있습니다. 일반적인 방법은 이미 서버에 업로드된 파일(예: PHP 코드가 내장된 겉보기에 무해한 이미지 파일)을 포함하거나 다른 서버 구성 오류를 활용하는 것입니다.
PoC 가용성: Python 스크립트와 Nuclei 템플릿을 포함한 여러 개념 증명 익스플로잇이 공개적으로 이용 가능하며, 승인된 랩 환경에서 검증에 사용할 수 있습니다
[*] 위에 제공된 Python 코드
패치 버전: 45.16.1