ICMacOS (Icarus macOS): Infostealer to Persistent RAT

ClickFix delivery, fake System Preferences password prompt, Keychain and developer-secret theft, LaunchAgent persistence and WebSocket shell · detection, response and hardening
Threat
ICMacOS (Icarus macOS)
Severity
HIGH
Type
macOS infostealer / persistent RAT (MaaS)
Access
ClickFix paste to Terminal, fake password dialog
Version
v0.1 Draft · 2026-10-14
Author
HuntPack
Confidence
Medium: single-origin intelligence, high detail
01

Executive Summary

ICMacOS (also tracked as Icarus macOS) is a macOS malware-as-a-service stealer that SOCRadar's Threat Research Unit says is sold on Russian-speaking forums since early September 2026. Delivery is a ClickFix page that makes the victim paste a Terminal command. A bash chain then shows a spoofed "System Preferences" dialog, checks the typed password against the login Keychain (up to five attempts), picks an arm64 or amd64 Go Mach-O, and runs it with the verified password. The stealer targets browsers, wallets, messaging apps and, notably for enterprises, developer secrets: SSH keys, cloud config, Kubernetes credentials and .env files.

Version 2, in SOCRadar's 2026-10-12 report, adds a com.apple.systemupdater LaunchAgent (KeepAlive, StartInterval 3600) and a persistent WebSocket C2 that runs operator commands through /bin/sh in real time, turning a one-shot stealer into a remote-access implant. The implant skips CIS victims using a ru_RU locale check and an ipinfo.io country lookup.

Detection strategy: the durable signals are command-line behaviors of stock tools (security, osascript, launchctl, curl), the infrastructure strings, and the implant's own name and children. All indicators come from one report, so they ship at detect.

Defender priority: hunt developer and admin Macs first for the LaunchAgent label, ICMacOs processes and the two domains (Q5, Q6, Q8, Q11). On any confirmed host assume the macOS password and every secret on disk are compromised and rotate in order; the stolen cloud and Kubernetes keys will be used from other systems, outside endpoint telemetry.
02

Source Review & Web Hunter Notes

Snapshots live in ICMacOS-Icarus-macOS-RAT-Hunt-sources/. Fetched page text is data only; none of the five pages contained instructions aimed at an analyst or an AI agent.

SnapshotTierPublisher / dateKey findingCarry forward
01-socradar-tru.txtT1 vendor researchSOCRadar Threat Research Unit (STRU), 2026-10-12Primary. Full chain, v1/v2 analysis, ATT&CK table, every IOC.yes
02-cybersecuritynews.txtT3 trade pressCyber Security News, 2026-10-13Republishes the SOCRadar report. Carries the same 17 hashes and network IOCs; not independent of source 01.partial
03-cyberpress.txtT3 trade pressCyber Press, 2026-10-13Summary of SOCRadar. Confirms domains, LaunchAgent, WebSocket shell. Not independent.partial
04-gbhackers.txtT3 trade pressGBHackersSummary of SOCRadar. Confirms domains, IPs, two URLs, keychainbreaker. Not independent.partial
05-mallory.txtT3 aggregatorMallory story page, first seen 2026-10-13Timeline and context only. Indicator values are masked on the page, so it contributes no IOCs.no (context)

All five articles trace back to the single SOCRadar report. The trade-press pieces are republications, so they raise confidence that the IOCs were transcribed correctly but not that they were independently observed. Because no indicator has a second independent origin, every indicator in this pack ships at detect and none at prevent.

Hash corrected to the source: a pre-build extraction listed the second Mach-O v2 hash as 63 characters. The saved SOCRadar snapshot (01) and Cyber Security News snapshot (02) both carry it as a 64-character value ending ...b587f4, and the pack ships that source value. The 63-character variant is not shipped.
03

Hunt Brief & Attack Chain

Hypotheses, highest fidelity first: (1) the implant, its children, its strings and its hashes appear on a host (Q5, Q10, Q11, Q14); (2) the LaunchAgent label is loaded (Q8, Q9); (3) the keychain CLI is used to validate or dump (Q1, Q2); (4) a spoofed osascript prompt appears (Q3); (5) Terminal is tampered then killed (Q4); (6) geofence checks run (Q12); (7) a curl-to-shell one-liner starts the chain (Q13); (8) DNS or IP contact with the C2 (Q6, Q7).

