실전 가이드 · 4분 · 06.22

내 Claude Code가 적의 코드를 실행할 확률 85% — Agentjacking이 던진 첫 번째 청구서

loopy vibecoder

내 Claude Code가 적의 코드를 실행할 확률 85% — Agentjacking이 던진 첫 번째 청구서

핵심 요약 (TL;DR)

Tenet Security 연구진이 신종 공격 "Agentjacking"을 공개했습니다. 가짜 Sentry 에러 리포트로 Claude Code·Cursor·Codex를 속여 공격자 서버의 코드를 실행하게 만드는 방식이고, 실험 결과 100여 개 실제 타깃에서 85% 성공률을 기록했습니다. 유효 Sentry DSN이 노출된 조직만 2,388곳이 확인됐고, Sentry는 6월 3일 디스클로저 후에도 root-cause fix를 거부한 채 단일 페이로드 필터만 추가했습니다. 6월 22일 현재 Anthropic·Cursor·OpenAI 공식 패치 발표는 없습니다.

"내 코드"가 아니라 "내 에이전트가 받은 텍스트"가 적이 됩니다

바이브코딩의 신뢰 모델은 단순합니다. 나는 에이전트를 믿고, 에이전트는 도구를 믿는다. Claude Code가 Sentry MCP에 붙어 에러 로그를 받아오면, "이건 우리 모니터링 도구가 준 정상 데이터"라는 전제로 그 안의 가이드를 따라갑니다.

Agentjacking은 이 전제의 가장 약한 고리를 찌릅니다. 공격 흐름은 이렇게 흘러갑니다.

  1. 공격자가 타깃의 Sentry DSN을 찾습니다. DSN은 write-only credential이라 보통 웹사이트 프론트엔드 코드에 그대로 박혀 있습니다. 비밀이 아닌 셈이죠.
  2. 그 DSN으로 Sentry ingest 엔드포인트에 POST 요청을 보내 가짜 에러 이벤트를 푸시합니다. 이벤트 본문 안에 "이 에러는 이 URL의 스크립트를 실행해 고칠 수 있다"는 식의 악성 명령을 심어두는 거죠.
  3. 며칠 뒤 개발자가 Cursor·Claude Code·Codex에 "이 에러 고쳐줘"라고 던지는 순간, 에이전트가 Sentry의 remediation guidance를 신뢰한 것처럼 가짜 명령을 실행합니다.

성공하면 환경변수, git credentials, private repo URL, 개발자 신원이 그대로 유출됩니다. 100여 개 타깃 중 85개에서 이 흐름이 통했고, 영향을 받은 에이전트 라인업은 Claude Code·Cursor·Codex 전수입니다.

Sentry가 "근본 해결 불가" 결론을 낸 의미

가장 무거운 디테일은 Tenet이 6월 3일 Sentry에 disclosure를 보냈을 때 돌아온 답입니다. "technically not defensible" — 근본 수준에서 막을 방법이 없다는 거죠. Sentry는 결국 단일 페이로드 문자열 필터만 추가했고, 그것도 알려진 한 가지 패턴만 거릅니다. 우회는 쉽고, 새 변형은 매주 나올 겁니다.

이게 무슨 뜻이냐면, 단기 책임이 사용자에게 떨어졌다는 겁니다. Sentry는 손을 들었고, 에이전트 회사들은 6월 22일 시점 공식 반응이 없습니다. 그 사이에 끼인 바이브코더가 자기 워크플로우 규율을 직접 짜야 하는 상황인 거죠. "Claude Code의 무엇이든 그대로 실행" 디폴트가 처음으로 명확한 비용으로 환산된 사건입니다.

바이브코더 즉시 점검 체크리스트 5가지

