펜리젠트 헤더

CVE-2025-32432의 해부학: 크래프트 CMS에서 Yii2 컨테이너 주입 무기화

웹 취약점의 계층 구조에서 레드팀 운영자의 즉각적인 주의를 요하는 것은 거의 없습니다. PHP 객체 주입(POI) 인증되지 않은 사용자에게 노출된 엔드포인트입니다.

CVE-2025-32432 가 바로 그것입니다. 와 CVSS v3.1 점수 10.0점Craft CMS의 이 취약점은 단순한 버그가 아니라 최신 종속성 주입(DI) 컨테이너가 지원하는 애플리케이션에 대해 어떻게 무기화될 수 있는지에 대한 마스터 클래스입니다.

하드코어 보안 엔지니어가 관심을 갖는 것은 단순한 RCE가 아니라 메커니즘입니다. 이는 보안이 근본적으로 실패하는 방식을 강조합니다. Yii2 프레임워크 (Craft를 구동하는)는 사용자 입력을 통해 전달되는 구성 배열을 처리합니다. 이 분석에서는 취약점 스택 추적, 익스플로잇에 필요한 특정 가젯 체인, 그리고 왜 이 특정 CVE가 기존 DAST 스캐너의 한계점을 나타내며 AI 기반 공격 에이전트의 등장을 필요로 하는지에 대해 자세히 분석합니다.

구조적 결함: DI가 잘못될 때

CVE-2025-32432를 이해하려면 Craft CMS의 아키텍처를 이해해야 합니다. Craft는 Yii2의 서비스 로케이터 및 종속성 주입 패턴에 크게 의존합니다.

이 취약점은 자산 컨트롤러특히 actionGenerateTransform 메서드를 사용합니다. 이 엔드포인트는 프론트엔드에서 이미지 변환(자르기, 크기 조정)을 즉시 요청할 수 있도록 설계되었습니다.

취약한 싱크대

코드 흐름은 사용자 입력에서 객체 인스턴스화에 이르는 위험한 경로를 따릅니다.

  1. 섭취: 컨트롤러는 다음이 포함된 POST 요청을 수락합니다. 변환 배열입니다.
  2. 정규화: 데이터는 다음 주소로 전달됩니다. Craft::$app->getAssetTransforms()->normalizeTransform().
  3. 실행(싱크대): 이 메서드는 결국 Craft::createObject($config).

Yii2, createObject 는 강력한 래퍼입니다. 만약 $config 배열에는 클래스 키를 입력하면 Yii2는 해당 특정 클래스의 인스턴스화를 시도하여 나머지 배열 키로 해당 클래스의 공용 프로퍼티를 채웁니다.

PHP

`// 단순화된 취약점 흐름 공개 함수 actionGenerateTransform() { $transformId = Craft::$app->getRequest()->getBodyParam('transformId'); // 공격자가 전체 구성 배열을 제어합니다 $transformConfig = Craft::$app->getRequest()->getBodyParam('transform'); // 이 경우, 공격자는 전체 구성 배열을 제어할 수 있습니다;

// 치명적 결함: 'class' 파라미터에 화이트리스트 유효성 검사가 없습니다.
$object = Craft::createObject($transformConfig);

$object->transform()을 반환합니다;

}`

다음은 정의입니다. 안전하지 않은 역직렬화 (CWE-502), 네이티브가 아닌 JSON/배열 구성을 사용하지만 직렬화 해제(). 결과는 동일합니다. 공격자가 제어 흐름을 지시합니다.

CVE-2025-32432의 해부학: 크래프트 CMS에서 Yii2 컨테이너 주입 무기화

익스플로잇 체인: 가젯 제작하기

스크립트 키디는 엔드포인트에서 페이로드를 가리키기만 하면 이 CVE에서 실패합니다. 400 잘못된 요청. 성공적인 익스플로잇을 위해서는 애플리케이션의 상태에 대한 미묘한 이해가 필요합니다.

1단계: 상황별 정찰(자산 ID)

그리고 actionGenerateTransform 함수에는 하드 종속성이 있습니다. 즉, 유효한 assetId (CMS에 업로드된 이미지를 나타내는 정수).

만약 assetId 가 존재하지 않으면 코드가 예외를 던집니다. 전에 취약 계층에 도달 createObject 호출합니다.

  • 더 트랩: 기존 스캐너(Nessus, Nuclei)는 페이로드를 무작위로 발사합니다. 무작위 ID를 사용하거나 ID를 사용하지 않습니다. 오류를 수신하고 대상을 "안전"으로 표시합니다.
  • 바이패스: 정교한 공격자(또는 에이전트)가 공개 HTML 소스 코드를 스크래핑하여 일반적인 Craft 에셋 패턴(예, /자산/이미지/1042/logo.png). 정수 1042 는 실행 경로를 잠금 해제하는 열쇠입니다.

2단계: 가젯 체인

유효한 에셋 ID로 게이트의 잠금이 해제되면 공격자는 페이로드를 제공해야 합니다. 인스턴스화할 수 있으므로 any 클래스의 수명 주기 동안 악의적인 활동을 트리거하는 클래스인 "가젯"이 필요합니다(일반적으로 __construct, __destruct또는 init).

CVE-2025-32432의 맥락에서 연구원들은 다음을 사용하는 체인을 확인했습니다. \\GuzzleHttp\\Client (설치된 경우) 또는 네이티브 Yii2 캐싱 클래스.

일반적인 벡터는 yii\\rbac\\PhpManager 또는 보기 렌더러를 사용하여 로컬 파일을 포함할 수 있습니다. 하지만 가장 직접적인 RCE 방법은 Craft\\Config 객체를 PHP 프로토콜 래퍼와 결합합니다.

