10 月 29 日,Cursor 應用市場裏的 Claude Code 擴展有兩個版本被人換了芯。2.1.312 和 2.1.313 掛着 Anthropic 的認證賬號和名字上架,真正的擴展代碼前面塞着一段 66 行的加載器,編輯器一打開它就先跑。這兩個版本在市場裏待了大約 11 個小時,Cursor 在 X 上說最多 5000 名用戶裝到或更新到了它們。
加載器不是 Anthropic 寫的,這兩個版本也不是它發佈的。Anthropic 的說法是,一個攻擊者「利用了對 Cursor 應用市場的訪問權限,發佈了一個被篡改的擴展」,它自己「沒有參與這版的構建、發佈和託管」。動手的人鑽進的是 Cursor 的發佈渠道,文件是在到你手上之前被換掉的。
你上一次打開自己機器上的 authorized_keys,是什麼時候?裏面的每一把鑰匙,你都認得嗎?
問這個,是因爲這次出事的路徑最後就落在這個文件上。加載器先把這臺機器的底細發出去:主機名、用戶名、操作系統和架構、home 目錄、當前工作目錄、公網 IP、Git 全局配置裏的郵箱,還有名字裏帶 KEY、TOKEN、SECRET、PASS、AWS、GCP 這些詞的環境變量的名字,最多 40 個,用明文 HTTP 發到攻擊者的服務器,端口 8099。
第一波發走的只有變量的名字,值還沒有動。名字本身已經夠攻擊者用了,他能看出這臺機器掛着哪幾家的雲賬號、大概存着哪幾類憑證。值要等他能登錄進來之後纔拿得到,所以他接着做了三件事,目的就是給自己開一條能登錄進來的路。
第一件是鑰匙:往 ~/.ssh/authorized_keys 里加一把攻擊者控制的 Ed25519 鑰匙,備註寫着 svc-telemetry。這個文件就是 SSH 登錄的鑰匙白名單,寫在上面的鑰匙都能登錄這臺機器。第二件是把這臺機器的 SSH 服務打開,Mac 上是遠程登錄,Linux 上是 sshd,Windows 上是 OpenSSH Server。
第三件是一條反向 SSH 隧道,連到 134.209.82.225,斷了大約每 60 秒重連一次,攻擊者的服務器順着這條隧道就能反過來連進你的機器。
爲了讓這條路在重啓之後還在,它按系統各留了一種自動恢復的辦法。Mac 上是啓動代理 com.apple.sysmond,名字仿着蘋果起的,跟蘋果沒有關係。Linux 上是定時任務裏一條開機就執行的記錄,Windows 上試着建一個叫 SysMon 的計劃任務。
早期報道里有一處錯,現在已經更正了:最初有分析把源頭指成 Open VSX,那不是事實。出事的只有 Cursor 市場裏的這兩個版本。微軟 10 月 30 日的分析也是同一個結論。
其他幾個渠道都查過,沒有問題。npm 上的官方包、微軟市場裏的版本、Open VSX 裏的版本都是乾淨的,那幾個渠道里的 2.1.312 是正常版本,而被動過手腳的 2.1.312 只在 Cursor 市場裏出現過。你要查的是你自己在 Cursor 裏裝的那個,不是別的渠道的。