# 1. 내 Sentry DSN이 어디 노출돼 있는지 확인
grep -r "sentry.io" ./src ./public 2>/dev/null
# DSN이 프론트엔드 번들에 있다면 정상 — 그게 공격 표면이라는 사실만 기억하세요
  1. Sentry DSN을 회전(rotate)하세요. 노출 자체는 정상이지만, 이번 폭로 이후로는 한 번 갈아주는 게 안전합니다. Sentry 프로젝트 설정에서 새 DSN을 발급하고 기존 것은 폐기하세요.

  2. 에이전트에 Sentry 에러 텍스트를 그대로 던지지 마세요. 에러 메시지를 읽어서 "내가 본문을 요약해 에이전트에 넘기는" 한 단계를 끼우세요. 사람이 한 번 읽고 옮기는 그 30초가 가장 싼 방어막입니다.

  3. MCP 노출 범위를 줄이세요. Claude Code가 자동으로 붙는 MCP 서버 목록을 점검하고, "쓰지도 않는데 켜져 있는" 도구는 끄세요. 공격 표면은 도구 수에 비례합니다.

  4. 에이전트의 자동 실행 가드를 켜세요. "shell 명령은 항상 컨펌"·"네트워크 요청은 도메인 화이트리스트만" 같은 룰을 IDE 설정에 박아두세요. Claude Code의 --allowedTools 옵션이 가장 직관적입니다.

  5. Git credentials를 격리하세요. 개발 환경의 토큰 권한을 read-only로 낮추고, push 권한이 필요한 워크플로우는 별도 세션에서만 쓰세요. 유출돼도 피해 반경이 줄어듭니다.

같은 주에 무너진 또 다른 데모 — TownSquare 사건

6월 20일 HN Show에 올라온 TownSquare가 비슷한 교훈을 줍니다. <script> 한 줄로 어떤 사이트든 실시간 프레즌스 레이어를 붙여주는 서비스고, 메이커가 본인 코멘트에 "This project has been mostly vibe-coded"라고 공언했습니다. 245점, 댓글 143개로 메인 페이지 톱을 찍었지만, 데모 페이지가 출시 직후 부적절 콘텐츠 스팸에 점령당했습니다.

메이커는 "모더레이션·blocklist 기능은 있었으나 settings에 노출 안 됐다"고 변명했지만, 핵심은 같습니다. "속도가 우선, 안전은 나중"의 청구서가 데모날에 동시에 도착한 거죠. Agentjacking이 도구 체인의 청구서라면, TownSquare는 제품 그 자체의 청구서입니다.

FAQ

Q. 내가 Sentry를 안 쓰면 안전한가요?
완전히 안전하지 않습니다. Agentjacking은 Sentry라는 특정 도구의 결함이라기보다, "에이전트가 외부 도구의 텍스트를 신뢰한다"는 구조적 패턴의 첫 사례입니다. 같은 클래스의 공격이 GitHub Issues·Linear·Datadog 등 다른 인터그레이션에서도 나올 수 있다는 게 보안 매체들의 일관된 결론입니다.

Q. Claude Code를 안 쓰면 안전한가요?
이번 실험에서 Cursor와 Codex도 동일하게 영향을 받았습니다. 에이전트 종류가 아니라 "에이전트가 외부 텍스트를 그대로 신뢰하는 디폴트"가 본질입니다.

Q. 영향받은 2,388개 조직 명단이 공개됐나요?
공개되지 않았습니다. Tenet Security는 공격을 입증할 정도의 수치만 발표했고, 개별 조직 노출 여부는 자체 점검이 필요합니다. 회사 Sentry 프로젝트의 DSN 회전을 이번 주 안에 한 번 해주세요.

마무리

vibe code의 신뢰 모델이 처음으로 청구서를 받았습니다. 속도는 그대로 가져가되, "외부 텍스트를 에이전트에 그대로 던지지 않는다"는 한 줄 규율만 워크플로우에 박아두세요. 그 한 줄이 다음 6개월의 사고를 절반으로 줄입니다.

소스: The Hacker News Agentjacking 보도, Tenet Security 기술 분석, Infosecurity Magazine 보도, TownSquare HN 토론

0

댓글 0

아직 댓글이 없습니다