Cursor Marketplace의 Claude Code 확장에 심어진 SSH 백도어
Backdoor in Claude Code for VS Code extension on the Cursor Marketplace
TL;DR Highlight
Cursor Marketplace의 변조된 Claude Code 확장이 SSH 백도어를 심었다
Who Should Read
Cursor나 VS Code 계열 에디터에 Claude Code 확장을 깔아 쓰는 개발자와 보안 담당자
Core Mechanics
- 변조된 버전은 2.1.312, 2.1.313
- Cursor Marketplace에 올라온 Claude Code for VS Code 확장 번들에 백도어가 있었다.
- Cursor는 두 버전을 마켓플레이스에서 내렸다.
- 처음 글은 2.1.313만 적었다가 Cursor 공지에 맞춰 2.1.312도 추가했다.
- 확장이 로드되자마자 실행된다
- 확장 파일 앞에 악성 코드(IIFE)가 붙어 있어 activate 호출 전에 돌아간다.
- 사용자가 확장을 직접 쓰지 않아도 실행된다.
- 공격자 SSH 키를 몰래 등록한다
- ~/.ssh/authorized_keys에 주석이 svc-telemetry인 Ed25519 공개키를 추가한다.
- 이미 같은 주석이 있는지만 확인하므로 탐지할 때는 키 지문(fingerprint)도 봐야 한다.
- 역방향 SSH 터널로 공격자가 들어온다
- 134.209.82[.]225에 tunnel 사용자로 outbound SSH를 열고 -R *:0:localhost:22로 포트를 되돌려 받는다.
- 60초마다 재시도하는 분리 프로세스라 IDE를 닫아도 터널이 유지된다.
- 재부팅 후에도 살아남는다
- macOS는 com.apple.sysmond.plist LaunchAgent로 위장해 ~/.config/.smt를 실행한다.
- Linux는 @reboot crontab, Windows는 SysMon 예약 작업이나 Startup 폴더 스크립트를 쓴다.
- macOS의 SSH 켜기 로직에는 버그가 있다
- systemsetup -getremotelogin이 일반 사용자에게는 관리자 권한 오류를 출력하고 종료 코드 0을 반환한다.
- 스크립트는 출력에 Off가 있을 때만 활성화를 시도해서 SSH가 꺼진 Mac에서는 켜기 단계를 건너뛴다.
- 이미 Remote Login이 켜져 있거나 나중에 켜면 백도어는 바로 쓸 수 있다.
- 호스트 정보도 beacon으로 보낸다
- 호스트명, 사용자명, OS, 공인 IP, git 이메일을 평문 HTTP POST로 134.209.82[.]225:8099/beacon에 보낸다.
- KEY|TOKEN|SECRET|PASS|AWS|GCP에 맞는 환경변수 이름을 최대 40개 보내지만 값은 보내지 않는다.
Community Reactions
- Anthropic 직원이 직접 선을 그었다는 댓글
- Anthropic 시스템이나 직원 노트북이 뚫린 게 아니라는 설명이다.
- 악성 행위자가 Cursor 마켓플레이스 접근권으로 변조본을 올렸고, Anthropic 공식 채널 버전은 영향이 없다고 한다.
- 감염 여부 확인 명령을 공유한 댓글
- Cursor 블로그에 나온 확인법이라며 macOS는 grep으로 authorized_keys에서 svc-telemetry를 찾는 명령을 올렸다.
- Windows는 PowerShell로 사용자 authorized_keys와 administrators_authorized_keys를 검사하는 방법을 올렸다.
- Open VSX와 공식 레지스트리 영향 범위를 따지는 의견
- 영향 대상이 Open VSX(및 Cursor 마켓플레이스)이고 공식 마켓플레이스 빌드는 깨끗해 보인다는 의견이 있었다.
- 2.1.313은 Microsoft 공식 레지스트리에 게시된 적이 없는 것으로 보인다고 했다.
- Cursor인지 VS Code인지 몰라 2시간을 썼다는 경험
- . - 제목에 Cursor라고 적혀 있지 않아 API 키를 전부 재발급하고 머신 재설치를 준비했다는 경험이다.
- 자동 업데이트 지연 설정이 신뢰 게시자에겐 안 통한다는 지적
- VS Code 업데이트 지연 설정이 Microsoft, GitHub, OpenAI 같은 신뢰 게시자 확장에는 적용되지 않는다는 문서를 인용했다.
- 신뢰 게시자 목록을 사용자가 설정할 수 없다는 점을 문제로 꼽았다.
How to Apply
- 오늘 감염 여부부터 확인하기
- macOS에서 grep -qs svc-telemetry ~/.ssh/authorized_keys 를 실행해 키가 있는지 본다.
- 설치된 확장 폴더에서 anthropic.claude-code-2.1.312, 2.1.313이 있는지도 확인한다.
- 감염 시 확장 삭제 말고 전체 정리하기
- 134.209.82[.]225로 가는 ssh, autossh와 /bin/sh 재시도 루프를 종료한다.
- com.apple.sysmond.plist, ~/.config/.smt, ~/.config/.smtk, /tmp/.stk_* 를 지우고 authorized_keys에서 svc-telemetry 키를 제거한다.
- 접근 가능했던 자격증명 교체하기
- SSH가 켜져 있었거나 로그인 흔적이 있으면 해당 계정에서 접근 가능한 토큰과 키를 교체한다.
- KEY, TOKEN, SECRET, PASS, AWS, GCP가 들어간 환경변수부터 우선 돌린다.
- EDR에서 IDE 프로세스의 SSH 파일 수정 감시하기
- Code Helper, Cursor Helper 같은 프로세스가 ~/.ssh/authorized_keys를 쓰면 경보를 건다.
- com.apple.* 라벨의 비Apple LaunchAgent 생성과 hidden 스크립트를 실행하는 LaunchAgent도 규칙에 넣는다.
Try It
# 터미널(macOS)에 그대로 붙여넣기: 원문과 Cursor 공지의 확인 명령 + 흔적 파일 점검
grep -qs svc-telemetry ~/.ssh/authorized_keys && echo "svc-telemetry key found" || echo "No key found; machine not impacted"
ls -la ~/.config/.smt ~/.config/.smtk ~/Library/LaunchAgents/com.apple.sysmond.plist 2>/dev/null
ls -la "$TMPDIR"/.stk_* 2>/dev/null
ls -d ~/.*/extensions/anthropic.claude-code-2.1.31[23]* 2>/dev/null
# 이어서 해 볼 것: 아래로 134.209.82.225 연결이 있는지 확인
ps aux | grep -E 'ssh|autossh' | grep 134.209.82Terminology
관련 논문
AI가 SRE를 대체하는 게 아니라 실력을 깎아먹는다
인시던트 95%를 AI에 맡기자 나머지 5%를 다룰 SRE의 실력이 녹슬 수 있다
AI-native 엔지니어링 조직 만들기: FurtherAI 9개월 회고
배포 전 과정을 단계별로 자동화하자 엔지니어 1인당 일일 머지가 약 5배 늘었다
Minecraft·Mindustry에서 AI 에이전트 군집 50마리를 돌려 봤다
에이전트 50개를 Minecraft에 풀었더니 배급 장부와 관료제가 생겼다
Cursor Agent SDK 출시: 에이전트를 코드로 정의하고 한 줄로 배포
Cursor가 에이전트를 코드로 정의·배포하는 Agent SDK를 정식 공개했다
에이전트가 코드를 짜는 시대, 엔지니어가 여전히 알아야 할 것: 기초·폭넓은 지식·필요할 때 깊이 파기
에이전트가 짠 코드의 오너십은 기초, 폭넓은 지식, 즉시 깊이 파는 능력에 달렸다
AI가 일을 줄여준다더니, 이렇게 많이 일한 적이 없다
에이전트를 병렬로 돌렸더니 GitHub 활동이 엔지니어 시절 수준으로 돌아왔다
Corgi: 사람과 에이전트를 위한 터미널 멀티플렉서
여러 AI 에이전트의 상태를 한눈에 보는 tmux류 터미널 도구
모델이 그렇게 좋다면 OpenAI는 왜 회사 100개를 직접 안 차릴까
HN 댓글 답: 코드는 쉬워도 뭘 만들지 아는 건 별개라 토큰을 판다