<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>事件处置 on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%BD%AE/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Sun, 01 Nov 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%BD%AE/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Claude Code 扩展投毒自查与清理手册：几分钟判断你有没有中招，中招后按什么顺序处置</title>
        <link>https://www.yesmiracle.net/post/20261101-claude-code-extension-incident-response-guide/</link>
        <pubDate>Sun, 01 Nov 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20261101-claude-code-extension-incident-response-guide/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20261101-claude-code-extension-incident-response-guide/cover.svg" alt="Featured image of post Claude Code 扩展投毒自查与清理手册：几分钟判断你有没有中招，中招后按什么顺序处置" /&gt;&lt;p&gt;昨天写的那篇讲的是这起事件的性质和它暴露的结构问题。这篇不重复那些，只讲动作：你现在该敲什么命令，看到什么算干净，看到什么该怎么清、按什么顺序清。&lt;/p&gt;
&lt;p&gt;先说一个让人松一口气的事实，它决定了今天这件事的紧急程度：攻击者的服务器已经被拿下线了，反向隧道和回传都不通。所以现在被实时入侵的风险很低。但留在你机器上的东西不会因为对方下线而消失，SSH 公钥还在 &lt;code&gt;authorized_keys&lt;/code&gt; 里，开机自启项还在，独立脚本还在跑。这就是为什么今天仍然值得花几分钟查一遍。&lt;/p&gt;
&lt;p&gt;如果你是个人使用者，整个流程大概是这样：三分钟排查，十五分钟清理（如果中了），然后是轮换凭据和长期加固。&lt;/p&gt;
&lt;h2 id=&#34;第-0-步先确认你在不在暴露面内&#34;&gt;第 0 步：先确认你在不在暴露面内&lt;/h2&gt;
&lt;p&gt;三个条件同时成立，才需要往下走：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;条件&lt;/th&gt;
          &lt;th&gt;具体值&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;从哪个市场装的&lt;/td&gt;
          &lt;td&gt;Cursor 的扩展市场（不是微软市场，也不是 Open VSX）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;版本&lt;/td&gt;
          &lt;td&gt;2.1.312 或 2.1.313（Cursor 最初只报 313，后来把 312 一并纳入）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;平台与时间窗&lt;/td&gt;
          &lt;td&gt;macOS 或 Windows，2026-10-29 02:27 到 13:35（太平洋时间）之间更新过&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里有一个很实用的细节：2.1.313 这个版本号，在 npm、Open VSX、微软市场里都不存在。OpenSourceMalware 对比时发现，那几个渠道的 Claude Code 版本是从 2.1.312 直接跳到 2.1.314 的。也就是说，313 这个版本号在事实上只以恶意构建的形式出现过。如果你在任何渠道装到过 2.1.313，都值得停下来查；如果是 2.1.312，要看来源是不是 Cursor 市场。&lt;/p&gt;
