
一条不该出现的命令
安全公司 Phorion 公布了一份安全公告:官方 Claude Code 的 VS Code 扩展包在 Cursor 应用市场上被篡改过,里面被塞进了一段持久化 SSH 后门。Cursor 已下架对应版本,并把 2.1.313 从 NPM 与 VSCode 注册表一并撤下。这条消息在 Hacker News 上当天拿到了最高分——不是因为手法多高明,而是因为它发生在“官方”这两个字上。
攻击面不在你的代码里
多数团队的安全预算花在自己的代码和服务器上:代码审计、防火墙、镜像扫描。这次事件提醒的是另一件事——开发者机器上装着几十个插件,每一个都以你的用户权限运行,能读写文件、执行命令、访问网络。它们不在你的代码库里,也不在服务器上,但实际权限比很多 CI 机器还大。
注入点只有开头一段
被改的 extension.js 前面插入了一段立即执行函数,后面的内容看起来完全是正常扩展:Claude Code 与 VS Code 的字符串都在,activate 与 deactivate 导出正常,界面代码原样。翻文件列表、对版本号、看体积,都看不出异常。恶意代码的位置很讲究——加载即执行,不需要等你点任何按钮。
三阶段:开门、留钥匙、保活
公告把行为拆成三步。第一步在三个系统上分别打开远程登录:Linux 用 systemctl 启动 sshd 或 ssh,失败就退到 service 与 /etc/init.d;macOS 检查“远程登录”状态,发现关闭就执行 sudo -n systemsetup -setremotelogin on;Windows 用 PowerShell 安装并启动 OpenSSH Server。
第二步写入攻击者自己的公钥。第三步做持久化:macOS 与 Linux 上落一个 ~/.config/.smt 脚本,里面内嵌隧道私钥,运行时解出到 ~/.config/.smtk 并进入重连循环;macOS 还在 ~/Library/LaunchAgents/ 放一个伪装成 com.apple.sysmond.plist 的 LaunchAgent,RunAtLoad 与 KeepAlive 都设为真,开机自起、被杀自动拉起。
攻击者写错了一行
有个细节值得记下来:在 macOS 上,普通用户执行 systemsetup -getremotelogin 会打印“需要管理员权限”的错误,但退出码仍是 0。脚本只在输出匹配 Off 时才去打开远程登录,于是把“我没权限查询”误判成“已经是开着的”,直接跳过了启用这一步。没开过 SSH 的 Mac,入站通道实际上没建立起来,但公钥和持久化文件照样落盘。防守方的运气,往往来自攻击方的疏忽。
对做交付的团队意味着什么
小团队能落地的动作有三条。一是插件要有台账,能不装的不装,锁版本而不是浮动升级。二是把开发者机器当生产环境看待,至少确认本机远程登录状态与开机自启项是干净的。三是给客户交付时,环境清单别只写服务器,办公与开发机器上的工具链也是风险面。
企业数字化最容易漏的从来不是架构设计,而是这类“装上就忘了”的东西。多做一次清单核对,成本远低于事后清理一台机器。


评论交流
欢迎留下你的想法