Back to Intelligence

Claude Code-Brand Cursor Extension SSH Backdoor + Fake-Takedown Bank Phishing: OTX Detection Pack

SA
Security Arsenal Team
November 4, 2026
8 min read

Two OTX pulses converge on the same business risk: credential capture at developer endpoints and customer banking channels. The first pulse details a supply-chain compromise of the Claude Code-branded Cursor extension 'anthropic.claude-code', versions 2.1.313 and 2.1.312, distributed through the Cursor marketplace during a narrow window on 2026-10-29. The injected JavaScript executes during module load, performs host reconnaissance, installs macOS persistence, and opens a persistent SSH reverse tunnel backdoor. Microsoft naming in the pulse maps the activity to Trojan:MacOS/SmtShellMal.A, Trojan:JS/CredTheft.MS!MTB, Trojan:MacOS/MalPlistSysmond.A, and HackTool:MacOS/RevAnthShell.A.

The second pulse is financially motivated credential theft against 189 US financial institutions using 248 live look-alike domains. The operators use urgency keywords fused with bank names, then cloak infrastructure by showing repeat visitors a fake 'account suspended' page while first-time visitors receive the live credential harvester. The collective objective is durable account access: developer credentials, SSH keys, tokens, and session material from engineering workstations; business banking credentials and treasury portal access from finance users.

Threat Actor / Malware Profile

Attribution remains unknown in both pulses. The extension campaign is best modeled as an opportunistic supply-chain intrusion against AI-assisted developer workflows. Distribution abused marketplace trust and brand impersonation rather than zero-day exploitation. Payload behavior begins with JavaScript embedded in the extension package and triggered at module load, which provides execution before users notice abnormal UI behavior. Reconnaissance likely fingerprints host, user, network, installed tools, and accessible credentials. Persistence centers on macOS LaunchAgent plist artifacts consistent with Trojan:MacOS/MalPlistSysmond.A, including misleading service names such as sysmond-like labels to blend with legitimate system components. HackTool:MacOS/RevAnthShell.A indicates reverse-shell or reverse-tunnel utility behavior, enabling outbound SSH that NAT and firewall policy often mistake for normal administrator traffic.

The bank-phishing network is infrastructure-led rather than payload-led. Its anti-analysis control is conditional content serving: returning IPs, known scanners, or previously cookied victims are shown a fake suspension page, while fresh victims see the phishing kit. This reduces takedown pressure, pollutes sandbox verdicts, and can make repeat validation by analysts falsely conclude the domain is inactive. Targeting is explicitly US finance, business banking, and treasury-portal users.

IOC Analysis

The extension pulse contains file hashes only in the sampled set: SHA256 7e0a52885fadee05544a9e99eb18c792bec05900a5e1a66d68f8383decb0e278 and ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15, MD5 f49bcd657ef1e626e85ce858958c1769, and SHA1 7d52fa561468f0c77bca112f8393399dec078d02. Treat MD5 and SHA1 as weak corroborating signals; pivot primarily on SHA256 in EDR, email gateway, software inventory, and package-artifact scanners. Search package caches and extension directories for anthropic.claude-code builds 2.1.313 and 2.1.312, then diff against known-good publisher releases where available.

The phishing pulse provides domains such as 53primaryset.com, authorize-valley.com, commercial-atfirst.com, and protect-pinnaclefp.com. SOC teams should operationalize domains through DNS sinkhole, secure web gateway categorization, proxy historical query review, and TLS certificate transparency monitoring for issuer and SAN overlaps. Add the naming grammar to detections: urgency verbs such as authorize, protect, verify, secure, alert, suspended plus bank, primary, valley, pinnacle, commercial, treasury, or business-banking tokens. Decode and enrich with passive DNS, certificate logs, WHOIS creation date, ASN, favicon hash, and HTML title hashes; fake suspended pages often reuse templates even when domains rotate.

Detection Engineering

YAML
---
title: Trojanized Claude Code Cursor Extension Module Load Execution
id: 8f9c9f25-1e11-4d0d-9d10-5f0bb7a2a001
status: experimental
description: Detects suspicious child processes or script execution spawned by Cursor or extension-host processes shortly after Claude Code extension load, consistent with injected JavaScript credential-theft loader behavior.
author: Security Arsenal
date: 2026/11/05
logsource:
  category: process_creation
  product: windows
  service: sysmon
detection:
  selection_parent:
    ParentImage|contains:
      - 'Cursor'
      - 'Code'
      - 'extensionHost'
  selection_child:
    Image|endswith:
      - '\node.exe'
      - '\powershell.exe'
      - '\cmd.exe'
      - '\curl.exe'
      - '\wget.exe'
      - '\ssh.exe'
  selection_cli:
    CommandLine|contains:
      - 'anthropic.claude-code'
      - 'claude-code'
      - '--eval'
      - 'iex'
      - 'Invoke-Expression'
      - 'curl '
      - 'http://'
      - 'https://'
  condition: selection_parent and selection_child and selection_cli
