先说结论:据 OpenSourceMalware 和 Phorion 10 月 30 日的分析,Open VSX 上发布的 Claude Code for VS Code 扩展 anthropic.claude-code@2.1.313 被植入了后门。它会在你的机器上留下一把攻击者的 SSH 公钥、一条到 134.209.82.225 的反向隧道和开机自启的持久化。据 Phorion,Anthropic 已经从 Open VSX、npm 和 VS Code Marketplace 撤下 2.1.313;据 Sesame Disk,目前 Open VSX 上的最新版是 2.1.314。
只卸载扩展清不掉后门。 用过 Cursor、VSCodium、Windsurf 这类从 Open VSX 装扩展的编辑器,今天装过或自动更新过 Claude Code 扩展的,建议按下面 5 步自查一遍。
我们在一台 Linux 机器上把下面的检查命令跑了一遍,整套检查不到 1 秒跑完,输出都正常;我们没有在任何机器上安装恶意版本。
发生了什么
据 OpenSourceMalware:
- 恶意版本自称
anthropic.claude-code2.1.313,解包后和正常版本基本一致,自带的二进制也是官方的,只有extension.js不同:开头被插入了一段 66 行的立即执行函数,之后才是正常的扩展代码。 - 不需要你和 Claude 对话,编辑器加载这个扩展模块就会执行;包里没有 install / postinstall 脚本,所以是运行时触发。
- 几乎所有异常都被吞掉,扩展照常可用,表面看不出异常。
据 RuntimeWire,这件事最早由安全研究者 Adnan Khan(@adnanthekhan)在 X 上公开;相关讨论也可见 X 上 @mattjay 的帖子。
后门做了什么
据 OpenSourceMalware 和 Phorion 的分析,加载器依次做了这些事:
- 写入公钥:创建
~/.ssh,往~/.ssh/authorized_keys追加一把 Ed25519 公钥,注释是svc-telemetry,指纹SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk。有了它,攻击者可以用对应私钥登录你的账号。 - 尝试开启 SSH:Linux 用
systemctl等方式启动sshd/ssh;macOS 尝试sudo -n systemsetup -setremotelogin on;Windows 用 PowerShell 安装并启动 OpenSSH Server。 - 反向隧道:把内置的另一把私钥(注释
svc-telemetry-tun)写到临时目录的.stk_*文件,以用户tunnel连到134.209.82.225:22,参数是-R '*:0:localhost:22',断了 60 秒后重连,有autossh就优先用。 - 持久化:macOS 写
~/.config/.smt、~/.config/.smtk和~/Library/LaunchAgents/com.apple.sysmond.plist(名字像苹果组件,其实不是);Linux 写同样两个文件并加一条@rebootcrontab;Windows 写.config\smt.cmd、.config\smtk,尝试建名为SysMon的计划任务,不成就往启动文件夹放sysmon.cmd。 - 回传主机信息:1.5 秒后用明文 HTTP POST 把主机名、用户名、系统、架构、目录、Git 邮箱和最多 40 个含 KEY/TOKEN/SECRET/PASS/AWS/GCP 的环境变量名发到
134.209.82.225:8099/beacon。据两家分析,发送的是变量名,不是变量值。
据 Phorion,macOS 上有个 bug:普通用户执行 systemsetup -getremotelogin 拿不到 Off,于是脚本跳过开启 Remote Login。但公钥和持久化照样会写进去,只要你之前或之后打开了远程登录,后门就能用。所以 Mac 用户也要查。
目前还不清楚的事
- 恶意版本是怎么发布上去的:目前公开报道尚未说明。据 OpenSourceMalware,这个 Open VSX 扩展的所有者是一名 Anthropic 员工,但是不是他的账号被盗、还是发布流程别的环节出了问题,目前公开报道尚未说明。
- 微软 VS Code Marketplace 有没有分发过这个版本:目前公开报道尚未说明。据 Sesame Disk,Marketplace 公开的版本历史里没有 2.1.313;OpenSourceMalware 出于谨慎也给 Marketplace 版建了威胁报告。
- 攻击者身份、
134.209.82.225归谁控制:目前公开报道尚未说明。
创建 API Key,查完换一把新的 Claude Code / Codex Key →
第 1 步:查扩展版本,升级到 2.1.314 及以上
macOS / Linux 终端里跑:
code --list-extensions --show-versions | grep -i anthropic.claude-code
cursor --list-extensions --show-versions | grep -i anthropic.claude-code
codium --list-extensions --show-versions | grep -i anthropic.claude-code
ls -d ~/.vscode/extensions/anthropic.claude-code-* \
~/.cursor/extensions/anthropic.claude-code-* \
~/.vscode-oss/extensions/anthropic.claude-code-* \
~/.windsurf/extensions/anthropic.claude-code-* 2>/dev/null
Windows PowerShell:
Get-ChildItem "$env:USERPROFILE\.vscode\extensions","$env:USERPROFILE\.cursor\extensions","$env:USERPROFILE\.vscode-oss\extensions" -Filter "anthropic.claude-code-*" -ErrorAction SilentlyContinue | Select-Object Name
输出里出现 anthropic.claude-code@2.1.313 或目录名带 2.1.313,说明装过这个版本,先别急着删,直接看第 2 到第 4 步,并按第 5 步处理。没有 2.1.313 的,也建议把扩展固定升级到 2.1.314:
code --install-extension anthropic.claude-code@2.1.314 --force
cursor --install-extension anthropic.claude-code@2.1.314 --force
codium --install-extension anthropic.claude-code@2.1.314 --force
claude --version
最后一行顺手看一下 Claude Code CLI 的版本。据 Phorion,npm 上的 2.1.313 也被撤下了,如果显示 2.1.313,同样升级。
第 2 步:查 authorized_keys,按指纹而不是只按注释
grep -n "svc-telemetry" ~/.ssh/authorized_keys
ssh-keygen -lf ~/.ssh/authorized_keys
ssh-keygen -lf ~/.ssh/authorized_keys | grep "0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk"
第一行按注释找;第二、三行按指纹找。据 Phorion,恶意代码只检查注释 svc-telemetry 是否存在,排查时应以指纹为准,因为注释可以随便改。我们在一个演示文件里放了一把自己的公钥,再把攻击者公钥的注释改成 renamed:grep svc-telemetry 命中 0 行,而 ssh-keygen -lf 照样列出了这个指纹:
256 SHA256:fcpk2HR713pxnLll4jbnb7Bu9k5gvtf8n7UREAQe1dI me@laptop (ED25519)
256 SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk renamed (ED25519)
除了这个指纹,ssh-keygen -lf 列出的每一行你都应该认得。不认识的也要当可疑处理。Windows 上:
Select-String -Path "$env:USERPROFILE\.ssh\authorized_keys" -Pattern "svc-telemetry"
ssh-keygen -lf "$env:USERPROFILE\.ssh\authorized_keys"
第 3 步:查到 134.209.82.225 的连接和隧道进程
# macOS
lsof -nP -i @134.209.82.225
pgrep -fl 'localhost:22|\.smtk|\.stk_'
# Linux
ss -tnp | grep 134.209.82.225
pgrep -af 'localhost:22|\.smtk|\.stk_'
Windows:
Get-NetTCPConnection -RemoteAddress 134.209.82.225 -ErrorAction SilentlyContinue
Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'localhost:22|smtk' } | Select-Object ProcessId,CommandLine
有任何一条到 134.209.82.225 的连接,或者命令行里带 localhost:22、.smtk、.stk_ 的 ssh / autossh 进程,基本可以确认中招。据 Phorion,隧道是脱离编辑器运行的,关掉编辑器隧道也还在。
第 4 步:查持久化,以及 SSH 有没有被打开
macOS:
ls -la ~/Library/LaunchAgents/com.apple.sysmond.plist ~/.config/.smt ~/.config/.smtk "$TMPDIR"/.stk_* 2>/dev/null
launchctl list | grep sysmond
sudo systemsetup -getremotelogin
Linux:
crontab -l | grep -n smt
ls -la ~/.config/.smt ~/.config/.smtk /tmp/.stk_* 2>/dev/null
systemctl is-enabled ssh sshd 2>/dev/null
systemctl is-active ssh sshd 2>/dev/null
Windows:
Get-ScheduledTask -TaskName SysMon -ErrorAction SilentlyContinue
Test-Path "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd"
Get-ChildItem "$env:USERPROFILE\.config" -Force -ErrorAction SilentlyContinue | Where-Object Name -match 'smt'
Get-Service sshd -ErrorAction SilentlyContinue
com.apple.sysmond.plist、~/.config/.smt、@reboot 里的 .smt、SysMon 计划任务、启动文件夹里的 sysmon.cmd,任何一个存在都按中招处理。另外看一下 SSH 服务:你本来没开远程登录,现在却是开着的,也要当可疑。
第 5 步:中招了怎么办
据 OpenSourceMalware 和 Phorion 的建议,顺序是:
- 先断网,在防火墙或路由器上屏蔽
134.209.82.225的 22 和 8099 端口。 - 保留证据,再动手清理:
mkdir -p ~/ir-evidence
cp -p ~/.ssh/authorized_keys ~/ir-evidence/ 2>/dev/null
cp -p ~/.config/.smt ~/Library/LaunchAgents/com.apple.sysmond.plist ~/ir-evidence/ 2>/dev/null
crontab -l > ~/ir-evidence/crontab.txt 2>/dev/null
ps auxww > ~/ir-evidence/ps.txt
- 停掉隧道、删持久化和公钥(macOS / Linux):
pkill -f '\.config/\.smt'
pkill -f 'localhost:22'
# macOS
launchctl unload -w ~/Library/LaunchAgents/com.apple.sysmond.plist
rm -f ~/Library/LaunchAgents/com.apple.sysmond.plist
# Linux
crontab -l | grep -v '\.smt' | crontab -
# macOS + Linux
rm -f ~/.config/.smt ~/.config/.smtk "${TMPDIR:-/tmp}"/.stk_*
sed -i.bak '/svc-telemetry/d' ~/.ssh/authorized_keys
ssh-keygen -lf ~/.ssh/authorized_keys
sed 只按注释删;如果第 2 步按指纹发现了改过注释的那行,手动打开 ~/.ssh/authorized_keys 删掉它。Windows:
Unregister-ScheduledTask -TaskName SysMon -Confirm:$false -ErrorAction SilentlyContinue
Remove-Item "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd" -ErrorAction SilentlyContinue
Remove-Item "$env:USERPROFILE\.config\smt.cmd","$env:USERPROFILE\.config\smtk" -ErrorAction SilentlyContinue
- 轮换这台机器能碰到的所有凭据:SSH 私钥、Git / GitHub Token、云厂商的 AWS / GCP Key、
.env里的各种 Token,以及 Claude Code、Codex 用的 API Key。轮换要在另一台干净的机器上做。据 Phorion,如果你的 SSH 曾被打开,或者 SSH 日志里有来自127.0.0.1/::1、用svc-telemetry公钥登录的记录,说明攻击者可能已经进来过,这一步就是必须的。 - 关掉扩展的自动更新,再考虑重装系统。据 OpenSourceMalware,攻击者一旦登录过,能做的事远不止这些已知文件,重装比只删已知文件更稳妥。
用本站 Key 的,在控制台删掉旧 Key、新建一把,再更新全局 ~/.claude/settings.json 和 ~/.codex/config.toml 里的值。
以后怎么防
- 固定扩展版本,关掉自动更新。在编辑器的
settings.json里加:
{
"extensions.autoUpdate": false,
"extensions.autoCheckUpdates": false
}
新版本出来先等一两天,看看安全社区有没有动静再升级。
- 优先用官方 CLI 装 Claude Code,少依赖编辑器扩展市场:
curl -fsSL https://claude.ai/install.sh | bash
claude --version
安装和接入第三方 API 的步骤见 Claude Code 第三方 API 接入教程。
- 分清扩展、插件和 MCP 的权限边界:编辑器扩展和你本人的权限一样大,能读本地文件、终端和凭据。思路可以参考 Codex Plugin、Skill、MCP 与 Internet Access 的边界 和 Codex 自动化与 Playwright MCP 安全指南。
- 定期给自己的项目做安全审计:可以用 Cloudflare security-audit skill 让 Claude Code 跑安全审计。
- Key 不要长期放在环境变量里给所有进程看,换 Key 的方法见 Codex API Key 配置。



