
CVE-2025-67644에 대한 개념 증명 익스플로잇: LangGraph SQLite Checkpoint의 SQL 인젝션 취약점입니다. 검증되지 않은 메타데이터 필터 키를 통한 임의 SQL 인젝션을 시연하여 데이터 유출 및 필터 우회를 가능하게 합니다.
alist()영향: 필터 완전 우회, 모든 체크포인트 레코드(잠재적으로 민감한 대화 상태, 스레드 ID, 메타데이터 포함) 유출, 일부 배포 시나리오에서는 더 넓은 데이터베이스 접근 가능.
영향 받는 버전: < 3.0.1
수정된 버전: ≥ 3.0.1
CVSS 점수: 7.3 (높음) — AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
내부 _metadata_predicate() 로직은 JSON 추출 표현식에서 사용자 제어 딕셔너리 키를 안전하지 않은 f-문자열 보간으로 처리합니다.
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
공격자가 임의의 키(예: API 입력을 통해)를 제공할 수 있다면, JSON 경로를 조기에 종료하고 SQL 조각을 주입할 수 있습니다. 예:
{"env') OR '1'='1": "anything"}
→ 결과적으로 항상 참으로 평가되는 WHERE 절이 생성되어 모든 레코드를 반환합니다.
flowchart TD
A["User / API Client"] -->|"Sends malicious filter dict"| B["Application using langgraph-checkpoint-sqlite"]
B -->|"Passes filter=..."| C["SqliteSaver.list method"]
C -->|"Unsafe key interpolation"| D["Metadata predicate logic"]
D -->|"Builds injectable SQL"| E["SQLite Engine"]
E -->|"Returns ALL checkpoints / sensitive data"| F[Attacker]
F -->|"Data exfiltration / authorization bypass"| G["Impact achieved"](이 다이어그램은 노드 텍스트에 가능한 한 괄호를 사용하지 않았으며, 특수 문자/마침표가 포함된 레이블에는 따옴표를 사용하여 파싱 오류를 방지했습니다.)
--dump-all (전체 레코드 표시), --threads-only (thread_id만 추출)pip install langgraph-checkpoint-sqlite"<3.0.1" # 예: ==2.0.0
# 기본 확인 (개수만)
python3 exploit.py checkpoints.db
# 전체 체크포인트 상세 정보 덤프
python3 exploit.py checkpoints.db --dump-all
# thread_id만 추출 (열거에 유용)
python3 exploit.py checkpoints.db --threads-only --dump-all
# 인메모리 데이터베이스 테스트 (빠르고 휘발성)
python3 exploit.py ":memory:" --dump-all
취약한 버전 설치:
pip install langgraph-checkpoint-sqlite==2.0.0
익스플로잇 코드를 exploit.py로 저장
기존 또는 새 체크포인트 데이터베이스에 대해 실행:
python3 exploit.py checkpoints.db --dump-all
즉시 업그레이드:
pip install --upgrade langgraph-checkpoint-sqlite
(버전 ≥ 3.0.1)
신뢰할 수 없는 출처(사용자, API, JSON 페이로드 등)로부터의 임의 메타데이터 필터 키는 절대 수용하지 마십시오.
버전 ≥ 3.0.1에서는 라이브러리가 키에 엄격한 정규식을 적용합니다: ^[a-zA-Z0-9_.-]+$
이는 교육 및 보안 연구 목적으로만 공개된 개념 증명입니다.
생산 시스템이나 명시적인 서면 허가 없이 모든 대상에 대해 이 코드를 사용하지 마십시오.
저자는 이 코드로 인한 오용이나 손해에 대해 책임을 지지 않습니다.
책임 있는 공개 및 연구 용도로만 사용하십시오.
Mohammed Idrees Banyamer
@banyamer_security