2026년 10월 30일, 보안업체 Phorion은 Cursor 마켓플레이스에 배포된 Claude Code for VS Code 확장의 2.1.312·2.1.313 버전에 SSH 백도어가 삽입돼 있었다고 공개했다. 악성 확장은 extension.js 맨 앞에 즉시 실행 함수(IIFE)를 덧붙인 형태로, 확장의 정상 activate 콜백이 돌기도 전에 Node 런타임이 파일을 읽는 순간 실행된다. 사용자가 명령 팔레트를 열지도, 확장을 호출하지도 않아도 페이로드가 먼저 뜨는 구조다. HN에서는 786점·댓글 493개(공개 약 19시간 시점)가 붙었고, 댓글창에서 가장 먼저 나온 반응은 "이 확장은 설치 수가 2,700만을 넘는다"는 말이었다. 지금 개발자들이 반응하는 지점은 화려한 공격 기법이 아니라, 평소 "공식 확장"이라고 믿고 설치하던 물건이 어느 배포 경로를 통해 손에 들어왔는가 하는 질문이다.
무슨 일이 있었나
Phorion의 분석에 따르면 감염 사슬은 네 단계다. 첫 단계는 ~/.ssh/authorized_keys에 공격자가 가진 Ed25519 공개키를 svc-telemetry라는 주석과 함께 덧붙이는 것이다. 권한은 디렉터리 0700, 파일 0600으로 맞춘다. 둘째 단계는 이 기계에서 공격자 서버(글에 적힌 134.209.82.225)로 역방향 SSH 터널을 여는 것이다. 터널 인증에 쓰는 별도 개인키(svc-telemetry-tun)를 임시 디렉터리에 .stk_로 시작하는 이름으로 떨군 뒤, -R *:0:localhost:22로 원격 포트 포워딩을 건다. 포트 0을 넘기면 공격자 서버가 빈 포트를 하나 할당하고, 그 포트로 들어온 트래픽이 터널을 타고 피해자 기계의 로컬 22번으로 되돌아간다. 운영자는 자기 서버의 그 포트로 별도 세션을 열어, 1단계에서 심어둔 키로 피해자 sshd에 로그인한다. 셋째 단계는 재부팅 후에도 살아남기 위한 지속성이고, 넷째는 호스트 정찰 비콘이다.
이 구조의 요점은 자바스크립트 안에 명령·제어(C2) 프로토콜을 직접 구현하지 않았다는 점이다. SSH 자체를 접근 통로로 재활용하기 때문에 코드가 짧고, 탐지 관점에서는 "개발자 기계에서 나가는 평범한 SSH 연결"로 보인다. 이는 최근 몇 년 사이 공격자들이 즐겨 쓰는 방식으로, 별도 악성 인프라 대신 이미 허용된 프로토콜과 정상 도구를 빌려 쓰는 흐름과 맞닿아 있다.
왜 지금 문제인가 — 확장은 곧 코드 실행 권한
VS Code 계열 확장은 IDE와 같은 사용자 권한으로 돌아간다. 즉 확장 하나가 승인되는 순간 로컬 파일, 소스 코드, 셸, 클라우드 자격증명에 이르는 경로가 함께 열린다. 여기에 AI 코딩 에이전트용 확장이라는 성격이 겹치면 문제는 한 겹 더 깊어진다. 이런 확장은 원래부터 코드 저장소 전체를 읽고, 터미널을 호출하고, 때로는 네트워크로 모델 API를 부르도록 설계돼 있다. 정상 동작만으로도 넓은 권한을 요구하니, 악성 코드가 그 권한 목록 안에 섞여 들어가도 사용자 눈에는 "원래 이런 확장"으로 보인다.
여기에 배포 경로 문제가 겹친다. Cursor는 Microsoft의 공식 VS Code 마켓플레이스가 아니라 자체 미러를 운영하며, 여기에 Open VSX 계열 생태계가 붙는다. HN 토론에서는 이 구조가 "누가 무엇을 서명했는지"를 사용자가 확인할 수 없게 만든다는 지적이 반복해서 나왔다. "Made by Anthropic"이라는 표시가 실제 아티팩트 서명을 뜻한다고 믿었던 사용자가 적지 않았다는 댓글이 그 증거다.
반전 — 맥에서는 공격자 쪽 버그가 문을 닫았다
Phorion이 짚은 가장 흥미로운 대목은 macOS 경로의 구현 실수다. 악성 스크립트는 원격 로그인 상태를 systemsetup -getremotelogin으로 확인하는데, 이 명령은 관리자 권한 없이 실행하면 "You need administrator access"라는 오류를 표준출력에 찍고 종료 코드 0으로 끝난다. 스크립트는 출력이 Off일 때만 SSH를 켜려 했으므로, 권한 오류 문구는 정규식에 걸리지 않아 sudo -n systemsetup -setremotelogin on 단계를 통째로 건너뛴다. 결과적으로 "SSH가 꺼져 있는지 확인할 권한이 없다"를 "SSH는 이미 켜져 있다"로 해석한 셈이다.
그래서 SSH가 원래 꺼져 있던 맥에서는 터널이 열려도 되돌아오는 트래픽이 닫힌 로컬 22번 포트에 부딪힌다. 다만 이건 방어 논리가 아니라 우연이다. 처음부터 원격 로그인이 켜져 있었거나 사용자가 나중에 켜면, 심어둔 키와 지속성은 그대로 살아 있다. Phorion도 이 점을 명시하며 "버그가 영향을 줄였다고 안심하지 말라"고 적었다. 윈도우 경로에도 PowerShell 명령을 /bin/sh로 감싸 실행하는 유사한 실수가 있었다고 글은 전한다.
반론 — "Cursor만의 문제"라는 설명에 대한 의심
원문은 "Cursor 마켓플레이스"를 지목하고, Cursor의 보안 공지도 macOS·윈도우용 2.1.312·2.1.313이 영향을 받았다고 밝혔다. 그런데 HN 토론에는 이 프레임을 그대로 받아들이지 않는 시각이 뚜렷했다. Anthropic 측 관계자가 스레드에서 "공식 VS Code 마켓플레이스나 Open VSX는 영향이 없고, Cursor가 운영하는 제3자 마켓플레이스에서만 발생했다"고 밝혔음에도, 한 댓글은 2.1.313 버전이 공식 VS Code 마켓플레이스에서도 사라졌고 GitHub 저장소의 CHANGELOG에는 2.1.313 항목이 없으며 태그는 2.1.312와 2.1.314만 있다는 점을 근거로 "다른 채널에서도 올라갔다가 내려간 것 아니냐"고 되물었다. 게시 주체가 Anthropic 계정 자격증명을 탈취당한 것인지, Cursor 미러 자체가 침해된 것인지는 공개된 자료만으로 확정되지 않는다.
또 다른 반론은 책임 범위에 관한 것이다. "어느 배포처든 같은 일이 일어날 수 있다"는 옹호론에 대해, 댓글들은 "수백만 개의 에이전트를 돌리는 회사라면 더 잘해야 한다"고 반박했다. 반면 "확장 생태계에는 서명 강제가 없다"는 구조적 지적도 함께 나왔다. 한 사용자는 VSCode 확장에 서명이 아예 요구되지 않는다는 점을 "설계상 이해하기 어려운 선택"이라고 표현했다. 이견 중 서로 충돌하는 부분은 "누구의 실수인가"가 아니라 "무엇을 정상으로 볼 것인가"다.
한국 개발자에게 주는 함의
첫째, 사내 개발자 기계의 ~/.ssh/authorized_keys를 정기적으로 감사 대상에 넣어야 한다. 이번 사례에서 침해의 흔적은 셸 명령 로그가 아니라 authorized_keys 파일 자체의 변경으로 남는다. Node의 fs.appendFileSync가 직접 파일을 쓰기 때문에, echo나 tee 같은 셸 명령을 감시하는 규칙만으로는 잡히지 않는다. IDE 확장 호스트 프로세스(Code Helper, Cursor Helper 등)가 SSH 인증 파일을 건드리는 이벤트를 별도로 보는 편이 낫다.
둘째, IDE 확장을 "설치형 소프트웨어"가 아니라 "상시 실행되는 백도어 후보"로 분류해야 한다. 최소 권한 원칙을 적용하려면 개발 컨테이너나 VM으로 작업 환경을 분리하고, 호스트의 SSH 키와 클라우드 자격증명을 그 안에 두지 않는 구성이 현실적인 답이 된다. HN에서도 도커 컨테이너, gVisor 런타임, 마이크로 VM 같은 대안이 실무 예로 언급됐다.
셋째, 공급망 사고 대응 절차에 "확장 제거"를 완결로 적어서는 안 된다. Phorion이 제시한 정리 목록은 확장 삭제가 아니라 터널 프로세스 종료, 지속성 아티팩트 제거(LaunchAgent·cron·시작 프로그램), authorized_keys의 키 제거, 자격증명 회전이다. 특히 이번 악성 코드는 환경변수 이름만 최대 40개까지 수집해 어떤 자격증명이 있는지 목록화했다. 값 자체를 훔치지 않았더라도, 그 목록을 가진 공격자는 다음 표적을 고를 수 있다.
사료의 한계
이 글의 1차 근거인 Phorion 글은 보안 벤더의 기술 분석이다. 난독화된 번들을 역분석한 결과와 지표(IOC)는 구체적이고 재현 가능한 형태로 제시됐지만, 글의 후반부는 자사 탐지 제품의 효용을 설명하는 영업 섹션으로 이어진다. 배포 경로에 대한 설명은 Cursor의 보안 공지(2026년 10월 31일 갱신)와 Anthropic 관계자의 HN 댓글에 의존하는데, 이 둘 모두 당사자 진술이다. 침해 경위와 책임 소재는 독립적인 제3자 조사로 확인된 바 없다. 설치 수 2,700만이라는 숫자도 HN 댓글에서 나온 값이며, 원문이 검증한 수치는 아니다.
참고 자료
- 원문: Phorion — Official Claude Code Extension Compromise: Security Advisory
- Cursor 보안 공지: Claude Code extension security notice
- HN 토론: Backdoor in Claude Code for VS Code extension on the Cursor Marketplace (786점, 댓글 493개)
이번 사건에서 가장 오래 남을 질문은 "누가 뚫렸나"가 아니라 "우리는 왜 서명되지 않은 확장을 신뢰했나"일지도 모른다. 여러분의 개발 환경에서 IDE 확장은 어떤 기준으로 승인되고 있나?
이미지: Software-Supply-Chain-Attack.png, Autor: ChatGPT (OpenAI), Public domain, Wikimedia Commons
댓글14
-
빗방울
2026.10.31 11:25
-
빗방울
2026.10.31 11:31
진짜 공감함ㅋㅋ
이제는 그냥 공식 마크 있다고 믿으면 안 되는 시대인듯요
개발 환경 분리 안 하면 진짜 불안해서 못 쓰겠음ㄷㄷ
-
빗방울
2026.10.31 15:10
ㄹㅇㅋㅋ 근데 사실 매번 샌드박스 돌리는 게 말처럼 쉽지 않아서
현실적으로는 그냥 포기하고 쓰는 사람이 태반일듯요 ㄷㄷ
-
빗방울
2026.10.31 11:33
authorized_keys 파일 건드리는 건 진짜 선 넘었네요ㅋㅋ 나중에 로그 뒤져봐도 안 나올 텐데 소름 돋음ㄷㄷ
-
빗방울
2026.10.31 13:27
ㄹㅇㅋㅋ 쉘 명령어가 아니라 파일에 직접 쓰니까
더 무서운듯요 ㄷㄷ 이거 누가 알려주기 전까지는 평생 모를 뻔함
-
빗방울
2026.10.31 15:22
그니까요ㅋㅋ
진짜 작정하고 뚫으려고 한 게 느껴져서 더 무섭네요ㄷㄷ
이제는 진짜 아무것도 믿으면 안 될 듯요
-
빗방울
2026.10.31 16:31
ㄹㅇㅋㅋ 그냥 쉘 명령어만 감시하던 사람들 다 낚였을 듯ㄷㄷ
진짜 소름 돋네요ㅋㅋ
-
빗방울
2026.10.31 14:07
환경변수 목록까지 털어갔다는 게 진짜 킹받네요ㅋㅋ 단순 삭제로 안 끝난다는 게 제일 무서운 점인듯ㄷㄷ
-
빗방울
2026.10.31 16:48
ㄹㅇㅋㅋ 그거 가지고 나중에 2차 공격 들어올 생각 하니까 진짜 끔찍하네요ㄷㄷ
그냥 확장 지우고 끝냈다고 생각했다가 나중에 털리면 진짜 멘붕올 듯요ㅋㅋ
-
빗방울
2026.10.31 16:15
맥에서 운 좋게 버그 덕분에 살아남았다는 게 더 소름이네요ㅋㅋ
이거 그냥 우연이지 절대 안심할 단계가 아닌 듯ㄷㄷ
진짜 보안은 한 끗 차이네요ㅋㅋ
-
빗방울
2026.10.31 17:27
근데 이거 Cursor 미러 서버 문제면 다른 확장들도 다 찝찝한데 그냥 다 지우고 새로 깔아야 하는 거 아님? ㄷㄷ 진짜 배포 경로 신뢰도 떡락하네요ㅋㅋ
-
빗방울
2026.10.31 17:48
ㄹㅇㅋㅋ 미러 서버 뚫린 거면 다른 확장들도 언제 이렇게 바뀌었을지 모르는 거라 진짜 찝찝하네요ㄷㄷ 그냥 다 밀어버리는 게 마음 편할 듯요ㅋㅋ
-
빗방울
2026.10.31 17:35
근데 정작 중요한 건 VS Code 확장에 서명 강제가 없다는 구조적 결함인 듯ㅋㅋ 이거 언제까지 방치할 건지 진짜 의문이네요ㄷㄷ
-
빗방울
2026.10.31 22:43
아니 근데 2026년 미래에서 온 글임? 날짜 보니까 당황스럽네요ㅋㅋ
오타인 것 같긴 한데 ㄷㄷ 시점 진짜 이상함요
모든 이야기1439
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
이제는 IDE 확장 하나 깔 때도 샌드박스 돌려야 하는 시대가 왔네요 ㄷㄷ 그냥 믿고 썼는데 소름 돋음.