&lt;p&gt;这条判断来自 OpenSourceMalware 追版本号时的发现，我把它挑出来是因为它对个人排查很省事：比记时间窗容易得多。&lt;/p&gt;
&lt;p&gt;平台分支上还有一处要留意。载荷本身覆盖 macOS、Linux、Windows 三个平台，但 Cursor 通告里列入受影响构建的是 Windows 与 macOS，Phorion 的披露也主要讲 macOS。如果你在 Linux 上，找一遍不会有坏处，因为载荷的 Linux 分支是实打实写了的：&lt;code&gt;/tmp/.stk_*&lt;/code&gt; 的私钥文件、crontab 里的 &lt;code&gt;@reboot&lt;/code&gt; 条目，都在 IOC 清单上。官方没把 Linux 列进受影响构建，只说明他们没见到 Linux 的分发样本，不等于这段代码在 Linux 上不工作。&lt;/p&gt;
&lt;h2 id=&#34;第-1-步跑检查&#34;&gt;第 1 步：跑检查&lt;/h2&gt;
&lt;p&gt;官方给的最小检查只有两条命令，先跑这个，成本最低。&lt;/p&gt;
&lt;p&gt;macOS 上：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -qs svc-telemetry ~/.ssh/authorized_keys &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;svc-telemetry key found&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No key found; machine not impacted&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows 上（PowerShell）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$files = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;\.ssh\authorized_keys&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\ProgramData\ssh\administrators_authorized_keys&amp;#34;&lt;/span&gt; | Where-Object { Test-Path $_ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($files &lt;span style=&#34;color:#f92672&#34;&gt;-and&lt;/span&gt; (Select-String svc-telemetry $files)) { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;svc-telemetry key found&amp;#34;&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No key found; machine not impacted&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这两条查的是同一个东西：那个被追加上去的公钥在不在你的授权列表里。但只查这一项会漏掉三件事：持久化文件、独立脚本、隧道进程。这三样都不在 &lt;code&gt;authorized_keys&lt;/code&gt; 里，而载荷是四样一起落的。&lt;/p&gt;
&lt;p&gt;下面这份脚本覆盖了完整的 IOC：SSH 密钥、持久化文件、开机自启项、隧道进程、到 C2 的活动连接、本地 8099 端口、已安装扩展目录里的载荷特征，以及本机 SSH 服务状态。它只读，不删任何东西。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Claude Code 扩展投毒事件：本机自查（只读，不删任何文件）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -u
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;KEY_COMMENT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;svc-telemetry&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C2&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;134.209.82.225&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;found&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hit&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; found&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1; printf &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;  [!] %s\n&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$*&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ok&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; printf &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;  [ok] %s\n&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$*&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. SSH 授权密钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ak in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.ssh/authorized_keys&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/etc/ssh/authorized_keys&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -f &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$ak&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  grep -qs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$KEY_COMMENT&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$ak&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$ak&lt;span style=&#34;color:#e6db74&#34;&gt; 里存在 &lt;/span&gt;$KEY_COMMENT&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$ak&lt;span style=&#34;color:#e6db74&#34;&gt; 干净&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 持久化文件与临时私钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.config/.smt&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.config/.smtk&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$f&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;存在 &lt;/span&gt;$f&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$f&lt;span style=&#34;color:#e6db74&#34;&gt; 不存在&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TMPDIR&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;/tmp&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;/.stk_* &amp;gt;/dev/null 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;存在 .stk_*（解出的隧道私钥）&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.stk_* 不存在&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3. 开机自启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab -l 2&amp;gt;/dev/null | grep -qs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\.smt&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;crontab 引用了 .smt&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;crontab 干净&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/Library/LaunchAgents/com.apple.sysmond.plist&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PL&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;存在假 Apple 名 LaunchAgent：&lt;/span&gt;$PL&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PL&lt;span style=&#34;color:#e6db74&#34;&gt; 不存在&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4. 隧道进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps ax | grep -E -- &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-R \*:0:localhost:22|autossh&amp;#39;&lt;/span&gt; | grep -qv grep &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;发现反向隧道进程&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;未发现隧道进程&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 5. 网络侧&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ss -tnp 2&amp;gt;/dev/null | grep -q &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$C2&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;存在到 &lt;/span&gt;$C2&lt;span style=&#34;color:#e6db74&#34;&gt; 的连接&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; ok &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;无到 &lt;/span&gt;$C2&lt;span style=&#34;color:#e6db74&#34;&gt; 的连接&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 6. 扩展目录里的载荷特征&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; d in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.cursor/extensions&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.vscode/extensions&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$d&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; e in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$d&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;/anthropic.claude-code-*; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$e&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    v&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;basename &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$e&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | sed &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/.*-//&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$v&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; in 2.1.312|2.1.313&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;受影响版本目录：&lt;/span&gt;$e&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;;; &lt;span style=&#34;color:#66d9ef&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    js&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$e&lt;span style=&#34;color:#e6db74&#34;&gt;/extension/extension.js&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -f &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$js&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; js&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$e&lt;span style=&#34;color:#e6db74&#34;&gt;/extension.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -f &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$js&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; grep -qs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$C2&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$js&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; hit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;extension.js 含 C2 地址&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$found&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;结论：未发现该事件 IOC&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;结论：见上方 [!]，按第 3 步处置&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我在自己的 Linux 机器上跑了一遍，输出是这样：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;=== 1. SSH 授权密钥 ===
  [ok] 本机没有 authorized_keys 文件（没有可被追加密钥的位置）
=== 2. 持久化文件 ===
  [ok] /home/&amp;lt;user&amp;gt;/.config/.smt 不存在
  [ok] /home/&amp;lt;user&amp;gt;/.config/.smtk 不存在
  [ok] /tmp/.stk_* 不存在
=== 3. 开机自启 ===
  [ok] crontab 未发现引用 .smt 的条目
  [ok] ~/Library/LaunchAgents/com.apple.sysmond.plist 不存在
