| |

66 行 JavaScript 如何把 Claude Code 插件變成 SSH 後門?6 個攻擊環節全解讀

66 行 JavaScript 如何把 Claude Code 插件變成 SSH 後門?6 個攻擊環節全解讀

作者注:拆解 Cursor 擴展市場惡意 Claude Code 插件事件。重點說明 66 行前置加載器如何觸發、兩組 SSH 密鑰與反向隧道如何配合、哪些結論已證實哪些未證實,以及開發者該如何排查。

2026 年 10 月 29 日,Cursor 的 VS Code 擴展市場出現一個被篡改的 anthropic.claude-code 擴展。研究人員在它的 extension.js 開頭髮現了 一段約 66 行的 JavaScript 加載器。只要編輯器加載這個模塊,它就會嘗試在開發者電腦上植入持久化的 SSH 後門。

這不是小道消息。 Cursor 官方安全公告、Microsoft Security Research、Phorion、StepSecurity、OpenSourceMalware 和 Expel 都已發佈分析,Expel 還調查了 4 起真實客戶事件。截至 11 月 1 日,StepSecurity 補充了精確樣本比對,技術全貌基本清晰。

核心價值:3 分鐘理解這 66 行代碼到底做了什麼、爲什麼用戶不需要執行任何危險命令,以及卸載插件之後爲什麼仍不能確認安全。

66-lines-javascript-claude-code-extension-ssh-backdoor-zh-hant-image-0


66 行 JavaScript 後門事件核心信息速覽

先把事件邊界說清楚。這是一起開發工具軟件供應鏈攻擊,問題出在 Cursor 的擴展分發渠道。Claude 模型本身沒有被攻破,Anthropic 內部系統也沒有被入侵的證據。微軟已確認,Microsoft Visual Studio Marketplace 和官方 npm 包 @anthropic-ai/claude-code 均未受影響。

信息項 詳情
發生日期 2026 年 10 月 29 日
分發渠道 Cursor VS Code Extension Marketplace
冒用身份 anthropic.claude-code(Anthropic 並未構建或發佈這些版本)
惡意版本 2.1.312、2.1.313
官方列出的惡意安裝包平臺 Windows x64、macOS ARM64
公開分發時長 約 11 小時 8 分鐘
官方披露的受影響用戶上限 5000 人(是上限,不等於 5000 臺被控制)
注入代碼 extension.js 第 1–66 行的前置加載器
後續修復版本 Anthropic 發佈 2.1.314

66 行 JavaScript 後門事件時間線

下面的時間均換算爲北京時間。需要區分兩個概念:一個是安裝包可以下載的時間,另一個是已下載的安裝包實際運行的時間,後者可能明顯更晚。

北京時間 事件
10 月 29 日 17:27 惡意擴展開始在 Cursor 市場提供下載
10 月 30 日 04:35 Cursor 停止分發,暴露窗口關閉
10 月 30 日 Cursor 發佈安全公告,Phorion、OpenSourceMalware、微軟相繼發佈分析
10 月 30 日 12:45 Expel 觀察到一臺客戶 Mac 首次運行惡意代碼,晚於下架約 8 小時
10 月 31 日 02:30 Cursor 更新公告,將 2.1.312 列入受影響版本,並修訂入侵指標
11 月 1 日 StepSecurity 基於 MalwareBazaar 樣本完成精確靜態比對

事件曝光後,Cursor 移除了惡意版本,並臨時關閉整個擴展市場,同時完成以下工作:審計訪問記錄、輪換密鑰、重建市場,並協調雲服務商關閉攻擊者服務器。目前公開資料還沒有解釋攻擊者如何獲得向 Cursor 市場發佈構建的權限。在調查結論出來之前,不應斷言是 Anthropic 賬戶被盜或 Cursor 存在某個具體漏洞。


66 行 JavaScript 如何觸發 Claude Code 插件後門

“66 行”很容易被誤讀成“整個插件只有 66 行”。實際情況是,正常的 extension.js 是一個體積很大的壓縮文件。攻擊者只在文件最前面插入了一段惡意加載器,它從第 1 行開始,到第 66 行結束。

