Claude Code VS Code 扩展 2.1.313 被植入 SSH 后门:Cursor / VSCodium 用户 5 分钟自查与清理

据 OpenSourceMalware 和 Phorion 的分析,Open VSX 上的 Claude Code 扩展 2.1.313 在 extension.js 开头被插入 66 行加载器,扩展一加载就往 ~/.ssh/authorized_keys 写入攻击者公钥、尝试开启 SSH、建立到 134.209.82.225 的反向隧道并写入开机持久化。本文给出 macOS、Linux、Windows 的 5 步自查命令:查扩展版本、按指纹查公钥、查连接和隧道进程、查持久化,以及中招后的取证、清理和凭据轮换。

7 分钟阅读
Claude Code VS Code 扩展 2.1.313 被植入 SSH 后门:Cursor / VSCodium 用户 5 分钟自查与清理

先说结论:据 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-code 2.1.313,解包后和正常版本基本一致,自带的二进制也是官方的,只有 extension.js 不同:开头被插入了一段 66 行的立即执行函数,之后才是正常的扩展代码。
  • 不需要你和 Claude 对话,编辑器加载这个扩展模块就会执行;包里没有 install / postinstall 脚本,所以是运行时触发。
  • 几乎所有异常都被吞掉,扩展照常可用,表面看不出异常。

据 RuntimeWire,这件事最早由安全研究者 Adnan Khan(@adnanthekhan)在 X 上公开;相关讨论也可见 X 上 @mattjay 的帖子。

后门做了什么

据 OpenSourceMalware 和 Phorion 的分析,加载器依次做了这些事:

  1. 写入公钥:创建 ~/.ssh,往 ~/.ssh/authorized_keys 追加一把 Ed25519 公钥,注释是 svc-telemetry,指纹 SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk。有了它,攻击者可以用对应私钥登录你的账号。
  2. 尝试开启 SSH:Linux 用 systemctl 等方式启动 sshd / ssh;macOS 尝试 sudo -n systemsetup -setremotelogin on;Windows 用 PowerShell 安装并启动 OpenSSH Server。
  3. 反向隧道:把内置的另一把私钥(注释 svc-telemetry-tun)写到临时目录的 .stk_* 文件,以用户 tunnel 连到 134.209.82.225:22,参数是 -R '*:0:localhost:22',断了 60 秒后重连,有 autossh 就优先用。
  4. 持久化:macOS 写 ~/.config/.smt、~/.config/.smtk 和 ~/Library/LaunchAgents/com.apple.sysmond.plist(名字像苹果组件,其实不是);Linux 写同样两个文件并加一条 @reboot crontab;Windows 写 .config\smt.cmd、.config\smtk,尝试建名为 SysMon 的计划任务,不成就往启动文件夹放 sysmon.cmd。
  5. 回传主机信息: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 终端里跑:

bash
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:

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:

bash
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,按指纹而不是只按注释

bash
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 照样列出了这个指纹:

text
256 SHA256:fcpk2HR713pxnLll4jbnb7Bu9k5gvtf8n7UREAQe1dI me@laptop (ED25519)
256 SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk renamed (ED25519)

除了这个指纹,ssh-keygen -lf 列出的每一行你都应该认得。不认识的也要当可疑处理。Windows 上:

powershell
Select-String -Path "$env:USERPROFILE\.ssh\authorized_keys" -Pattern "svc-telemetry"
ssh-keygen -lf "$env:USERPROFILE\.ssh\authorized_keys"

第 3 步:查到 134.209.82.225 的连接和隧道进程

bash
# 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:

powershell
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:

bash
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:

bash
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:

powershell
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 的建议,顺序是:

  1. 先断网,在防火墙或路由器上屏蔽 134.209.82.225 的 22 和 8099 端口。
  2. 保留证据,再动手清理:
bash
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
  1. 停掉隧道、删持久化和公钥(macOS / Linux):
bash
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:

powershell
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
  1. 轮换这台机器能碰到的所有凭据:SSH 私钥、Git / GitHub Token、云厂商的 AWS / GCP Key、.env 里的各种 Token,以及 Claude Code、Codex 用的 API Key。轮换要在另一台干净的机器上做。据 Phorion,如果你的 SSH 曾被打开,或者 SSH 日志里有来自 127.0.0.1 / ::1、用 svc-telemetry 公钥登录的记录,说明攻击者可能已经进来过,这一步就是必须的。
  2. 关掉扩展的自动更新,再考虑重装系统。据 OpenSourceMalware,攻击者一旦登录过,能做的事远不止这些已知文件,重装比只删已知文件更稳妥。

用本站 Key 的,在控制台删掉旧 Key、新建一把,再更新全局 ~/.claude/settings.json 和 ~/.codex/config.toml 里的值。

创建 API Key,替换可能暴露过的旧 Key →

以后怎么防

  • 固定扩展版本,关掉自动更新。在编辑器的 settings.json 里加:
json
{
  "extensions.autoUpdate": false,
  "extensions.autoCheckUpdates": false
}

新版本出来先等一两天,看看安全社区有没有动静再升级。

  • 优先用官方 CLI 装 Claude Code,少依赖编辑器扩展市场:
bash
curl -fsSL https://claude.ai/install.sh | bash
claude --version

安装和接入第三方 API 的步骤见 Claude Code 第三方 API 接入教程。

参考来源

相关文章

Claude API 413 request_too_large 怎么办?上限提到 128 MB 了,Bedrock/第三方渠道多少、大 PDF 和截图怎么传

Claude API 413 request_too_large 怎么办?上限提到 128 MB 了,Bedrock/第三方渠道多少、大 PDF 和截图怎么传

Claude API 的 Messages 单次请求上限从 32 MB 提到 128 MB,但 Bedrock 仍是 20 MB、Google 托管的 Vertex 是 30 MB,第三方转发渠道也各有上限。本文讲怎么认出 413 request_too_large、各渠道上限对照表、图片压缩和降采样、用 Files API 的 file_id 传大 PDF、长时间 computer use 和 Claude Code 会话怎么清旧截图,并附我们用本站 Key 实测 10 MB 到 130 MB 请求的结果。

Google Jules 停服(12 月 31 日):导出数据并迁移到 Claude Code / Codex 后台 agent 教程

Google Jules 停服(12 月 31 日):导出数据并迁移到 Claude Code / Codex 后台 agent 教程

Google 宣布 Jules 将于 2026 年 12 月 31 日停服,11 月 11 日起只读。本文按官方公告走一遍导出(设置、环境变量、定时任务、仓库、记忆、setup 脚本、全部会话和 patch),再把它们一一搬到 Claude Code 和 Codex:环境变量、setup 脚本、定时任务怎么对应,附同一份导出在两个客户端里的实测用时(Claude Code 约 15 秒,Codex 约 44 秒)。