익스플로잇 페이로드 구조:

JSON

{ "assetId": "1042", "transform": { "class": "craft\\\\base\\\\ImageTransform", "width": "100", "height": "100", "format": "php", "quality": { "class": "yii\\\\rest\\\\IndexAction", "checkAccess": "system", "id": "whoami" } } }

참고: 실제 가젯 체인은 서버에 설치된 특정 컴포저 종속성에 따라 달라질 수 있으므로 페이로드를 동적으로 조정해야 합니다.

크래프트 CMS에서 Yii2 컨테이너 주입 무기화

정적 보안 도구의 실패

이 취약점은 현 세대 보안 도구의 한계를 드러냅니다.

  1. 무국적자: 기존 스캐너는 무국적 상태입니다. 홈페이지에서 자산 ID를 발견했다는 사실을 '기억'하지 않고 10분 후 POST 요청에서 이를 사용하기로 '결정'합니다.
  2. 컨텍스트 블라인드: 비즈니스 로직을 유추할 수 없습니다. 공격자들은 이미지 ID를 익스플로잇 체인의 필수 키가 아닌 숫자로만 인식합니다.

업계는 다음과 같은 방향으로 전환하고 있습니다. 에이전트 보안.

자동화된 추론: 성실한 접근 방식

에서 CVE-2025-32432를 분석했을 때 펜리전트에서 표준 퍼징의 성공률이 0%라는 것을 발견했습니다. 이 취약점을 안정적으로 검증하기 위해서는 다단계 추론이 가능한 AI 에이전트를 배포해야 했습니다.

그리고 펜리전트 워크플로에서 '스캐닝'과 '침투 테스트'의 차이점을 확인할 수 있습니다:

  1. 지문 인식: 에이전트는 X-Powered-By: Craft CMS 헤더.
  2. 시맨틱 구문 분석: 에이전트는 퍼징 대신 랜딩 페이지의 DOM을 구문 분석합니다. 에이전트는 다음을 식별합니다. <img src="..."> 태그와 정규식 일치 URL 구조를 사용하여 잠재적인 에셋 ID를 추출합니다.
  3. 가설 테스트: 에이전트는 추출된 ID로 양성 변환 요청을 시도합니다. 에이전트가 200 OK 또는 논리 예외 (대신 404)를 클릭하면 ID가 유효한지 확인합니다.
  4. 페이로드 돌연변이: 에이전트는 JSON 페이로드를 구성합니다. 서버가 특정 래퍼를 더 이상 지원하지 않는 최신 PHP 버전을 실행 중인 경우 에이전트는 실시간으로 가젯 체인을 수정하여 대체 객체 삽입을 시도합니다.

이 기능은 다음을 수행할 수 있습니다. 체인 로직-A단계에서 키를 찾아 B단계에서 사용하는 것이 인간(및 에이전트) 해커와 자동화된 스크립트를 구분하는 방법입니다.

치료 및 방어

Craft CMS 설치를 방어하는 경우 즉각적인 조치가 필요합니다.

1. 패치 적용

공급업체는 다음 버전에서 엄격한 유효성 검사를 릴리스했습니다. 실행 중인지 확인하세요:

  • Craft CMS 3.x -> -> 3.9.15+
  • Craft CMS 4.x -> -> 4.14.15+
  • Craft CMS 5.x -> 5.6.17+

2. WAF 구성

레거시 코드 동결로 인해 패치를 즉시 적용할 수 없는 경우, WAF 수준에서 특정 공격 벡터를 차단해야 합니다.

ModSecurity 규칙 예제:

Apache

SecRule REQUEST_URI "@contains /actions/assets/generate-transform" \\ "id:100001,phase:2,t:none,t:소문자,deny,status:403,msg:'Block Craft CMS RCE CVE-2025-32432', \\ chain" SecRule ARGS_POST:transform "@rx class"

이 규칙은 POST 본문에서 'class' 매개 변수를 정의하려는 변환 엔드포인트에 대한 모든 요청을 차단합니다.

영향력이 큰 취약점 비교(2024-2025년)

CVE-2025-32432를 맥락에 맞게 이해하려면 주요 프레임워크의 다른 최근 아키텍처 오류와 비교하는 것이 도움이 됩니다.

CVE IDTarget벡터복잡성중요한 이유
CVE-2025-32432Craft CMS개체 주입Medium검증되지 않은 DI 컨테이너의 실패를 보여줍니다.
CVE-2024-21626runc컨테이너 탈출높음컨테이너 런타임 격리의 근본적인 결함.
CVE-2024-23897Jenkins임의 파일 읽기낮음CLI 구문 분석기 기능 남용(args4j).
CVE-2024-3400팔로알토 PAN-OS명령 주입낮음엣지 보안 디바이스에서 인증되지 않은 RCE.

결론

CVE-2025-32432 는 최신 웹 개발에서 "기능이 풍부하다"는 것은 종종 "공격면이 풍부하다"는 것을 의미한다는 사실을 상기시켜 줍니다. Yii2의 편리함 createObject 는 개발자에게는 유연성을 제공했지만 공격자에게는 장전된 총을 쥐어준 셈입니다.

보안 엔지니어에게 이 취약점은 '포인트 앤 슛' 방식의 스캔 시대가 끝났음을 보여줍니다. 취약점은 점점 더 논리적이고, 상황에 따라 달라지며, 상태에 따라 달라지고 있습니다. 이를 방어하려면 공격자만큼 빠르게 생각하고 추론하고 적응할 수 있는 도구가 필요합니다.

참고 자료 및 추가 자료:

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