Back to Intelligence

Claude Dispatch Browser Extension Attack Chain: Detecting and Blocking Malicious Code Execution on Endpoints

SA
Security Arsenal Team
November 7, 2026
13 min read

Executive Summary

Endpoint security researchers at Forever Security have demonstrated a concerning attack chain: a malicious browser extension with scripting access to claude.ai can leverage Claude Dispatch — the feature that allows users to relay tasks from their phone to Claude Desktop — to execute arbitrary code on a victim's local machine. This is a real-world example of the threat class security teams have been warning about for two years: AI agents with local system access becoming a bridge between browser-borne attackers and the endpoint.

No CVE has been assigned, and this is currently a demonstrated proof-of-concept rather than confirmed in-the-wild exploitation. That distinction matters, but it should not breed complacency. The prerequisite conditions — a user running Claude Desktop with Dispatch enabled, plus a malicious or compromised browser extension — are common in modern enterprise environments. Organizations that have adopted AI desktop assistants must treat this as a live architectural risk today.


Introduction: Why Defenders Must Act Now

AI desktop assistants are no longer passive chat windows. Features like Dispatch transform them into task execution brokers — they accept instructions, interpret them, and take action on the host with the user's privileges. That is exactly the capability attackers have always wanted, and it arrives pre-installed, signed, and whitelisted by most application control policies.

The attack demonstrated by Forever Security is straightforward in its logic:

  1. The victim installs (or is tricked into installing) a malicious browser extension, or a legitimate extension is compromised via a supply-chain update.
  2. The extension can read and inject content into web sessions on claude.ai — standard extension behavior that most users grant without scrutiny.
  3. The attacker uses this position to push a crafted task through Dispatch to the victim's Claude Desktop client.
  4. Claude Desktop, acting on what it believes is a legitimate user-issued task, executes code or commands on the local machine.

The result is remote code execution delivered through a trusted, signed application — no exploit of a memory corruption bug, no dropped malware binary initially, just a trusted agent doing what it was designed to do, on instructions it should never have received.

For SOC teams, this is the detection nightmare scenario: the executing process is legitimate, signed, and expected. Your telemetry must therefore focus on behavioral lineage — what Claude Desktop spawns and does, not whether Claude Desktop is present.


Technical Analysis

Affected Components

ComponentDetails
Primary attack surfaceClaude Desktop (Anthropic) with the Dispatch feature enabled
Delivery vectorMalicious or compromised browser extensions with scripting/read access on claude.ai
PlatformsWindows and macOS endpoints running Claude Desktop
PrerequisitesUser logged into claude.ai in browser; Dispatch enabled and paired; extension with host permissions for claude.ai
CVENone assigned as of publication — this is a feature-abuse / trust-boundary weakness, not a memory-safety vulnerability
Exploitation statusDemonstrated PoC by Forever Security; no confirmed in-the-wild exploitation or CISA KEV listing at time of writing

Attack Chain (Defender's View)

Code
[Malicious Browser Extension]
        │  (content script injection / DOM manipulation on claude.ai)
        ▼
[claude.ai Web Session] ── forged or manipulated task input
        │  (Dispatch relay: cloud-brokered task delivery)
        ▼
[Claude Desktop on endpoint] ── interprets task as legitimate user instruction
        │  (agent executes: shell commands, script files, downloads)
        ▼
[Local Code Execution] ── cmd.exe / powershell.exe / sh / osascript / dropped payloads

Why This Works

The core weakness is a confused-deputy problem across a trust boundary:

  • Dispatch is designed to accept tasks originating from the user's authenticated surfaces (their phone, their web session) and act on them locally.
  • A browser extension with scripting privileges on claude.ai operates inside that authenticated surface. From Dispatch's perspective, an extension-injected task may be indistinguishable from a user-typed one.
  • Claude Desktop executes with the user's full local privileges. Anything the agent is permitted to do — run scripts, write files, fetch URLs — happens under a legitimate, signed parent process.

This mirrors the broader class of indirect prompt injection attacks against AI agents, but with a critical difference: the injection point here is the browser extension layer, which is already a well-documented enterprise risk with mature (if under-deployed) controls.

Exploitation Requirements

An attacker needs:

  1. A malicious extension installed in the victim's browser (via social engineering, typosquatted extension listings, or compromise of a legitimate extension's update pipeline), with host permissions covering claude.ai.
  2. The victim running Claude Desktop with Dispatch enabled and paired.
  3. The victim's browser session on claude.ai active (or the extension maintaining its own authenticated API path).

None of these are exotic. Browser extension compromise is a recurring supply-chain event, and enterprise AI assistant adoption is accelerating faster than the controls around them.


