Claude Cowork VM Boot Image Tamper

Detects unexpected modification of Claude Desktop Cowork VM boot images (kernel, initrd, root filesystem). Adversaries with user-context access can rewrite these stored images so later Cowork sessions boot attacker-controlled code inside a virtual instance that host EDR cannot inspect by default.

Elastic rule (View on GitHub)

  1[metadata]
  2creation_date = "2026/08/05"
  3integration = ["endpoint"]
  4maturity = "production"
  5updated_date = "2026/09/25"
  6
  7[rule]
  8author = ["Elastic"]
  9description = """
 10Detects unexpected modification of Claude Desktop Cowork VM boot images (kernel, initrd, root filesystem). Adversaries
 11with user-context access can rewrite these stored images so later Cowork sessions boot attacker-controlled code inside a
 12virtual instance that host EDR cannot inspect by default.
 13"""
 14from = "now-9m"
 15index = ["logs-endpoint.events.file-*"]
 16language = "eql"
 17license = "Elastic License v2"
 18name = "Claude Cowork VM Boot Image Tamper"
 19note = """## Triage and analysis
 20
 21### Investigating Claude Cowork VM Boot Image Tamper
 22
 23Cowork boots a local Linux VM from images under the user's Claude AppData / Application Support tree. Those files are
 24writable by the user and are not integrity-checked before boot. A non-Claude writer changing them is a strong signal of
 25post-compromise defense evasion: later Cowork sessions can run attacker code inside a sanctioned Hyper-V /
 26Virtualization.framework guest that host EDR does not see by default. This does not grant new privileges.
 27
 28### Possible investigation steps
 29
 30- Confirm the writer: `process.name`, `process.executable`, `process.parent.executable`, and `user.name`. This rule
 31  already excludes Claude Desktop (`claude.exe` under `WindowsApps\\Claude_*\\app\\`, and `Claude` /
 32  `Claude Helper` under `/Applications/Claude.app/`). Any other writer (script host, LOLBin, unsigned binary) is
 33  unexpected.
 34- Note which artifact changed (`file.name` / `file.path`) and `event.action`:
 35  - `initrd` / `initrd.zst`: primary PoC target; both are often replaced together so the service cannot re-extract a
 36    clean initrd from the `.zst`.
 37  - `vmlinuz` / `rootfs.*` / `smol-bin.vhdx`: full guest control if replaced.
 38- Pivot on `process.entity_id` / `host.id` for ~30m around the alert: how the writer started, other file writes under
 39  the Claude package path, and whether `claude.exe` / Claude.app then started a Cowork session.
 40- If Cowork runs afterward, check whether the session failed and Claude re-downloaded images (careless tamper) or
 41  continued normally (payload may have kept the expected guest daemon alive).
 42- Treat this as evidence of existing host compromise; hunt for the initial access that produced the writer process.
 43
 44### False positive analysis
 45
 46- Claude Desktop updates should not alert; if they do, the install path likely changed (new WindowsApps package layout
 47  or non-AppX install) and the allowlist needs updating, not an exception for the writer name alone.
 48- Backup or sync tools rewriting these exact filenames are uncommon; require a stable `process.executable` before
 49  adding an exception. This rule watches create/overwrite/rename/modification only; deletions are out of scope.
 50
 51### Response and remediation
 52
 53- Delete or restore the affected bundle directory (Windows:
 54  `%LOCALAPPDATA%\\Packages\\Claude_*\\LocalCache\\Roaming\\Claude\\vm_bundles\\claudevm.bundle\\`; macOS:
 55  `~/Library/Application Support/Claude/vm_bundles/claudevm.bundle/`) and let Claude re-download trusted images, or
 56  restore from a known-good backup.
 57- Isolate the host and investigate the writer process lineage; rotate credentials and secrets available to that user.
 58- Search the environment for the same writer hash/path and for other unexpected modifications under Claude package
 59  paths.
 60"""
 61references = ["https://y637f9qq2x.com/posts/cowork-boot-trust"]
 62risk_score = 47
 63rule_id = "a0939500-a817-4ce9-85a9-191133352a9e"
 64severity = "medium"
 65tags = [
 66    "Domain: Endpoint",
 67    "OS: macOS",
 68    "OS: Windows",
 69    "Use Case: Threat Detection",
 70    "Tactic: Defense Evasion",
 71    "Data Source: Elastic Defend",
 72    "Resources: Investigation Guide",
 73    "Rule Type: Event Correlation (EQL)",
 74    "Platform: Windows",
 75    "Platform: macOS",
 76    "Domain: GenAI",
 77    "Mitre Atlas: AML.T0097",
 78    "Mitre Atlas: AML.T0105",
 79]
 80timestamp_override = "event.ingested"
 81type = "eql"
 82
 83query = '''
 84file where host.os.type in ("windows", "macos") and
 85  event.action in ("creation", "modification", "overwrite", "rename") and
 86  event.outcome == "success" and
 87  file.path : (
 88    "/Users/*/Library/Application Support/Claude/vm_bundles/claudevm.bundle/initrd",
 89    "/Users/*/Library/Application Support/Claude/vm_bundles/claudevm.bundle/initrd.zst",
 90    "/Users/*/Library/Application Support/Claude/vm_bundles/claudevm.bundle/vmlinuz",
 91    "/Users/*/Library/Application Support/Claude/vm_bundles/claudevm.bundle/vmlinuz.zst",
 92    "/Users/*/Library/Application Support/Claude/vm_bundles/claudevm.bundle/rootfs.img",
 93    "?:\\Users\\*\\AppData\\Local\\Packages\\Claude_*\\LocalCache\\Roaming\\Claude\\vm_bundles\\claudevm.bundle\\initrd",
 94    "?:\\Users\\*\\AppData\\Local\\Packages\\Claude_*\\LocalCache\\Roaming\\Claude\\vm_bundles\\claudevm.bundle\\initrd.zst",
 95    "?:\\Users\\*\\AppData\\Local\\Packages\\Claude_*\\LocalCache\\Roaming\\Claude\\vm_bundles\\claudevm.bundle\\vmlinuz",
 96    "?:\\Users\\*\\AppData\\Local\\Packages\\Claude_*\\LocalCache\\Roaming\\Claude\\vm_bundles\\claudevm.bundle\\rootfs.vhdx",
 97    "?:\\Users\\*\\AppData\\Local\\Packages\\Claude_*\\LocalCache\\Roaming\\Claude\\vm_bundles\\claudevm.bundle\\smol-bin.vhdx"
 98  ) and
 99  not (
100    (process.name : "claude.exe" and
101     process.executable : "?:\\Program Files\\WindowsApps\\Claude_*\\app\\claude.exe") or
102    (process.name : ("Claude", "Claude Helper") and
103     process.executable like "/Applications/Claude.app/*")
104  )
105'''
106
107
108[[rule.threat]]
109framework = "MITRE ATT&CK"
110[[rule.threat.technique]]
111id = "T1564"
112name = "Hide Artifacts"
113reference = "https://attack.mitre.org/techniques/T1564/"
114[[rule.threat.technique.subtechnique]]
115id = "T1564.006"
116name = "Run Virtual Instance"
117reference = "https://attack.mitre.org/techniques/T1564/006/"
118
119
120
121[rule.threat.tactic]
122id = "TA0005"
123name = "Defense Evasion"
124reference = "https://attack.mitre.org/tactics/TA0005/"
125[[rule.threat_mappings]]
126framework = "MITRE ATLAS"
127version = "2026.08"
128[[rule.threat_mappings.threat]]
129framework = "MITRE ATLAS"
130[[rule.threat_mappings.threat.technique]]
131id = "AML.T0097"
132name = "Virtualization/Sandbox Evasion"
133reference = "https://atlas.mitre.org/techniques/AML.T0097/"
134
135
136[rule.threat_mappings.threat.tactic]
137id = "AML.TA0007"
138name = "Defense Evasion"
139reference = "https://atlas.mitre.org/tactics/AML.TA0007/"
140[[rule.threat_mappings.threat]]
141framework = "MITRE ATLAS"
142[[rule.threat_mappings.threat.technique]]
143id = "AML.T0105"
144name = "Escape to Host"
145reference = "https://atlas.mitre.org/techniques/AML.T0105/"
146
147
148[rule.threat_mappings.threat.tactic]
149id = "AML.TA0012"
150name = "Privilege Escalation"
151reference = "https://atlas.mitre.org/tactics/AML.TA0012/"

