펜리젠트 헤더

팬텀 클래스: 크래프트 CMS에서 CVE-2025-32432 (Yii2 컨테이너 주입) 무기화

최신 웹 취약점의 계층 구조에서, 종속성 주입(DI) 컨테이너 주입 는 먹이사슬의 정점에 위치합니다. SQL 인젝션보다 탐지하기 어렵고, 메모리 손상보다 더 정교하며, 그 영향력은 치명적입니다.

최근 공개된 CVE-2025-32432 타겟팅 Craft CMS-그리고 더 나아가 Yii2 프레임워크-사용자 입력이 클래스 인스턴스화를 제어하면 애플리케이션이 공격자의 소유가 된다는 사실을 잔인하게 상기시켜 줍니다. 많은 자동화된 스캐너가 처음에는 이를 심각도가 낮은 '대량 할당' 또는 '구성 문제'로 분류했지만, 엘리트 보안 엔지니어는 이를 실제 상황으로 인식하고 있습니다: 원격 코드 실행(RCE) 안전하지 않은 객체 역직렬화 논리를 통해.

이 글에서는 취약점에 대한 기술적 부검을 수행합니다. 공급업체의 조언을 넘어 가젯 체인을 재구성하고, 기본 PHP 매직 메서드를 분석하며, AI 기반 시맨틱 분석이 이러한 논리 결함을 대규모로 포착할 수 있는 유일한 실행 가능한 방법인 이유를 보여드릴 것입니다.

팬텀 클래스: 크래프트 CMS에서 CVE-2025-32432 (Yii2 컨테이너 주입) 무기화

실패의 아키텍처: Yii2 서비스 로케이터 내부

CVE-2025-32432를 이해하려면 먼저 Yii2 프레임워크의 아키텍처 핵심을 이해해야 합니다: yii\\di\\Container.

Craft CMS는 클래스 종속성을 관리하기 위해 Yii2의 서비스 로케이터 패턴과 의존성 주입 컨테이너에 크게 의존합니다. 개발을 유연하게 하기 위해 개발자는 컨테이너를 사용하여 객체를 구성할 수 있습니다. 구성 배열. 이 기능이 취약점의 근본 원인입니다.

"CreateObject" 싱크

이 취약점 클래스의 중요한 싱크는 다음과 같습니다. Yii::createObject(). 이 메서드는 구성 배열을 허용합니다. 클래스 키는 인스턴스화할 PHP 클래스를 지정하고, 후속 키는 해당 인스턴스의 공용 속성을 정의합니다.

PHP

// Craft CMS 백엔드 코드에서 합법적으로 사용 $object = Yii::createObject([ 'class' => 'app\\models\\User', 'username' => 'admin', 'role' => 'superuser' ]);

이 취약점(CVE-2025-32432)은 Craft CMS의 특정 컨트롤러 동작(종종 플러그인 구성 저장 또는 초안 처리와 관련됨)이 HTTP 요청에서 원시 JSON 입력을 받아 이 싱크에 맹목적으로 전달하기 때문에 발생합니다.

논리 결함:

  1. 출처: 사용자 전송 POST /api/v1/plugin-config 를 JSON 본문으로 사용합니다.
  2. 흐름: 컨트롤러는 JSON을 PHP 배열로 디코딩합니다.
  3. 싱크: 배열은 다음 주소로 전달됩니다. Yii::createObject($requestData).
  4. 결과: 공격자는 클래스로 변환하여 데이터 주입을 개체 주입.
크래프트 CMS에서 CVE-2025-32432(Yii2 컨테이너 주입)의 무기화

킬 체인 구축하기: 가젯 사냥

PHP 익스플로잇에서 클래스를 인스턴스화할 수 있다는 것은 해당 클래스가 아니면 쓸모가 없습니다. 무언가를 수행합니다. 라이프사이클 동안 흥미를 유발합니다. 우리는 가젯.

가젯은 매직 메서드에서 민감한 작업(파일 쓰기, 명령 실행, 데이터베이스 쿼리)을 수행하는 클래스입니다(__construct, __destruct, __wakeup, __toString) 또는 초기화 메서드(init). Craft CMS에는 전체 Yii2 에코시스템과 대규모 공급업체 라이브러리(Guzzle, Monolog 등)가 포함되어 있으므로 가젯 환경이 비옥합니다.

기본 가젯: yii\\rest\\IndexAction

