Langsmith 0.3.79에 5건의 CVE가 발견됐다… 실제로는 어떤 것이 파손되는가

발행: (2026년 6월 16일 AM 12:21 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

LangSmith 0.3.79에 5개의 CVE가 발생했습니다. 실제로 깨지는 원인은 여기입니다.

LangSmith를 0.3.79로 업그레이드했습니다. 보안 스캐너가 5개의 취약점을 발견했으며, 가장 높은 심각도는 9.8입니다. 첫 번째 본능은 패닉 업그레이드입니다. 두 번째는 “그것은 단지 클라이언트 SDK일 뿐”이라 무시하는 것입니다. 둘 다 틀렸습니다. 이유는 다음과 같습니다.

LangSmith는 LLM 관측성 레이어입니다. 에이전트에서 트레이스, 로그, 평가 데이터를 LangSmith 플랫폼으로 전송합니다. 0.3.79.tgz 파일은 알려진 문제점이 있는 의존성을 포함하고 있습니다. 9.8 severity CVE는 LangSmith가 내부에서 사용하는 HTTP 클라이언트인 Undici에 있습니다. Undici에는 요청 스미글링 취약점이 있어 공격자가 요청에 헤더를 주입할 수 있습니다.

익숙하신가요? 이는 작년 주요 CDN을 다운시킨 동일한 버그 클래스입니다.

실제로 일어나는 일: 에이전트 → LangSmith SDK → Undici HTTP 클라이언트 → LangSmith API ↓ 공격자가 요청을 가로채고 악성 헤더를 삽입합니다. 트레이스 데이터가 손상됩니다.

하지만 핵심은 이겁니다: 직접 Undici를 호출하지 않습니다. LangSmith 의존성 트리 깊이 3층에 묻혀 있습니다. package-lock.json에는 취약한 버전이 고정되어 있으며, npm audit만으로는 트랜зитив 업데이트가 필요해 수정할 수 없습니다.

공격자는 악성 응답을 만들어 후속 요청을 오염시킬 수 있습니다. LangSmith를 공유 프로세스 공간(예: Next.js 서버리스 함수)에서 실행 중이라면, 하나의 손상된 트레이스가 다른 사용자 데이터를 유출할 수 있습니다. 실제 영향: 고객 지원 에이전트가 사용자의 개인 식별 정보를 LangSmith에 전송합니다. 공격자는 연결을 가로채고 헤더를 삽입한 뒤, 다른 사용자 세션 데이터를 읽게 됩니다.

같은_family_ (가족)입니다. 다른 각도입니다. 공격자는 요청을 조기에 종료하고 가짜 하나를 추가합니다. LangSmith는 에이전트가 전혀 수행하지 않은 도구를 호출한 것으로 인식합니다. 디버깅에 불리합니다: 트레이스를 확인하고从未 만든 도구 호출을 보게 되며, 재현하려고 몇 시간씩 소요합니다. 이는 버그가 아니라 공격(Exploit)입니다.

특정 조건에서 Undici는 힙 메모리를 누수시킵니다. 에이전트는 몇 시간 동안 정상 작동하다가 OutOfMemory(OOM)이 발생합니다. LLM을 탓합니다. 컨텍스트 윈드를 탓합니다. 메모리를 더 추가합니다. 다음에 무슨 일이 일어날까요? 다시 OOM이 발생합니다. 누수는 에이전트가 아닌 추적 레이어에 있기 때문입니다.

선택지는 두 가지입니다: npm install undici@6.6.2

package.json에 오버라이드를 추가하세요: { “overrides”: “undici”: “6.6.2” }

다시 npm install 실행합니다. 확인하세요: npm ls undici

→ 6.6.2이 표시되어야 합니다.

LangSmith의 변경 로그를 확인하세요. 0.3.80 이후에 의존성이 수정되었다면 업데이트합니다: npm install langsmith@0.3.82

취약한 파일을 직접 패치하세요. 찾으려면: find node_Modules/undici -name “*.js” | xargs grep -l “CRLF|split|smuggle”

취약한 구문 분석 로직을 수동으로 교체합니다. 재밌지 않습니다. 문제가 생겼을 때 작동합니다.

TracePilot는 Undici를 사용하지 않습니다. 우리는 엄격한 헤더 검증을 적용한 Node.js http 모듈을 직접 사용해 인gestion 파이프라인을 구축했습니다. 트랜зитив HTTP 클라이언트 의존성이 없습니다. LangSmith를 TracePilot로 교체하는 데 한 줄만 변경하면 됩니다: // 이전 import { Client } from ‘langsmith’; const ls = new Client({ apiKey: process.env.LANGSMITH_API_KEY });

// 이후 import { TracePilot } from ‘tracepilot-sdk’; const tp = new TracePilot(process.env.TRACEPILOT_API_KEY);

그것만으로 충분합니다. HTTP 계층에 CVE가 없습니다.

하지만 진짜 승리 포인트는 TracePilot이 모든 LLM 호출, 도구 실행, 토큰 사용량을 캡처하고 실시간 대시보드에 표시한다는 것입니다. 무언가 깨지면 로그를 검색하지 않습니다. 트레이스를 열고 실패 단계에서 실행을 포크한 뒤, 프롬프트를 편집하고 재생합니다. 배포 없이도 동작합니다. ‘내 기계에서는 안 된다’는 말은 이제 필요 없습니다.

당신은 현재 생산 에이전트에 5개의 CVE가 존재하고 있습니다. 그 중 하나는 9.8입니다. 보안 팀이 질문할 것입니다. 패치할 수 있습니다. 오버라이드할 수도 있으며, 처음부터 이 문제를 갖지 않는 추적 레이어로 교체할 수도 있습니다. TracePilot은 동일한 관측성 — 그리고 타임 트래블 디버깅 — 을 제공하지만 부담은 없습니다. 무료 API 키를 받으세요. 첫 번째 실패한 트레이스를 5분 안에 포크하세요. Undici 오버라이드를 계속 싸울 수도 있습니다. 선택은 여러분의 것입니다. AI 에이전트 디버깅은 ‘매트릭스’를 읽는 것 같은 느낌이 들지 않아야 합니다. TracePilot Discord

0 조회
Back to Blog

관련 글

더 보기 »