CLOSEDQUORUM — Autonomous AI-Orchestrated C2 Implant
Executive Summary
CLOSEDQUORUM is a 16.4MB, 64-bit Windows implant written in Go (CGO-enabled) that Cisco Talos disclosed on
2026-09-22 through its new CAIRN research toolkit. Its distinguishing feature is architectural, not technical:
instead of phoning home to attacker-run C2 infrastructure, it queries up to four commercial LLM providers
(DeepSeek, Qwen via OpenRouter, Mistral, and Google Gemini) with structured host-context prompts, tallies their
independent votes by plurality, and autonomously executes whichever of four actions wins — steal
(LSASS dump + browser credential theft + crypto wallet extraction, all three simultaneously),
inject (Early Bird APC injection by default, process hollowing if the model selects it),
persist (Registry Run key + scheduled task + WMI event subscription, all three), or
move (defined in the decision schema but not implemented in the distribution build). Ties are
broken in a fixed order: DeepSeek, then Qwen, then Mistral, then Gemini. The attacker never issues commands
once the implant is running — the LLM panel does.
Read this before anything else in this pack. Cisco Talos
explicitly states it has not confirmed in-the-wild deployment. The publicly analyzed
distribution binary ships with placeholder API keys (dummy_api_key) and a non-functional Discord
webhook (dummy_webhook_url) — it cannot reach any LLM provider or exfiltrate anything as
distributed. Talos observed the full architecture only through static analysis of development builds; it did
not observe a complete end-to-end live execution. The six SHA256 hashes in this pack are development
build hashes from the malware's own build chain, not samples recovered from a victim environment.
Everything in this pack should be treated as hunting for a credible, technically-confirmed but
not-yet-observed-active threat model — not as an active campaign. The one piece of real-world attribution
Talos offers is that artifacts in the binary tie the developer to carding-forum posts dating back to 2025,
consistent with an operator-configured credentials-as-a-service offering rather than a deployed campaign.
The attacker's objective, per Talos, is straightforward credential and cryptocurrency theft — there is nothing novel about what CLOSEDQUORUM steals. What is novel is effort displacement: an entire post-compromise decision phase (which action to take next, against which process, with which technique) is delegated from a human operator to a model panel that keeps running whether or not the attacker is at a keyboard. Traditional C2 requires attacker-run infrastructure — a domain, an IP, a listener — that defenders can track, block, and see rotate. CLOSEDQUORUM instead rides four commercial API endpoints that thousands of legitimate applications call every day, plus a Discord webhook, which is exactly why Talos and every outlet that covered this story land on the same recommendation: this is a behavioral-correlation hunt, not a domain-blocking exercise. DeepSeek, OpenRouter, Mistral, and Gemini API traffic is not inherently suspicious and must never be treated as a block candidate on this intelligence alone.
Highest-value defensive angle: no single indicator in this
threat model is reliable in isolation. The combination is what's distinct — one non-browser process
reaching two or more LLM provider APIs, correlated on the same host or same process with LSASS access,
suspended-process injection precursors, a "WindowsUpdate" Run-key write, scheduled-task creation, the
C:\Windows\Temp\wmi.ps1 forensic artifact, or Discord webhook egress. Section 8, Q7 builds that
correlation directly; every other query in this pack is a component signal meant to feed it.
Source Review & Web Hunter Notes
Four sources were fetched and saved verbatim to this pack's source-snapshot directory
(CLOSEDQUORUM-AI-C2-Implant-Hunt-sources/) before any indicator or technical claim in this pack
was written. No fetched content contained instructions directed at an AI agent, requests to change output
behavior, or any other prompt-injection attempt — all four sources are plain threat-intelligence
reporting.
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| PRIMARY | Cisco Talos – "The Closed Quorum" (2026-09-22) | Full technical disclosure: architecture, decision schema, ATT&CK mapping, YARA rule, 6 dev-build SHA256 hashes, explicit no-ITW-confirmation and placeholder-credentials statements. | yes |
| CORROBORATION | The Hacker News (2026-09-23) | Independent summary confirming architecture, action set, tie-break order, and the Snort rule (1:66984) Talos published alongside the YARA rule. | yes |
| CORROBORATION | BleepingComputer (2026-09-22) | Confirms decision-module behavior (steal/inject/persist/move) and the placeholder-credential / dev-build distinction. | yes |
| CORROBORATION | Security Affairs (2026-09-24) | Confirms the correlated-behaviors defensive framing verbatim from Talos and the credentials-as-a-service operating-model assessment. | yes |
Decisions: All four sources trace back to the same underlying Talos technical analysis —
they are corroborating summaries of one primary disclosure, not independent confirmations from separate
research. This pack treats the intelligence as single-primary-source accordingly: no indicator in this pack is
recommended for action=prevent/blocking on that basis (see Section 10). No delivery vector was
reported by any source — Talos found CLOSEDQUORUM through static/behavioral analysis via CAIRN, not
through incident response, so how it would reach a victim endpoint is unknown and out of scope for this pack.
Hunt Brief & Attack Chain
Hunt hypotheses
| # | Hypothesis | MITRE | Falcon telemetry | Confidence |
|---|---|---|---|---|
| H1 | A non-browser process on an endpoint resolves 2+ distinct commercial LLM provider domains in a short window — the ModelOrchestrator's four-provider query loop. | TA0011, T1102 | DnsRequest, ProcessRollup2 | High |
| H2 | A process writes a value named exactly "WindowsUpdate" to the current user's Run key. | T1547.001 | AsepValueUpdate | High |
| H3 | schtasks.exe creates a task shortly after an otherwise-unexplained process launch. | T1053.005 | ProcessRollup2 | Medium |
| H4 | powershell.exe executes a script at a path consistent with C:\Windows\Temp\wmi.ps1, the WMI subscription's forensic artifact. | T1546.003, T1059.001 | ProcessRollup2 | High |
| H5 | A non-Discord-client process communicates with discord.com / discordapp.com / cdn.discordapp.com — the reporting and exfil channel. | T1567.004 | DnsRequest, ProcessRollup2 | High |
| H6 | A common injection target (svchost.exe, RuntimeBroker.exe, notepad.exe, dllhost.exe) is spawned with no command line by a non-standard parent — an Early Bird APC / hollowing precursor. | T1055.004, T1055.012 | ProcessRollup2 | Low (proxy only — see Coverage Map) |
| H7 | The same host shows both an LLM-provider DNS resolution and a WindowsUpdate Run-key write within the same window — the composite correlation Talos frames as the durable signal. | TA0011, T1547.001 | DnsRequest, AsepValueUpdate | High |
| H8 | A non-browser process opens a Chrome/Edge "Login Data" file, Firefox "logins.json", or a MetaMask/Exodus/Ethereum wallet path. | T1555.003, T1005, T1552.001 | FileOpenInfo ⚠ validate in tenant | Medium |
Attack chain
| Step | Talos-described behavior | Telemetry | Hunt angle |
|---|---|---|---|
| 1. Initialize | gatherSystemInfo() captures hostname, OS/arch, CPU count, Windows version, admin status — folded into every LLM prompt as TARGET:%s. | ProcessRollup2 (process start) | Not independently observable; context only. |
| 2. Delay/evade | 5-minute initial delay, then randomized 5–15 minute polling; ETW suppressed by overwriting EtwEventWrite with a single RET instruction. | None directly — self-blinding technique | Honest gap; see Coverage Map and Section 7. |
| 3. Query the quorum | ModelOrchestrator queries up to 4 LLM provider APIs in sequence; responses aggregated by plurality vote on the Decision field. | DnsRequest, NetworkConnectIP4 | Q1, Q7, Q8 |
| 4. Report the decision | Winning decision + reasoning + parameters posted to the operator's Discord webhook before capability execution. | DnsRequest, NetworkConnectIP4 | Q5 |
| 5a. steal | lsassDump() (SeDebugPrivilege + MiniDumpWriteDump), dumpBrowserCredentials(), extractCryptoWallets() — all three run together. | No dedicated Falcon CQL field for LSASS handle access in the referenced data model | Q9, Q10 (proxy); Section 7 (RTR-based); Coverage Map gap |
| 5b. inject | generateShellcode() then Early Bird APC (default) or process hollowing if selected. | No direct NtQueueApcThread/WriteProcessMemory field | Q6 (proxy); Coverage Map gap |
| 5c. persist | establishPersistence(): Run key "WindowsUpdate", schtasks.exe task, WMI permanent event subscription (60s trigger) writing/executing C:\Windows\Temp\wmi.ps1. | AsepValueUpdate, ProcessRollup2 | Q2, Q3, Q4 |
| 5d. move | Defined in the decision schema; no handler in the distribution build — selecting it does nothing. | N/A | Not applicable to the analyzed build. |
| 6. Exfiltrate | Stolen material AES-256-GCM encrypted, Base64-encoded, segmented into 1,900-byte chunks, posted to Discord at 1-second intervals. | DnsRequest, NetworkConnectIP4 | Q5 |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| sha256 | 250d4fa37488af9b025333fa17705573d721467b203765bc360890b4f5a90cd7 | medium | hunt | CLOSEDQUORUM development-build hash, developer build chain over 7 days (Talos static analysis, dated 2026-06-17). Not a confirmed victim-environment sample. | 2026-12-24 |
| sha256 | c4dc171f2513fcaf9d5ecc815a94aee4063b213ab380f80bd3ac422dee5205a7 | medium | hunt | CLOSEDQUORUM development-build hash, developer build chain over 7 days (Talos static analysis, dated 2026-06-17). Not a confirmed victim-environment sample. | 2026-12-24 |
| sha256 | c13cea04f598e2b0c248d603a6e31bd13aabb64d8149c1b6a77b64e0b983a86f | medium | hunt | CLOSEDQUORUM development-build hash, developer build chain over 7 days (Talos static analysis, dated 2026-06-17). Not a confirmed victim-environment sample. | 2026-12-24 |
| sha256 | f5f1f8c3e7b883793800ab6ccf21b3e60bd0730f300b4595fe74a33adc17a63c | medium | hunt | CLOSEDQUORUM development-build hash, developer build chain over 7 days (Talos static analysis, dated 2026-06-17). Not a confirmed victim-environment sample. | 2026-12-24 |
| sha256 | 5191cf625dfc209a347f137b50aea199e82040fd5ee9086fb3e2de73c133f3cb | medium | hunt | CLOSEDQUORUM development-build hash, developer build chain over 7 days (Talos static analysis, dated 2026-06-17). Not a confirmed victim-environment sample. | 2026-12-24 |
| sha256 | eddbd0ecf7195d38fefae5b9d393abfa79e6f3f94bde19308ecef130a05a42e5 | medium | hunt | CLOSEDQUORUM development-build hash, developer build chain over 7 days (Talos static analysis, dated 2026-06-17). Not a confirmed victim-environment sample. | 2026-12-24 |
| registry value | HKCU\Software\Microsoft\Windows\CurrentVersion\Run\WindowsUpdate | medium | hunt | Behavioral signature, not an atomic indicator — the value name alone is generic enough that a hit needs corroboration (see Q2, Q7). | 2026-12-24 |
| filename / path | C:\Windows\Temp\wmi.ps1 | high | hunt | Distinctive forensic artifact of the WMI persistence mechanism; low FP if seen (see Q4). | 2026-12-24 |
| domain (correlation only) | api.deepseek.com, openrouter.ai, api.mistral.ai, Google Gemini API | n/a — legitimate infrastructure | enrich | These are real, widely-used commercial API endpoints. Never block or treat as a standalone indicator — correlation signal only, per Section 10. | n/a |
| domain (correlation only) | discord.com, discordapp.com, cdn.discordapp.com | n/a — legitimate infrastructure | enrich | Legitimate chat/CDN platform used as C2-reporting and exfil channel. Do not block wholesale — pair with process context (see Q5). | n/a |
| YARA rule | CLOSEDQUORUM_LLM_Autonomous_Implant (Talos/CAIRN, confidence: high, tier T3) | high | pivot | Published by Talos; matches VT metadata anchors and binary-level strings (system prompt, DWARF function names). Deploy via your VT/CAIRN integration, not via CQL. | 2027-03-24 |
| Snort rule | 1:66984 (Talos) | medium | pivot | Matches the implant's prompts to the AI services; requires TLS inspection to see the plaintext prompt content, per Talos and The Hacker News. | 2027-03-24 |
All six SHA256 hashes are development-build hashes from the malware's
own build chain, published by Talos as static-analysis artifacts — not samples recovered from a
compromised environment. They are shipped here at action=hunt (search and manually evaluate), never
action=prevent/detect-block, because this pack has one primary technical source and single-sourced
indicators do not ship as blocking recommendations in this library.
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows endpoint – process/network | ProcessRollup2, DnsRequest, NetworkConnectIP4 | Critical | Low — standard Falcon sensor telemetry, present in every deployment. |
| Windows endpoint – registry (ASEP) | AsepValueUpdate | Critical | Low. |
| Windows endpoint – file access (credential/wallet stores) | FileOpenInfo | High | Medium — coverage/retention varies by Falcon module and sensor policy; validate in tenant. |
| Windows endpoint – credential memory access (LSASS) | No dedicated CQL-queryable field for process-handle/MiniDumpWriteDump access in the referenced Falcon data model | Critical | High — real gap. Covered by Falcon's sensor-side ML/IOA credential-theft detections, not by hand-written CQL. See Coverage Map. |
| Windows endpoint – process injection (APC/hollowing) | No direct NtQueueApcThread / WriteProcessMemory / thread-context field | Critical | High — real gap. Q6 is a coarse behavioral proxy only. See Coverage Map. |
| Windows endpoint – ETW tamper | Self-blinding technique — the sensor's own telemetry pipeline is the thing being tampered with | High | High — real gap. No query-based detection is reliable for the moment of tampering itself. See Coverage Map / Section 7. |
| Network egress (TLS-inspected) | Proxy/TLS-inspection logs (out of Falcon CQL scope) | Medium | Medium — only relevant if your environment performs TLS inspection; Talos and The Hacker News both note the prompt content and Snort rule 1:66984 require it. |
ATT&CK Mapping
| Tactic | Technique | Observed behavior (per Talos) | Query / control |
|---|---|---|---|
| Command and Control (TA0011) | T1102 - Web Service | ModelOrchestrator queries up to 4 commercial LLM provider APIs; plurality-vote decision loop. | Q1, Q7, Q8 |
| Command and Control (TA0011) / Exfiltration (TA0010) | T1567.004 - Exfiltration Over Web Service: Exfiltration Over Webhook | Decisions and stolen data posted to an operator-controlled Discord webhook. | Q5 |
| Exfiltration (TA0010) | T1102 - Web Service (secondary) | Discord also serves as the real-time reporting channel for the LLM panel's decisions. | Q5 |
| Persistence (TA0003) | T1547.001 - Boot or Logon Autostart Execution: Registry Run Keys | Sets a "WindowsUpdate" value under the current user's Run key. | Q2, Q7 |
| Persistence (TA0003) | T1053.005 - Scheduled Task/Job: Scheduled Task | Creates a scheduled task via schtasks.exe. | Q3 |
| Persistence (TA0003) | T1546.003 - Event Triggered Execution: WMI Event Subscription | Permanent WMI event subscription triggers execution every 60 seconds. | Q4 |
| Execution (TA0002) | T1059.001 - Command and Scripting Interpreter: PowerShell | WMI mechanism writes and executes C:\Windows\Temp\wmi.ps1 via powershell.exe. | Q4 |
| Credential Access (TA0006) / Collection (TA0009) | T1003.001 - OS Credential Dumping: LSASS Memory | SeDebugPrivilege + MiniDumpWriteDump captures full LSASS memory. | Section 7 (native/RTR) — Coverage Map gap |
| Credential Access (TA0006) | T1555.003 - Credentials from Password Stores: Credentials from Web Browsers | Collects Chrome/Edge Login Data and Firefox logins.json. | Q9 |
| Credential Access (TA0006) | T1552.001 - Unsecured Credentials: Credentials in Files | Collects wallet files that may contain authentication/recovery material. | Q10 |
| Collection (TA0009) | T1005 - Data from Local System | Collects MetaMask, Exodus, and Ethereum wallet data from local storage. | Q10 |
| Collection (TA0009) | T1074.001 - Data Staged: Local Data Staging | LSASS dumps, browser DBs, and wallet files staged under C:\Windows\Temp\ before transmission. | Section 7 (native/RTR) |
| Privilege Escalation (TA0004) / Defense Evasion (TA0005) | T1055.004 - Process Injection: Asynchronous Procedure Call | Default Early Bird APC: suspended process, shellcode write, NtQueueApcThread, resume. | Q6 (proxy) — Coverage Map gap |
| Privilege Escalation (TA0004) / Defense Evasion (TA0005) | T1055.012 - Process Injection: Process Hollowing | When the LLM selects process_hollow: image-base overwrite + resume. | Q6 (proxy) — Coverage Map gap |
| Defense Evasion (TA0005) | T1685 - Disable or Modify Tools | Suppresses ETW telemetry by overwriting EtwEventWrite with a single RET instruction. | Section 7 (native) — Coverage Map gap |
| Defense Evasion (TA0005) | T1027 - Obfuscated Files or Information | Secondary payload stored encrypted to impede static recovery. | Not independently queryable |
| Defense Evasion (TA0005) | T1480.001 - Execution Guardrails: Environmental Keying | Secondary-payload decryption key derived from current system time. | Not independently queryable |
| Defense Evasion (TA0005) | T1497.003 - Virtualization/Sandbox Evasion: Time Based Checks | 5-minute initial delay, randomized 5–15 minute polling. | Timing pattern only; not a standalone query |
| Defense Evasion (TA0005) | T1036.005 - Masquerading: Match Legitimate Resource Name or Location | Windows-Update-themed Registry, WMI filter, and consumer names. | Q2, Q4 |
| Exfiltration (TA0010) | T1573.001 - Encrypted Channel: Symmetric Cryptography | Stolen data AES-256-GCM encrypted with a daily-rotating, date-derived key. | Not independently queryable |
| Exfiltration (TA0010) | T1132.001 - Data Encoding: Standard Encoding | Encrypted data Base64-encoded before transmission. | Not independently queryable |
| Exfiltration (TA0010) | T1030 - Data Transfer Size Limits | Ciphertext divided into 1,900-byte segments, posted at 1-second intervals. | Volumetric pattern; pair with Q5 |
Native Audit-Log Hunts
These checks cover ground the CQL queries in Section 8 cannot reach with the Falcon data model referenced by this pack — either because the telemetry isn't exposed as a queryable field, or because the technique targets the telemetry pipeline itself. Run them as Falcon Real Time Response (RTR) scripts, scheduled PowerShell via GPO/RMM, or native Windows tooling, not as CQL.
1. On-disk LSASS dump / staging artifact sweep (RTR)
CLOSEDQUORUM stages LSASS dumps, browser databases, and wallet files under C:\Windows\Temp\
before transmission. Falcon's referenced data model has no dedicated event for arbitrary non-PE file writes, so
this is a point-in-time filesystem sweep rather than a continuous query:
Get-ChildItem -Path 'C:\Windows\Temp\' -File -ErrorAction SilentlyContinue |
Where-Object { $_.Extension -in '.dmp','.tmp' -or $_.Name -match '^(lsass|wallet|login|creds?)' } |
Select-Object FullName, Length, CreationTimeUtc, LastWriteTimeUtc
Caveat: a positive hit only means a suspicious file existed at scan time — the implant does not persist these files (they are staged for transmission, then presumably cleaned up), so absence of a hit on a scheduled sweep does not clear a host. Treat this as a secondary corroboration check, not a primary detection.
2. WMI permanent event subscription audit (RTR / scheduled PowerShell)
Falcon's referenced event model does not expose WMI __EventFilter / __EventConsumer
/ __FilterToConsumerBinding objects as first-class CQL fields, so the persistence mechanism itself
(not just its wmi.ps1 side effect, covered by Q4) needs a native query:
Get-CimInstance -Namespace root\subscription -ClassName __EventFilter |
Where-Object { $_.Name -match 'Windows ?Update' -or $_.Query -match 'Win32_PerfFormattedData' } |
Select-Object Name, Query
Get-CimInstance -Namespace root\subscription -ClassName __EventConsumer |
Where-Object { $_.Name -match 'Windows ?Update' } |
Select-Object Name, CommandLineTemplate
Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding
Also enable and forward the Microsoft-Windows-WMI-Activity/Operational event log (disabled by
default on many builds) — it is the durable, native audit trail for WMI subscription creation and is not
dependent on the Falcon sensor's own event model.
3. ETW tamper detection (compensating control, not a query)
CLOSEDQUORUM suppresses ETW by overwriting EtwEventWrite in its
own process's memory with a single RET instruction. This is a self-blinding technique: the
telemetry pipeline used to observe the tampered process may itself go dark for that process at the moment of
tampering. No CQL query against post-hoc log data can reliably catch the instant of patching. Compensating
controls, not queries: (a) rely on your EDR vendor's kernel-mode sensor components and anti-tamper protections,
which are not solely dependent on user-mode ETW providers — validate this claim with your specific vendor
rather than assuming it; (b) enable Protected Process Light (PPL) / HVCI where your EDR supports registering as
a protected process, which raises the bar for a user-mode implant to patch the sensor's own hooks; (c) treat any
host where CLOSEDQUORUM's OTHER behavioral signals (Section 8) go silent mid-session, after having fired once,
as higher priority for manual triage — a telemetry gap immediately following a partial hit is itself a
signal.
4. TLS-inspected proxy log review for LLM-prompt content and Discord webhook payloads
Both Talos and The Hacker News note that the structured prompts (host context, offensive capability language)
and the Discord webhook payload content are visible only through TLS inspection or provider-side telemetry, not
through Falcon network metadata alone. Talos's Snort rule 1:66984 matches on the implant's prompts
to the AI services and requires TLS inspection to fire. If your environment performs TLS interception, review
proxy logs for: (a) POST bodies to the four LLM provider API endpoints containing structured JSON with fields
resembling target_process, exploit_type, evasion_method, or
payload_config; (b) POST bodies to discord.com/api/webhooks/... containing Base64 code
blocks in ~1,900-byte segments at roughly 1-second intervals.
CrowdStrike LogScale CQL Hunt Queries
Looks for: A single non-browser process resolving two or more of the four commercial LLM provider domains CLOSEDQUORUM's ModelOrchestrator queries in sequence (DeepSeek, OpenRouter/Qwen, Mistral, Google Gemini) within the lookback window. This is the headline behavioral correlation Talos frames as the strongest available signal: no single provider domain is suspicious on its own, but the fan-out pattern from one unexpected process is rare.
FP: AI-enabled IDEs, LLM gateway/proxy software, and browser extensions that intentionally call more than one provider.
// HUNT: Single Non-Browser Process Contacting Multiple Commercial LLM Provider APIs // MITRE: TA0011 Command and Control / T1102 - Web Service // CONF: high FP: medium COST: medium | REQUIRES: DnsRequest, ProcessRollup2 // FALSE POSITIVES: AI-enabled IDEs, LLM gateway/proxy software, and browser extensions that intentionally call more than one provider. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=DnsRequest | DomainName=/^(api\.deepseek\.com|openrouter\.ai|api\.mistral\.ai|generativelanguage\.googleapis\.com)$/i | rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal) | join(query={#event_simpleName=ProcessRollup2}, field=TargetProcessId_decimal, include=[ImageFileName, FileName, CommandLine, ComputerName, UserName]) | !in(FileName, values=["chrome.exe","msedge.exe","firefox.exe","brave.exe","opera.exe","Code.exe","Cursor.exe","iexplore.exe"]) | groupBy([aid, ComputerName, TargetProcessId_decimal, ImageFileName], function=[collect(DomainName, limit=10), count(DomainName, distinct=true, as=DistinctProviders)], limit=20000) | DistinctProviders >= 2 | table([ComputerName, ImageFileName, TargetProcessId_decimal, DistinctProviders, DomainName])
Looks for: CLOSEDQUORUM's establishPersistence() writes a value literally named "WindowsUpdate" under the current user's Run key to blend with legitimate system activity. A generically-named Run value is common; this exact value name in this exact key is a distinctive artifact both Talos and independent corroboration call out by name.
FP: legitimate OEM or third-party update agents that happen to use an identically-named Run value (uncommon, but confirm against your fleet's known-good baseline before treating a hit as conclusive).
// HUNT: Non-Standard Process Writing a "WindowsUpdate" Value to the User Run Key // MITRE: T1547.001 - Boot or Logon Autostart Execution: Registry Run Keys // CONF: high FP: low COST: low | REQUIRES: AsepValueUpdate // FALSE POSITIVES: legitimate OEM or third-party update agents that happen to use an identically-named Run value (uncommon, but confirm against your fleet's known-good baseline before treating a hit as conclusive). // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=AsepValueUpdate | RegObjectName=/\\Software\\Microsoft\\Windows\\CurrentVersion\\Run$/i | RegValueName=/^WindowsUpdate$/i | table([ComputerName, UserName, RegObjectName, RegValueName, RegStringValue, aid])
Looks for: CLOSEDQUORUM's persist decision creates a scheduled task via schtasks.exe as one of three parallel persistence mechanisms. This query surfaces all task-creation activity for triage; pair it with Q1/Q2/Q7 to raise confidence before escalating a single hit.
FP: legitimate software installers, IT/RMM tooling, and scripted deployment pipelines that create scheduled tasks routinely.
// HUNT: schtasks.exe Task Creation (Persistence Precursor) // MITRE: T1053.005 - Scheduled Task/Job: Scheduled Task // CONF: medium FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate software installers, IT/RMM tooling, and scripted deployment pipelines that create scheduled tasks routinely. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=ProcessRollup2 | FileName=/^schtasks(\.exe)?$/i | CommandLine=/create/i | table([ComputerName, UserName, ParentBaseFileName, CommandLine, aid])
Looks for: The WMI persistence mechanism writes its payload script to a path consistent with C:\\Windows\\Temp\\wmi.ps1 and executes it with powershell.exe every time the permanent WMI event subscription's 60-second timer fires. Both Talos and independent corroboration single this out as a distinctive on-disk forensic artifact left specifically because the WMI mechanism itself doesn't clean up after itself.
FP: none expected — this exact filename in this exact path is not a standard Windows or common third-party artifact; validate any hit before automated response.
// HUNT: PowerShell Execution of a Windows-Update-Themed WMI Persistence Script (wmi.ps1) // MITRE: T1546.003 - Event Triggered Execution: WMI Event Subscription / T1059.001 - PowerShell // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: none expected — this exact filename in this exact path is not a standard Windows or common third-party artifact; validate any hit before automated response. // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=ProcessRollup2 | FileName=/^powershell(\.exe)?$/i | CommandLine=/wmi\.ps1/i | table([ComputerName, UserName, ParentBaseFileName, CommandLine, aid])
Looks for: CLOSEDQUORUM reports the LLM panel's winning decision AND exfiltrates stolen credentials and wallet data to the operator through a Discord webhook — both control-channel and exfil-channel traffic ride the same benign-looking HTTPS destination. A non-Discord, non-browser process reaching discord.com / discordapp.com / cdn.discordapp.com is the tell.
FP: legitimate Discord desktop/web client traffic, and any internal bot or integration tooling that legitimately posts to Discord webhooks (CI/CD notifiers, community-management bots).
// HUNT: Discord Webhook / CDN Egress From a Process That Is Not a Known Discord Client // MITRE: T1567.004 - Exfiltration Over Web Service: Exfiltration Over Webhook // CONF: high FP: medium COST: medium | REQUIRES: DnsRequest, ProcessRollup2 // FALSE POSITIVES: legitimate Discord desktop/web client traffic, and any internal bot or integration tooling that legitimately posts to Discord webhooks (CI/CD notifiers, community-management bots). // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=DnsRequest | DomainName=/(discord\.com|discordapp\.com|cdn\.discordapp\.com)$/i | rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal) | join(query={#event_simpleName=ProcessRollup2}, field=TargetProcessId_decimal, include=[ImageFileName, FileName, CommandLine, ComputerName, UserName]) | !in(FileName, values=["Discord.exe","DiscordPTB.exe","DiscordCanary.exe","Update.exe","chrome.exe","msedge.exe","firefox.exe","brave.exe","opera.exe"]) | table([ComputerName, FileName, ImageFileName, CommandLine, aid])
Looks for: This is a coarse behavioral PROXY, not a direct injection signal — Falcon's documented CQL data model does not expose NtQueueApcThread, PEB/image-base, or thread-context fields, so there is no query that directly observes Early Bird APC injection or process hollowing. This hunt instead looks for the precursor shape: a common injection-target process launched with no command-line arguments by a parent outside the usual system launch paths, which is what a suspended-process-then-inject workflow tends to produce. Expect high noise; this is a pivot query, not a standalone detection. See the Coverage Map for the honest gap this query only partially closes.
FP: large volumes of unrelated legitimate software packaging, launcher, and update-agent behavior that also spawns child processes with no command line.
// HUNT: Common Injection-Target Process Spawned Bare by a Non-Standard Parent (Early Bird APC / Hollowing Precursor) // MITRE: T1055.004 - Process Injection: Asynchronous Procedure Call / T1055.012 - Process Hollowing // CONF: low FP: high COST: medium | REQUIRES: ProcessRollup2 // FALSE POSITIVES: large volumes of unrelated legitimate software packaging, launcher, and update-agent behavior that also spawns child processes with no command line. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=ProcessRollup2 | FileName=/^(svchost|RuntimeBroker|notepad|dllhost)(\.exe)?$/i | CommandLine="" | not ParentBaseFileName=/^(services|svchost|explorer|wininit|userinit|taskhostw|dllhost)(\.exe)?$/i | table([ComputerName, FileName, ParentBaseFileName, CommandLine, aid])
Looks for: This is the query built directly around Talos's own framing: "no single indicator fully identifies the architecture, but the combination is distinct." It correlates, on the SAME host within the same lookback window, (a) DNS resolution of a commercial LLM provider domain and (b) a WindowsUpdate-named Run-key write. Neither behavior alone is unusual; the pairing is not an expected pattern for any known legitimate software.
FP: very low in isolation — still confirm process lineage before response, since this is a same-host correlation, not a same-process one.
// HUNT: Composite Correlation — Multi-Provider LLM Contact Combined With WindowsUpdate Persistence on the Same Host // MITRE: TA0011 Command and Control + T1547.001 (composite; see Q1/Q2 for per-technique detail) // CONF: high FP: low COST: high | REQUIRES: DnsRequest, ProcessRollup2, AsepValueUpdate // FALSE POSITIVES: very low in isolation — still confirm process lineage before response, since this is a same-host correlation, not a same-process one. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) #event_simpleName=/^(DnsRequest|AsepValueUpdate)$/ | case { #event_simpleName=DnsRequest and DomainName=/^(api\.deepseek\.com|openrouter\.ai|api\.mistral\.ai|generativelanguage\.googleapis\.com)$/i | category := "llm_provider"; #event_simpleName=AsepValueUpdate and RegValueName=/^WindowsUpdate$/i | category := "asep_windowsupdate"; * | category := "other"; } | category != "other" | selfJoinFilter(field=[aid], where=[ {category="llm_provider"}, {category="asep_windowsupdate"} ]) | table([aid, ComputerName, category, @timestamp])
Looks for: A deliberately broad baseline across the whole fleet: which processes talk to any of the four LLM provider domains at all, and how often. Use it to build a per-host-group allowlist of expected AI-tool processes, then feed that allowlist into Q1's exclusion list rather than alerting on this query directly.
FP: intentionally broad — expect legitimate AI-tooling, browser, and SaaS-integration hits.
// HUNT: Environment-Wide Baseline — Hosts/Processes Resolving Commercial LLM Provider Domains // MITRE: TA0011 Command and Control (baseline/reconnaissance query, not a standalone detection) // CONF: medium FP: high COST: medium | REQUIRES: DnsRequest, ProcessRollup2 // FALSE POSITIVES: intentionally broad — expect legitimate AI-tooling, browser, and SaaS-integration hits. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 7d (set in the Falcon time picker -- no in-query time filter) #event_simpleName=DnsRequest | DomainName=/^(api\.deepseek\.com|openrouter\.ai|api\.mistral\.ai|generativelanguage\.googleapis\.com)$/i | rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal) | join(query={#event_simpleName=ProcessRollup2}, field=TargetProcessId_decimal, include=[FileName, ComputerName]) | groupBy([FileName, DomainName], function=count(), limit=20000) | sort(_count, order=desc)
Looks for: CLOSEDQUORUM's steal decision runs dumpBrowserCredentials() targeting Chrome/Edge "Login Data" and Firefox "logins.json" alongside the LSASS dump and wallet extraction, all three simultaneously. This looks for a process other than the browser itself opening those specific credential-store filenames.
FP: backup/sync agents, DLP tooling, and browser-profile-migration utilities that legitimately open these files.
// HUNT: Non-Browser Process Opening a Browser Credential Store File // MITRE: T1555.003 - Credentials from Password Stores: Credentials from Web Browsers // CONF: medium FP: medium COST: medium | REQUIRES: FileOpenInfo ⚠ validate field availability/licensing tier in your tenant // FALSE POSITIVES: backup/sync agents, DLP tooling, and browser-profile-migration utilities that legitimately open these files. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) // NOTE: FileOpenInfo coverage/retention varies by Falcon module and sensor policy -- ⚠ validate in tenant #event_simpleName=FileOpenInfo | TargetFileName=/\\(Login Data|logins\.json|Local State)$/i | not ParentBaseFileName=/^(chrome|msedge|firefox|brave|opera)(\.exe)?$/i | table([ComputerName, ImageFileName, TargetFileName, ParentBaseFileName, aid])
Looks for: The same steal decision runs extractCryptoWallets() against MetaMask (Chrome extension storage), Exodus (exodus.wallet), and Ethereum keystore data. This looks for a process other than the wallet application itself touching those paths.
FP: the wallet applications themselves (the MetaMask browser-extension host process, Exodus.exe) opening their own data — expected and should be excluded.
// HUNT: Process Access to Known Cryptocurrency Wallet Storage Paths // MITRE: T1005 - Data from Local System / T1552.001 - Unsecured Credentials: Credentials in Files // CONF: medium FP: medium COST: medium | REQUIRES: FileOpenInfo ⚠ validate field availability/licensing tier in your tenant // FALSE POSITIVES: the wallet applications themselves (the MetaMask browser-extension host process, Exodus.exe) opening their own data — expected and should be excluded. // TUNING: see the FP note above -- scope exclusions to your environment's approved tooling before promoting to an alert // LOOKBACK: 24h (set in the Falcon time picker -- no in-query time filter) // NOTE: FileOpenInfo coverage/retention varies by Falcon module and sensor policy -- ⚠ validate in tenant #event_simpleName=FileOpenInfo | TargetFileName=/\\(exodus\.wallet|keystore|nkbihfbeogaeaoehlefnkodbefgpgknn)\\/i | not FileName=/^(Exodus|chrome|msedge|firefox|brave)(\.exe)?$/i | table([ComputerName, ImageFileName, TargetFileName, FileName, aid])
CrowdStrike Custom IOA Recommendations
Four queries are strong Custom IOA candidates — high confidence, low-to-medium FP, and each is a distinctive behavioral pattern rather than a broad recon sweep. The rest remain investigate-only hunt queries (build baselines, corroborate hits, or accept a documented high-FP rate) until your environment's own FP data justifies promotion.
IOA candidates
| Query | IOA name | Pattern | Exclusions needed before promotion | Deployment path |
|---|---|---|---|---|
| Q1 | Multi-LLM-Provider Fan-Out From Non-Browser Process | ≥2 distinct LLM provider domains resolved by one process ID within the lookback window | Approved AI dev tools / IDE plugins / LLM gateway processes by FileName | Promote after a 2-week baseline run (Q8) to build the tenant-specific allowlist |
| Q2 | WindowsUpdate-Named Run Key Persistence | AsepValueUpdate on HKCU Run, RegValueName == WindowsUpdate | None identified in Talos's or corroborating reporting; monitor for false positives before hard-blocking on this alone | Promote directly — low FP, distinctive value name |
| Q4 | wmi.ps1 PowerShell Execution From Windows\Temp | powershell.exe CommandLine containing wmi.ps1 | None identified | Promote directly — not a standard artifact |
| Q5 | Discord Webhook Egress From Non-Discord Process | DNS/network to discord.com / discordapp.com / cdn.discordapp.com from a process outside the known Discord client set | Internal bots/integrations that legitimately post to Discord webhooks | Promote after excluding known internal Discord-integration hostnames/process names |
Q7 (the composite correlation) is the highest-fidelity detection in this pack
but is intentionally kept as a scheduled hunt query rather than a real-time IOA in this initial version:
selfJoinFilter correlation queries carry meaningfully higher COST, and this pack has not yet been
validated against a live tenant's query-cost budget for real-time execution. Re-evaluate for IOA promotion after
the validation gates in Section 11 are cleared in your environment.
Machine-Readable IOC Appendix
Read before importing anything below. This pack has one
primary technical source (Cisco Talos). Per this library's standing rule, no indicator sourced from a single
report ships at action=prevent/block. The six hashes below are development-build artifacts, not
victim-environment samples, and ship at action=hunt only. The commercial LLM provider API domains
(DeepSeek, OpenRouter, Mistral, Gemini) are legitimate infrastructure used by thousands of applications and
must never be imported as block candidates — they appear below only as correlation
signals for the CQL queries in Section 8, clearly labeled as such.
type,value,action,severity,expiration,description,tags sha256,250d4fa37488af9b025333fa17705573d721467b203765bc360890b4f5a90cd7,hunt,medium,2026-12-24,CLOSEDQUORUM development-build hash (Talos CAIRN static analysis) -- NOT a confirmed victim-environment sample,campaign:CLOSEDQUORUM;status:dev-build;confidence:single-primary-source sha256,c4dc171f2513fcaf9d5ecc815a94aee4063b213ab380f80bd3ac422dee5205a7,hunt,medium,2026-12-24,CLOSEDQUORUM development-build hash (Talos CAIRN static analysis) -- NOT a confirmed victim-environment sample,campaign:CLOSEDQUORUM;status:dev-build;confidence:single-primary-source sha256,c13cea04f598e2b0c248d603a6e31bd13aabb64d8149c1b6a77b64e0b983a86f,hunt,medium,2026-12-24,CLOSEDQUORUM development-build hash (Talos CAIRN static analysis) -- NOT a confirmed victim-environment sample,campaign:CLOSEDQUORUM;status:dev-build;confidence:single-primary-source sha256,f5f1f8c3e7b883793800ab6ccf21b3e60bd0730f300b4595fe74a33adc17a63c,hunt,medium,2026-12-24,CLOSEDQUORUM development-build hash (Talos CAIRN static analysis) -- NOT a confirmed victim-environment sample,campaign:CLOSEDQUORUM;status:dev-build;confidence:single-primary-source sha256,5191cf625dfc209a347f137b50aea199e82040fd5ee9086fb3e2de73c133f3cb,hunt,medium,2026-12-24,CLOSEDQUORUM development-build hash (Talos CAIRN static analysis) -- NOT a confirmed victim-environment sample,campaign:CLOSEDQUORUM;status:dev-build;confidence:single-primary-source sha256,eddbd0ecf7195d38fefae5b9d393abfa79e6f3f94bde19308ecef130a05a42e5,hunt,medium,2026-12-24,CLOSEDQUORUM development-build hash (Talos CAIRN static analysis) -- NOT a confirmed victim-environment sample,campaign:CLOSEDQUORUM;status:dev-build;confidence:single-primary-source
# Registry Run-key value (see Q2, Q7) HKCU\Software\Microsoft\Windows\CurrentVersion\Run -> value name: WindowsUpdate # WMI persistence forensic artifact (see Q4) C:\Windows\Temp\wmi.ps1 # Process-tree pattern for WMI-triggered execution wmiprvse.exe (or WMI event consumer) -> powershell.exe -> CommandLine contains "wmi.ps1" # Non-browser process resolving 2+ of these in one session -- CORRELATION SIGNAL ONLY, DO NOT BLOCK (see Q1, Q7, Q8) api.deepseek.com openrouter.ai api.mistral.ai generativelanguage.googleapis.com (Google Gemini API) # Reporting / exfil channel -- CORRELATION SIGNAL ONLY, DO NOT BLOCK WHOLESALE (see Q5) discord.com discordapp.com cdn.discordapp.com
Family: CLOSEDQUORUM Prior internal name (per Talos): BALZAK (renamed 2026-07-03) Discovery toolkit: CAIRN (Cisco Talos, open-source, released 2026-09-22) YARA rule: CLOSEDQUORUM_LLM_Autonomous_Implant (author: CAIRN, tier: T3, confidence: high) Snort rule: 1:66984 (requires TLS inspection to match implant prompts to LLM providers) Related prior art (cited by Talos/press, NOT this campaign): LAMEHUG (CERT-UA, July 2025) -- asked an AI model to WRITE commands; CLOSEDQUORUM asks the model to CHOOSE the action. Different technique, do not conflate.
# This is a novel implant architecture, not a vulnerability -- there is no patch or ASR
# signature CVE to audit against. Use this checklist instead:
[ ] Confirm LSA Protection (RunAsPPL) is enabled fleet-wide (Section 12/13, Immediate)
[ ] Confirm ASR rule "Block credential stealing from lsass.exe" (GUID
9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2) is deployed in Block mode, not Audit
[ ] Confirm AppLocker/WDAC blocks execution from %TEMP% and %APPDATA% for non-approved binaries
[ ] Confirm Microsoft-Windows-WMI-Activity/Operational and TaskScheduler/Operational logs are
enabled and forwarded
[ ] Run Q8 (baseline) for 14 days before promoting Q1 to an alerting IOA
[ ] Confirm your EDR/proxy stack has NOT been configured to block api.deepseek.com / openrouter.ai /
api.mistral.ai / the Gemini API outright -- these are correlation signals, not block targets
Detection Validation Gates
| Gate | Check | Pass criteria |
|---|---|---|
| 1. Telemetry ready | Confirm DnsRequest, ProcessRollup2, AsepValueUpdate are flowing for the target host group; confirm FileOpenInfo licensing/coverage for Q9/Q10. | All required events present in a 24h test window on a representative host. |
| 2. Benign baseline | Run Q8 (environment-wide LLM-domain baseline) for 14 days across the fleet before promoting Q1. | Documented allowlist of expected AI-tool FileNames per host group; false-positive rate quantified. |
| 3. Positive tests | For Q2/Q4, manually write a test Run-key value or drop a benign wmi.ps1-named file in a lab VM and confirm the query fires. | Each IOA-candidate query fires on its synthetic positive test within one polling cycle. |
| 4. Promotion | Q2, Q4 promote directly given low documented FP. Q1, Q5 promote only after Gate 2's allowlist is built. Q7 stays a scheduled hunt pending a tenant COST evaluation. | Promotion decision documented per query with owner and date. |
See Section 15 (Detection Coverage Map) for the honest gaps — LSASS access, process injection, and ETW tampering — that no amount of query tuning closes with the telemetry referenced in this pack.
Hardening — Tiered & Deployable
Platform scope
CLOSEDQUORUM is a Windows-only implant (64-bit Go/CGO executable targeting Win32 APIs). All hardening below is Windows/AD-focused; no Linux, macOS, cloud, or container surface is touched by this threat.
- Enable LSA Protection (RunAsPPL) to block non-protected-process handles to lsass.exe, which directly stops MiniDumpWriteDump-based dumping. — M1043 (Credential Access Protection) / M1040 (Behavior Prevention on Endpoint). Authority: Microsoft Security Baseline & CIS Microsoft Windows 11 Benchmark, "Configure LSASS to run as a protected process." See Playbook 1.
- Deploy the ASR rule "Block credential stealing from the Windows local security authority
subsystem" (GUID
9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2) in Block mode. — M1040. Authority: Microsoft Defender Attack Surface Reduction rules reference. See Playbook 2. - Confirm/enable Microsoft-Windows-WMI-Activity/Operational and TaskScheduler/Operational event logs, forwarded to your SIEM. — M1047 (Audit). Authority: CIS Microsoft Windows Benchmark, audit-policy section.
- AppLocker or WDAC policy blocking script/executable launch from %TEMP% and %APPDATA% for standard users — directly targets the implant's own execution path and the wmi.ps1 drop location. — M1038 (Execution Prevention). Authority: CIS Microsoft Windows Benchmark, "Ensure execution from user-writable directories is restricted"; Microsoft AppLocker design guide. See Playbook 3.
- Disable browser saved-password storage via policy (Chrome/Edge
PasswordManagerEnabled=false), pushing users to a dedicated password manager with hardware-backed encryption. — M1041 (Encrypt Sensitive Information) / M1017 (User Training). Authority: CIS Google Chrome Benchmark & CIS Microsoft Edge Benchmark, password-manager controls. - Restrict WMI namespace permissions on
root\subscriptionto admins only on endpoints where standard users have no legitimate need to create permanent event subscriptions. — M1018 (User Account Management). Authority: Microsoft WMI security documentation.
- Enable Credential Guard (Windows 11 Enterprise / Server 2019+) to isolate LSA secrets in a virtualization-based security container, independent of RunAsPPL. — M1043. Authority: Microsoft Credential Guard deployment guide; CIS Benchmark VBS/HVCI section. Requires hardware virtualization support and compatibility testing against any LSA-plugin-dependent legacy authentication software.
- SaaS/AI-tool egress visibility program: deploy a forward proxy or CASB capable of identifying which processes talk to which SaaS/AI APIs (not blocking the APIs — visibility). This is what makes Q1/Q8's baseline sustainable at scale instead of a one-time exercise. — M1037 (Filter Network Traffic) / M1031 (Network Intrusion Prevention, for the TLS-inspection component Talos and The Hacker News both flag as necessary to see prompt content). Authority: NIST SP 800-41 (firewall/segmentation guidance); vendor SaaS-application-control documentation (e.g., CrowdStrike Falcon Firewall Management, or your existing SWG/CASB).
- EDR/sensor tamper-resistance review against the EtwEventWrite-patching technique specifically — confirm with your EDR vendor (in writing) which of their detection components depend on user-mode ETW versus kernel-mode hooks, and whether PPL/anti-tamper protections cover the sensor process itself. — M1040. Authority: vendor-specific; no generic CIS/NIST control covers this, ⚠ best-practice, no formal benchmark — do not drop this control for lack of one.
Deployable Playbooks
Playbook 1 — Enable LSA Protection (RunAsPPL)
Blocks non-PPL processes (including an unsigned Go implant) from opening the handle to lsass.exe that MiniDumpWriteDump requires. Directly stops CLOSEDQUORUM's steal/lsassDump() capability.
Step 1 -- Set the registry value (deploy via GPO Preferences or your RMM, not manually per-host): reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f Prerequisites: Windows 8.1/Server 2012 R2 or later. Inventory any third-party LSA plugins/credential providers (some smartcard middleware, legacy VPN clients, and older AV credential providers are NOT PPL- compatible and will fail to load) BEFORE fleet-wide rollout; pilot on a representative ring first. Reboot required: YES -- LSASS re-reads this value only at boot. Rollback: reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 0 /f then reboot. If a host becomes unbootable due to an incompatible LSA plugin, boot into Safe Mode or WinRE and delete/zero the RunAsPPL value via offline registry edit, then reboot normally.
Playbook 2 — Deploy the LSASS-credential-theft ASR rule
Microsoft Defender's Attack Surface Reduction rule for LSASS credential theft blocks common credential-dumping techniques (including MiniDumpWriteDump-style access from non-allow-listed processes) at the OS level, independent of RunAsPPL.
Step 1 -- Audit first (always -- ASR rules can break legitimate LSASS-adjacent tooling):
Set-MpPreference -AttackSurfaceReductionRules_Ids 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 `
-AttackSurfaceReductionRules_Actions AuditMode
Step 2 -- Review Defender ASR audit events (Event ID 1122, Microsoft-Windows-Windows Defender/Operational)
for 1-2 weeks; identify and allow-list any legitimate tooling that triggers (some backup/EDR/diagnostic
tools legitimately touch LSASS).
Step 3 -- Move to Block mode once the audit period is clean:
Set-MpPreference -AttackSurfaceReductionRules_Ids 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 `
-AttackSurfaceReductionRules_Actions Enabled
Prerequisites: Microsoft Defender Antivirus must be the active AV engine (ASR rules do not function in
passive/EDR-only mode on some configurations -- verify with Get-MpComputerStatus). Requires E5/Defender for
Endpoint Plan 1+ licensing for centralized reporting (the rule itself works without it).
Reboot required: NO.
Rollback: Set-MpPreference -AttackSurfaceReductionRules_Ids 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 `
-AttackSurfaceReductionRules_Actions Disabled
Playbook 3 — AppLocker path rule blocking execution from %TEMP% / %APPDATA%
Targets the implant's own launch path and the wmi.ps1 drop location under C:\Windows\Temp\ specifically.
Step 1 -- Build and test in Audit mode first (New-AppLockerPolicy / Set-AppLockerPolicy):
$rule = New-AppLockerPolicy -RuleType Path -User Everyone -RuleNamesToGenerate `
-PathConditions "%OSDRIVE%\Users\*\AppData\Local\Temp\*","%OSDRIVE%\Windows\Temp\*" -Deny
Set-AppLockerPolicy -PolicyObject $rule -Merge
Step 2 -- Deploy via GPO in Audit-only enforcement mode for 2-4 weeks; review
Microsoft-Windows-AppLocker/EXE and DLL + Microsoft-Windows-AppLocker/MSI and Script logs for legitimate
software that launches from Temp/AppData (many installers do -- expect a real allow-list burden here).
Step 3 -- Add allow-list exceptions for confirmed-legitimate installers/updaters, then switch enforcement
from Audit to Enforce.
Prerequisites: Windows 10/11 Enterprise or Education edition (AppLocker enforcement requires these SKUs;
Pro/Home cannot enforce, only audit via limited functionality). Application Identity service must be running.
WDAC is the modern equivalent if you are not on Enterprise/Education licensing.
Reboot required: NO (policy applies at next Group Policy refresh / gpupdate /force).
Rollback: remove the GPO link, or set the rule collection back to "Not Configured" and run gpupdate /force.
No reboot needed to roll back.
Playbook 4 — Disable browser saved-password storage (Chrome/Edge policy)
Step 1 -- GPO / registry (Chrome, via ADMX or direct registry under HKLM\SOFTWARE\Policies\Google\Chrome): reg add "HKLM\SOFTWARE\Policies\Google\Chrome" /v PasswordManagerEnabled /t REG_DWORD /d 0 /f Step 2 -- Edge (HKLM\SOFTWARE\Policies\Microsoft\Edge): reg add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v PasswordManagerEnabled /t REG_DWORD /d 0 /f Prerequisites: an approved enterprise password manager must already be deployed and communicated to users BEFORE this rolls out, or you will generate a support-ticket spike and users will route around the policy with personal browser profiles. Reboot required: NO -- takes effect on next browser policy refresh / browser restart. Rollback: set PasswordManagerEnabled back to 1 (or remove the registry value) and restart the browser.
Containment Runbook
| Phase | Actions | Owner | Evidence to preserve |
|---|---|---|---|
| 1. Isolate | Network-contain the host via Falcon (or equivalent) while preserving the running process for triage. Do NOT reboot or power off — volatile memory holds the LSASS-dump/decision context. Preserve DNS/network telemetry for the suspected process ID. | IR / SOC on-call | Falcon process timeline export, network-containment timestamp, aid/host ID. |
| 2. Triage | Confirm the correlation: does the flagged process show 2+ LLM-provider DNS hits (Q1), a WindowsUpdate Run-key write (Q2), schtasks/WMI persistence (Q3/Q4), and/or Discord egress (Q5)? Pull full process ancestry and command lines. If FileOpenInfo is available, check for Login Data / wallet-path access (Q9/Q10). | IR / Threat Hunter | Full process tree, all correlated query hits with timestamps, RTR-collected file listing from C:\Windows\Temp\. |
| 3. Eradicate | Kill the implant process. Remove the WindowsUpdate Run-key value, delete the scheduled task, remove the WMI __EventFilter/__EventConsumer/__FilterToConsumerBinding objects (native hunt #2 in Section 7), delete C:\Windows\Temp\wmi.ps1 and any staged dump/credential files. | IR / Endpoint Engineering | Before/after registry and WMI-subscription export; hash of the binary before deletion (feed back into this pack's IOC table if new). |
| 4. Credential reset | Rotate credentials for any account whose LSASS/browser/wallet material could have been staged before containment — treat the LSASS-dump capability as having succeeded unless memory forensics proves otherwise. Rotate crypto wallet keys if any wallet files were staged (assume compromised, not just accessed). | IAM / Security Engineering | List of accounts/wallets rotated, timestamps, approving manager. |
| 5. Recover | Re-image or restore from known-good backup if eradication cannot be fully verified (recommended default for a credential-theft implant with process-injection capability). Reapply Section 12/13 hardening BEFORE returning the host to the network. | Endpoint Engineering | Re-image confirmation, hardening-playbook completion checklist. |
| 6. Lessons learned | Confirm how the binary arrived (delivery vector is unknown per current public intel — this is your chance to close that gap for your own environment). Update Q1's exclusion allowlist and Q8's baseline with anything learned. File a changelog entry (Section 17) if any query or indicator in this pack needed correction. | IR Lead | Root-cause writeup, updated pack changelog. |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1102 (multi-provider LLM C2) | Process resolves 2+ LLM provider domains | Q1, Q7, Q8 | Q1 candidate | Good |
| T1547.001 (Run key) | WindowsUpdate value under HKCU Run | Q2, Q7 | Q2 candidate | Good |
| T1053.005 (scheduled task) | schtasks.exe task creation | Q3 | not promoted (FP medium) | Partial — high legitimate base rate, needs org-specific tuning |
| T1546.003 (WMI event subscription) | wmi.ps1 execution (side effect); the subscription objects themselves | Q4 (side effect only) | Q4 candidate | Partial — Q4 catches the script execution, not the WMI subscription object itself; use Section 7 native hunt #2 for the object-level check |
| T1003.001 (LSASS memory) | SeDebugPrivilege + MiniDumpWriteDump | none — no queryable field in the referenced Falcon data model | none | GAP — covered only by Falcon's sensor-side ML/IOA credential-theft detection and Section 7 native RTR sweep, not by hand-written CQL |
| T1555.003 / T1552.001 / T1005 (browser + wallet theft) | File access to Login Data / logins.json / wallet paths | Q9, Q10 (⚠ validate FileOpenInfo in tenant) | not promoted | Partial — depends on FileOpenInfo module coverage, which varies by Falcon licensing tier |
| T1055.004 / T1055.012 (APC injection / hollowing) | Shellcode injection into a suspended process | Q6 (coarse proxy only) | none | GAP — no NtQueueApcThread / WriteProcessMemory / thread-context field in the referenced data model; Q6 catches only a noisy precursor shape |
| T1685 (ETW suppression) | EtwEventWrite patched with a RET instruction | none — self-blinding technique | none | GAP — see Section 7 for compensating controls; no log-based query reliably observes the moment of tampering |
| T1567.004 / T1102 (Discord exfil + reporting) | Webhook traffic to Discord domains | Q5 | Q5 candidate | Good |
| T1480.001 / T1497.003 (environmental keying / sandbox timing evasion) | Time-derived decryption key; 5-min delay + randomized polling | none directly | none | GAP — timing/crypto-internal behavior not independently observable via endpoint telemetry |
| T1036.005 (masquerading) | Windows-Update-themed naming | Q2, Q4 (via the specific names used) | Q2, Q4 candidates | Good — for THESE specific names; a renamed variant would evade Q2/Q4 (see Coverage Map note below) |
Honest summary: this pack has strong coverage of CLOSEDQUORUM's network-correlation and persistence behaviors (T1102, T1547.001, T1546.003's side effect, T1567.004) because those all produce telemetry Falcon's documented CQL data model exposes cleanly. It has real, acknowledged gaps on the credential-theft and injection techniques (T1003.001, T1055.004/.012) and on the evasion techniques (T1685, T1480.001/T1497.003) because those either aren't exposed as queryable fields in the referenced data model or are specifically designed to blind the telemetry pipeline that would observe them. Do not represent this pack as full-kill-chain coverage in any downstream reporting — it is strong on correlation and persistence, partial on credential theft, and gapped on injection and evasion. Section 7's native/RTR checks and Section 12/13's hardening controls (LSA Protection, the LSASS ASR rule) are the compensating controls for the gapped techniques, not a query.
Hunt Summary Ticket
TITLE: CLOSEDQUORUM -- Autonomous LLM-Orchestrated Windows Implant (Behavioral Correlation Hunt)
SEVERITY: MEDIUM -- novel technique, single primary source, NOT confirmed in-the-wild
SCOPE: Windows endpoints with Falcon sensor coverage; requires DnsRequest, ProcessRollup2, AsepValueUpdate
(FileOpenInfo optional, validate licensing tier)
HYPOTHESIS: A non-browser process is contacting 2+ commercial LLM provider APIs (DeepSeek, OpenRouter/Qwen,
Mistral, Gemini) and/or exhibiting the persistence triad (WindowsUpdate Run key + schtasks + WMI
wmi.ps1) and/or reporting/exfiltrating via Discord webhook, consistent with Cisco Talos's 2026-09-22
disclosure of CLOSEDQUORUM.
QUERIES: Q1-Q10 (Section 8); Q1/Q2/Q4/Q5 are IOA candidates (Section 9); Q7 is the composite correlation query
DO FIRST: Run Q8 (14-day baseline) before promoting Q1. Run Q2, Q4, Q5 immediately -- low FP, no baseline
needed. Cross-reference any hit against Q7's composite correlation before escalating.
FINDINGS: [fill in per-run -- host(s), process(es), correlated query IDs, timestamps]
GAPS: No direct telemetry for LSASS memory access (T1003.001), process injection (T1055.004/.012), or ETW
suppression (T1685) in the referenced Falcon data model -- see Coverage Map (Section 15) and native
hunts (Section 7) for compensating controls.
ACTIONS: See Containment Runbook (Section 14) if any hit corroborates against 2+ independent queries.
OWNER: HuntPack
VERSION: v0.1 -- 2026-09-24
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| PRIMARY | Cisco Talos – "The Closed Quorum: Inside the first reported autonomous AI C2 implant" | Full technical basis for this pack: architecture, decision schema, ATT&CK mapping, YARA/Snort rules, 6 SHA256 hashes, no-ITW-confirmation statement. | 2026-09-24 |
| CORROBORATION | The Hacker News – "This Windows Malware is Built to Let Up to Four AI Models Vote on Its Next Move" | Independent-outlet confirmation of architecture and technical details; Snort rule ID. | 2026-09-24 |
| CORROBORATION | BleepingComputer – "New ClosedQuorum Windows malware uses AI for attack decisions" | Confirmed decision-module behavior and placeholder-credential distinction. | 2026-09-24 |
| CORROBORATION | Security Affairs – "CLOSEDQUORUM, the malware that asks four AI models what to do next" | Confirmed correlated-behaviors defensive framing and credentials-as-a-service assessment. | 2026-09-24 |
| FRAMEWORK | MITRE ATT&CK | Technique IDs cited throughout Sections 3, 6, 12. | 2026-09-24 |
| FRAMEWORK | CIS Benchmarks (Microsoft Windows, Google Chrome, Microsoft Edge) | Hardening authority citations in Section 12. | 2026-09-24 |
| FRAMEWORK | Microsoft Defender Attack Surface Reduction rules reference | ASR rule GUID and deployment guidance in Playbook 2. | 2026-09-24 |
Source text for all four cited news/research sources was fetched and saved verbatim to
CLOSEDQUORUM-AI-C2-Implant-Hunt-sources/ before this pack was written, so every atomic indicator
above traces to a specific saved snapshot rather than to memory or summary.