펜리젠트 헤더

CVE-2025-62164 PoC: 임베디드를 공격 표면으로 만드는 vLLM의 완성 데이터 플레인 버그

경영진 요약

LLM(대규모 언어 모델) 인프라가 성숙해지면서 공격 표면이 기존의 관리 인터페이스('컨트롤 플레인')에서 추론 데이터의 실제 흐름('데이터 플레인')으로 이동하고 있습니다.

CVE-2025-62164 의 패러다임을 바꾸는 취약점을 나타냅니다. vLLM는 높은 처리량의 LLM 서비스를 위한 업계 표준 엔진입니다. 이 결함으로 인해 공격자는 이 엔진을 무기화할 수 있습니다. /v1/complements 악성 엔드포인트를 주입하여 프롬프트 임베딩. 공격자는 파이토치의 로딩 로직 내에서 안전하지 않은 역직렬화 메커니즘을 악용하여 유효한 API 키가 없어도(배포 구성에 따라 다름) 메모리 손상을 유발하여 서비스 거부(DoS) 및 잠재적인 원격 코드 실행(RCE)을 유발할 수 있습니다.

이 분석은 기술적 근본 원인을 분석하고, 개념 증명(PoC)을 제공하며, AI 플랫폼 엔지니어를 위한 즉각적인 해결 단계를 설명합니다.

CVE-2025-62164-PoC-vLLMs-Completions-Data-Plane-Bug

공격 벡터: 임베딩이 위험한 이유

표준 LLM 상호 작용에서는 사용자가 텍스트를 보냅니다. 그러나 vLLM과 같은 고급 추론 엔진은 다음을 지원합니다. 임베딩 입력 (텐서 데이터)를 API를 통해 직접 사용할 수 있습니다. 이는 성능 최적화와 멀티모달 워크플로우를 위해 설계되었지만 위험한 문을 열 수 있습니다: 직접 객체 역직렬화.

취약점은 vLLM이 이러한 수신 텐서를 처리하는 방식에 있습니다. 즉, 엔진은 사용자가 제공한 직렬화된 데이터의 구조를 무해한 수학적 표현이라고 가정하여 암묵적으로 신뢰합니다.

취약한 코드 경로

중요한 결함은 다음과 같습니다. vllm/entrypoints/renderer.py 내부의 _LOAD_AND_VALIDATE_EMBED 함수입니다.

Python

# 취약한 로직의 단순화된 표현
import torch
import io
pybase64 가져오기

def _LOAD_AND_VALIDATE_EMBED(embed: 바이트):
    # 위험: 신뢰할 수 없는 바이너리 스트림을 역직렬화하기
    tensor = torch.load(
        io.BytesIO(pybase64.b64decode(embed, validate=True)),
        weights_only=True, # 보안에 대한 잘못된 인식
        map_location=torch.device("cpu"),
    )
    반환 텐서

동안 가중치 전용=참 는 임의의 파이썬 코드(일반적인 피클 취약점)의 실행을 방지하기 위한 것입니다. 충분하지 않음 를 사용하여 특정 PyTorch 텐서 유형을 처리할 때 메모리 손상을 방지할 수 있습니다.

기술 심층 분석: 스파스 텐서 활용하기

CVE-2025-62164의 핵심은 파이토치의 안전 플래그와 다음과 같은 처리 사이의 단절을 활용합니다. 스파스 텐서.

  1. 파이토치 2.8+ 시프트: 최신 버전의 PyTorch는 기본적으로 스파스 텐서에 대한 값비싼 무결성 검사를 생략하여 성능을 개선합니다.
  2. 바이패스: 공격자는 잘못된 '스파스 COO'(좌표 형식) 텐서를 구성할 수 있습니다. 심지어 가중치 전용=참, torch.load 는 이 구조를 역직렬화합니다.
  3. 메모리 손상: 스파스 텐서의 인덱스는 로드 중에 선언된 크기에 대해 유효성이 검사되지 않기 때문에 후속 작업(텐서를 고밀도 포맷으로 변환하거나 GPU 메모리로 이동하는 등)을 수행하면 다음과 같은 결과가 발생합니다. 아웃오브바운드(OOB) 쓰기.

이 OOB 쓰기는 파이썬 인터프리터를 즉시 충돌시킵니다(DoS). 정교한 힙 스프레이 및 메모리 레이아웃 조작을 통해 이 프리미티브는 에스컬레이션되어 명령 포인터를 제어하여 RCE를 달성할 수 있습니다.

CVE-2025-62164 PoC 펜리전트

개념 증명(PoC) 분석