Detection & Response

The reliable detection strategy here is child-process lineage from Claude Desktop, combined with extension inventory auditing. The agent process itself is legitimate; its behavioral output is where maliciousness becomes visible.

Sigma Rules

YAML
---
title: Claude Desktop Spawning Shell or Scripting Interpreter
id: 3f8a2c71-9b4e-4d5a-a6c2-7e1f8b3d9a42
status: experimental
description: Detects Claude Desktop spawning command shells or scripting engines, consistent with agent-driven local code execution such as the Dispatch browser-extension attack chain demonstrated by Forever Security.
references:
  - https://thehackernews.com/2026/11/malicious-browser-extensions-could-use.html
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.execution
  - attack.t1059
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|endswith:
      - '\Claude.exe'
      - '\claude.exe'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\mshta.exe'
      - '\rundll32.exe'
      - '\regsvr32.exe'
      - '\bitsadmin.exe'
      - '\certutil.exe'
  condition: selection_parent and selection_child
falsepositives:
  - Legitimate Claude Desktop tool-use features invoking shells under user direction; baseline frequency per host before tuning
level: high
---
title: Claude Desktop Writing Executable or Script Files to User-Writable Paths
id: 8c4d1e92-5a3b-4f6c-b7d1-2a9e4c6f8b35
status: experimental
description: Detects Claude Desktop dropping scripts or executables into temp, downloads, or appdata paths, a likely artifact of an agent executing an injected task from the Dispatch relay.
references:
  - https://thehackernews.com/2026/11/malicious-browser-extensions-could-use.html
  - https://attack.mitre.org/techniques/T1105/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.command_and_control
  - attack.t1105
logsource:
  category: file_event
  product: windows
detection:
  selection_source:
    Image|endswith:
      - '\Claude.exe'
      - '\claude.exe'
  selection_target:
    TargetFilename|contains:
      - '\AppData\Local\Temp\'
      - '\Downloads\'
      - '\AppData\Roaming\'
    TargetFilename|endswith:
      - '.exe'
      - '.dll'
      - '.ps1'
      - '.bat'
      - '.cmd'
      - '.vbs'
      - '.js'
      - '.hta'
  condition: selection_source and selection_target
falsepositives:
  - User-directed code generation workflows where Claude legitimately writes project files; restrict to non-project directories during tuning
level: medium
---
title: Claude Desktop Process Establishing Outbound Connection to Raw Payload Infrastructure
id: 1b7e3f54-6c2a-4d8e-9a1b-5f3c7d2e8a16
status: experimental
description: Detects Claude Desktop making network connections to uncommon non-Anthropic destinations, potentially indicating an agent fetching second-stage payloads after a Dispatch-injected task.
references:
  - https://thehackernews.com/2026/11/malicious-browser-extensions-could-use.html
  - https://attack.mitre.org/techniques/T1071/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.command_and_control
  - attack.t1071.001
logsource:
  category: network_connection
  product: windows
detection:
  selection:
    Image|endswith:
      - '\Claude.exe'
      - '\claude.exe'
    Initiated: 'true'
  filter_anthropic:
    DestinationHostname|endswith:
      - '.anthropic.com'
      - '.claude.ai'
  condition: selection and not filter_anthropic
falsepositives:
  - MCP server integrations and legitimate tool connectors configured by the user; inventory sanctioned connectors and extend the filter
level: medium

A note on tuning: rule one will fire in environments where developers legitimately use Claude's tool-execution capabilities. That is the correct behavior — those executions are exactly the surface you need visibility into. Deploy in audit mode for 7–14 days, baseline per-host frequency, then alert on deviations and on child processes launched outside business-context workflows.

KQL — Microsoft Sentinel / Defender

KQL — Microsoft Sentinel / Defender
// Hunt: Suspicious child processes spawned by Claude Desktop (Dispatch abuse indicator)
// Covers both the direct shell-spawn pattern and script-interpreter lineage.
let Lookback = 14d;
let SuspiciousChildren = dynamic([
    "cmd.exe", "powershell.exe", "pwsh.exe", "wscript.exe", "cscript.exe",
    "mshta.exe", "rundll32.exe", "regsvr32.exe", "bitsadmin.exe", "certutil.exe",
    "wmic.exe", "schtasks.exe", "curl.exe"
]);
DeviceProcessEvents
| where TimeGenerated > ago(Lookback)
| where InitiatingProcessFileName =~ "Claude.exe"
   or InitiatingProcessFolderPath has_any ("Claude")
