
2026년 10월 29일 Cursor 확장 마켓플레이스에서 악성 anthropic.claude-code 2.1.313 패키지가 약 2시 27분부터 오후 1시 35분까지(태평양 시간, 09:27~20:35 UTC) 유통됐다. Cursor는 패키지를 삭제하고 마켓플레이스를 복구했으며 공격자의 서버를 오프라인으로 전환했다고 밝혔다. 다른 버전이나 공식 배포 경로가 영향을 받았다는 증거는 없다고 공지했다. 모든 Claude Code 설치본이나 모든 마켓플레이스가 영향을 받은 것은 아니다. Cursor의 사고 공지
악성 페이로드는 공격자의 SSH 로그인 키를 추가하고 SSH 서버를 활성화한 뒤, 워크스테이션의 SSH 포트로 연결을 전달하는 외부 터널을 열려고 했다. 터널 연결을 재시도하는 시작 스크립트를 설치하고, 환경 변수 이름을 포함한 호스트 정보 보고서를 외부 서버로 전송했다. 권한 오류나 버그로 SSH 서비스 설정이 실패하더라도 키 설치, 지속성 유지, 호스트 정보 전송은 이뤄질 수 있었다. Phorion의 기술 분석
감염 흔적 점검
먼저 Cursor가 공개한 svc-telemetry SSH 키 점검 방법을 확인한다. 읽기 전용 탐지 스크립트는 확장 프로그램 파일과 시작 항목, 현재 연결도 검사한다. 지표가 발견되면 조사해야 하지만, 아무것도 발견되지 않았다고 해서 기기가 깨끗하다고 단정할 수는 없다. 버전이 설치돼 있거나 캐시된 패키지가 있다고 해서 페이로드가 실행됐다는 뜻도 아니다.
고정 버전 스크립트를 내려받아 claude_code_compromise_check.py로 저장한 뒤 내용을 살펴본다. 아래 운영체제별 명령으로 실행하기 전에 SHA-256 해시가 다음 값과 일치하는지 확인해야 한다. Python 3.8 이상이 필요하다.
73d96647e17bbf0dbd1e9cd5a0f5cfce6af626346a09d82e8b90ab599d3f7b6d
다운로드한 디렉터리에서 해시를 확인한다.
macOS:
Linux:
```sha256sum claude_code_compromise_check.py ```
Windows PowerShell:
```Get-FileHash .\\claude_code_compromise_check.py -Algorithm SHA256 ```
해시가 일치하면 macOS와 Linux에서는 `python3 claude_code_compromise_check.py`, Windows에서는 `py -3 claude_code_compromise_check.py`로 실행한다.
종료 코드 2는 지표가 발견됐다는 뜻이다. [발견 항목을 조사](https://photostructure.com/coding/malicious-editor-extensions/#respond-to-a-finding)해야 한다. 1은 지표가 발견되지 않았지만 일부 검사가 완료되지 않았다는 뜻이다. `CHECKS INCOMPLETE` 아래 항목을 확인하고 필요하면 관리자에게 도움을 요청한다. 0은 검사한 위치에서 나열된 지표를 찾지 못했다는 뜻이다. 스크립트는 현재 사용자와 현재 상태를 검사한다. 다른 계정, 사용자 지정 설치 위치, 과거 활동은 별도로 조사해야 한다.
## 스크립트가 검사하는 항목
탐지 스크립트는 설치된 확장 프로그램과 캐시된 VSIX 패키지에서 2.1.313 버전, 패키지 및 번들 해시, `extension.js`에 함께 나타나는 `134.209.82.225`와 `svc-telemetry` 표식을 확인한다. Cursor 외부에서 버전만 일치하는 경우에는 출처가 확인되지 않은 항목으로 따로 보고한다. [고정 스크립트의 소스](https://gist.githubusercontent.com/mceachen/86c91f4f630c7be691e8ce47e7d179b4/raw/e3972f98c5b9dd8e6c90ddbb18be82553c6d1d21/claude_code_compromise_check.py)에 정확한 해시와 검사 위치가 나와 있다.
고정 스크립트에 기록된 macOS VSIX 해시는 [Cursor의 현재 공지](https://cursor.com/blog/claude-code-extension-security-notice)에 나온 값과 다르다. 보존된 패키지도 공지 내용과 대조해야 한다. 스크립트의 버전 및 번들 표식 검사는 여전히 적용된다.
스크립트는 `~/.ssh/authorized_keys`를 검사하며, Windows에서는 `C:\\ProgramData\\ssh\\administrators_authorized_keys`도 살펴본다. 검사 대상은 주석과 다음의 승인되지 않은 키 지문이다.
`SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk `
지속성 검사 항목은 운영체제별로 다르다.
* macOS: `~/.config/.smt`, `~/.config/.smtk`, `~/Library/LaunchAgents/com.apple.sysmond.plist`
* Linux: `~/.config/.smt`, `~/.config/.smtk`, 일치하는 사용자 크론 항목. Phorion이 보고한 페이로드 구현 세부 사항이며, 별도의 Linux 마켓플레이스 패키지가 영향을 받았다는 증거는 아니다.
* Windows: `%USERPROFILE%\\.config\\smt.cmd`, `%USERPROFILE%\\.config\\smtk`, `SysMon` 예약 작업, `%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\sysmon.cmd`
이 밖에 임시 `.stk_<10 hex>` 터널 키 파일, 의심스러운 SSH 프로세스, 사고 관련 IP와의 실시간 연결도 찾는다. 파일 이름이나 작업 이름만으로는 확정할 수 없으므로 내용이나 실행 동작을 확인해야 한다. [Phorion의 아티팩트 분석](https://phorion.io/blog/offical-claude-code-vsx-compromise/)
LAN과 조직 전체를 점검할 때는 보존된 방화벽, 프록시, 네트워크 흐름, 엔드포인트 기록에서 `134.209.82.225`를 검색한다. 특히 외부로 나가는 TCP 22 SSH 연결과 TCP 8099의 HTTP `POST /beacon`을 살펴보고, 발견 항목을 확장 프로그램 설치 기록 및 SSH 키나 시작 항목의 변경과 대조한다. 지속성은 설치 이후에도 남을 수 있으므로 노출 기간이 시작된 시점부터 검색해야 한다.
LAN 센서는 보고된 `127.0.0.1:8099` 루프백 연결 시도를 볼 수 없다. 이를 확인하려면 엔드포인트 가시성이 필요하다. `ifconfig.me`와 `api.ipify.org`는 정상적인 공인 IP 확인 서비스이므로, 이 서비스와 통신했다는 사실만으로 감염 증거가 되지는 않는다. [네트워크 지표](https://cursor.com/blog/claude-code-extension-security-notice)
## 편집기 확장 공격은 반복됐다
[Cursor는 공식 Claude Code 배포본이 영향을 받았다는 증거가 없다고 밝혔다](https://cursor.com/blog/claude-code-extension-security-notice). 그러나 악성 편집기 확장이 등장한 것은 이번이 처음이 아니다.
2026년 2월 Aqua는 로컬 AI 코딩 에이전트를 이용해 민감한 정보를 훔치도록 설계된 악성 Trivy 확장 1.8.12를 Open VSX에서 공개했다. Aqua의 권고문은 악성 릴리스가 있었다고 확인하지만, 자동 배포가 이뤄졌다고 밝히지는 않는다. [Aqua의 권고문](https://github.com/aquasecurity/trivy-vscode-extension/security/advisories/GHSA-8mr6-gf9x-j8qg)
2026년 5월 18일에는 악성 Nx Console 18.95.0이 Visual Studio Marketplace와 Open VSX에 올라왔다. 이 버전은 자격 증명을 수집했다. CISA는 자동 업데이트로 악성 버전이 전달됐다고 확인했으며, 이 침해를 GitHub 내부 저장소 탈취와 연관 지었다. [Nx의 사후 분석](https://nx.dev/blog/nx-console-v18-95-0-postmortem), [CISA 경보](https://content.govdelivery.com/accounts/USDHSCISA/bulletins/419668f)
마이크로소프트는 2026년 6월 3일 VS Code 1.123에서 문제가 있거나 침해된 릴리스로부터 보호하기 위한 자동 업데이트 지연 기능을 도입했다. 이는 10월 Cursor 사고보다 앞선 일이며, 릴리스 노트는 해당 변경을 이들 공격과 직접 연결하지 않는다. [VS Code 릴리스 노트](https://code.visualstudio.com/updates/v1_123)
## 다음 침해의 위험 줄이기
확장 프로그램 수를 줄이고 ID, 버전, 마켓플레이스 출처를 기록해 팀에 필요한 항목만 승인한다. 게시자 신원과 패키지 무결성을 확인하되, 배지나 게시자 이름이 일치한다고 안전이 보장되는 것은 아니다. VS Code는 확장 프로그램과 버전별 허용 목록을 관리하는 기능을 지원한다. Cursor의 [확장 허용 목록과 선택적 서명 확인](https://prod.cursor.com/help/customization/extensions)은 별도로 설정해야 한다. [확장 프로그램 보안](https://code.visualstudio.com/docs/configure/extensions/extension-runtime-security), [VS Code 기업용 제어 기능](https://code.visualstudio.com/docs/enterprise/extensions)
VS Code에서는 설정 JSON에 24시간 자동 업데이트 지연을 지정할 수 있다.
```{ "extensions.autoUpdate": "on", "extensions.autoUpdateDelay": 24 } ```
수동 업데이트에는 VS Code의 지연이 적용되지 않는다. [업데이트 설정](https://code.visualstudio.com/docs/configure/extensions/extension-marketplace)
Cursor 개인 사용자는 `"extensions.installCooldownHours": 24`로 설정할 수 있다. 관리자는 Team settings → Security & automation → Marketplace Install Cooldown에서 팀 전체에 적용할 수 있다. 팀의 대기 시간 설정은 개인 설정에 우선한다. [Cursor 확장 프로그램 문서](https://prod.cursor.com/help/customization/extensions)
대기 시간은 임시방편에 가깝다. VS Code는 마이크로소프트, GitHub, 그리고 다소 의외로 OpenAI를 포함한 일부 ‘신뢰된’ 게시자를 [대기 시간 적용 대상에서 제외한다](https://code.visualstudio.com/updates/v1_123). 새 버전을 먼저 쓰는 사용자는 여전히 위험을 감수해야 한다. 대기 시간보다 오래 탐지되지 않은 악성코드도 설치될 수 있다. 지연은 대응 시간을 벌어줄 뿐이므로 권한 제한, 자격 증명 최소화, 네트워크 제어와 함께 사용해야 한다. 팀은 격리된 테스트 환경에서 업데이트를 먼저 검증하는 것이 좋다. 다만 지연은 정당한 수정도 늦추므로 긴급 업데이트 절차를 문서화해야 한다.
편집기는 관리자 권한 없이 실행하고 개발 계정에서 제한 없는 비밀번호 없는 `sudo` 사용을 피한다. VS Code 확장 프로그램은 편집기의 파일 접근 및 프로세스 실행 권한을 물려받는다. 일반 사용자 권한만으로도 파일과 자격 증명에 접근할 수 있다. [확장 프로그램의 실행 권한](https://code.visualstudio.com/docs/configure/extensions/extension-runtime-security)
SSH 서버를 사용하지 않는다면 비활성화한다. 호스트 방화벽을 켜 두고 필요한 인바운드 접근만 허용하며, `authorized_keys`와 시작 방식의 변경을 감시한다. SSH 서비스가 수신 대기하지 않으면 이 페이로드의 터널이 연결할 SSH 로그인 서비스는 없지만, 다른 동작까지 막지는 못한다.
편집기와 확장 프로그램은 자격 증명과 호스트 접근을 제한한 별도 개발 가상 머신에서 실행할 수 있다. 원격 워크스페이스를 사용해도 확장 프로그램이 로컬에서 실행될 수 있다. 홈 디렉터리 전체를 공유하거나 권한이 넓은 SSH 에이전트를 가상 머신에 전달하지 않는다. [VS Code 확장 프로그램 실행 위치](https://code.visualstudio.com/api/advanced-topics/extension-host)
개발자 기기에서 승인된 목적지 외부로 나가는 SSH 연결을 제한한다. 규칙을 적용하기 전에 Git-over-SSH, 원격 개발, 관리 작업에 필요한 연결을 고려해야 한다. 보고된 SSH 목적지를 차단하면 해당 터널을 중단할 수 있고, IP 또는 외부 TCP 8099 통신을 차단하면 외부 보고를 막을 수 있다. 이런 값은 사고별 지표일 뿐 영구적인 안전 보장은 아니다.
인바운드만 차단하는 라우터 방화벽은 워크스테이션에서 시작한 연결을 막지 못한다. DNS 필터링도 IP 주소를 직접 사용하는 연결을 차단하지 못한다. 연결 로그를 보존하고 인터넷 경계와 내부 네트워크 경계 모두에 제어를 적용한다. [CIS 네트워크 모니터링 지침](https://www.cisecurity.org/controls/network-monitoring-and-defense), [NIST SP 800-53, SC-7](https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final)
개발자 기기를 민감한 로컬 장치, 백업 저장소, 관리 인터페이스와 분리하고 필요한 트래픽만 허용한다. 네트워크 분리는 침해된 워크스테이션이 접근할 수 있는 범위를 줄이지만 확장 프로그램의 실행 자체를 막지는 않는다. [CISA의 네트워크 분리 지침](https://www.cisa.gov/sites/default/files/2023-02/22_0816_ec3_ecc-segmentation_508c.pdf)
## 지표가 발견되면
보고된 지표를 조사한다. 실행이나 백도어 설치의 증거를 찾으면 워크스테이션을 격리하고 유용한 로그와 아티팩트를 보존한 뒤 [Cursor의 복구 지침](https://cursor.com/blog/claude-code-extension-security-notice)을 따른다. Cursor가 제공한 [macOS 스크립트](https://cursor.com/static/security/claude-code-extension/remediate-macos.sh) 또는 [Windows 스크립트](https://cursor.com/static/security/claude-code-extension/remediate-windows.ps1)를 내려받아 내용을 확인한다. macOS 스크립트는 영향을 받은 사용자 권한으로 실행하고 root로 실행하지 않는다. Windows에서는 관리자 권한 PowerShell을 사용하고 공지에 나온 명령을 그대로 따른다. Linux는 운영체제에 맞춘 정리가 필요하다. 확장 프로그램을 삭제하는 것만으로는 별도로 실행 중인 지속성 요소가 남을 수 있다. 시스템을 재구축할지 평가하고, 접근 가능했던 자격 증명을 교체하며 신뢰할 수 있는 기기에서 세션을 취소한다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요