무슨 일이 있었나
AgentVCR record/replay 구성 요소는 호출자가 제공한 카세트 이름을 path.join()을 사용하여 .json 접미사와 연결하고 결과가 cassettePath 아래에 있는지 확인하지 않고 즉시 읽기/쓰기를 수행합니다. Node의 path.join이 포함된 '..' 세그먼트를 정규화하므로 순회 이름이 기본 디렉토리를 벗어납니다. 시연된 읽기 프리미티브와 쓰기 프리미티브는 프로세스가 접근할 수 있는 JSON 파일로 제한되지만, 다중 에이전트 테스트/오케스트레이션 배포에서 카세트 이름은 종종 신뢰할 수 없는 소스에서 오므로 에이전트의 기록/저장 상태가 임의 JSON 읽기/쓰기 채널이 됩니다.
왜 중요한가
에이전트 record/replay는 에이전트 동작을 결정적이고 검사 가능하게 만드는 일반적인 방법입니다. 카세트 이름이 신뢰할 수 없는 경우 동일한 메커니즘이 AI 에이전트 오케스트레이션 콘솔 내의 임의 JSON 파일 읽기/쓰기 프리미티브가 되어 에이전트 자체 런타임 내에서 구성/정책 변조 및 자격 증명이나 상태 노출을 가능하게 합니다.
공격 경로
AgentVCR은 path.join(cassettePath, name + '.json')을 통해 카세트 파일 경로를 구성하며 정규화 및 포함 검사를 수행하지 않습니다. 공격자가 name 인수를 제어하면 상대 순회 시퀀스 (../../...)를 제공하여 load()가 임의 .json 파일을 읽고 내용을 반환하고, save()가 임의 .json 파일을 쓰거나 덮어씁니다 — 오케스트레이터의 자체 정책 파일을 위조하고 (운영자가 거부 임계값 아래에 둔 인증을 에이전트에 부여하는 조작된 신뢰 수준 항목이 시연됨) 합법적인 에이전트가 보유한 토큰을 무효화하기에 충분합니다.
영향받는 시스템
network-ai npm 패키지, AgentVCR (lib/agent-vcr.ts), 5.13.4 through 5.15.4; 5.15.5에서 수정
완화 방안
network-ai >= 5.15.5로 업그레이드하십시오 (advisory의 확인된 수정 범위는 5.15.5 이전); 신뢰할 수 없는 입력에서 카세트 이름을 파생하지 않거나 구성된 카세트 디렉토리 내에서 검증/제한하십시오.