=== 4. 运行中的隧道进程 ===
  [ok] 未发现反向隧道进程
=== 7. 已安装扩展目录里的载荷特征 ===
  [ok] 未发现 anthropic.claude-code 扩展目录
结论：本机未发现该事件的任何 IOC。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这份输出的证据边界要说清：&lt;strong&gt;只有 Linux 分支被真实执行过&lt;/strong&gt;，脚本里的 macOS 路径和 Windows 路径是按官方 IOC 清单写的，没有实机验证。所以如果你在 macOS 或 Windows 上，请把脚本当检查清单用，路径逐个对，或者直接用官方清理脚本。&lt;/p&gt;
&lt;h2 id=&#34;第-2-步怎么读结果&#34;&gt;第 2 步：怎么读结果&lt;/h2&gt;
&lt;p&gt;结果只有三种，对应三种动作。&lt;/p&gt;
&lt;p&gt;第一种，没命中任何一项，而且你不在暴露面内。结束，不用做别的。&lt;/p&gt;
&lt;p&gt;第二种，没命中，但你在暴露面内。这也不等于没事。载荷的第一个动作就是往 &lt;code&gt;authorized_keys&lt;/code&gt; 追加密钥，而如果那次没写成功，或者你后来重装过系统，痕迹可能已经不在。官方的处置建议里明确写着这一条：即使环境变量收集范围有限，也不能排除通过后门做后续凭据访问，所以按受影响处理、轮换凭据。&lt;/p&gt;
&lt;p&gt;第三种，命中了任意一项。进入第 3 步，而且不要先急着删。&lt;/p&gt;
&lt;p&gt;判读时最容易误判的是「隧道连不上所以没事」这个推论。载荷在启用 SSH 服务这一步写错了：macOS 上它用 &lt;code&gt;systemsetup -getremotelogin&lt;/code&gt; 检查，这条命令以普通用户身份跑会返回权限错误、退出码却是 0，输出里没有 &lt;code&gt;Off&lt;/code&gt;，而脚本只在看到 &lt;code&gt;Off&lt;/code&gt; 时才去启用 SSH，于是跳过了；Windows 上它想通过 &lt;code&gt;/bin/sh&lt;/code&gt; 调 PowerShell 装 OpenSSH Server，标准 Windows 没有这个 shell，也失败。所以绝大多数机器上隧道确实通不了。&lt;/p&gt;
&lt;p&gt;但隧道通不了只说明它没能给你开一个入口，不说明它没动过你的机器。它已经做了三件事：把攻击者的公钥写进了你的授权列表，落了持久化脚本，把主机信息发出去了。边缘情况也确实存在，Phorion 说得很直接，在本来就开着远程登录的 Mac 上，或者用户事后自己打开的情况下，后门就是现成可用的。Cursor 也补了一条：除非 Cursor 是以管理员权限启动的，否则这一步会失败，反过来说，用管理员权限开 IDE 的人就在危险那一侧。&lt;/p&gt;
&lt;h2 id=&#34;第-3-步命中之后先别删&#34;&gt;第 3 步：命中之后，先别删&lt;/h2&gt;
&lt;p&gt;顺序比命令重要。先取证，再断网，再清，最后轮换。&lt;/p&gt;
&lt;p&gt;第一件事是留档。OpenSourceMalware 的建议是先断网、保留现场，删掉已知文件之后再评估要不要重建主机。理由很实在：这个载荷给的是一个可交互的 SSH 入口，你能看到的文件不一定代表全部改动，删完之后你连查的线索都没了。&lt;/p&gt;
&lt;p&gt;值得留下的东西不多，五样就够：&lt;code&gt;authorized_keys&lt;/code&gt; 的完整副本、&lt;code&gt;ps&lt;/code&gt; 输出里带隧道参数的那几行、&lt;code&gt;crontab -l&lt;/code&gt; 的输出、LaunchAgent 的 plist 内容或计划任务的导出、以及扩展目录里 &lt;code&gt;extension.js&lt;/code&gt; 的原件加哈希。另外记下你发现它的时间，这个时间戳后面判断「有没有人进来过」要用。&lt;/p&gt;
&lt;p&gt;想确认有没有人真的登进来过，Phorion 给了方法：查 SSH 日志里来自 localhost、用的正是 &lt;code&gt;svc-telemetry&lt;/code&gt; 这个 key 的登录记录。如果没有这条记录，说明至少没有人成功用过这个后门；如果有，就按已经失陷处理。&lt;/p&gt;
&lt;p&gt;然后是四个层次的东西要清，我按平台列全：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;层次&lt;/th&gt;
          &lt;th&gt;macOS&lt;/th&gt;
          &lt;th&gt;Linux&lt;/th&gt;
          &lt;th&gt;Windows&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;SSH 公钥&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; 里 &lt;code&gt;svc-telemetry&lt;/code&gt; 那条&lt;/td&gt;
          &lt;td&gt;同左&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;%USERPROFILE%\.ssh\authorized_keys&lt;/code&gt;，以及 &lt;code&gt;C:\ProgramData\ssh\administrators_authorized_keys&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;持久化文件&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;~/.config/.smt&lt;/code&gt;、&lt;code&gt;~/.config/.smtk&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;同左&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;%USERPROFILE%\.config\smt.cmd&lt;/code&gt;、&lt;code&gt;%USERPROFILE%\.config\smtk&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;临时私钥&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;$TMPDIR/.stk_&amp;lt;10 位十六进制&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/tmp/.stk_&amp;lt;10 位十六进制&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;%TEMP%\.stk_&amp;lt;10 位十六进制&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;开机自启&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;~/Library/LaunchAgents/com.apple.sysmond.plist&lt;/code&gt;（label 是 &lt;code&gt;com.apple.sysmond&lt;/code&gt;，名字冒充 Apple 组件，实际不是，要用 &lt;code&gt;launchctl unload -w&lt;/code&gt; 卸掉）&lt;/td&gt;
          &lt;td&gt;crontab 里 &lt;code&gt;@reboot /bin/sh &amp;quot;&amp;lt;HOME&amp;gt;/.config/.smt&amp;quot;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;名为 &lt;code&gt;SysMon&lt;/code&gt; 的计划任务（试图以 SYSTEM 运行），以及回退项 &lt;code&gt;%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;进程可以用命令行特征找，载荷用的参数很显眼：&lt;code&gt;-R &#39;*:0:localhost:22&#39;&lt;/code&gt; 那句端口转发、&lt;code&gt;StrictHostKeyChecking=no&lt;/code&gt;、&lt;code&gt;UserKnownHostsFile=/dev/null&lt;/code&gt;、&lt;code&gt;ExitOnForwardFailure=yes&lt;/code&gt;，以及 Unix 上优先用 &lt;code&gt;autossh&lt;/code&gt;。还有一个不显眼的：macOS 那个 LaunchAgent 用的是 &lt;code&gt;RunAtLoad&lt;/code&gt; 加 &lt;code&gt;KeepAlive&lt;/code&gt;，意思是开机就起、挂了就重启，所以你杀掉进程它还会回来，得先把自启项卸掉。&lt;/p&gt;