先打開 ~/.ssh/authorized_keys,看裏面有沒有一把備註寫着 svc-telemetry 的鑰匙。Mac 上再找一遍啓動代理的目錄,看有沒有 com.apple.sysmond 這個文件。Linux 上打開定時任務列表,找一條你沒寫過的開機執行記錄。
Windows 上打開任務計劃程序,看有沒有一個叫 SysMon 的任務。再看一眼正在跑的進程,裏面有沒有一個長期掛着的 ssh 或 autossh,參數帶着一條把外部連接轉回本機 22 端口的反向轉發。這幾處都沒有,你這次就沒有被它種下東西。
Cursor 還給了一個限定,能幫你判斷自己的風險:在 Mac 和 Windows 上,打開 SSH 服務需要管理員權限,擴展一般拿不到,所以在大多數這類機器上,鑰匙就算寫進去了,攻擊者最後也沒有真的登錄進來。這個限定講的是大多數機器,但是你這一臺到底是哪種情況,還是要靠上面那幾處檢查來定。
真在哪一處找到了,先不要急着刪。把 authorized_keys 的內容存一份,把找到的啓動代理或任務存一份,把還在跑的那個隧道進程用的命令和參數記下來。留完證據再動手:刪掉那把鑰匙,刪掉那幾樣自動恢復的辦法,停掉隧道進程。
然後換一臺你信得過的乾淨機器,把這臺機器上存過、輸過、用過的憑證全部換掉。OpenSourceMalware 的建議更直接,它說與其刪掉已知的幾樣東西就當信任恢復了,不如把機器重裝一遍。我認同它這句,你刪得掉的是你找到的那些,但是沒找到的還在不在,你沒有辦法確認。
查完這一次,還有幾件平時的事能擋住下一回。第一件就是開頭問的那個文件:authorized_keys 是你這臺機器的鑰匙名單,隔一段時間打開看一眼,裏面每一把鑰匙你都應該認得。這次的鑰匙備註叫 svc-telemetry,下次會換一個名字,所以要認的是「每一把都認得」,不是去搜某一個詞。
第二件,不用 SSH 登錄這臺機器,就把遠程登錄關掉。鑰匙要能用上,前提是機器開着 SSH 服務;服務關着,鑰匙寫進去也進不來。這次大多數機器沒有被真的登錄,靠的就是開服務需要管理員權限這一步:你平時把這個開關關着,等於一直把這一步卡在管理員密碼上。當然,這擋的是登錄那一步,但是擋不住機器信息被髮出去那一步,所以它要和別的辦法一起用。
第三件,擴展少裝,並且知道自己裝了哪些。擴展是在編輯器裏跑的程序,用的就是你這個賬號的權限,能讀你的文件,也能執行命令。這次的事也說明,認證徽章能證明的只是發佈賬號是誰,但是證明不了這一次發出來的文件沒有被動過。看徽章這個習慣不用扔,它能擋住起個像官方的名字來騙人的那種;但別把徽章當成文件本身的保證。
第四件,更新要做,但要知道更新管的是哪一半。Anthropic 後來用 2.1.314 換掉了這兩個版本,新版本是乾淨的,加載器不在裏面了。可是已經寫進 authorized_keys 的鑰匙還在,自動恢復的辦法還在,發出去的信息也收不回來。出事之後的清理要按清單一項一項對,不能因爲看到版本是最新的就當處理完了。
Cursor 事後關掉了市場,換掉自己的鑰匙,重建之後才重新上線,還和託管商一起把攻擊者的服務器下了線。但是它到現在也沒有說清楚,被動過手腳的版本到底是怎麼進到市場裏面去的。Anthropic 說自己的系統沒有被攻破,而 Kevin Beaumont 批評它的做法:它沒有通知用戶,被動過手腳的版本是悄悄換掉的。
我維護開源項目,發佈要用的東西基本都在我這臺開發機上:GitHub 令牌、雲服務的憑證、還沒有發佈的代碼,全在上面。所以一個陌生人要是能長期用 SSH 進來,他不需要偷走任何文件,因爲他要用的東西本來就放在裏面。被動過手腳的版本是怎麼進市場的,平臺那邊還沒有說法,但是我自己機器上的這幾處檢查,今天就能做完。
這兩個版本在市場裏只待了 11 個小時。你 authorized_keys 裏那把鑰匙能待多久,要看你什麼時候去翻它。今天先把別的事情放一放,打開那個文件看一眼,順手確認一下遠程登錄的開關是關着的。這篇對你有用的話,收藏一下,訂閱一下,我接着寫 AI、安全和開源這幾塊的實事。
出處:OpenSourceMalware 的分析 https://opensourcemalware.com/blog/trojanized-claude-code-extension-plants-persistent-ssh-backdoor ;Cursor 的安全通知 https://cursor.com/blog/claude-code-extension-security-notice
「最多 5000 名用戶」這個數字出自 Cursor 在 X 上的聲明:https://x.com/cursor_ai/status/2116074289053175808