falsepositives:
  - Legitimate extension telemetry or updates
level: high
tags:
  - attack.execution
  - attack.t1059
  - attack.t1195
---
title: macOS LaunchAgent Persistence With Sysmond-Like Naming
id: 5f6c1a39-7a54-4aa7-90d6-91a7158cc002
status: experimental
description: Detects creation of user LaunchAgents using deceptive system-like names, including MalPlistSysmond-style plist persistence for macOS backdoors.
author: Security Arsenal
date: 2026/11/05
logsource:
  category: file_event
  product: macos
detection:
  selection_path:
    TargetFilename|contains:
      - '/Library/LaunchAgents/'
      - '~/Library/LaunchAgents/'
  selection_name:
    TargetFilename|contains:
      - 'sysmond'
      - 'sysmon'
      - 'systemd'
      - 'com.apple.'
      - 'anthropic'
      - 'claude'
  selection_ext:
    TargetFilename|endswith: '.plist'
  condition: selection_path and selection_ext and selection_name
falsepositives:
  - Legitimate enterprise management agents
level: high
tags:
  - attack.persistence
  - attack.t1543
  - attack.t1053
---
title: Outbound SSH Reverse Tunnel From Developer Workstation
id: 39f9b0f8-0631-4f4f-9aa2-c18a48db8003
status: experimental
description: Detects SSH clients creating remote forwarding or persistent tunnels from endpoints where development extensions or AI coding assistants are installed.
author: Security Arsenal
date: 2026/11/05
logsource:
  category: process_creation
  product: linux
  service: auditd
detection:
  selection_img:
    Image|endswith:
      - '/ssh'
      - '/autossh'
      - '/socat'
      - '/ngrok'
      - '/cloudflared'
  selection_cli:
    CommandLine|contains:
      - ' -R '
      - ' -N '
      - ' -f '
      - 'StrictHostKeyChecking=no'
      - 'ServerAliveInterval'
      - 'localhost.run'
      - 'trycloudflare'
  condition: selection_img and selection_cli
falsepositives:
  - Administrator bastion workflows
level: medium
tags:
  - attack.command_and_control
  - attack.t1071
  - attack.t1572
  - attack.t1090
---
title: Fake Suspended-Page Bank Phishing Domain Grammar
id: b68f5c2a-e82b-4b6d-a0dd-2e80f5f9a004
status: experimental
description: Detects DNS or proxy lookups matching urgency keyword plus financial naming grammar used by look-alike bank phishing domains and fake takedown cloaking infrastructure.
author: Security Arsenal
date: 2026/11/05
logsource:
  category: dns
detection:
  selection_dns:
    QueryName|contains:
      - 'authorize'
      - 'protect'
      - 'secure'
      - 'verify'
      - 'alert'
      - 'suspended'
      - 'primary'
      - 'valley'
      - 'pinnacle'
      - 'commercial'
      - 'treasury'
  selection_finance:
    QueryName|contains:
      - 'bank'
      - 'financial'
      - 'fp'
      - 'cu'
      - 'business'
  condition: selection_dns and selection_finance
falsepositives:
  - Legitimate banking portals and payment providers
level: medium
tags:
  - attack.initial_access
  - attack.t1566
  - attack.t1071