면책 조항: 이 PoC는 교육 및 방어 목적으로만 사용됩니다.

1. 페이로드 구성하기

공격자는 내부 일관성 제약 조건을 위반하는 직렬화된 PyTorch 텐서를 생성합니다.

Python

토치 가져오기
import io
import base64

def generate_exploit_payload():
    buffer = io.BytesIO()
    
    # 액세스 시 OOB 쓰기를 트리거하도록 설계된 스파스 텐서를 생성합니다.
    # 특정 인덱스는 할당된 메모리 외부를 가리키도록 만들어집니다.
    # malformed_tensor = torch.sparse_coo_tensor(indices=..., values=..., size=...)
    
    # 데모를 위해 직렬화를 시뮬레이션합니다.
    # 실제 공격에서 이 버퍼에는 바이너리 피클 스트림이 포함됩니다.
    torch.save(malformed_tensor, buffer)
    
    # JSON 전송을 위한 인코딩
    반환 base64.b64encode(buffer.getvalue()).decode('utf-8')

2. 익스플로잇 요청

공격자는 이 페이로드를 표준 완료 엔드포인트로 전송합니다.

POST http://target-vllm-instance:8000/v1/completions

JSON

{
  "model": "meta-llama/Llama-2-7b-hf",
  "prompt": {
    "임베딩": ""
  },
  "max_tokens": 10
}

3. 결과

  • 모범 사례: vLLM 워커 프로세스에 세분화 오류가 발생하여 크래시가 발생합니다. 오케스트레이터(예: 쿠버네티스)가 다시 시작하면 공격자는 간단히 요청을 다시 전송하여 지속적 서비스 거부를 일으킬 수 있습니다.
  • 최악의 경우: 메모리 손상으로 함수 포인터를 덮어쓰면 공격자가 컨테이너 컨텍스트 내에서 셸 코드를 실행할 수 있습니다.

영향 평가

  • 가용성(높음): 이는 실행하기 쉬운 DoS입니다. 단일 요청으로 추론 노드를 다운시킬 수 있습니다. 클러스터 환경에서는 공격자가 노드를 반복적으로 공격하여 전체 클러스터를 다운시킬 수 있습니다.
  • 기밀성 및 무결성(중요): RCE가 달성되면 공격자는 환경 변수(종종 허깅 페이스 토큰, S3 키 또는 WandB 키를 포함하는)와 메모리에 로드된 독점 모델 가중치에 액세스할 수 있게 됩니다.

해결 및 완화

1. 즉시 업그레이드

취약점이 패치되었습니다. vLLM v0.11.1.

  • 액션: Docker 이미지 또는 PyPI 패키지를 즉시 최신 버전으로 업데이트하세요.
  • 로직 수정: 이 패치는 안전하지 않은 텐서 형식이 메모리 할당자와 상호 작용하기 전에 이를 거부하는 엄격한 유효성 검사 로직을 구현합니다.

2. 입력 살균(WAF/게이트웨이 수준)

즉시 업그레이드할 수 없는 경우 게이트웨이에서 공격 벡터를 차단해야 합니다.

  • 액션: 들어오는 JSON 본문을 검사하도록 API 게이트웨이(Nginx, Kong, Traefik)를 구성하세요.
  • 규칙: 다음 요청을 차단합니다. /v1/complements 여기서 프롬프트 필드에는 임베딩 키입니다.

3. 네트워크 세분화

추론 서버가 공용 인터넷에 직접 노출되지 않도록 하세요. 액세스는 입력을 살균하고 인증을 처리하는 백엔드 서비스를 통해 중개되어야 합니다.

결론

CVE-2025-62164는 AI 보안에 대한 경각심을 일깨우는 역할을 합니다. 더 이상 '모델'과 '임베딩'을 비활성 데이터로 취급할 수 없습니다. AI 시대에는 데이터는 코드입니다를 역직렬화하려면 바이너리 실행 파일을 실행하는 것과 동일한 수준의 면밀한 조사가 필요합니다.

AI 인프라에서 펜 테스트를 실행하는 팀(예 Penligent.ai), 추론 엔진에서 노출된 직렬화 엔드포인트를 확인하는 것은 이제 참여 범위의 표준 부분이어야 합니다.

작성자 참고: AI 인프라를 안전하게 유지하세요. 항상 입력의 유효성을 검사하고, 직렬화된 데이터를 신뢰하지 말고, vLLM 버전을 안정적인 최신 릴리스에 고정하세요.

임베디드를 공격 표면으로 만드는 데이터 플레인 버그, vLLM이 해결했습니다.
게시물을 공유하세요:
관련 게시물