커뮤니티 반응
보안 취약점을 발견하고 즉시 해결책을 공유한 것에 대해 긍정적인 반응이며, 많은 사용자가 자신의 프로젝트에 적용 여부를 확인하고 있습니다.
주요 논점
01찬성다수
라이브러리 자체 수정 전까지 개발자가 직접 입력값에 대한 타입 검증(String coercion)을 수행해야 한다.
합의점 vs 논쟁점
합의점
- 사용자로부터 입력받은 thread_id를 검증 없이 쿼리에 직접 사용하는 것은 위험하다
- Zod와 같은 라이브러리를 통한 스키마 검증이 가장 권장되는 방어 방식이다
실용적 조언
- Express 앱에서 req.body.thread_id를 사용하기 전 반드시 String()으로 감싸세요
- Zod 라이브러리를 사용하여 입력 데이터의 타입을 엄격하게 검증하세요
- LangGraph.js의 관련 이슈(2351번) 업데이트 상황을 주시하고 패치가 나오면 즉시 업데이트하세요
섹션별 상세
MongoDBSaver 내부의 getTuple 메서드에서 thread_id를 문자열로 강제 변환하지 않아 NoSQL 인젝션 취약점이 발생했다. 공격자가 thread_id에 '$gt'와 같은 MongoDB 비교 연산자 객체를 주입하면 데이터베이스는 이를 문자열이 아닌 쿼리 조건으로 해석한다. 결과적으로 find 쿼리가 컬렉션 내의 모든 체크포인트를 검색 대상으로 삼게 되며, 정렬 조건에 따라 가장 최근에 생성된 다른 사용자의 데이터를 반환하게 된다.
typescript
const { thread_id, checkpoint_ns = "", checkpoint_id } = config.configurable ?? {};
const query = { thread_id, checkpoint_ns };
this.db.collection(...).find(query).sort("checkpoint_id", -1).limit(1);취약점이 발생한 LangGraph.js의 MongoDBSaver 내부 쿼리 로직
json
{
"thread_id": { "$gt": "" },
"checkpoint_ns": { "$ne": null }
}다른 사용자의 최신 체크포인트를 탈취하기 위한 공격 페이로드 예시
취약점의 영향을 받는 환경은 MongoDBSaver를 사용하면서 thread_id를 JSON 바디나 Express의 쿼리 스트링 파서를 통해 직접 전달받는 경우이다. 특히 Express의 qs 파서는 '?thread_id[$gt]=' 형태의 입력을 객체로 자동 변환하므로 별도의 타입 검증이 없다면 공격에 노출된다. 반면 서버에서 직접 발급한 JWT 세션을 사용하거나 URL 경로 파라미터로 thread_id를 받는 경우, 또는 Zod 등을 통해 문자열 검증을 수행하는 경우에는 안전하다.
javascript
const thread_id = String(req.body.thread_id ?? "");
// 또는
z.string().parse(req.body.thread_id)입력값을 문자열로 강제 변환하여 취약점을 해결하는 방어 코드
가장 빠르고 확실한 해결책은 사용자 입력을 데이터베이스 쿼리에 전달하기 전에 명시적으로 문자열로 변환하는 것이다. String(req.body.thread_id) 함수를 사용하거나 Zod 라이브러리의 z.string().parse()를 적용하여 입력값이 객체가 아닌 문자열임을 보장해야 한다. 현재 오픈소스 메인스트림에서도 수정 작업이 진행 중이지만, 라이브러리 업데이트 전까지는 애플리케이션 레벨에서 이 한 줄의 방어 코드를 추가할 것이 권장된다.
용어 해설
- NoSQL 인젝션(NoSQL Injection)
- — 공격자가 쿼리 필터에 특수 연산자(예: $gt, $ne)를 주입하여 데이터베이스 로직을 조작하는 공격 기법이다. 이 글에서는 MongoDB 쿼리 객체에 문자열 대신 객체가 전달되어 다른 사용자의 데이터를 조회하는 보안 취약점으로 나타났다.
- 체크포인트(Checkpoint)
- — AI 에이전트의 대화 상태, 도구 입출력 기록, 변수 값 등을 저장한 스냅샷이다. LangGraph에서는 이를 통해 대화의 맥락을 유지하거나 이전 상태로 복구하는 기능을 수행한다.
- 타입 강제 변환(Type Coercion)
- — 데이터의 타입을 명시적으로 변환하는 과정이다. 이 취약점 사례에서는 입력받은 thread_id를 String() 함수로 감싸 객체 형태의 공격 페이로드가 쿼리에 직접 전달되지 않도록 방어하는 핵심 수단으로 쓰였다.
언급된 도구
LangGraph.js중립
AI 에이전트 워크플로우 및 상태 관리 라이브러리
MongoDBSaver비추천
LangGraph 상태를 MongoDB에 저장하는 체크포인터
Zod추천
TypeScript 우선 스키마 선언 및 데이터 검증 도구
언급된 리소스
AI 분석 전체 내용 보기
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
원문 발행 2026. 04. 30.수집 2026. 04. 30.출처 타입 REDDIT
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.