KQL — Microsoft Sentinel / Defender
let SuspiciousPhishDomains = dynamic(["53primaryset.com","authorize-valley.com","commercial-atfirst.com","protect-pinnaclefp.com"]);
let PhishGrammar = dynamic(["authorize","protect","secure","verify","alert","suspended","primary","valley","pinnacle","commercial","treasury","business","bank"]);
let FileHashes = dynamic(["7e0a52885fadee05544a9e99eb18c792bec05900a5e1a66d68f8383decb0e278","ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15","7d52fa561468f0c77bca112f8393399dec078d02","f49bcd657ef1e626e85ce858958c1769"]);
union isfuzzy=true
(DeviceNetworkEvents
| where TimeGenerated >= ago(14d)
| where RemoteUrl has_any (SuspiciousPhishDomains) or RemoteUrl has_any (PhishGrammar)
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Hits=count() by DeviceName, RemoteUrl, RemoteIP, InitiatingProcessFileName
),
(DeviceProcessEvents
| where TimeGenerated >= ago(14d)
| where (InitiatingProcessFileName has_any ("Cursor","Code","extensionHost","node") and ProcessCommandLine has_any ("anthropic.claude-code","claude-code","-R","autossh","StrictHostKeyChecking=no","Invoke-Expression","iex"))
   or FileName has_any ("ssh","autossh","socat","ngrok","cloudflared")
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Hits=count() by DeviceName, AccountName, FileName, ProcessCommandLine, SHA256
),
(DeviceFileEvents
| where TimeGenerated >= ago(14d)
| where SHA256 has_any (FileHashes) or MD5 has_any (FileHashes) or SHA1 has_any (FileHashes) or FolderPath has_any ("LaunchAgents","anthropic.claude-code","claude-code")
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Hits=count() by DeviceName, FolderPath, FileName, SHA256, MD5, SHA1
)
| order by LastSeen desc
PowerShell
$ErrorActionPreference = 'SilentlyContinue'
$sha256 = @('7e0a52885fadee05544a9e99eb18c792bec05900a5e1a66d68f8383decb0e278','ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15')
$md5 = 'f49bcd657ef1e626e85ce858958c1769'
$sha1 = '7d52fa561468f0c77bca112f8393399dec078d02'
$domains = @('53primaryset.com','authorize-valley.com','commercial-atfirst.com','protect-pinnaclefp.com')
$roots = @("$env:USERPROFILE\.cursor\extensions","$env:USERPROFILE\.vscode\extensions","$env:APPDATA\Cursor\User\globalStorage","$env:LOCALAPPDATA\Programs\Cursor","$env:USERPROFILE\Library\Application Support\Cursor\User\globalStorage","$env:USERPROFILE\Library\LaunchAgents")
Write-Output '[*] Hash sweep in extension and cache locations'
foreach ($root in $roots) {
  if (Test-Path $root) {
    Get-ChildItem $root -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {
      $h256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
      $hm = (Get-FileHash $_.FullName -Algorithm MD5).Hash.ToLower()
      $hs = (Get-FileHash $_.FullName -Algorithm SHA1).Hash.ToLower()
      if ($sha256 -contains $h256 -or $hm -eq $md5 -or $hs -eq $sha1) {
        Write-Output "[HASH-HIT] $($_.FullName) sha256=$h256 md5=$hm sha1=$hs"
      }
    }
  }
}
Write-Output '[*] Claude Code extension version check'
Get-ChildItem "$env:USERPROFILE\.cursor\extensions","$env:USERPROFILE\.vscode\extensions" -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -match 'anthropic\.claude-code|claude-code' } | ForEach-Object {
  $pkg = Join-Path $_.FullName 'package.json'
  if (Test-Path $pkg) {
    $json = Get-Content $pkg -Raw | ConvertFrom-Json
    if ($json.version -in @('2.1.313','2.1.312')) { Write-Output "[BAD-VERSION] $($_.FullName) version=$($json.version)" }
  }
}
Write-Output '[*] LaunchAgent plist persistence check'
$la = @("$env:USERPROFILE\Library\LaunchAgents",'/Library/LaunchAgents')
foreach ($p in $la) { if (Test-Path $p) { Get-ChildItem $p -Filter *.plist | Where-Object { $_.Name -match 'sysmond|sysmon|claude|anthropic|com\.apple\.' } | ForEach-Object { Write-Output "[PLIST-REVIEW] $($_.FullName)" } } }
Write-Output '[*] SSH reverse tunnel process check'
Get-CimInstance Win32_Process | Where-Object { $_.Name -match 'ssh|autossh|socat|ngrok|cloudflared' -and $_.CommandLine -match ' -R | -N |StrictHostKeyChecking=no|ServerAliveInterval|trycloudflare|localhost\.run' } | Select-Object ProcessId,Name,CommandLine | Format-List
Write-Output '[*] DNS cache phishing indicator check'
$dns = Get-DnsClientCache -ErrorAction SilentlyContinue
foreach ($d in $domains) { $hits = $dns | Where-Object { $_.Entry -like "*$d*" -or $_.Data -like "*$d*" }; if ($hits) { $hits | ForEach-Object { Write-Output "[DNS-HIT] $($_.Entry) -> $($_.Data)" } } }
Write-Output '[*] Complete'

Response Priorities

Immediate: block the four SHA256, SHA1, and MD5 indicators at EDR and mail/web controls; block and sinkhole the listed phishing domains; isolate developer workstations with anthropic.claude-code 2.1.313 or 2.1.312 installed; export process trees, extension directories, LaunchAgents, shell histories, SSH configs, known_hosts, and outbound TCP 22 or tunneling-tool connections; capture extension package artifacts before cleanup for hash and JavaScript diffing.

24 hours: force credential rotation for users on affected endpoints, prioritizing SSH private keys, cloud CLI tokens, Git credentials, npm/PyPI tokens, browser-stored passwords, IdP session cookies, and Cursor/Claude API keys; revoke active sessions and refresh tokens; for finance users, reset business banking and treasury-portal credentials, validate out-of-band with known contacts, and review recent ACH, wire, payee-change, and MFA-enrollment events. Search proxy and DNS for first-time visits to look-alike domains and repeat visits that may have received fake suspended pages.

1 week: enforce signed extension allowlisting and version pinning for AI coding tools, require package provenance checks before marketplace install, restrict extension-host child processes, alert on LaunchAgent creation outside MDM, and constrain outbound SSH from workstations to approved bastions. Add phishing-resistant MFA for banking and developer IdPs, deploy conditional-content-resistant validation playbooks for takedown requests, and create CT-log monitoring for urgency-keyword financial domains before credential loss occurs.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.