StepBehaviorTelemetryHunt
1Victim lands on a ClickFix page and pastes a command into TerminalTerminal-launched shell with curl (macOS process creation with command line; CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Q13, Q5
2Dropper saved to /tmp from escapeai[.]live/icmacos_run_v2[.]command, run with build and owner parametersDNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents) and process creationQ5, Q6
3Terminal preferences altered; fake System Preferences dialog via osascript; password validated with unlock-keychain, up to 5 triesProcess creation with command lineQ3, Q4, Q1
4uname -m chooses arm64 or amd64; Mach-O downloaded to /tmp/.update-tmp/ICMacOs.gz and run with nohup; killall Terminal; fake error shownProcess creation, outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents)Q10, Q4, Q7
5Geofence (ru_RU, ipinfo.io country), then theft: Keychain, browsers, wallets, developer secrets, messaging, notes, VPN, filesProcess creation for the CLI parts; file reads are outside the verified event setQ12, Q1, Q2; gap for file reads
6Archive in /tmp (for example .systemd-private-helper.zip) POSTed to /uploadOutbound connection and DNS; archive creation is a file event not verified for macOSQ6, Q7; gap for archive
7v2 only: pgrep/kill of older instances, root or wheel check, LaunchAgent written and launchctl bootstrapProcess creation with command lineQ8, Q9, Q10
8v2 only: WebSocket C2 to wss[://]escapeai[.]live/ws, operator commands run through /bin/shProcess creation with parent name, outbound connection, DNSQ11, Q6, Q7
04

Consolidated IOC Table

Fanged values appear only in the import CSV and the queries. Everything below is from SOCRadar (snapshot 01), with the same values repeated by the trade press where noted.

TypeValueConfidenceActionContext
Domainescapeai[.]livemediumdetectPrimary C2, dropper and payload delivery, config, upload, WebSocket. In 01, 02, 03, 04.
Domainmikoblico[.]xyzmediumdetectLabelled "ICMacOS Login" in the SOCRadar table. In 01, 02, 03, 04.
IPv485.137.253[.]61mediumdetectLabelled "ICMacOS Login". In 01, 04.
IPv445.13.186[.]247mediumdetectLabelled "ICMacOS Login". In 01, 04.
URLhxxps[://]escapeai[.]live/icmacos_run_v2[.]command?t={date}mediumdetectDropper download
URLhxxp[://]escapeai[.]live/loader_v2[.]sh?build={build_name}&owner={owner}mediumdetectLoader (listed by SOCRadar, 01, 02)
URLhxxps[://]escapeai[.]live/ICMacOs?arch=arm64 and ?arch=amd64mediumdetectMach-O delivery by CPU architecture
URLhxxps[://]escapeai[.]live/payload[.]pymediumdetectPython supplementary payload
URLhxxps[://]escapeai[.]live/api/build_configmediumdetectPer-build config and fake error text
URLhxxps[://]escapeai[.]live/uploadmediumdetectHTTPS POST multipart/form-data exfiltration
URLwss[://]escapeai[.]live/ws?mac_id={hostname}&username={username}mediumdetectVersion 2 WebSocket C2
Path/tmp/.update-helper.logmediumhuntDropper log
Path/tmp/.cache-update.logmediumhuntStealer log
Path/tmp/.update-tmp/ICMacOs.gzmediumhuntStaged compressed payload
Path/tmp/.systemd-private-helper.ziplowhuntExample name of the hidden loot archive (SOCRadar says "e.g.")
Path~/Library/LaunchAgents/com.apple.systemupdater.plistmediumdetectv2 persistence. Label com.apple.systemupdater, KeepAlive, StartInterval 3600
SHA-25611 dropper script hashesmediumdetectIn the CSV in section 10. Scripts, not stock binaries.
SHA-2563 Mach-O v1 hashesmediumdetectIn the CSV in section 10
SHA-2562 Mach-O v2 hashesmediumdetectIn the CSV in section 10. See note on one corrected value below.
SHA-2561 Python payload hashmediumdetectIn the CSV in section 10
05

Affected Surface & Telemetry Matrix

SurfaceTelemetryPriorityGap
macOS process execution (command line, image path, parent)Process creation with command line, path and parent (CrowdStrike: ProcessRollup2, SyntheticProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)HighNone for the CLI steps. Scripts passed over stdin or files hide their text.
Name resolutionDNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents)HighLookups resolved only inside the browser may not be attributed. Encrypted DNS bypasses the sensor view.
Outbound networkOutbound connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents)HighTLS content, WebSocket frames and the upload body are outside endpoint telemetry.
Persistence file writesFile creation by process (CrowdStrike: file-write events. SentinelOne: File Creation. Defender: DeviceFileEvents)MediumThe plist is written by the Go implant, so no process-creation event exists. Only the launchctl step is covered here; file-write event names for macOS are not verified in the pack's references.
Keychain and credential filesFile read telemetryLowOutside endpoint telemetry for this pack: offline keychainbreaker parsing of login.keychain-db, and reads of .ssh, .aws, .kube, .env* and browser stores generate no process event.
Identity and cloudCloud, VCS and SaaS audit logsHigh priority, outside endpoint telemetryStolen SSH, cloud, Kubernetes, Git and session tokens are used from other hosts, so detection moves to those logs.
06

ATT&CK Mapping

TacticTechniqueNameObserved behaviorHunt
ExecutionT1204.004User Execution: Malicious Copy and PasteClickFix page makes the victim paste a Terminal commandQ13, Q5
ExecutionT1059.004Unix ShellBash dropper chain, then /bin/sh remote shell in v2Q5, Q10, Q11
ExecutionT1059.002AppleScriptosascript spawns the fake dialog and launches the payload with nohupQ3
ExecutionT1059.006PythonSupplementary payload.py (VPN, Slack/Signal/Zoom, filegrabber)Q5 (fetch), gap on execution
PersistenceT1543.001Launch Agentcom.apple.systemupdater.plist, KeepAlive, StartInterval 3600Q8, Q9
StealthT1036.005MasqueradingApple-like label to blend into launchctl listQ8, Q9
StealthT1480Execution Guardrailslocale ru_RU and ipinfo.io country checkQ12
StealthT1564Hide Artifactscom.apple.Terminal preference edits, killall Terminal, hidden /tmp filesQ4
Privilege EscalationT1548Abuse Elevation Control MechanismAppleScript with administrator privilegesQ3
Credential AccessT1056.002GUI Input CaptureFake System Preferences password dialogQ3
Credential AccessT1555.001Keychainunlock-keychain -p validation, dump-keychain -d, offline keychainbreaker parseQ1 (CLI only)
Credential AccessT1555.003Credentials from Web BrowsersSafe Storage key read, Login Data and Cookies copyQ2 (key read only)
Credential AccessT1555.005Password ManagersPassword manager app and extension dataGap
Credential AccessT1552.001Credentials In FilesSSH keys, .aws, .kube, .docker, .env* recursive searchGap
Credential AccessT1552.003Shell History.zsh_history, .bash_history and othersGap
DiscoveryT1082 / T1083 / T1057 / T1033System, File, Process, User discoverysystem_profiler, sysctl, sw_vers, pgrep ICMACOS, root/wheel checkQ11 (child processes)
CollectionT1115Clipboard Datapbpaste at execution timeQ11
CollectionT1005 / T1119 / T1213 / T1560Local data, automated collection, archiveWallet and extension stores, filegrabber, hidden ZIP in /tmpGap (file telemetry)
ExfiltrationT1048.002 / T1567HTTPS POST to escapeai[.]live/uploadmultipart/form-data over HTTPSQ6, Q7, Q5
Command and ControlT1071.001Web ProtocolsGorilla WebSocket client to wss://escapeai[.]live/wsQ6, Q7
07

Native Audit-Log Hunts

Run these on a suspect Mac (or through MDM). All are read-only.

# 1. Persistence: Apple-labelled agents in the user folder, and the specific label
ls -la ~/Library/LaunchAgents/ | grep -i "com.apple."
launchctl print gui/$(id -u)/com.apple.systemupdater 2>&1 | head -20
plutil -p ~/Library/LaunchAgents/com.apple.systemupdater.plist 2>&1

# 2. Hidden staging and log artifacts
ls -la /tmp/.update-helper.log /tmp/.cache-update.log /tmp/.systemd-private-helper.zip /tmp/.update-tmp 2>&1

# 3. Hash any binary found (compare to the Mach-O rows in section 10)
shasum -a 256 /tmp/.update-tmp/* 2>/dev/null

# 4. Live network: who is talking to the C2 host
lsof -nP -i 2>/dev/null | grep -i -E "ICMacOs|escapeai"

# 5. Unified log: privileged AppleScript and keychain CLI use in the last day
log show --last 1d --predicate 'process == "osascript" OR eventMessage CONTAINS "unlock-keychain" OR eventMessage CONTAINS "systemupdater"' --style compact | head -100
  • Proxy and DNS logs: search 30 days for escapeai[.]live and mikoblico[.]xyz, paying attention to /ws, /upload and /ICMacOs?arch= paths in proxy logs.
  • Cloud and VCS audit logs (stolen developer secrets): for any confirmed host, review AWS CloudTrail, Kubernetes audit, Git hosting audit and SSH bastion logs for use of that user's keys from new source addresses after the infection time.
  • Identity provider: new sessions, token grants and MFA changes for the user after infection.
08

Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL

Show all queries in
Pick your tenant's cloud first: every "Open in Falcon" button below uses this selection.

Event names used: ProcessRollup2, SyntheticProcessRollup2, DnsRequest, NetworkConnectIP4, all present in the crowdstrike-logscale-v3 event reference. event_platform=Mac scopes process queries to macOS. Set the time window in the console; LOOKBACK comments record intent.

Q1 · Keychain password validation or dump through the security CLI
CONF HIGHFP MEDIUMCOST LOW

Looks for: The dropper validates the phished password with security unlock-keychain -p (up to five tries) and the stealer falls back to security dump-keychain -d. T1555.001.

FP: Build agents that unlock a code-signing keychain with -p (fastlane, xcodebuild wrappers, CI runners). Exclude by service account or parent; keep interactive-user hits in scope.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A keychain command run by a process the agent did not observe starting is not captured.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • PowerQuery assumes: tgt.process.cmdline holds the full argument string of the created process.
  • KQL – Defender XDR: A keychain command run by a process the sensor did not observe starting is not captured.
  • KQL – Defender XDR assumes: The query carries no operating-system filter; the security binary name is macOS specific.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: macOS keychain password validation or dump via the security CLI
// MITRE: T1555.001
// CONF: high  FP: medium  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: exclude CI service accounts that unlock a build keychain, e.g. add | UserName!=/^(jenkins|buildkite|runner)$/i after the CommandLine filter. A user-context dump-keychain -d has almost no benign use and should stay in scope.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^security$/i
| CommandLine=/unlock-keychain\s+(\S+\s+)*-p\s|dump-keychain\s+(\S+\s+)*-d/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q2 · Browser Safe Storage key pulled from the Keychain
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Chromium-family master key extraction with security find-generic-password -w ... "<Browser> Safe Storage". T1555.003.

FP: Rare password-recovery or migration tools, and developers testing browser automation. Baseline per fleet for a week.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A key read through the Security framework API rather than the command line tool is not captured.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: A key read through the Security framework API rather than the command line tool is not captured.
  • KQL – Defender XDR assumes: The query carries no operating-system filter; the security binary name is macOS specific.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: browser Safe Storage key read through the security CLI
// MITRE: T1555.003
// CONF: medium  FP: medium  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: exclude known IT or forensics tooling by ParentBaseFileName once baselined. Browsers read their own key through the Security framework, not this CLI, so benign hits are uncommon.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^security$/i
| CommandLine=/find-generic-password/i
| CommandLine=/Safe\s+Storage/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q3 · osascript fake password dialog or admin-privileged shell
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: AppleScript launches the spoofed "System Preferences" password prompt and, as fallback, runs security dump-keychain -d through do shell script ... with administrator privileges. T1056.002, T1059.002, T1548. Only visible when the script text is on the command line (-e); a script passed through a file or stdin hides these strings.

FP: MDM agents and installers legitimately use with administrator privileges. Exclude by parent (jamf, mdm agent, installer) after baselining.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: An AppleScript run from a script file rather than the command line is not captured when the prompt text is not in the arguments.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: An AppleScript run from a script file rather than the command line is not captured when the prompt text is not in the arguments.
  • KQL – Defender XDR assumes: The query carries no operating-system filter; osascript is macOS specific.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: osascript spoofed System Preferences prompt or privileged keychain dump
// MITRE: T1056.002, T1059.002, T1548
// CONF: medium  FP: medium  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: exclude management agents with | ParentBaseFileName!=/^(jamf|Self Service|mdmclient|installer)$/i after baselining; keep any hit whose CommandLine also contains dump-keychain or hidden answer.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^osascript$/i
| CommandLine=/System Preferences|hidden answer|with administrator privileges|dump-keychain/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q4 · Terminal preference tampering followed by killall Terminal
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: The dropper alters com.apple.Terminal preferences to hide window titles and ends with killall Terminal to close the victim's window. SOCRadar does not state which tool writes the preference, so this covers defaults, plutil and PlistBuddy. T1564.

FP: Users styling Terminal with defaults write and IT scripts that restart Terminal. Alert on both behaviors from one host inside minutes, not on either alone.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The 10-minute pairing of a preference edit and killall Terminal is a tuning step and is not enforced by this query.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: The 10-minute pairing of a preference edit and killall Terminal is a tuning step and is not enforced by this query.
  • KQL – Defender XDR assumes: The query carries no operating-system filter; these tools are macOS specific in this combination.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: com.apple.Terminal preference edits and killall Terminal
// MITRE: T1564
// CONF: medium  FP: medium  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: single hits are noisy. Raise to alert only when one aid shows both a Terminal preference edit and killall Terminal within 10 minutes, or exclude managed-config scripts by ParentBaseFileName.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^(defaults|plutil|PlistBuddy|killall)$/i
| CommandLine=/com\.apple\.Terminal|killall\s+Terminal/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q5 · Published ICMacOS strings in any command line
CONF HIGHFP LOWCOST LOW

Looks for: Any process whose command line carries the C2 host, the login domain, the dropper or loader names, the payload URL fragment or the hidden staging paths SOCRadar published.

FP: Near zero. A hit on a hunting or threat-intel host that merely queried the strings is the main benign case.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A string split across arguments or built at run time is not matched.
  • PowerQuery assumes: The query carries no operating-system filter, so a matching command line on any agent platform is returned.
  • PowerQuery assumes: The leading dot of .update-helper.log, .cache-update.log and .systemd-private-helper.zip is matched as an escaped group, as in the CQL.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: A string split across arguments or built at run time is not matched.
  • KQL – Defender XDR assumes: The query carries no operating-system filter, so a matching command line on any device platform is returned.
  • KQL – Defender XDR assumes: The leading dot of .update-helper.log, .cache-update.log and .systemd-private-helper.zip is matched as an escaped group, as in the CQL.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: published ICMacOS infrastructure and staging strings in command lines
// MITRE: T1204.004, T1059.004, T1105
// CONF: high  FP: low  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| CommandLine=/escapeai\.live|mikoblico\.xyz|icmacos_run_v2|loader_v2\.sh|ICMacOs\?arch=|\.update-tmp|\.update-helper\.log|\.cache-update\.log|\.systemd-private-helper\.zip/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q6 · DNS lookup of ICMacOS domains
CONF HIGHFP LOWCOST LOW

Looks for: Resolution of escapeai.live (C2, delivery, upload) or mikoblico.xyz from any host, including subdomains. Pivot on ContextProcessId to the requesting process.

FP: Near zero outside research hosts. Lookups made inside the browser by the ClickFix page are visible here only if the sensor attributes them to the browser process.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The suffix anchoring of the CQL is replaced by a substring test.
  • PowerQuery assumes: event.dns.request is the populated DNS name field on this tenant; the vendor docs name dns.request, so run the readiness test to see which is filled.
  • PowerQuery assumes: The acting process on a DNS event is src.process.*.
  • KQL – Defender XDR: The suffix anchoring of the CQL is replaced by a substring test.
  • KQL – Defender XDR assumes: The DNS name is stored under DnsQueryString or QueryName inside AdditionalFields; the readiness test prints the raw field so you can see which key your tenant fills.
  • KQL – Defender XDR assumes: DnsQueryResponse events are recorded for the monitored macOS devices.
// HUNT: DNS resolution of ICMacOS domains
// MITRE: T1071.001, T1567
// CONF: high  FP: low  COST: low | REQUIRES: endpoint DNS request telemetry
// LOOKBACK: 7d
#event_simpleName=DnsRequest
| DomainName=/(^|\.)(escapeai\.live|mikoblico\.xyz)$/i
| table([@timestamp, aid, ComputerName, DomainName, ContextProcessId_decimal])
Q7 · Outbound connection to ICMacOS IP addresses
CONF HIGHFP LOWCOST LOW

Looks for: IPv4 connections to the two addresses SOCRadar lists under the login infrastructure. Shared hosting means an IP match alone needs the DNS or process corroboration before containment.

FP: Near zero today. Addresses can be reassigned, so the expiry on the Falcon IOC rows is six months.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Connections that go through a proxy show the proxy address, not the destination.
  • PowerQuery assumes: dst.ip.address holds the remote address on IP Connect events.
  • KQL – Defender XDR: Connections that go through a proxy show the proxy address, not the destination.
  • KQL – Defender XDR assumes: RemoteIP holds the destination address for outbound connections.
// HUNT: outbound connection to published ICMacOS IP addresses
// MITRE: T1071.001
// CONF: high  FP: low  COST: low | REQUIRES: endpoint network connection telemetry
// LOOKBACK: 7d
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["85.137.253.61", "45.13.186.247"])
| table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalAddressIP4])
Q8 · launchctl loading the com.apple.systemupdater LaunchAgent
CONF HIGHFP LOWCOST LOW

Looks for: Version 2 registers its persistence with launchctl bootstrap gui/<uid> ~/Library/LaunchAgents/com.apple.systemupdater.plist. T1543.001, T1036.005.

FP: None expected: this label is not a shipped Apple job.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A LaunchAgent loaded by launchd at login without a launchctl command is not captured.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: A LaunchAgent loaded by launchd at login without a launchctl command is not captured.
  • KQL – Defender XDR assumes: The query carries no operating-system filter; launchctl is macOS specific.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: launchctl referencing the com.apple.systemupdater persistence label
// MITRE: T1543.001, T1036.005
// CONF: high  FP: low  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^launchctl$/i
| CommandLine=/systemupdater/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q9 · Apple-named LaunchAgent loaded from a user Library folder
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Generic form of the persistence trick: launchctl loading a com.apple.* plist out of /Users/<name>/Library/LaunchAgents. Catches renamed variants of the label. T1543.001, T1036.005.

FP: A few vendor tools and profile migrations drop Apple-prefixed plists in user LaunchAgents. Baseline the labels seen in a week and exclude them by name.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A plist loaded from a path that does not start with /Users/ is not matched; the other CQL cards cover the campaign label.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • PowerQuery assumes: The home folder path starts with /Users/, as on a stock macOS install.
  • KQL – Defender XDR: A plist loaded from a path that does not start with /Users/ is not matched.
  • KQL – Defender XDR assumes: The query carries no operating-system filter; the path and launchctl are macOS specific.
  • KQL – Defender XDR assumes: The home folder path starts with /Users/, as on a stock macOS install.
// HUNT: com.apple.* LaunchAgent loaded from a per-user LaunchAgents folder
// MITRE: T1543.001, T1036.005
// CONF: medium  FP: medium  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: after a one-week baseline, exclude known-good labels with | CommandLine!=/com\.apple\.(labelA|labelB)\.plist/i. Keep unknown labels and anything whose plist sits under /tmp or a hidden folder.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^launchctl$/i
| CommandLine=/bootstrap|load|submit|kickstart/i
| CommandLine=/\/Users\/[^\/]+\/Library\/LaunchAgents\/com\.apple\./i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q10 · Implant binary or staging-directory execution
CONF HIGHFP LOWCOST LOW

Looks for: Execution of a binary named ICMacOs or from the hidden .update-tmp staging folder. The name is the one SOCRadar documents; a renamed build is covered by the hash query and by the LaunchAgent queries.

FP: Near zero. If the operator renames the binary this query goes quiet, which is why it is not the only persistence detection.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: An implant renamed and run from outside a .update-tmp folder is not matched by name or path.
  • PowerQuery assumes: tgt.process.image.sha256 is populated on process-creation events; it is shown for triage only and is not part of the predicate.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: An implant renamed and run from outside a .update-tmp folder is not matched by name or path.
  • KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
  • KQL – Defender XDR assumes: SHA256 is shown for triage only and is often unpopulated.
// HUNT: ICMacOs implant binary or .update-tmp staging execution
// MITRE: T1059.004, T1036.005
// CONF: high  FP: low  COST: low | REQUIRES: macOS process creation with image path
// LOOKBACK: 7d
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^ICMacOs$/i or ImageFileName=/\.update-tmp/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Q11 · Children of the ICMacOs implant (remote shell activity)
CONF HIGHFP LOWCOST LOW

Looks for: Version 2 executes operator text over /bin/sh and returns output over the WebSocket, so interactive C2 shows up as shells, discovery tools, pbpaste and security spawned by the implant. T1059.004, T1115, T1082.

FP: Near zero while the binary keeps the documented name.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Children of an implant renamed away from ICMacOs are not matched.
  • PowerQuery assumes: src.process.name holds the creator's name on Process Creation events.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: Children of an implant renamed away from ICMacOs are not matched.
  • KQL – Defender XDR assumes: InitiatingProcessFileName holds the creator's file name.
// HUNT: processes spawned by the ICMacOs implant
// MITRE: T1059.004, T1115, T1082, T1033
// CONF: high  FP: low  COST: low | REQUIRES: macOS process creation with parent name
// LOOKBACK: 7d
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| ParentBaseFileName=/^ICMacOs$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Q12 · Geofence checks: locale ru_RU and ipinfo country lookup
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Before stealing, the Mach-O runs locale | grep -c ru_RU and curl -s --max-time 5 https://ipinfo.io/country to skip CIS victims. T1480.

FP: Admin scripts that look up their public country. The pair of checks within seconds, from a non-interactive parent, is the discriminator.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The 60-second pairing of a locale check and an ipinfo.io lookup is a tuning step and is not enforced by this query.
  • PowerQuery assumes: The query carries no operating-system filter, so the same shell commands on Linux agents are also returned.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: The 60-second pairing of a locale check and an ipinfo.io lookup is a tuning step and is not enforced by this query.
  • KQL – Defender XDR assumes: The query carries no operating-system filter, so the same shell commands on Linux devices are also returned.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: CIS geofence checks (locale ru_RU, ipinfo country lookup)
// MITRE: T1480
// CONF: medium  FP: medium  COST: low | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: exclude well-known IT inventory scripts by ParentBaseFileName; prioritise hosts where both ru_RU and ipinfo.io/country appear for one aid inside 60 seconds.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^(sh|bash|zsh|curl|grep)$/i
| CommandLine=/ru_RU|ipinfo\.io\/country/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q13 · ClickFix-style curl-to-shell from a command line
CONF MEDIUMFP HIGHCOST MEDIUM

Looks for: ClickFix lures make the victim paste a one-line downloader. This is the generic shape (bash -c "$(curl ...)" or curl ... | sh), not an ICMacOS-specific string. T1204.004.

FP: Very common for developers: Homebrew and many vendor installers use the same shape. Treat as a hunt, not an alert.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Expect a high false-positive rate from legitimate installers; the Homebrew exclusion is only a starting point.
  • PowerQuery: A download written with wget or a language runtime instead of curl is not matched.
  • PowerQuery assumes: The query carries no operating-system filter, so the same shell one-liners on Linux agents are also returned.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: Expect a high false-positive rate from legitimate installers; the Homebrew exclusion is only a starting point.
  • KQL – Defender XDR: A download written with wget or a language runtime instead of curl is not matched.
  • KQL – Defender XDR assumes: The query carries no operating-system filter, so the same shell one-liners on Linux devices are also returned.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full argument string.
// HUNT: ClickFix-style curl-to-shell one-liners
// MITRE: T1204.004, T1059.004
// CONF: medium  FP: high  COST: medium | REQUIRES: macOS process creation with command line
// LOOKBACK: 7d
// TUNING: exclude the Homebrew installer and other vendor installers you allow: the CommandLine!=/Homebrew\/install/i line below is a starting point. Prioritise hits to new or low-reputation hosts, or where the next stage lands under /tmp and is a .command file.
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| event_platform=Mac
| FileName=/^(sh|bash|zsh)$/i
| CommandLine=/-c\s+.*\$\(\s*curl|curl\s.*\|\s*(ba|z)?sh/i
| CommandLine!=/Homebrew\/install/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])
Q14 · Published ICMacOS file hashes executing
CONF HIGHFP LOWCOST LOW

Looks for: SHA-256 values from SOCRadar's host indicator table matched against process image hashes. Mach-O builds will match as the executed image; dropper hashes are shell scripts, so they only match if the sensor reports the script as the image.

FP: Near zero. Use the Falcon IOC import for file-hash matching of scripts at rest.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A rebuilt or re-signed sample has a new hash and is not matched; the behavioural cards cover it.
  • PowerQuery assumes: tgt.process.image.sha256 is populated on process-creation events on this tenant; the readiness test shows how many rows carry it.
  • PowerQuery assumes: src.process.user holds the account that ran the creating process.
  • KQL – Defender XDR: SHA256 is often unpopulated in DeviceProcessEvents, and the CQL carries no SHA1 values to pivot on instead.
  • KQL – Defender XDR: A rebuilt or re-signed sample has a new hash and is not matched.
  • KQL – Defender XDR assumes: SHA256 is populated for the created process on this tenant; the readiness test counts how many rows carry it.
// HUNT: published ICMacOS SHA-256 values as process images
// MITRE: T1059.004
// CONF: high  FP: low  COST: low | REQUIRES: macOS process creation with SHA-256
// LOOKBACK: 7d
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| in(SHA256HashData, values=["5dfb0c01ac5c075e23ec37873b30ba16cf28e290e9439d04101f0a8191f929d8", "8cc449e7e240894e77187f6faff415bc8b9f2f9da73f60eef1f7605debd9144a", "62e435102e1e1de74537f174ede7c8ff198dc4df3fd2e1167f537096e0b4dd17", "857236d1902f4604acdf27519c0310064d21f8a82af3b95b1e4f02fef581b1d0", "6917505bbdc8efa01ea1a0298eae62a93a57a8c98d3712a69d822dca4a667f05", "dca852b53c259641e1782bd9122c5007130614a7a8fd17102400acb4f50f6e94", "e7e8ac14aaee970c6d00c6cbb398decc56dfc128974c01bfc8e7acd13a18576e", "ec37acd3bd15f50eee2941d5644ca0ee738b36ce4a39e9e08058e35ebc7961fc", "fcf9de13ecc70b4fda3998ed7a93849edf86c48767a1a13f32f4a6a631a65ae2", "3d4f70172c8f31813e7b37fc1a49bce193663e33c4eb65952bb5aec9d7176826", "8b7606bdccdd6ff691db875283fdf5b6b658dd8d4d141b44e07f8f2583ff5604", "bc8d70f000e73c0c7a69a2676805190e7109cab59df3e34c5a74d2cb7f13a7e4", "a9b21ac0112855b835b5e5850ef167471eff7305d42b3a8104c1961b257a444d", "c8136413ad38a1028050f5d508e25267b518c5fdeac80b6442103d1009d8924c", "e52855d447d152bb698e565f361161cdc8946183ab09bf3cbea89765a2b5ff31", "d9df05a3fb68d302ecf134a1214b609c6ec0a3fb9122907214afac3908b587f4", "8b4303a065e18e80050ef22031ec60b1a4e84f958d9e56cc5cc34cd29d988d69"])
| table([@timestamp, ComputerName, UserName, FileName, ImageFileName, SHA256HashData, CommandLine])
09

Detection Rules by Platform

CrowdStrike: Custom IOA

IOA namePattern (Process Creation, macOS)PromotesActionExclusions
ICMacOS published strings in command lineCommand line matches (?i)(escapeai\.live|mikoblico\.xyz|icmacos_run_v2|loader_v2\.sh|ICMacOs\?arch=|\.update-tmp)Promote Q5Detect, highNone needed
Keychain password validation or dumpImage .*/security, command line (?i)(unlock-keychain\s+\S*\s*-p\s|dump-keychain\s+.*-d)Promote Q1Detect, mediumCI service accounts, build keychain parents
osascript spoofed password promptImage .*/osascript, command line (?i)(System Preferences|hidden answer|dump-keychain)Promote Q3Detect, mediumMDM and installer parents
Apple-named LaunchAgent loaded from user folderImage .*/launchctl, command line (?i)/Users/[^/]+/Library/LaunchAgents/com\.apple\.Promote Q8, Q9Detect, highBaselined labels
ICMacOs implant child processParent image .*/ICMacOsPromote Q11Detect, highNone
Why none of these are Prevent: security, osascript, launchctl, curl and the shells are stock macOS binaries (rule: detect only). The campaign-specific rows (strings, implant name) have a single origin, the SOCRadar report, and the other four articles republish it. A Prevent posture needs two independent sources. Verify in the tenant which Custom IOA rule types your sensor version offers for macOS before building these.

Alert package for Q5 / Q11 (campaign-specific, highest fidelity)

  • Scheduled search name: DETECT - ICMacOS Strings or Implant Children (macOS)
  • Description: Fires when a macOS process carries the published ICMacOS C2 or staging strings, or when a child process is spawned by a binary named ICMacOs. Indicates a ClickFix-delivered stealer or v2 remote shell.
  • Email subject: [HIGH] Detection: ICMacOS - macOS infostealer/RAT activity on <ComputerName>
  • Body: What fired (query, host, user, command line). Meaning: the user likely pasted a Terminal command and typed their login password into a spoofed dialog, so assume the password, Keychain, browser sessions, SSH, cloud and Kubernetes credentials are exposed. Immediate action: network-contain the host, do not power off, start the triage list. Escalate to IR lead on any v2 sign (LaunchAgent, ICMacOs children).

Triage checklist (L1)

  1. Confirm the hit: host, user, parent chain, full command line.
  2. Run Q6 and Q7 for the same aid to see whether DNS or connections to the C2 exist.
  3. Check for the LaunchAgent: Q8 and Q9, then the native hunt in section 7 if the host is reachable.
  4. Look for /tmp artifacts: hidden logs, .update-tmp, hidden ZIP.
  5. Ask the user what they pasted or typed and when; record the lure URL from browser history.
  6. Isolate with network containment; keep the host powered for volatile triage.
  7. Open credential-rotation tasks (section 14) for the user: macOS password first.
  8. Escalate to IR and cloud/identity owners if the user held developer credentials.

Pivot queries

// host-scoped: everything the implant did (replace the aid)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| aid=REPLACE_WITH_AID
| ParentBaseFileName=/^(ICMacOs|launchd|sh|bash|zsh)$/i
| table([@timestamp, ParentBaseFileName, FileName, CommandLine])
| sort(@timestamp, order=asc)

// environment-wide: which other hosts resolved the C2 domain
#event_simpleName=DnsRequest
| DomainName=/(^|\.)escapeai\.live$/i
| groupBy([ComputerName], function=count(as=Lookups))
| sort(Lookups, order=desc)

SentinelOne: custom detection rules

RuleSource queryRun asNotes
ICMacOS published strings in command lineQ5, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
Keychain password validation or dumpQ1, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
osascript spoofed password promptQ3, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
Apple-named LaunchAgent loaded from user folderQ8, Q9, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
ICMacOs implant child processQ11, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"

Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.

Microsoft Defender: custom detection rules

RuleSource queryRun asNotes
ICMacOS published strings in command lineQ5, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself
Keychain password validation or dumpQ1, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself
osascript spoofed password promptQ3, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself
Apple-named LaunchAgent loaded from user folderQ8, Q9, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself
ICMacOs implant child processQ11, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself

Q2, Q4, Q6, Q7, Q10, Q12, Q13 and Q14 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.

10

Machine-Readable IOC Appendix

All rows are detect and high or medium severity, never critical: the intelligence has one origin (see section 2). Paths and URL paths are behavioral signatures, not importable IOCs.

Falcon IOC Management CSV21 rows, all detect
type,value,action,severity,expiration,description,tags
domain,escapeai.live,detect,high,2027-04-14,ICMacOS primary C2 and payload delivery host,campaign:ICMacOS
domain,mikoblico.xyz,detect,high,2027-04-14,ICMacOS login infrastructure (SOCRadar IOC table),campaign:ICMacOS
ipv4,85.137.253.61,detect,high,2027-04-14,ICMacOS login infrastructure (SOCRadar IOC table),campaign:ICMacOS
ipv4,45.13.186.247,detect,high,2027-04-14,ICMacOS login infrastructure (SOCRadar IOC table),campaign:ICMacOS
sha256,5dfb0c01ac5c075e23ec37873b30ba16cf28e290e9439d04101f0a8191f929d8,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,8cc449e7e240894e77187f6faff415bc8b9f2f9da73f60eef1f7605debd9144a,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,62e435102e1e1de74537f174ede7c8ff198dc4df3fd2e1167f537096e0b4dd17,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,857236d1902f4604acdf27519c0310064d21f8a82af3b95b1e4f02fef581b1d0,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,6917505bbdc8efa01ea1a0298eae62a93a57a8c98d3712a69d822dca4a667f05,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,dca852b53c259641e1782bd9122c5007130614a7a8fd17102400acb4f50f6e94,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,e7e8ac14aaee970c6d00c6cbb398decc56dfc128974c01bfc8e7acd13a18576e,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,ec37acd3bd15f50eee2941d5644ca0ee738b36ce4a39e9e08058e35ebc7961fc,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,fcf9de13ecc70b4fda3998ed7a93849edf86c48767a1a13f32f4a6a631a65ae2,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,3d4f70172c8f31813e7b37fc1a49bce193663e33c4eb65952bb5aec9d7176826,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,8b7606bdccdd6ff691db875283fdf5b6b658dd8d4d141b44e07f8f2583ff5604,detect,medium,2027-04-14,ICMacOS dropper script,campaign:ICMacOS
sha256,bc8d70f000e73c0c7a69a2676805190e7109cab59df3e34c5a74d2cb7f13a7e4,detect,high,2027-04-14,ICMacOS Mach-O v1,campaign:ICMacOS
sha256,a9b21ac0112855b835b5e5850ef167471eff7305d42b3a8104c1961b257a444d,detect,high,2027-04-14,ICMacOS Mach-O v1,campaign:ICMacOS
sha256,c8136413ad38a1028050f5d508e25267b518c5fdeac80b6442103d1009d8924c,detect,high,2027-04-14,ICMacOS Mach-O v1,campaign:ICMacOS
sha256,e52855d447d152bb698e565f361161cdc8946183ab09bf3cbea89765a2b5ff31,detect,high,2027-04-14,ICMacOS Mach-O v2,campaign:ICMacOS
sha256,d9df05a3fb68d302ecf134a1214b609c6ec0a3fb9122907214afac3908b587f4,detect,high,2027-04-14,ICMacOS Mach-O v2,campaign:ICMacOS
sha256,8b4303a065e18e80050ef22031ec60b1a4e84f958d9e56cc5cc34cd29d988d69,detect,medium,2027-04-14,ICMacOS Python payload,campaign:ICMacOS
Microsoft Defender indicators CSVSettings, Endpoints, Indicators, Import: audit only
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert
DomainName,escapeai.live,Audit,ICMacOS primary C2 and payload delivery host,ICMacOS primary C2 and payload delivery host,2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,mikoblico.xyz,Audit,ICMacOS login infrastructure,ICMacOS login infrastructure (SOCRadar IOC table),2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
IpAddress,85.137.253.61,Audit,ICMacOS login infrastructure,ICMacOS login infrastructure (SOCRadar IOC table),2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
IpAddress,45.13.186.247,Audit,ICMacOS login infrastructure,ICMacOS login infrastructure (SOCRadar IOC table),2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,5dfb0c01ac5c075e23ec37873b30ba16cf28e290e9439d04101f0a8191f929d8,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,8cc449e7e240894e77187f6faff415bc8b9f2f9da73f60eef1f7605debd9144a,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,62e435102e1e1de74537f174ede7c8ff198dc4df3fd2e1167f537096e0b4dd17,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,857236d1902f4604acdf27519c0310064d21f8a82af3b95b1e4f02fef581b1d0,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,6917505bbdc8efa01ea1a0298eae62a93a57a8c98d3712a69d822dca4a667f05,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,dca852b53c259641e1782bd9122c5007130614a7a8fd17102400acb4f50f6e94,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,e7e8ac14aaee970c6d00c6cbb398decc56dfc128974c01bfc8e7acd13a18576e,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,ec37acd3bd15f50eee2941d5644ca0ee738b36ce4a39e9e08058e35ebc7961fc,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,fcf9de13ecc70b4fda3998ed7a93849edf86c48767a1a13f32f4a6a631a65ae2,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,3d4f70172c8f31813e7b37fc1a49bce193663e33c4eb65952bb5aec9d7176826,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,8b7606bdccdd6ff691db875283fdf5b6b658dd8d4d141b44e07f8f2583ff5604,Audit,ICMacOS dropper script,ICMacOS dropper script,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,bc8d70f000e73c0c7a69a2676805190e7109cab59df3e34c5a74d2cb7f13a7e4,Audit,ICMacOS Mach-O v1,ICMacOS Mach-O v1,2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,a9b21ac0112855b835b5e5850ef167471eff7305d42b3a8104c1961b257a444d,Audit,ICMacOS Mach-O v1,ICMacOS Mach-O v1,2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,c8136413ad38a1028050f5d508e25267b518c5fdeac80b6442103d1009d8924c,Audit,ICMacOS Mach-O v1,ICMacOS Mach-O v1,2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,e52855d447d152bb698e565f361161cdc8946183ab09bf3cbea89765a2b5ff31,Audit,ICMacOS Mach-O v2,ICMacOS Mach-O v2,2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,d9df05a3fb68d302ecf134a1214b609c6ec0a3fb9122907214afac3908b587f4,Audit,ICMacOS Mach-O v2,ICMacOS Mach-O v2,2027-04-14T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,8b4303a065e18e80050ef22031ec60b1a4e84f958d9e56cc5cc34cd29d988d69,Audit,ICMacOS Python payload,ICMacOS Python payload,2027-04-14T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True

Column names and allowed values are from Microsoft's documented parameter table. Check each expirationTime before importing: an indicator whose date has passed is already expired. Download the sample CSV from the Import page to confirm the column order before a bulk import. Each file takes at most 500 indicators. Learn describes the import per entity type, so if a mixed file is rejected, split it by indicatorType. An imported indicator does nothing unless the matching Advanced features are on (for example Custom network indicators and Allow or block file).

SentinelOne IOC importnot included

This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.

Behavioral Signatureshunt / IOA seeds
# Behavioral signatures (no atomic value; hunt, do not import)
launchctl bootstrap gui/<uid> ~/Library/LaunchAgents/com.apple.systemupdater.plist
plist keys: Label=com.apple.systemupdater, KeepAlive=true, StartInterval=3600
security unlock-keychain -p <password> ~/Library/Keychains/login.keychain-db   (up to 5 attempts)
security dump-keychain -d ~/Library/Keychains/login.keychain-db
security find-generic-password -w -a "<user>" -s "<Browser> Safe Storage"
osascript -> fake "System Preferences" dialog; do shell script ... with administrator privileges
killall Terminal   (after com.apple.Terminal preference edits)
locale | grep -c ru_RU
curl -s --max-time 5 https://ipinfo.io/country
pgrep ICMACOS   then   kill -SIGKILL <pid>
Paths: /tmp/.update-helper.log  /tmp/.cache-update.log  /tmp/.update-tmp/ICMacOs.gz  /tmp/.systemd-private-helper.zip
URL paths on the C2 host: /icmacos_run_v2.command  /loader_v2.sh  /ICMacOs?arch=arm64  /ICMacOs?arch=amd64  /payload.py  /api/build_config  /upload  /ws?mac_id={hostname}&username={username}
Named Malware and Toolingas the sources name them
# Names used by the sources
ICMacOS, Icarus macOS            (SOCRadar Threat Research Unit; also "ICMacOs" for the Mach-O)
Icarus ClickFix                  (companion delivery panel named by SOCRadar)
Mach-O written in Go; Gorilla WebSocket client; embedded keychainbreaker library
Actor handle per SOCRadar: GlowComa (MaaS seller). Not an attribution claim by this pack.
macOS Audit Commandsread-only
# macOS audit (read-only)
ls -la ~/Library/LaunchAgents/ | grep "com.apple."
launchctl list | grep -i systemupdater
ls -la /tmp/.update* /tmp/.cache-update.log /tmp/.systemd-private-helper.zip 2>/dev/null
profiles list 2>/dev/null | head
# Credential exposure inventory (names and permissions only, never contents)
ls -l ~/.ssh ~/.aws/credentials ~/.kube/config ~/.docker/config.json 2>/dev/null
find ~ -maxdepth 4 -name ".env*" -not -path "*/node_modules/*" 2>/dev/null | head -50
11

Detection Validation Gates

GateCriteria
Telemetry readyMac sensors report process creation with command line and parent name, DNS requests with the requesting process, and outbound connections (CrowdStrike: ProcessRollup2, DnsRequest, NetworkConnectIP4. SentinelOne: Process Creation, DNS Resolved, IP Connect. Defender: DeviceProcessEvents, DeviceEvents, DeviceNetworkEvents). Confirm event_platform=Mac returns rows in your tenant.
Benign baselineRun Q1, Q2, Q3, Q4, Q9, Q12 and Q13 for 7 days without alerting; record parents of benign hits (CI agents, MDM, Homebrew) and add exclusions.
Positive testOn an isolated lab Mac, run harmless equivalents: security unlock-keychain -p x /tmp/test.keychain-db against a throwaway keychain, launchctl list with a dummy com.apple-prefixed test plist in a test account, and an osascript call carrying the string System Preferences. Expect Q1, Q9 and Q3 to fire.
PromotionPromote only Q5, Q8 and Q11 to scheduled searches first; others stay hunt-only until baselined. All remain Detect.
12

Hardening: Tiered

Immediate (this week, no user-visible change)
  • Alert on the network indicators, do not block on them yet. Add escapeai[.]live, mikoblico[.]xyz and the two IPs to DNS and proxy alerting. Single-origin indicators justify visibility first; blocking is the owner's decision. MITRE M1037 Filter Network Traffic. Verify: Q6 and Q7 return results in a test.
  • Run the LaunchAgent audit across the Mac fleet. Flag any com.apple.* plist in a user LaunchAgents folder. MITRE M1047 Audit. Verify: playbook step 1 output. CIS Apple macOS Benchmark covers login item and LaunchAgent review by name; exact item numbers vary by OS release.
  • Confirm FileVault and a lock-on-sleep policy. A stolen login password unlocks the keychain, so full-disk encryption plus screen lock limit what a lost or idle Mac exposes. CIS Apple macOS Benchmark (FileVault, screen saver lock). Verify: fdesetup status.
  • Brief developers and admins on the exact lure. No legitimate site or support person needs a command pasted into Terminal, and no dialog that appears after running a script should receive the login password. MITRE M1017 User Training.
Near term (1 to 4 weeks, pilot first)
  • Restrict who can run Terminal-based installers on non-developer Macs. Use MDM application restrictions or an allowlisting tool (for example a binary-authorization agent) so unsigned or unknown downloads cannot execute from /tmp. MITRE M1038 Execution Prevention. Mac Gatekeeper and notarization enforcement is in the CIS Apple macOS Benchmark. Verify: spctl --status.
  • Managed login items. Use MDM to inventory and, where supported, control Background Task Management items so unknown LaunchAgents surface to the admin. MITRE M1018 User Account Management, M1022 Restrict File and Directory Permissions. best-practice, no formal benchmark item named
  • Keychain hygiene for admins and developers. Use a separate keychain password from the login password where policy allows, and store high-value secrets in an agent-protected store, not in plaintext files. MITRE M1027 Password Policies. best-practice, no formal benchmark
  • Tune the Falcon Mac prevention policy to the strongest machine-learning and script-control settings your tenant supports and confirm the sensor is current on every Mac. best-practice, vendor setting names vary by console version
Strategic (1 to 3 months)
  • Remove long-lived developer secrets from disk. Move to short-lived cloud credentials (federated SSO sessions), hardware-backed or agent-held SSH keys, and Kubernetes exec-based credential plugins. This directly removes the high-value files ICMacOS targets (.ssh, .aws, .kube, .env*). MITRE M1027, M1041 Encrypt Sensitive Information. NIST SP 800-53 IA-5.
  • Detect stolen-credential use at the source. Enable and centralize cloud, Kubernetes, VCS and bastion audit logs with alerts on new-source use of an existing key (ATT&CK T1078 follow-on). Outside endpoint telemetry by design.
  • Browser and wallet policy. Keep crypto wallets and password managers out of corporate browser profiles; require MFA that is phishing resistant for admin SaaS so a stolen cookie is not enough. MITRE M1032 Multi-factor Authentication.
13

Deployable Playbooks

Step 1: Inventory suspicious LaunchAgents (read-only)

Prerequisites: shell as the target user, or an MDM script run per user. Reboot required: No. Rollback: none required, nothing is changed.

for d in /Users/*/Library/LaunchAgents; do
  [ -d "$d" ] || continue
  ls -la "$d" | grep -i "com.apple." | sed "s|^|$d: |"
done
launchctl list | grep -i systemupdater

Step 2: Quarantine and remove the ICMacOS persistence (confirmed infection only)

Prerequisites: host is network-contained and triage evidence is collected; run as the affected user (not root) so the correct gui/<uid> domain is used. Reboot required: No. Rollback: the plist is moved, not deleted. To restore: mv ~/ICMacOS-quarantine/com.apple.systemupdater.plist ~/Library/LaunchAgents/ and launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.apple.systemupdater.plist. Restoring re-enables the malware, so only do this to preserve evidence on an isolated lab host.

UIDN=$(id -u)
mkdir -p ~/ICMacOS-quarantine
launchctl bootout gui/$UIDN/com.apple.systemupdater 2>/dev/null
mv ~/Library/LaunchAgents/com.apple.systemupdater.plist ~/ICMacOS-quarantine/ 2>/dev/null
pkill -x ICMacOs 2>/dev/null
mv /tmp/.update-tmp /tmp/.cache-update.log /tmp/.update-helper.log /tmp/.systemd-private-helper.zip ~/ICMacOS-quarantine/ 2>/dev/null
launchctl list | grep -i systemupdater || echo "label gone"

Step 3: Credential exposure inventory (read-only, names only)

Prerequisites: shell as the affected user. Reboot required: No. Rollback: none required, nothing is changed. The output tells the identity team which secrets to rotate.

ls -l ~/.ssh ~/.aws/credentials ~/.aws/config ~/.kube/config ~/.docker/config.json \
      ~/.config/gcloud/application_default_credentials.json ~/.npmrc ~/.netrc ~/.git-credentials 2>/dev/null
find ~ -maxdepth 5 -name ".env*" -not -path "*/node_modules/*" 2>/dev/null
ls -d ~/Library/Application\ Support/{Exodus,Electrum,"Ledger Live"} 2>/dev/null

Step 4: Post-incident credential rotation (order matters)

Prerequisites: a clean device, and the incident owner's approval. Reboot required: No. Rollback: none required for rotation itself; keep the old values only until dependent services are re-keyed, then destroy them.

  1. macOS account password (from a clean Mac or after reimage). The attacker holds the verified plaintext.
  2. Browser-stored passwords and active sessions: sign out everywhere, reset high-value accounts, MFA re-enrollment.
  3. SSH keys (generate new, remove old public keys from servers and Git hosting), cloud access keys and sessions, Kubernetes tokens and kubeconfig contexts, Docker, npm, PyPI, Git tokens, database passwords, every secret found in .env* files.
  4. Password manager master credentials and recovery material if its data folder was present.
  5. Crypto wallets: move funds to new wallets created on a clean device.
  6. Messaging sessions (Telegram, Discord, Slack, Signal) revoked from the account side.
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain the Mac in Falcon, keep it powered, disable the user's SSO sessions and VPN, suspend cloud keys found in the exposure inventory.SOC / IRContainment timestamp, host and user record
Isolate: by platformCrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation).SOC / IRContainment timestamp, host and user record
ScopeRun Q5, Q6, Q7, Q8, Q9, Q11 across the fleet; determine v1 (stealer only) or v2 (LaunchAgent plus WebSocket); list secrets present using playbook step 3.IR / detection engineeringQuery exports, secret inventory
EradicatePrefer reimage. If not, run playbook step 2 and re-verify with Q8, Q9, Q10. Do not trust in-place cleanup alone because the operator had a live shell on v2.IR / endpoint engineeringQuarantine folder, hashes, launchctl output
RotatePlaybook step 4 in the stated order; review cloud, Kubernetes, VCS and IdP audit logs from infection time for misuse.Identity / cloud ownersRotation log, audit-log review
RecoverReturn the Mac to service after reimage, with updated sensor and managed login item controls; user retraining on the lure.Endpoint engineeringHealth check, training record
Re-huntRe-run the queries after 7 and 30 days and on any update to the SOCRadar indicators.Detection engineeringQuery results, closure decision
15

Detection Coverage Map

TechniqueBehaviorCQLIOACrowdStrike coverageGapSentinelOneDefender XDR
T1204.004ClickFix paste to TerminalQ13, Q5IOA 1PartialBrowser page and clipboard are outside endpoint telemetry; Q13 is noisyGood, with assumptionsGood, with assumptions
T1059.004 / .002Bash chain and osascriptQ3, Q5, Q10, Q11IOA 1, 3, 5GoodScript text passed through stdin or file hides stringsGood, with assumptionsGood, with assumptions
T1056.002Fake password dialogQ3IOA 3PartialThe password typed and the dialog itself are not visibleGood, with assumptionsGood, with assumptions
T1555.001Keychain unlock/dumpQ1IOA 2PartialOffline keychainbreaker parse of login.keychain-db makes no process; keychain contents are not visibleGood, with assumptionsGood, with assumptions
T1555.003Browser keys and storesQ2nonePartialCopying Login Data and Cookies is file access; no verified macOS file-read event usedGood, with assumptionsGood, with assumptions
T1552.001 / .003, T1555.005, T1005, T1119Dev secrets, histories, password managers, walletsnonenoneGAPFile reads of .ssh, .aws, .kube, .env*, wallets: outside verified endpoint telemetry. Cover with cloud and VCS audit logsNo queryNo query
T1560Hidden ZIP in /tmpQ5 (path strings only)IOA 1GAPGo code creates the archive; archive-write event for macOS is not verifiedGood, with assumptionsGood, with assumptions
T1543.001 / T1036.005com.apple.systemupdater LaunchAgentQ8, Q9IOA 4PartialThe plist file write is not seen; only the launchctl stepGood, with assumptionsGood, with assumptions
T1564, T1480Terminal prefs, geofenceQ4, Q12nonePartialMedium-FP huntsGood, with assumptionsGood, with assumptions
T1071.001, T1567, T1048.002C2 and upload to escapeai[.]liveQ6, Q7nonePartialTLS body, WebSocket frames and upload content invisible; in-browser lookups may be unattributedGood, with assumptionsGood, with assumptions
T1059.006payload.py executionQ5 (fetch string)IOA 1PartialPython execution of an unseen script path is genericGood, with assumptionsGood, with assumptions

Honest limits: Falcon macOS telemetry cannot see keychain contents, what the victim types into a dialog, anything resolved or rendered only inside the browser (including the ClickFix page), TLS or WebSocket payloads, or the content of files the Go implant reads. Validation gates are in section 11; none of the queries has been run against a live tenant.

16

Hunt Summary Ticket

TITLE: ICMacOS (Icarus macOS) infostealer evolving into a persistent RAT
SEVERITY: High (single-origin intelligence)
DATE: 2026-10-14
VERSION: v0.1 Draft 2026-10-14
SCOPE: macOS endpoints, especially developer and admin Macs holding SSH, cloud, Kubernetes and .env secrets
HYPOTHESIS: A ClickFix paste leads to a spoofed password dialog, Keychain validation, theft and, on v2, LaunchAgent persistence plus WebSocket shell.
QUERIES: Q1 keychain CLI; Q2 Safe Storage; Q3 osascript prompt; Q4 Terminal prefs; Q5 published strings; Q6 DNS; Q7 IP; Q8 and Q9 LaunchAgent; Q10 implant exec; Q11 implant children; Q12 geofence; Q13 curl-to-shell; Q14 hashes
DO FIRST: Run Q5, Q6, Q7, Q8 and Q11 over 30 days; run the LaunchAgent audit on developer Macs.
FINDINGS: any published string, domain, IP, label, ICMacOs process or hash.
GAPS: file reads of secrets, keychain contents, archive creation, browser-only activity and TLS payloads are outside endpoint telemetry.
ACTIONS: contain, reimage or run playbook step 2, rotate credentials in order (playbook step 4), review cloud and VCS audit logs.
OWNER: SOC / Incident Response / Identity
FOLLOW-UP: Re-hunt after 7 and 30 days and on any SOCRadar IOC update.
17

Changelog

v0.12026-10-14Initial pack: 14 CQL hunts, 21 Falcon IOC rows (all detect), 5 source snapshots, tiered macOS hardening, playbooks with rollback, containment runbook. SentinelOne PowerQuery and Microsoft Defender KQL tabs added to Q1-Q14: SIEM Query Rosetta release 0.1.0 (public-beta; static-reviewed translations).
18

References

TierSourceUsed forAccess date
T1SOCRadar TRU: Inside ICMacOS (2026-10-12)Primary analysis and all IOCs (snapshot 01)2026-10-14
T3Cyber Security News (2026-10-13)Republication of IOC lists (snapshot 02)2026-10-14
T3Cyber Press (2026-10-13)Summary and domain confirmation (snapshot 03)2026-10-14
T3GBHackersSummary and partial IOC confirmation (snapshot 04)2026-10-14
T3Mallory story pageTimeline context only (snapshot 05)2026-10-14
RefMITRE ATT&CKTechnique IDs as listed in the SOCRadar table2026-10-14