這段代碼使用立即執行函數表達式(IIFE)。它不需要等待用戶向 Claude 發消息,也不需要任何觸發條件。Cursor 用 Node.js 運行環境加載擴展主文件時,這段邏輯就會先於正常業務代碼執行。

7,386 字節的改動:樣本精確比對

StepSecurity 在 11 月 1 日從 MalwareBazaar 獲取樣本,覈對 SHA-256 後做了靜態比對。結果說明,攻擊者完全沒有必要重寫插件。

對比項 數值
正常 extension.js 3,685,536 字節
惡意 extension.js 3,692,922 字節
新增加載器 7,386 字節
新增內容佔比 約 0.20%
外部清單版本號 2.1.313
業務代碼內部自我標識 2.1.312

最後兩行同樣值得注意。攻擊者以 2.1.312 的正常構建爲基礎重新打包,只修改了外部版本信息。顯示的版本號與代碼的真實來源並不一定一致,因此只憑版本號做判斷並不可靠。StepSecurity 正文另一處“剩餘字節數”的表述存在算術不一致,引用時應以上表的整體大小和增量爲準。

爲什麼用戶不需要執行任何危險命令

這次攻擊和提示詞注入沒有關係。研究人員確認,整個過程具備以下特徵:

  • 不需要用戶發起 Claude 對話,也不需要模型同意執行高危指令;
  • 不依賴惡意 Prompt,也不依賴 npm 安裝生命週期腳本;
  • 初始攻擊不需要下載額外的可執行文件。

真正的風險來自 IDE 擴展在開發者電腦上的執行權限。擴展跑在 Node.js 裏,天然可以調用文件系統、讀取系統信息、創建子進程、執行系統命令、發起 HTTP 請求,以及調用本機的 SSH 工具。

66-lines-javascript-claude-code-extension-ssh-backdoor-zh-hant-image-1


Claude Code 插件 SSH 後門的兩組密鑰設計

這段 66 行代碼最巧妙的地方,是把後門完全建立在系統自帶的 SSH 之上。攻擊者不需要開發一套自定義遠控程序,只需要兩組用途不同的 SSH 身份配合即可。

第一組是受害電腦的授權密鑰。 惡意程序向用戶的 authorized_keys 追加攻擊者公鑰,公開的標記爲 svc-telemetry。如果本機 SSH 服務處於開啓狀態,持有對應私鑰的人就有機會以該用戶身份登錄。

第二組是連接外部服務器的身份密鑰。 惡意程序另行保存一把私鑰,讓受害設備能主動連接攻擊者服務器。這把密鑰不是用戶原有的私鑰。簡單來說,第一組解決“攻擊者能否通過認證”,第二組解決“受害電腦能否先連出去”。

反向 SSH 隧道爲什麼值得警惕

很多企業和家庭網絡會阻止公網直接訪問個人電腦,但電腦主動向外發起連接通常不受限制。反向隧道正好利用了這一點:受害電腦先連上攻擊者服務器,再把另一端的訪問請求轉回本地的 22 端口。

不過,連接存在不等於登錄成功。能否最終登錄,取決於本機 SSH 是否運行、認證配置是否生效,以及攻擊者服務器的轉發設置。如果本地 SSH 沒有啓動,隧道仍可能建立,但無法完成遠程登錄。


66 行惡意代碼的隱蔽手法與實現缺陷

爲了降低被發現的概率,加載器採取了幾種措施:

  • 正常的 Claude Code 功能繼續加載;
  • 各攻擊步驟單獨捕獲異常,靜默失敗後繼續執行;
  • 持久化任務使用 SysMon、com.apple.sysmond 等仿冒系統組件的名稱;
  • 連接失敗後約每 60 秒重試一次;
  • 啓動約 1.5 秒後嘗試上報信息。

用戶界面上可能看不到任何異常。

惡意代碼本身也有明顯缺陷,這在客觀上降低了遠程登錄的成功率:

平臺 實現缺陷 實際影響
macOS 以普通權限查詢 Remote Login 狀態,返回權限錯誤;代碼只在識別到明確的“關閉”狀態時才嘗試開啓 許多原本沒開 SSH 的 Mac 不會被自動開啓遠程登錄;若 SSH 原本已開啓,風險仍在
Windows 用 PowerShell 安裝 OpenSSH Server,卻通過依賴 /bin/sh 的輔助函數執行 標準 Windows 沒有該路徑,SSH 服務啓用步驟可能失敗
Linux 通過 crontab @reboot 持久化,Phorion 發現 crontab 檢查有缺陷 重複執行時可能誤傷用戶原有定時任務;Linux 實際分發規模未確認

缺陷不代表代碼完全失效。寫入用戶自己的文件、創建用戶級啓動項,往往不需要管理員權限。因此可能出現這樣一種情況:遠程登錄服務沒能啓動,但授權密鑰已經寫入,啓動腳本已經生成,主機信息已經發出,後臺進程也在持續嘗試外連。“沒有管理員權限就完全安全”的想法並不成立。


Claude Code 插件後門對開發者的影響分析

對開發者的影響

  • API Key 相關的環境變量名稱可能已經暴露:加載器最多篩選 40 個名稱中包含 KEY、TOKEN、SECRET、PASS、AWS、GCP 的環境變量。初始上報的是名稱而非值,但攻擊者可以據此判斷你在用哪些 API 或雲平臺。一旦後門可用,本地憑證仍可能被進一步讀取。
  • 卸載插件不等於清除後門:持久化文件、啓動項和 SSH 公鑰不會隨擴展卸載自動消失。Expel 的一起案例顯示,用戶在插件下架後纔打開 Cursor,惡意活動隨即開始,並持續了接近 10 小時。
  • 單一指標會漏報:Expel 發現一臺機器有惡意隧道進程,卻沒有 svc-telemetry 公鑰標記。排查時需要同時覈對版本、文件哈希、進程、網絡連接和啓動項。

對行業的影響

  • IDE 擴展成爲高價值攻擊面:AI 編程工具普及後,開發者電腦上同時存放着源碼、雲憑證和模型 API Key。在一個 3.6MB 的壓縮文件前面插入 7KB 代碼,就足以改變它的安全屬性。
  • 第三方擴展市場的發佈鏈路需要重新審視:這次事件只發生在 Cursor 市場,而同名擴展在其他渠道沒有問題。這說明“發佈者名稱看起來是官方”並不能作爲信任依據。

66-lines-javascript-claude-code-extension-ssh-backdoor-zh-hant-image-2

上圖由 API易 apiyi.com 技術團隊根據公開研究整理。下表把事實邊界單獨列出,引用或轉述時請注意區分:

結論 狀態 說明
Cursor 市場分發過被篡改的 Claude Code 擴展 已證實 官方公告確認
惡意代碼具備信息收集、密鑰植入、反向隧道、持久化能力 已證實 多家機構樣本分析一致
存在真實客戶設備上的惡意活動 已證實 Expel 處理 4 起,均爲 Mac
5000 臺電腦被完全控制 未證實 5000 只是可能受影響的上限
用戶 API Key 實際值被竊取 未證實 初始上報只有變量名稱
全球成功入侵數量與經濟損失 未公佈 不應推算

如何排查 Claude Code 插件 SSH 後門

如果你在 10 月 29 日至 30 日期間通過 Cursor 市場安裝或自動更新過 Claude Code 擴展,建議先做一次快速自查。下面的 Node.js 腳本只讀取公開披露的痕跡路徑,不做任何修改:

// 只讀排查:檢查公開披露的入侵痕跡(不能單獨作爲結論)
const fs = require("fs"), os = require("os"), path = require("path");
const home = os.homedir();
const checks = [
  path.join(home, ".ssh", "authorized_keys"),
  path.join(home, ".config", ".smt"),
  path.join(home, ".config", ".smtk"),
  path.join(home, "Library", "LaunchAgents", "com.apple.sysmond.plist"),
  path.join(home, ".config", "smt.cmd"),
  path.join(home, ".config", "smtk"),
];
for (const p of checks) {
  if (!fs.existsSync(p)) continue;
  const hit = p.endsWith("authorized_keys")
    ? fs.readFileSync(p, "utf8").includes("svc-telemetry")
    : true;
  if (hit) console.log("⚠️ 發現可疑痕跡:", p);
}