&lt;p&gt;手上不想敲这些，官方直接给了清理脚本，两个平台各一个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS：下载 &lt;code&gt;remediate-macos.sh&lt;/code&gt;，以受影响的用户身份运行，不要用 root，然后 &lt;code&gt;bash remediate-macos.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows：下载 &lt;code&gt;remediate-windows.ps1&lt;/code&gt;，在以管理员身份打开的 PowerShell 里跑 &lt;code&gt;powershell -ExecutionPolicy Bypass -File .\remediate-windows.ps1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两个脚本会移除恶意扩展、持久化项、隧道进程和攻击者的 SSH 公钥，而且如果还有残留会返回非零退出码，方便你确认清干净了。地址在 Cursor 的安全通告里。&lt;/p&gt;
&lt;p&gt;有一条必须记住：卸载扩展不够。载荷会落下独立脚本继续跑，所以清理要按主机侧做，不能只在 IDE 里点卸载。这也是官方通告里专门加粗提醒的一句。&lt;/p&gt;
&lt;h2 id=&#34;第-4-步清完之后评估要不要重建&#34;&gt;第 4 步：清完之后，评估要不要重建&lt;/h2&gt;
&lt;p&gt;清理和重建是两个不同量级的选择，官方和第三方给的倾向不完全一样。Cursor 的说法是「评估这台主机是否需要重建」，OpenSourceMalware 说得更直接：重建主机比假设「删掉已知文件就恢复了信任」更安全。&lt;/p&gt;
&lt;p&gt;我的判断标准是这样，谈不上权威，但比「要不要重装」这种问题好回答：&lt;/p&gt;
&lt;p&gt;如果命中了，并且满足下面任一条，我会倾向直接重建：那 11 小时窗口里这台机器的 SSH 服务在跑；或者你平时用管理员权限启动 Cursor；或者 SSH 日志里出现了用 &lt;code&gt;svc-telemetry&lt;/code&gt; 从 localhost 登入的记录。这三种情况意味着隧道有机会被实际使用过，而用过之后对方看到了什么、做了什么，你从文件层面查不出来。&lt;/p&gt;
&lt;p&gt;如果只命中了 key 和持久化文件，SSH 服务从来没开过，日志里也没有那次登录，那么清理加完整轮换通常够用，不必重建。代价是你要接受「基于已知 IOC 清理」这件事本身有残余风险。&lt;/p&gt;
&lt;p&gt;重建之外还有一个折中：把受影响机器上的开发凭据全部作废并重新签发，等于把「这台机器曾经能碰到的东西」重建成空集，这比修复文件更接近根治。&lt;/p&gt;
&lt;h2 id=&#34;第-5-步整改从轮换凭据开始&#34;&gt;第 5 步：整改，从轮换凭据开始&lt;/h2&gt;
&lt;p&gt;清理只解决了「东西还在不在」，不解决「对方拿走了什么」。所以这一步是轮换。&lt;/p&gt;
&lt;p&gt;官方的顺序建议是：在一台可信的机器上，轮换受影响的这台机器能够访问到的凭据和会话。为什么要换机器，因为被污染的主机上任何操作都可能被看着，包括你输密码那一刻。&lt;/p&gt;
&lt;p&gt;问题是要轮换的东西太多，从哪开始？这次事件的载荷给了一个现成的优先级依据。它收集的是环境变量名字，匹配规则是名字里包含 &lt;code&gt;KEY&lt;/code&gt;、&lt;code&gt;TOKEN&lt;/code&gt;、&lt;code&gt;SECRET&lt;/code&gt;、&lt;code&gt;PASS&lt;/code&gt;、&lt;code&gt;AWS&lt;/code&gt; 或 &lt;code&gt;GCP&lt;/code&gt;，最多 40 个。也就是说，攻击者手上有一份「哪些机器配了哪类凭据」的名单。&lt;/p&gt;
&lt;p&gt;你可以用同一条规则给自己列清单：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;env | cut -d&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -f1 | grep -Ei &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;KEY|TOKEN|SECRET|PASS|AWS|GCP&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这条命令只打印变量名，不打印值，可以放心跑。打印出来的是「如果这台机器在 10 月 29 日被碰过，那这些凭据要当作已泄露」。按这个清单去轮换，比凭感觉删一通要准得多。&lt;/p&gt;
&lt;p&gt;轮换的顺序建议是：云凭据（AWS/GCP）→ 代码托管 token（GitHub/GitLab）→ 模型 API key → 其他服务 token → 最后是这台机器上所有登录会话（浏览器会话、SSH 私钥）。&lt;/p&gt;
&lt;h2 id=&#34;为什么个人用户的处置门槛比想象中高&#34;&gt;为什么个人用户的处置门槛比想象中高&lt;/h2&gt;
&lt;p&gt;做完上面这些，我意识到难点不在命令，在于一个个人开发者要回答三个问题，而每个问题都不是一条命令能答的。&lt;/p&gt;
&lt;p&gt;第一个是「我在不在暴露面内」。这要求你记得自己装过哪个版本、从哪个市场装的。现实是绝大多数人不记得，因为扩展是自动更新的，装的时候也不会有人提醒你记下来。这次能靠版本号跳变（313 在别的渠道不存在）取巧判断，下次未必有这个便宜可占。&lt;/p&gt;
&lt;p&gt;第二个是「我有没有被留下东西」。这要求你在四个几乎从不变动的位置上有基线，不然你只知道「现在有什么」，不知道「什么时候多出来的」。&lt;/p&gt;
&lt;p&gt;第三个是「我该轮换什么」。这要求你知道这台机器上的凭据分布，而凭据通常散在环境变量、配置文件、IDE 设置和 shell profile 里，没有一份清单。&lt;/p&gt;
&lt;p&gt;三个问题对应三个缺位：安装记录没有版本历史、持久化位置没有基线、凭据没有清单。这三样都是可以在平静期补上的，成本很低，而它们决定了出事那天的处置是从三分钟开始，还是从三天开始。第 5 步里那几条加固，本质上就是在补这三个缺位。&lt;/p&gt;
&lt;h2 id=&#34;第-6-步以后怎么少踩&#34;&gt;第 6 步：以后怎么少踩&lt;/h2&gt;
&lt;p&gt;下面是个人使用者能做的，按性价比从高到低排。前两条这次事件里能直接救你，后四条是长期收益。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;把凭据从环境变量里挪走。这是这次事件最直接的教训。它的第一轮收集就是扫环境变量名，而环境变量是绝大多数开发者放 API key 的默认位置，因为方便，也因为它会被 IDE、终端、构建脚本和 agent 一起继承。挪走的方式有很多种，macOS 用 Keychain，跨平台用 1Password CLI 或 &lt;code&gt;pass&lt;/code&gt;，或者退一步：放进权限 0600 的文件、由工具按需读取，并确保它在 &lt;code&gt;.gitignore&lt;/code&gt; 里。用哪种方案都可以，要的是让凭据不再出现在 &lt;code&gt;env&lt;/code&gt; 的输出里。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;监控那四个持久化位置。这次事件里，最直接能抓住它的检测点在这四个位置被改动，跟扩展本身长什么样无关：&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;、&lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt;（或 &lt;code&gt;~/.config/systemd/user/&lt;/code&gt;）、&lt;code&gt;crontab -l&lt;/code&gt;、以及 Windows 的计划任务。这四样在正常的一天里几乎不会变。个人也做得到，写个每天跑一次的脚本对它们算哈希存下来，变了就提醒你。这条的价值在于它是行为层检测，不依赖你认得出哪个发布者是真的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关掉插件自动更新，改成固定版本。这次的传播完全靠自动更新：11 小时窗口里最多 5,000 台机器，没有人是被说服之后装的。把扩展当依赖管理，固定版本、需要时手动升，你就在这个链条上留了一个人工闸门。代价是失去及时获得安全修复的便利，所以合理的折中是自动更新关掉，但订阅官方的安全公告。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;让 SSH 服务保持关闭。这次事件里那个 bug 之所以救了一大批人，恰恰是因为大多数 macOS 和 Windows 主机没有在跑 SSH 服务，隧道连不进来。这个默认关闭是你的资产，别为了偶尔远程登录把它长期打开。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不要用管理员权限启动 IDE。官方明确写了，唯一会让载荷成功开 SSH 的场景，就是 Cursor 以管理员权限启动。编辑器本来不需要这个权限。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把已装插件清单化，并且只从官方市场装。不用做复杂，一份文本文档记下装了哪些扩展、来自哪个市场、版本几号就够。它的作用在出事那天显出来：你能在三十秒内回答「我在不在暴露面内」，而不是去翻缓存目录猜。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;一句总结和一点边界&#34;&gt;一句总结和一点边界&lt;/h2&gt;
&lt;p&gt;这起事件对个人使用者最实际的启示是：你无法通过「这个发布者是官方」来判断安全，只能通过「这个东西的行为是否合理」。一个代码补全插件往你的 SSH 授权列表里写东西、拉起一条常驻隧道、在开机时自启，这三件事没有一件是它该做的。这次是扩展，下次可能是别的东西，行为基线这条防线不随载体变化。&lt;/p&gt;
&lt;p&gt;证据边界说清楚：本文的命令、路径、哈希、指纹全部来自 Cursor 的安全通告和 OpenSourceMalware 的技术分析，我没有能力独立验证那些远端材料；我自己的检查脚本只在本机 Linux 上真实跑过，macOS 与 Windows 分支是按官方 IOC 清单写的，未经实机验证。如果你在受影响的平台且命中任何一项，优先用官方的清理脚本，而不是照着我这份清单手敲。&lt;/p&gt;
&lt;p&gt;事件本身的性质、以及它为什么会发生，见昨天那篇&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20261031-claude-code-extension-marketplace-supply-chain/&#34; &gt;《Claude Code 官方扩展被投毒》&lt;/a&gt;；供应链这一类问题在别的载体上的表现，见&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20261001-agent-mcp-supply-chain-security/&#34; &gt;《MCP 供应链安全》&lt;/a&gt;和&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20261021-litellm-supply-chain-attack-1070/&#34; &gt;《LiteLLM 又被投毒了》&lt;/a&gt;。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