| where FileName in~ (SuspiciousChildren)
| project TimeGenerated, DeviceName, AccountName,
          InitiatingProcessFileName, InitiatingProcessCommandLine,
          FileName, ProcessCommandLine, SHA256, FolderPath
| order by TimeGenerated desc;

// Companion hunt: network connections from Claude Desktop to non-Anthropic destinations
DeviceNetworkEvents
| where TimeGenerated > ago(Lookback)
| where InitiatingProcessFileName =~ "Claude.exe"
| where not(RemoteUrl has_any ("anthropic.com", "claude.ai"))
| summarize ConnectionCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated)
          by DeviceName, RemoteUrl, RemoteIP, RemotePort
| order by ConnectionCount asc;  // low-frequency destinations are the interesting ones

Velociraptor VQL

VQL — Velociraptor
-- Hunt for Claude Desktop child process lineage across the fleet
-- Deploy as a multi-client hunt to identify hosts where the agent
-- has spawned shells or scripting interpreters (Dispatch abuse artifact)

SELECT Pid,
       Ppid,
       Name,
       Exe,
       CommandLine,
       Username,
       CreateTime,
       get_member(field="Exe", member="Authenticode") AS Signature
FROM pslist()
WHERE Ppid IN (
        SELECT Pid FROM pslist()
        WHERE Name =~ '(?i)claude'
      )
  AND Name =~ '(?i)(cmd|powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32|curl|wget|bash|sh)'
VQL — Velociraptor
-- Inventory browser extensions with claude.ai host permissions (Chrome, fleet-wide)
-- Parses each profile's Secure Preferences for extension host permissions

SELECT FullPath AS ExtensionID,
       parse_json(data=read_file(filename=FullPath)).name AS ExtensionName,
       parse_json(data=read_file(filename=FullPath)).permissions AS Permissions
FROM glob(globs='C:/Users/*/AppData/Local/Google/Chrome/User Data/*/Extensions/*/*/manifest.json')
WHERE read_file(filename=FullPath) =~ 'claude\\.ai'

Remediation & Audit Script (PowerShell)

PowerShell
# Security Arsenal - Claude Dispatch Exposure Audit & Hardening Script
# Run elevated on endpoints. Audits Claude Desktop child-process history,
# inventories Chrome/Edge extensions with claude.ai permissions, and
# reports Dispatch configuration state.

$ReportPath = "C:\ProgramData\SecurityArsenal\ClaudeDispatchAudit_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
New-Item -ItemType Directory -Path (Split-Path $ReportPath) -Force | Out-Null

function Write-Finding($Message) {
    $line = "$(Get-Date -Format 'u') $Message"
    Add-Content -Path $ReportPath -Value $line
    Write-Host $line
}

Write-Finding "=== Claude Dispatch Exposure Audit Started ==="

# 1. Check whether Claude Desktop is installed
$claudePaths = @(
    "$env:LOCALAPPDATA\Programs\Claude\Claude.exe",
    "$env:LOCALAPPDATA\AnthropicClaude\Claude.exe"
)
$claudeInstalled = $claudePaths | Where-Object { Test-Path $_ }
if ($claudeInstalled) {
    Write-Finding "[FOUND] Claude Desktop installed at: $($claudeInstalled -join ', ')"

    # Check if the process is currently running
    $running = Get-Process -Name "Claude" -ErrorAction SilentlyContinue
    if ($running) {
        Write-Finding "[ALERT] Claude Desktop is currently RUNNING (PID(s): $($running.Id -join ', '))"
    }

    # 2. Audit running child processes of Claude (live snapshot)
    $claudePids = (Get-Process -Name "Claude" -ErrorAction SilentlyContinue).Id
    if ($claudePids) {
        $children = Get-CimInstance Win32_Process |
            Where-Object { $claudePids -contains $_.ParentProcessId }
        foreach ($child in $children) {
            Write-Finding "[REVIEW] Claude child process: $($child.Name) | PID $($child.ProcessId) | CmdLine: $($child.CommandLine)"
        }
        if (-not $children) { Write-Finding "[OK] No active child processes under Claude." }
    }
} else {
    Write-Finding "[OK] Claude Desktop not found on this host."
}

# 3. Inventory Chrome extensions requesting claude.ai host permissions
$extRoot = "$env:LOCALAPPDATA\Google\Chrome\User Data"
if (Test-Path $extRoot) {
    $manifests = Get-ChildItem -Path $extRoot -Recurse -Filter "manifest.json" -ErrorAction SilentlyContinue |
        Where-Object { $_.FullName -match '\\Extensions\\' }
    foreach ($m in $manifests) {
        $raw = Get-Content $m.FullName -Raw -ErrorAction SilentlyContinue
        if ($raw -match 'claude\.ai') {
            $json = $raw | ConvertFrom-Json -ErrorAction SilentlyContinue
            Write-Finding "[EXTENSION] Name: $($json.name) | Path: $($m.FullName)"
        }
    }
}

