Stroq: 코딩 에이전트가 한 일과 이유를 로컬에서 감사하는 도구
Show HN: Stroq – a local audit of what your coding agent did and why
TL;DR Highlight
Stroq는 에이전트 세션에서 유출된 키를 찾고 위험 명령을 출처까지 추적해 막는다
Who Should Read
Claude Code·Codex·Cursor에 API 키가 있는 환경을 맡기고 유출이나 프롬프트 인젝션이 걱정인 개발자
Core Mechanics
- 과거 세션을 설치 없이 감사한다
- `npx @stroq/cli`는 최근 30일 세션, 키 파일, 작업 폴더를 읽는다.
- 키 이름만 출력하고 값은 출력하지 않으며 아무것도 전송하지 않는다.
- 키가 어디로 갔는지 분류한다
- `stroq sent`는 Claude Code, Codex CLI, Cursor 세션을 내 컴퓨터의 자격 증명과 대조한다.
- 다른 회사로 전송됨, 전송 가능성, AI가 봄, 해당 서비스에만 사용, 실행 전 차단으로 나눈다.
- 명령이 어디서 왔는지 추적한다
- 훅(실행 전에 끼어드는 코드)이 도구 호출을 실행 전에 판단한다.
- `curl | sh`와 알려진 시크릿이 담긴 외부 호출은 거부한다.
- 에이전트가 읽은 텍스트를 그대로 반복하는 명령은 그 텍스트를 지목해 먼저 묻는다.
- 세션 기록을 지금 정책으로 재판정한다
- `stroq replay --all`은 훅 없이 최근 30일 Claude Code 세션을 현재 정책에 돌려 본다.
- 결과는 현재 정책의 판정이며 당시에 실제로 일어난 일의 기록은 아니다.
- 공격 36개를 샌드박스에서 재현한다
- `stroq attack`은 공개 보고서와 합성 사례 36개를 임시 홈에서 정책에 돌린다.
- 0.30.0 기준 15개 거부, 21개 질문, 0개 통과다.
- 한계를 스스로 밝힌다
- 매칭은 텍스트 수준이라 모델이 처음부터 써낸 명령은 출처를 추적하지 못한다.
- 필터일 뿐 샌드박스가 아니며, 스크립트·파일·변수로 나간 키는 놓칠 수 있다.
Community Reactions
- 호스트 하네스에 의존하지 않는다는 경험
- gVisor 완전 격리와 기본 차단 egress 프록시(시크릿 주입 포함)로 에이전트를 돌린다는 댓글이 있었다.
- 외부 연결 시 gVisor를 일시 정지하고 사용자가 허용 여부를 고르게 하며, 하네스 도구 경계에만 맡기는 것은 못 믿겠다는 의견이다.
- eBPF 백엔드를 쓰라는 의견
- eBPF 백엔드면 더 많은 적대적 시나리오를 다룰 수 있다는 의견이 있었다.
- Linux 전용이지만 개발은 VM에서 하는 게 낫다며 agentsight 링크를 공유했다.
- LLM 없이 규칙으로 판단하느냐는 질문
- README상 텍스트 매칭이고 외부 전송이 없으니 LLM이 아닌 규칙 기반이 맞느냐는 질문이 두 건 있었다.
- 프롬프트 인젝션 경고 시스템의 일부가 될 수 있겠다는 기대도 있었다.
- 메뉴바 상주 데몬 제안
- 백그라운드에서 계속 스캔하고 일치하면 메뉴바에서 알리자는 제안이 있었다.
- 항목에서 마스킹, 삭제, 수리, 오탐 표시를 하게 하자는 의견이다.
How to Apply
- 오늘 내 세션에서 키 유출부터 확인하기
- 터미널에서 `npx @stroq/cli sent`를 실행한다.
- 전송됨으로 나온 키는 바로 폐기하고 재발급한다.
- 과거 세션을 현재 정책에 돌려 보기
- `npx @stroq/cli replay --all`로 최근 30일 세션을 훅 설치 없이 점검한다.
- 열어 보라고 지목한 세션을 `stroq show`로 확인한다.
- 훅을 켜서 다음 세션을 지키기
- 결과를 확인한 뒤 `npx @stroq/cli init`으로 에이전트에 훅을 연결한다.
- 콘솔의 Test hook으로 훅이 실제 호출되는지 확인한다.
- 격리 환경과 함께 쓰기
- 필터일 뿐 샌드박스가 아니니 민감한 키는 에이전트 작업 환경에서 분리한다.
- 에이전트는 VM이나 컨테이너 안에서 돌린다.
Try It
# 터미널에 그대로 붙여넣기 (Node.js 22 이상 필요)
npx @stroq/cli
# 키가 어디로 갔는지 확인 (키 이름만 출력, 값은 출력 안 함)
npx @stroq/cli sent
# 훅 없이 최근 30일 세션을 현재 정책으로 재판정
npx @stroq/cli replay --all
# 이어서 해 볼 것: 공격 36개를 샌드박스에서 돌려 보고, 마음에 들면 훅 연결
npx @stroq/cli attack
npx @stroq/cli initTerminology
관련 논문
Claude Code가 User-Agent 헤더에 이메일을 실어 웹사이트로 보낸다
Claude Code가 curl 요청 User-Agent에 사용자 이메일을 넣어 스팸 피해 제보가 나왔다
Rivet: S3 위에서 에이전트를 확장·오케스트레이션하는 Actor 플랫폼
에이전트마다 Actor를 띄웠더니 콜드스타트 4.99ms, 메모리 72KB가 됐다
멀티 에이전트 시스템 밑바닥부터 만들기: 아키텍처 패턴 3가지와 실패 모드
에이전트를 쪼개면 조율 문제가 생기니 코드 레벨 제한으로 막아야 한다
에이전트 매 턴마다 후보 N개 뽑아 고르기: Turn-Level Best-of-N 샘플링
매 턴 후보 액션 N개 중 LLM이 하나를 골랐더니 pass@1이 오르고 턴 수가 40~50% 줄었다
요약이 지시가 될 때: LLM 에이전트가 직접 쓴 인수인계 요약 속 근거 없는 정책
시스템 프롬프트의 승인 문장을 구체화하자 근거 없는 제한 요약이 5.0%에서 1.8%로 줄었다
AI가 40년 된 기술 부채를 갚게 만들고 있다: PHP2Shell 사건
AI가 PHP의 오래된 크래시 버그를 원격 코드 실행 취약점으로 바꿔냈다
Postman 데스크톱이 Codex·Claude Code 플러그인을 몰래 설치했다
Postman 앱을 열었더니 Codex·Claude에 플러그인과 훅이 자동 설치됐다
Octomind: 단일 Rust 바이너리 오픈소스 코딩 에이전트 하니스
Rust 바이너리 하나로 어떤 모델이든 돌리고, TOML 가드레일로 정책을 거는 코딩 에이전트