Triage and analysis

Investigating Claude Cowork VM Boot Image Tamper

Cowork boots a local Linux VM from images under the user's Claude AppData / Application Support tree. Those files are writable by the user and are not integrity-checked before boot. A non-Claude writer changing them is a strong signal of post-compromise defense evasion: later Cowork sessions can run attacker code inside a sanctioned Hyper-V / Virtualization.framework guest that host EDR does not see by default. This does not grant new privileges.

Possible investigation steps

  • Confirm the writer: process.name, process.executable, process.parent.executable, and user.name. This rule already excludes Claude Desktop (claude.exe under WindowsApps\Claude_*\app\, and Claude / Claude Helper under /Applications/Claude.app/). Any other writer (script host, LOLBin, unsigned binary) is unexpected.
  • Note which artifact changed (file.name / file.path) and event.action:
    • initrd / initrd.zst: primary PoC target; both are often replaced together so the service cannot re-extract a clean initrd from the .zst.
    • vmlinuz / rootfs.* / smol-bin.vhdx: full guest control if replaced.
  • Pivot on process.entity_id / host.id for ~30m around the alert: how the writer started, other file writes under the Claude package path, and whether claude.exe / Claude.app then started a Cowork session.
  • If Cowork runs afterward, check whether the session failed and Claude re-downloaded images (careless tamper) or continued normally (payload may have kept the expected guest daemon alive).
  • Treat this as evidence of existing host compromise; hunt for the initial access that produced the writer process.

False positive analysis

  • Claude Desktop updates should not alert; if they do, the install path likely changed (new WindowsApps package layout or non-AppX install) and the allowlist needs updating, not an exception for the writer name alone.
  • Backup or sync tools rewriting these exact filenames are uncommon; require a stable process.executable before adding an exception. This rule watches create/overwrite/rename/modification only; deletions are out of scope.

Response and remediation

  • Delete or restore the affected bundle directory (Windows: %LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\vm_bundles\claudevm.bundle\; macOS: ~/Library/Application Support/Claude/vm_bundles/claudevm.bundle/) and let Claude re-download trusted images, or restore from a known-good backup.
  • Isolate the host and investigate the writer process lineage; rotate credentials and secrets available to that user.
  • Search the environment for the same writer hash/path and for other unexpected modifications under Claude package paths.

References

Related rules

to-top