CVE-2025-32432의 맥락에서 가장 신뢰할 수 있는 가젯 체인은 다음을 활용합니다. yii\\rest\\IndexAction. 이 클래스는 REST API에 대한 모델을 나열하도록 설계되었지만 특정 속성을 가지고 있습니다: checkAccess.

그리고 checkAccess 프로퍼티는 권한 확인을 위한 호출 가능한 함수를 보유하기 위한 것입니다. 그러나 DI 컨테이너를 통해 속성 값을 제어하기 때문에 이 값을 콜백 실행 프리미티브.

무기화된 페이로드(PoC)

아래는 재구성된 개념 증명(PoC) 페이로드입니다. 이 JSON 구조는 취약한 엔드포인트에서 처리될 때 RCE를 트리거합니다.

JSON

{ "action": "save-config", "config": { "class": "yii\\\\rest\\\\IndexAction", "id": "rce_trigger", "controller": { "class": "yii\\\\web\\\\Controller", "id": "dummy_controller" }, "modelClass": "yii\\\\base\\\\Model", "checkAccess": "시스템", "실행": "id; uname -a; cat /etc/passwd" } }

단계별 실행 흐름:

  1. 인스턴스화: DI 컨테이너는 다음을 표시합니다. 클래스: yii\\rest\\IndexAction. Reflection을 사용하여 이 클래스의 인스턴스를 생성합니다.
  2. 속성 인구: 컨테이너는 키를 반복합니다.
    • 설정 $indexAction->checkAccess = '시스템'.
    • 재귀적으로 인스턴스화합니다. dummy_controller (필수 IndexAction).
  3. 함정 트리거하기: 대부분의 Yii2 컴포넌트는 init() 또는 run() 의 수명 주기 동안. 이 특정 익스플로잇 경로에서 애플리케이션 로직은 결국 동작을 호출합니다.
  4. 콜백 실행: 내부 IndexAction::run()로 설정하면 코드가 다음을 확인합니다. checkAccess 는 set.PHP // yii\\rest\\IndexAction의 내부 로직 if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $params); }
  5. RCE: PHP 실행 system('rce_trigger', ...)? 아니요, 공격자는 인수를 정렬해야 합니다. 공격자는 콜백에 인자로 전달되는 내부 속성을 조작하여 다음을 달성합니다. system('id; ...').

참고: 지능형 공격자는 이를 yii\\캐싱\\파일 캐시 가젯을 사용하여 퍼시스턴트 PHP 웹셸을 작성할 수 있습니다(예, shell.php)를 퍼블릭 웹루트(/웹/자산/), 임시 실행 제한을 우회합니다.

레거시 스캐너가 실패하는 이유