腳本命中任何一項,都應進一步覈對文件哈希、SysMon 計劃任務、進程和網絡記錄,例如是否連接過 134.209.82[.]225 的 22 或 8099 端口。Cursor 官方公告還提供了 macOS 與 Windows 的檢查和修復腳本,建議在理解腳本權限之後再執行。

對於手頭的可疑擴展文件,也可以藉助大模型做一輪輔助代碼審查,重點看文件開頭是否有調用 child_process、寫 authorized_keys、建立 ssh 連接的 IIFE。下面是最簡調用示例:

import openai

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1"  # API易 OpenAI 兼容接口
)

head = open("extension.js", encoding="utf-8", errors="ignore").read(10000)
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "請審查這段 JS 開頭是否存在可疑的子進程、SSH、持久化或外連行爲:\n" + head}]
)
print(resp.choices[0].message.content)
查看完整審查腳本(含哈希比對)
import hashlib
import sys
import openai

# 公開披露的惡意 extension.js SHA-256
KNOWN_BAD = {
    "ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15",
}
KEYWORDS = ["child_process", "authorized_keys", "svc-telemetry",
            "LaunchAgents", "schtasks", "crontab", "8099", "-R"]

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1"  # 使用 API易 統一接口
)

def sha256(path: str) -> str:
    h = hashlib.sha256()
    with open(path, "rb") as f:
        for chunk in iter(lambda: f.read(1 << 20), b""):
            h.update(chunk)
    return h.hexdigest()

def review(path: str, head_size: int = 10000) -> None:
    digest = sha256(path)
    print("SHA-256:", digest)
    if digest in KNOWN_BAD:
        print("⚠️ 命中已公佈的惡意哈希,請立即隔離設備並按官方指引處置")

    head = open(path, encoding="utf-8", errors="ignore").read(head_size)
    hits = [k for k in KEYWORDS if k in head]
    print("文件開頭命中關鍵詞:", hits or "無")

    prompt = (
        "你是安全審計助手。下面是一個 IDE 擴展入口文件的開頭部分,"
        "請判斷是否存在在模塊加載時立即執行的代碼,"
        "並列出涉及子進程、SSH 密鑰、持久化、網絡外連的可疑片段。\n\n" + head
    )
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=1200,
    )
    print(resp.choices[0].message.content)

if __name__ == "__main__":
    review(sys.argv[1] if len(sys.argv) > 1 else "extension.js")

建議:模型審查只是輔助手段,不能替代 EDR 日誌和官方指標比對。如果需要對比不同模型的代碼審查效果,可以通過 API易 apiyi.com 用同一個 Key 切換調用。新用戶有免費測試額度。另外,送審前請確認代碼中沒有業務敏感信息。

確認惡意擴展執行過之後,請依次完成以下步驟:

  1. 保留調查證據並隔離設備;
  2. 清理惡意文件、啓動項和 SSH 公鑰;
  3. 評估這臺設備能訪問的倉庫、雲憑證、會話令牌和 API Key 是否面臨後續風險;
  4. 無法恢復可信狀態時重建系統,並在可信設備上輪換全部憑證。

常見問題 FAQ

Q1:66 行 JavaScript 是指整個 Claude Code 插件嗎?

不是。66 行指的是插入在 `extension.js` 最前面的惡意加載器,從第 1 行到第 66 行,約 7,386 字節。正常插件代碼有 3.6MB 以上,仍在其後照常運行。

Q2:這和提示詞注入攻擊有什麼區別?

提示詞注入是誘導模型輸出或執行危險操作,而這次是擴展代碼在加載時直接執行。整個過程不經過 Claude,不需要對話,也不需要模型同意。即使你從沒用過插件裏的 AI 功能,只要擴展被加載,代碼就可能運行。

Q3:從官方 npm 或 VS Code 市場安裝的 Claude Code 受影響嗎?

微軟已確認,Visual Studio Marketplace 和官方 npm 包 `@anthropic-ai/claude-code` 未受影響,Open VSX 也沒有發現對應惡意版本。受影響的僅是 Cursor 市場分發的 2.1.312 和 2.1.313,判斷時還要結合來源和文件哈希。