# 4. Inventory Edge extensions with the same check
$edgeExtRoot = "$env:LOCALAPPDATA\Microsoft\Edge\User Data"
if (Test-Path $edgeExtRoot) {
    $edgeManifests = Get-ChildItem -Path $edgeExtRoot -Recurse -Filter "manifest.json" -ErrorAction SilentlyContinue |
        Where-Object { $_.FullName -match '\\Extensions\\' }
    foreach ($m in $edgeManifests) {
        $raw = Get-Content $m.FullName -Raw -ErrorAction SilentlyContinue
        if ($raw -match 'claude\.ai') {
            $json = $raw | ConvertFrom-Json -ErrorAction SilentlyContinue
            Write-Finding "[EDGE-EXTENSION] Name: $($json.name) | Path: $($m.FullName)"
        }
    }
}

# 5. Optional hardening: block Claude Desktop via AppLocker (uncomment to enforce)
# NOTE: Pilot first. This blocks execution entirely for standard users.
# New-AppLockerPolicy -RuleTypes Publisher -XmlPolicy "C:\temp\baseline.xml"
# Then add a DENY publisher rule for Anthropic Claude.exe if org policy prohibits agentic AI desktop tools.

Write-Finding "=== Audit Complete. Review findings above. ==="
Write-Host "`nReport written to: $ReportPath" -ForegroundColor Cyan

Remediation & Hardening Guidance

There is no patch to apply — this is a feature-abuse scenario, so remediation is architectural and procedural.

Immediate Actions (This Week)

  1. Disable Dispatch where it is not operationally required. Inventory which users actually use phone-to-desktop task relay. For everyone else, turn it off at the client level. An unused remote-task channel is pure attack surface.
  2. Audit browser extensions with claude.ai host permissions. The PowerShell script above gives you a fleet-runnable starting point. Any extension you cannot attribute to a business need should be removed.
  3. Deploy the Sigma child-process rule in audit mode. Baseline what Claude Desktop normally spawns in your environment before this technique shows up in the wild.

Short-Term Controls (30 Days)

  1. Enforce extension allowlisting via browser policy. Chrome (ExtensionInstallAllowlist / ExtensionInstallForcelist) and Edge both support managed extension policies. Move high-risk populations (developers, finance, executives) to default-deny extension models.
  2. Treat AI desktop agents as privileged software in your application control policy. If you run AppLocker, WDAC, or a third-party equivalent, explicitly model what Claude Desktop may launch — or whether it may be present at all.
  3. Add AI-agent lineage to your EDR custom detection library. The KQL queries above convert directly into scheduled analytics rules in Sentinel.
  4. Update acceptable-use policy. Employees should understand that an AI desktop agent with task-relay features is, functionally, a remote administration tool — and should be treated with the same skepticism as AnyDesk or TeamViewer from an install-approval standpoint.

Strategic Posture (This Quarter)

  1. Track Anthropic's response. Monitor the official advisory channels at https://www.anthropic.com/security and the Claude release notes for Dispatch hardening — task-origin attestation, user confirmation prompts before local execution, or extension-context isolation would all materially reduce this risk.
  2. Extend threat models to agentic AI. Any AI tool that (a) accepts externally sourced instructions and (b) can act on the host belongs in your threat model alongside RMM tools. The MITRE ATT&CK techniques in play — T1059 (Command and Scripting Interpreter), T1105 (Ingress Tool Transfer), T1071 (Application Layer Protocol) — are familiar; the delivery vehicle is new.
  3. Prepare an IR playbook entry. If a Dispatch-abuse event fires in your environment, your playbook should cover: isolating the host, capturing the Claude Desktop conversation/task logs, pulling the browser extension inventory, and reviewing Dispatch pairing history for the account.

The Bottom Line

Forever Security's demonstration is a proof-of-concept, not a breach report. But it validates a threat model that SOC teams can no longer defer: the AI assistant on the endpoint is a command-and-control channel that arrived through the front door. The attackers don't need to exploit Claude — they need to exploit the trust Claude places in instructions arriving through authenticated surfaces, and browser extensions sit squarely inside those surfaces.

The defenders who win here are the ones who instrument agent lineage now, while the technique is still a conference-stage demonstration rather than a ransomware operator's initial-access broker listing.


Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

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