CVE-2025-32432를 탐지하는 것은 기존의 동적 애플리케이션 보안 테스트(DAST) 도구에겐 악몽과도 같습니다.

  • 구문 실명: 페이로드는 구문적으로 유효한 JSON입니다. SQL 토큰을 포함하지 않습니다(' 또는 1=1) 또는 XSS 벡터(<script>). OWASP Top 10 기본값으로 구성된 WAF는 일반적으로 이를 통과시킵니다.
  • 컨텍스트 블라인드: 스캐너가 JSON 객체를 인식합니다. 스캐너는 키 클래스 는 백엔드 PHP 프레임워크에 의미론적 의미를 갖습니다. 스캐너로, 클래스 와 같은 또 다른 데이터 필드일 뿐입니다. 사용자 이름 또는 이메일. 를 유추할 수 없습니다. 객체 인스턴스화 부작용.

AI 기반 탐지: 펜리젠트의 이점

여기에서 Penligent.ai 는 공격적 보안 테스트의 패러다임 전환을 의미합니다. 펜리젠트는 패턴 매칭을 넘어 다음과 같은 방법을 사용합니다. 문맥 인식 시맨틱 분석.

  1. 프레임워크 핑거프린팅 및 로직 매핑

펜리전트의 AI 에이전트는 먼저 기본 기술 스택(Craft CMS / Yii2)을 식별합니다. 결정적으로, AI는 이 프레임워크와 관련된 위험한 싱크를 '알고' 있습니다. Yii2에서 pickle.load가 Python용, unserialize가 일반 PHP용인 것처럼 Yii::createObject가 중요한 제어 지점이라는 것을 이해합니다.

  1. 지능형 프로빙(의도를 가진 퍼징)

펜리젠트는 무작위로 문자를 뿌리는 대신 로직 프로브를 구성합니다.

  • 프로브 1: 주입 {"class": "yii\\\\helpers\\\\VarDumper"}.
  • 관찰: 응답 시간이 변경되나요? 오류 메시지가 "VarDumper"를 언급하나요?
  • 추론: 애플리케이션이 클래스를 로드하려고 시도하면 AI가 클래스 매개 변수가 DI 컨테이너에서 해석되고 있습니다.
  1. 비파괴 검증

인젝션 벡터가 확인되면 Penligent는 취약점을 증명하기 위해 rm -rf /를 실행할 필요가 없습니다. 100%의 확실성과 프로덕션 인프라에 대한 위험 없이 RCE 기능을 증명하는 양성 가젯 체인(예: 단순히 대역 외 수신기에 대한 DNS 조회를 수행하는 가젯 체인)을 생성할 수 있습니다. 이를 통해 보안팀은 비즈니스 운영을 중단하지 않고도 CVE-2025-32432 패치를 검증할 수 있습니다.

관련 영향력이 큰 취약점

보안 엔지니어는 위협 환경을 완전히 이해하기 위해 CVE-2025-32432와 과거 선례를 연관시켜야 합니다. 다음과 같은 메커니즘 컨테이너 주입 는 Craft CMS에만 있는 것이 아닙니다.

CVE ID대상 소프트웨어기술 메커니즘
CVE-2023-41892Craft CMSRCE 경유 이미지 매직 객체 인스턴스화 로직의 조건 매개변수입니다.
CVE-2019-15488Yii2 프레임워크안전하지 않은 역직렬화 yii\\db\\BatchQueryResult __wakeup 메서드를 사용합니다.

이러한 취약점은 공통의 DNA를 공유합니다: 입력 유형에 대한 신뢰.

수정 및 심층 방어

CVE-2025-32432를 완화하려면 코드 수정, 구성 강화 및 런타임 보호를 포함하는 다계층 접근 방식이 필요합니다.

1. 코드 수준 수정(근본 원인)

최종적인 해결책은 엄격한 유형 검사. 개발자는 절대로 원시 사용자 입력 배열을 Yii::createObject.

  • 거부 목록: 명시적으로 설정 해제 클래스 키를 입력한 후 처리합니다.
  • 허용 목록: 동적 인스턴스화가 필요한 경우, 요청된 클래스를 엄격한 하드코딩된 안전 클래스 화이트리스트와 비교하여 유효성을 검사합니다.

PHP

// 보안 구현 $config = json_decode($json, true); unset($config['class']); // 오브젝트 삽입 방지 $object = Yii::createObject(array_merge(['class' => SafeClass::class], $config));

2. 런타임 강화(php.ini)

공격자가 클래스를 인스턴스화하더라도 기본 시스템 기능이 중립화되어 있으면 RCE가 불가능합니다. 여러분의 php.ini 를 클릭하여 위험한 실행 기능을 비활성화합니다:

Ini, TOML

disable_functions = system, exec, shell_exec, passsthru, proc_open, popen, pcntl_exec

3. 즉시 패치 적용

최신 Craft CMS 업데이트를 즉시 적용하세요. CVE-2025-32432에 대한 공급업체 패치는 프레임워크 수준 필터를 도입하여 다음을 방지할 가능성이 높습니다. 클래스 매개변수가 특정 컨트롤러 동작에 적용되지 않도록 합니다.

결론

CVE-2025-32432 는 프레임워크가 더욱 추상적이고 강력해질수록 복잡한 논리적 공격 표면이 생겨난다는 사실을 극명하게 보여줍니다. 컨테이너 인젝션은 "2020년대의 SQL 인젝션"-작성하는 코드에 결함이 있는 것이 아니라 프레임워크의 마법을 구성하는 방식에 결함이 있는 것입니다.

하드코어 보안 엔지니어에게 교훈은 분명합니다: 입력 유효성 검사 는 데이터 값을 넘어 데이터로 확장되어야 합니다. 유형 그리고 구조. 사용자가 정의할 수 있도록 허용하는 경우 구조 를 누르면 이미 게임에서 진 것입니다.

신뢰할 수 있는 참조 자료

게시물을 공유하세요:
관련 게시물
ko_KRKorean