Q4:環境變量裏存了 API Key,需要更換嗎?

初始上報只包含變量名稱,沒有上報變量值。但如果你的設備確認運行過惡意代碼,後門存在被用來讀取憑證的可能,穩妥做法是在可信設備上輪換。對存放在環境變量中的 API易 apiyi.com 等平臺的 Key,也建議一併更換,並改用更安全的密鑰管理方式。

Q5:開發 AI 應用時如何降低這類風險?

建議做到以下幾點:開發機不長期以明文環境變量保存高權限 Key,不同項目使用不同 Key,並定期審計 IDE 擴展。通過 API易 apiyi.com 這類聚合平臺調用模型,可以用一個 Key 覆蓋多家模型,減少散落在本地的憑證數量,出問題時也只需輪換一處。


66 行 JavaScript 後門事件 Key Takeaways

  • 攻擊本質:Cursor 擴展市場遭供應鏈投毒,Claude 模型本身沒有被攻破
  • 觸發方式:66 行 IIFE 加載器在擴展加載時自動執行,不需要用戶進行任何操作
  • 後門結構:兩組 SSH 密鑰配合反向隧道,完全複用系統自帶工具
  • 事實邊界:5000 是受影響用戶上限,API Key 實際值被盜未證實
  • 處置要點:卸載插件不等於清除後門,需要多維度排查並在可信設備上輪換憑證
  • 防護習慣:減少本地明文 Key,可藉助 API易 apiyi.com 統一管理模型調用憑證

總結

66 行 JavaScript 後門事件說明了三件事:

  1. 改動小,危害大:只需在 3.6MB 文件前插入 0.2% 的代碼,一個可信擴展就會變成後門載體。
  2. 權限決定風險:IDE 擴展擁有完整的 Node.js 執行能力,普通用戶權限下也能完成密鑰寫入和持久化。
  3. 下架不等於結束:已安裝的惡意組件可能延遲運行、持續外連,必須單獨排查和清理。

如果你在暴露窗口內使用過 Cursor 市場的 Claude Code 擴展,請對照官方指標完成排查,並輪換可能受影響的憑證。日常開發中,建議收斂本地憑證的數量,例如通過 API易 apiyi.com 用統一的 Key 調用多家模型,降低單點泄露帶來的影響面。


📚 參考資料

  1. Cursor 官方安全公告:事件時間、版本、哈希及清理腳本
  2. 鏈接:cursor.com/blog/claude-code-extension-security-notice
  3. 說明:排查與修復的第一手依據

  4. Microsoft Security Research:完整攻擊鏈與 MITRE ATT&CK 映射

  5. 鏈接:microsoft.com/en-us/security/blog/2026/10/30/inside-malicious-claude-code-branded-cursor-extension-persistent-ssh-backdoor/
  6. 說明:涵蓋供應鏈邊界、SSH 機制與持久化分析

  7. Phorion:66 行加載器與各平臺實現缺陷

  8. 鏈接:phorion.io/blog/offical-claude-code-vsx-compromise/
  9. 說明:包含環境變量篩選與 Linux crontab 缺陷細節

  10. StepSecurity:11 月 1 日樣本精確比對

  11. 鏈接:stepsecurity.io/blog/claude-code-extension-trojanized
  12. 說明:給出文件大小差異和版本標識僞裝證據

  13. Expel:4 起真實客戶事件調查

  14. 鏈接:expel.com/blog/blog-fake-claude-code-extension-cursor-ssh-backdoor/
  15. 說明:記錄了延遲運行與漏報案例

  16. OpenSourceMalware:惡意插件內部結構分析

  17. 鏈接:opensourcemalware.com/blog/trojanized-claude-code-extension-plants-persistent-ssh-backdoor
  18. 說明:確認了加載器位置與執行方式

作者:APIYI 技術團隊
技術交流:歡迎在 API易 apiyi.com 網站首頁聯繫我們,更多資料可訪問 docs.apiyi.com 文檔中心

延伸閱讀

Similar Posts