AMOS Stealer (Atomic macOS Stealer) — June 2026 Keychain-Theft Campaign

ClickFix-style fake-app / Terminal-paste lures deliver a curl|sh loader that copies the macOS Keychain, harvests Chrome/Edge secrets and developer keys, then exfiltrates via chunked HTTP PUT. macOS endpoints; actively distributed.
Threat
AMOS / Atomic macOS Stealer
Severity
ACTIVE · CREDENTIAL THEFT
Type
macOS infostealer (Keychain + browser + dev keys)
Access
User-executed (ClickFix social engineering)
Version
v0.1 · 2026-06-22
Author
HuntPack
Confidence
High (vendor + press reporting, Jun 2026)
01

Executive Summary

AMOS (Atomic macOS Stealer) is a financially motivated macOS infostealer being distributed through a June 2026 campaign that pairs deceptive software downloads and fake websites with ClickFix-style social engineering: the victim is instructed to copy a command and paste it into Terminal (or, in newer variants, into Script Editor via an applescript:// URL to dodge Apple's Terminal paste-protection). That single pasted command is a curl | sh loader.

The loader uses macOS's built-in curl with -fsSL — flags that suppress progress bars and error output so the download runs silently — to pull a remote script, then launches AppleScript via the zsh/osascript chain. Running curl|sh straight from Terminal sidesteps Gatekeeper because no quarantined app bundle is ever launched. Once executing, AMOS copies the macOS Keychain database login.keychain-db; harvests passwords, cookies and autofill from Google Chrome and Microsoft Edge; and reads developer secrets at ~/.ssh, ~/.kube, ~/.zshrc and ~/.gitconfig.

Stolen data is compressed with the native ditto tool into /tmp/osalogging.zip, split into 10 MB chunks, and exfiltrated over HTTP PUT via curl (retrying failed uploads up to eight times) to attacker infrastructure such as bestbuydomain.com. A session ID is derived from the current timestamp mixed with an OpenSSL hex string. The malware then cleans up with rm -f /tmp/osalogging.zip and rm -rf /tmp/sync.

Defender priority: The highest-fidelity signals are behavioral and live in Falcon for macOS process telemetry — a curl -fsSL ... | sh chain launched from Terminal/zsh, an osascript spawned in that same chain, a non-Apple process touching login.keychain-db, and ditto writing /tmp/osalogging.zip. Any confirmed Keychain copy or osalogging.zip staging is a probable live infostealer — assume ALL Keychain, browser, SSH and cloud credentials on that host are exfiltrated and rotate them.

02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry Forward
1 · VendorTrend Micro ResearchAMOS distributed via deceptive downloads / fake sites; curl -fsSL loader, ditto staging, chunked PUT exfil, retry-8.Yes
1 · VendorMicrosoft Security Blog (ClickFix macOS)ClickFix fake-utility lures push Terminal-pasted base64 → curl|sh that loads AMOS / MacSync / Shub; targets Keychain, wallets.Yes
1 · VendorJamf Threat LabsVariant abuses applescript:// URL scheme → Script Editor to deliver Atomic Stealer, bypassing Terminal paste-protection on macOS Tahoe 26.4.Yes
2 · PressHackreadAMOS copies login.keychain-db, Chrome/Edge passwords + cookies + autofill, reads .ssh/.kube/.zshrc/.gitconfig; C2 bestbuydomain.com.Yes
2 · PressSophos / Infosecurity MagazineAMOS at scale; ClickFix evolution; Atomic Stealer bypasses Apple security warnings via user-driven Terminal execution.Partial

Web-hunter note: AMOS is sold as a stealer-as-a-service, so payload hashes, lure domains and staging server hosts rotate constantly. Durable indicators here are behavioral (the curl|sh-from-Terminal loader, Keychain copy, ditto→osalogging.zip, chunked PUT). Treat the named domain and filenames as hunt/enrich values and confirm in your own telemetry before promoting any single host/hash to a durable block.

03

Hunt Brief & Attack Chain

Hypotheses (ordered by fidelity)

  1. H1 (high): curl launched from Terminal/zsh with -fsSL and its output piped to a shell (curl ... | sh/zsh/bash) → the ClickFix loader (T1059.004, T1105). Very low FP.
  2. H2 (high): A non-Apple, non-Keychain-Access process reads or copies login.keychain-db → Keychain credential theft (T1555.001). Strong.
  3. H3 (high): ditto (or any process) writes osalogging.zip / touches /tmp/sync → archive staging of collected data (T1560). Near-unique to this campaign.
  4. H4 (medium): osascript / AppleScript spawned by Terminal/zsh in the install chain → scripted execution (T1059.002).
  5. H5 (medium): An untrusted, recently-spawned process reads browser cookie/login stores or developer keys (~/.ssh, ~/.kube, ~/.gitconfig, Chrome/Edge Login Data/Cookies) → credential harvesting (T1552.001, T1539, T1555.003).
  6. H6 (medium): A non-browser process makes outbound DNS/connections to bestbuydomain.com or issues curl HTTP PUT to a rare host → exfiltration over C2 (T1041, T1071).

Attack chain

StepTelemetryHunt Angle
1 · ClickFix lure: user pastes command into Terminal/Script EditorProcessRollup2 (ParentBaseFileName=Terminal/zsh)H1 — curl -fsSL piped to a shell
2 · Loader fetches + runs remote script; AppleScript stageProcessRollup2 (osascript under Terminal/zsh)H4 — osascript in install chain
3 · Copy macOS Keychain DBFileOpenInfo / ProcessRollup2 (login.keychain-db)H2 — non-Apple proc touches Keychain
4 · Harvest browser secrets + dev keysFileOpenInfo (Cookies, Login Data, .ssh/.kube)H5 — untrusted reads of cred stores
5 · Stage archive via dittoFileCreateInfo (TargetFileName=osalogging.zip)H3 — ditto → /tmp/osalogging.zip
6 · Chunked HTTP PUT exfil; cleanupDnsRequest / NetworkConnectIP4; CommandLine (curl -T / PUT, rm)H6 — PUT to rare host / IOC domain
04

Consolidated IOC Table

AMOS is stealer-as-a-service; payload hashes and lure/staging hosts rotate. The values below are behavioral and contextual. Replace REPLACE_WITH_* placeholders with indicators confirmed in your own telemetry before promoting to a block.

TypeValueConfidenceActionContext
behaviorTerminal/zsh → curl -fsSL ... piped to sh/zsh/bashhighdetectClickFix curl|sh loader (H1)
behaviorNon-Apple process reads/copies login.keychain-dbhighdetectKeychain theft (H2)
filenameosalogging.ziphighdetectditto staging archive (H3)
path/tmp/osalogging.zip, /tmp/synchighhuntStaging + scratch dirs (H3)
domainbestbuydomain.commediumdetectExfil / C2 host (perishable)
sha256REPLACE_WITH_AMOS_PAYLOAD_SHA256mediumhuntConfirmed loader/payload hash (perishable)
domainREPLACE_WITH_LURE_OR_STAGING_DOMAINlowenrichFake-app download / script host
05

Affected Surface & Telemetry Matrix

SurfaceRequired TelemetryPriorityGap Risk
macOS endpoints (Falcon for macOS) — esp. developer/admin laptopsProcessRollup2 (ParentBaseFileName, ImageFileName, CommandLine)CriticalLow
Keychain & credential-store file accessFileOpenInfo (TargetFileName=login.keychain-db, Cookies, Login Data)HighMed — file-read telemetry coverage varies
Archive staging dir (/tmp)FileCreateInfo (TargetFileName=osalogging.zip)HighLow
Outbound exfil / C2NetworkConnectIP4, DnsRequestMediumLow
06

ATT&CK Mapping

TacticTechniqueObserved BehaviorQuery / Control
ExecutionT1059.004 — Unix Shellcurl -fsSL piped to sh from Terminal/zshQ1 · S12
ExecutionT1059.002 — AppleScriptosascript spawned by Terminal/zsh loaderQ2
Command & ControlT1105 — Ingress Tool Transfercurl -fsSL fetch of remote payloadQ1
Credential AccessT1555.001 — KeychainCopy of login.keychain-dbQ3
Credential AccessT1539 / T1555.003 — Cookies / Browser CredsRead Chrome/Edge Cookies + Login DataQ4
Credential AccessT1552.001 — Credentials in FilesRead ~/.ssh, ~/.kube, ~/.gitconfigQ4
CollectionT1560.001 — Archive via Utility (ditto)ditto writes /tmp/osalogging.zipQ5
ExfiltrationT1041 / T1071.001 — Exfil over C2 / WebChunked HTTP PUT to rare host / IOC domainQ6
07

Native Audit-Log Hunts (non-CQL)

Checks that do not require Falcon process telemetry — run these directly on a suspect macOS host or via MDM-pushed scripts:

  • Staging artifact sweep: look for the staging archive and scratch dir: ls -la /tmp/osalogging.zip /tmp/sync 2>/dev/null. Either present (or recently deleted, per FSEvents) is a strong AMOS indicator.
  • Shell history review: inspect ~/.zsh_history and ~/.bash_history for a pasted curl -fsSL ... | sh one-liner or an osascript invocation the user does not recognize — the ClickFix lure.
  • Keychain access time: check the mtime/atime of ~/Library/Keychains/login.keychain-db against the suspected infection window; a copy/read by malware leaves access traces.
  • Quarantine / Gatekeeper: because curl|sh bypasses Gatekeeper, expect NO quarantine event for the payload — absence of a normal app-launch/quarantine record alongside the above is itself suspicious.
  • Browser store integrity: confirm whether Chrome/Edge Cookies and Login Data SQLite files were read by a non-browser process during the window (correlate with Q4).
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · curl -fsSL piped to a shell from Terminal/zsh (ClickFix loader)
CONF HIGHFP LOWCOST LOW

Looks for: a curl (or the shell wrapping it) launched under Terminal/zsh with the loader's signature -fsSL flags and a pipe to a shell — the ClickFix curl|sh stage (H1, T1059.004/T1105). FP: low; some developer install scripts use the same idiom — baseline trusted install hosts and exclude known package-manager bootstraps.

// HUNT: curl -fsSL piped to a shell, launched from Terminal/zsh (ClickFix loader)
// MITRE: T1059.004, T1105
// CONF: high  FP: low  COST: low | REQUIRES: Falcon for macOS ProcessRollup2
// FALSE POSITIVES: legit dev install one-liners (Homebrew/nvm/rustup bootstraps)
// TUNING: exclude CommandLine matching known install domains after baselining
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(Terminal|zsh|bash|sh|iTerm2|Script Editor|osascript)$/i
| ImageFileName=/\/(curl|zsh|bash|sh)$/i
| CommandLine=/curl\s+(-\w*[fsSL]\w*\s+)+/i
| CommandLine=/curl[^|]*\|\s*(sh|zsh|bash)/i
| table([@timestamp, ComputerName, aid, ParentBaseFileName, ImageFileName, CommandLine, UserName], limit=200)
Q2 · osascript / AppleScript spawned by Terminal/zsh install chain
CONF MEDFP MEDCOST LOW

Looks for: osascript spawned by Terminal/zsh/curl in the install chain — the AppleScript stage of the loader (H4, T1059.002). FP: medium; admin/automation scripts and some apps drive osascript legitimately — baseline known automation and prioritize osascript whose ancestry includes curl or a freshly pasted shell.

// HUNT: osascript/AppleScript spawned by a Terminal/zsh loader chain
// MITRE: T1059.002
// CONF: medium  FP: medium  COST: low | REQUIRES: ProcessRollup2 (macOS)
// FALSE POSITIVES: legit admin automation / app-driven AppleScript
// TUNING: exclude known automation CommandLine; favor hits with curl/sh ancestry
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(Terminal|zsh|bash|sh|curl|Script Editor)$/i
| ImageFileName=/\/osascript$/i
| table([@timestamp, ComputerName, aid, ParentBaseFileName, ImageFileName, CommandLine, UserName], limit=200)
Q3 · Non-Apple process reads/copies login.keychain-db
CONF HIGHFP LOWCOST MED

Looks for: a file open/access on login.keychain-db by a process that is not Keychain Access, the security daemon, or a signed Apple binary — Keychain credential theft (H2, T1555.001). FP: low after excluding Apple/Keychain tooling and known password managers; investigate every remaining hit.

// HUNT: Keychain DB (login.keychain-db) accessed by a non-Apple/non-Keychain process
// MITRE: T1555.001
// CONF: high  FP: low  COST: medium | REQUIRES: FileOpenInfo (macOS)
// FALSE POSITIVES: Keychain Access.app, securityd, signed password managers
// TUNING: exclude trusted ImageFileName (Keychain Access, security, 1Password, etc.)
#event_simpleName=/FileOpenInfo/
| TargetFileName=/login\.keychain-db$/i
| ImageFileName!=/\/(Keychain Access|security|securityd|cloudd|trustd)$/i
| ImageFileName!=/\/Applications\/(1Password|Bitwarden|Keeper)[^\/]*\.app\//i
| table([@timestamp, ComputerName, aid, ImageFileName, TargetFileName, UserName], limit=200)
Q4 · Untrusted reads of browser secrets & developer keys
CONF MEDFP MEDCOST MED

Looks for: a non-browser process reading Chrome/Edge Cookies/Login Data stores or developer secrets (~/.ssh, ~/.kube, ~/.gitconfig, ~/.zshrc) — credential harvesting (H5, T1539/T1552.001/T1555.003). FP: medium; the browsers themselves, backup tools and dev tooling read these — exclude the owning browser and known backup/sync agents.

// HUNT: Non-browser process reads browser cred stores or developer keys
// MITRE: T1539, T1552.001, T1555.003
// CONF: medium  FP: medium  COST: medium | REQUIRES: FileOpenInfo (macOS)
// FALSE POSITIVES: the browser itself; backup/sync agents; dev tooling
// TUNING: exclude Google Chrome/Microsoft Edge bundles and known backup agents
#event_simpleName=/FileOpenInfo/
| TargetFileName=/(\/(Cookies|Login Data|Web Data)$|\/\.(ssh|kube|gitconfig|zshrc))/i
| ImageFileName!=/\/(Google Chrome|Microsoft Edge|Google Chrome Helper.*|com\.apple\.).*$/i
| table([@timestamp, ComputerName, aid, ImageFileName, TargetFileName, UserName], limit=200)
Q5 · ditto / archive write of osalogging.zip or /tmp/sync activity
CONF HIGHFP LOWCOST LOW

Looks for: creation of osalogging.zip (or any write under /tmp/sync) — AMOS's ditto archive-staging step (H3, T1560.001). FP: very low; the filename is near-unique to this campaign. The companion process angle (ditto targeting /tmp/osalogging.zip) is folded in.

// HUNT: Archive staging — osalogging.zip created / ditto staging to /tmp
// MITRE: T1560.001
// CONF: high  FP: low  COST: low | REQUIRES: FileCreateInfo + ProcessRollup2 (macOS)
// FALSE POSITIVES: very low — filename is campaign-specific
// TUNING: none typically needed; investigate every hit
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| TargetFileName=/osalogging\.zip$/i OR TargetFileName=/\/tmp\/sync\//i OR (ImageFileName=/\/ditto$/i AND CommandLine=/\/tmp\/(osalogging\.zip|sync)/i)
| table([@timestamp, ComputerName, aid, ImageFileName, TargetFileName, CommandLine, UserName], limit=200)
Q6 · Exfil — curl HTTP PUT / DNS to IOC domain from non-browser
CONF MEDFP MEDCOST MED

Looks for: the exfil stage — a curl issuing an HTTP PUT / upload (-T / --upload-file / -X PUT), or a DNS request to the IOC domain bestbuydomain.com (H6, T1041/T1071.001). FP: medium for the curl-PUT idiom (legit API uploads) — scope to non-browser parents and rare destinations; the DNS branch is high-fidelity. Replace/extend the domain regex as new infra is confirmed.

// HUNT: Chunked exfil — curl PUT/upload or DNS to AMOS IOC domain
// MITRE: T1041, T1071.001
// CONF: medium  FP: medium  COST: medium | REQUIRES: ProcessRollup2 + DnsRequest (macOS)
// FALSE POSITIVES: legit curl PUT to internal/CDN APIs; exclude known upload endpoints
// TUNING: add confirmed staging hosts; scope curl-PUT branch to non-browser parents
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2|DnsRequest/
| (ImageFileName=/\/curl$/i AND CommandLine=/(--upload-file|\s-T\s|-X\s*PUT)/i)
  OR DomainName=/bestbuydomain\.com$/i
| table([@timestamp, ComputerName, aid, ImageFileName, ParentBaseFileName, CommandLine, DomainName, UserName], limit=200)
Q7 · Cleanup — rm of /tmp/osalogging.zip or /tmp/sync
CONF MEDFP LOWCOST LOW

Looks for: the post-exfil cleanup — rm -f /tmp/osalogging.zip or rm -rf /tmp/sync (T1070.004, Indicator Removal). FP: low; these exact paths are campaign-specific. A hit on Q7 with no preceding Q5 staging may indicate the staging file write was missed by file telemetry — still treat as a strong lead.

// HUNT: Post-exfil cleanup of AMOS staging artifacts
// MITRE: T1070.004
// CONF: medium  FP: low  COST: low | REQUIRES: ProcessRollup2 (macOS)
// FALSE POSITIVES: low — exact paths are campaign-specific
// TUNING: none typically needed; correlate with Q5 staging
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ImageFileName=/\/rm$/i
| CommandLine=/\/tmp\/(osalogging\.zip|sync)/i
| table([@timestamp, ComputerName, aid, ImageFileName, ParentBaseFileName, CommandLine, UserName], limit=200)
09

CrowdStrike Custom IOA Recommendations

Promotion candidates from the hunt queries above (macOS platform, Process Create rule type unless noted):

IOA NamePatternExclusionsAction / Deployment
curl|sh From Terminal (ClickFix Loader)Parent Terminal|zsh|Script Editorcurl/sh with -fsSL and pipe-to-shell in command lineKnown dev install bootstraps (Homebrew/nvm/rustup)Detect → Block after 1–2 wk baseline (from Q1) · M1040
Keychain DB Access by Untrusted ProcFile access on login.keychain-db by non-Apple/non-password-manager imageKeychain Access, securityd, signed PW managersDetect (from Q3) — file-keyed; deploy as scheduled-search detection
AMOS Staging Archive WrittenFileCreate osalogging.zip or ditto → /tmp/osalogging.zipNone (campaign-specific name)Detect → Block candidate (from Q5)

Q3 and Q5 key on file telemetry rather than process creation — deploy them as scheduled-search / file-based detections rather than Process-Create IOAs. Q1 is the strongest blocking-IOA candidate once dev-install false positives are baselined out.

10

Machine-Readable IOC Appendix

One-click copy blocks for ingestion. Hashes and lure/staging hosts are perishable for this stealer-as-a-service — use placeholders until you confirm values in your own telemetry.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
domain,bestbuydomain.com,detect,high,2026-09-22,AMOS exfil/C2 host,campaign:AMOSStealer
sha256,REPLACE_WITH_AMOS_PAYLOAD_SHA256,detect,critical,2026-12-22,AMOS loader/payload,campaign:AMOSStealer
domain,REPLACE_WITH_LURE_OR_STAGING_DOMAIN,detect,high,2026-09-22,AMOS fake-app/script host,campaign:AMOSStealer
Behavioral Signatureshunt logic
parent_proc IN (Terminal, zsh, Script Editor)
  AND child curl -fsSL ... | sh/zsh/bash       # ClickFix loader
file_access: login.keychain-db BY non-Apple proc # Keychain theft
file_read: Chrome/Edge (Cookies, Login Data), ~/.ssh ~/.kube ~/.gitconfig
file_create: osalogging.zip  (ditto staging)
net: curl PUT/upload to rare host | DNS bestbuydomain.com
cleanup: rm -f /tmp/osalogging.zip ; rm -rf /tmp/sync
Named Tooling / Artifactsreference
AMOS — Atomic macOS Stealer (Jun 2026 Keychain campaign)
Delivery: ClickFix fake-app / Terminal-paste; applescript:// variant
Loader:   curl -fsSL <url> | sh  ->  osascript (zsh chain), bypasses Gatekeeper
Targets:  login.keychain-db; Chrome/Edge pw+cookies+autofill; ~/.ssh ~/.kube ~/.zshrc ~/.gitconfig
Staging:  ditto -> /tmp/osalogging.zip (10MB chunks); session id = ts + openssl hex
Exfil:    HTTP PUT via curl, retry x8  ->  bestbuydomain.com
Cleanup:  rm -f /tmp/osalogging.zip ; rm -rf /tmp/sync
Host Triage / Exposure Auditverify
# Staging artifacts present (or recently removed)
ls -la /tmp/osalogging.zip /tmp/sync 2>/dev/null
# ClickFix one-liner in shell history
grep -nE 'curl[^|]*\|[[:space:]]*(sh|zsh|bash)|osascript' \
  ~/.zsh_history ~/.bash_history 2>/dev/null
# Keychain DB access window
stat -f '%Sa %N' ~/Library/Keychains/login.keychain-db 2>/dev/null
11

Detection Validation Gates

GateCheckPass Criteria
1 · Telemetry readyFalcon for macOS on all in-scope endpoints; ProcessRollup2, FileOpenInfo/FileCreateInfo, DnsRequest flowingEvents seen from a representative macOS fleet in last 24h
2 · Benign baselineRun Q1/Q2/Q4 over 7–14 days; catalog legit dev install one-liners, automation osascript, browser/backup file readsKnown-good command lines & reader images enumerated & excluded
3 · Positive testIn a lab macOS host, run a benign curl -fsSL http://example/x | sh from Terminal and ditto -c -k somedir /tmp/osalogging.zipQ1 and Q5 both fire on the test actions
4 · PromotionQ1 FP rate acceptable after excluding dev bootstraps; Q3/Q5 reviewedPromote Q1 to blocking IOA; keep Q2/Q4/Q6 as investigate-only
12

Hardening — Tiered

Immediate (this week — low compat risk)
  • User training against clipboard-paste-to-Terminal: the entire attack hinges on a user pasting a command into Terminal/Script Editor. Brief staff that no legitimate fix requires pasting a curl … | sh command, and report such prompts. (M1017 — User Training.)
  • Deploy Q1 + Q5 as detections now across all macOS endpoints — they catch the live loader and the staging archive even before policy changes land. (M1040 — Behavior Prevention on Endpoint; enable Falcon behavior-prevention for curl|sh.)
  • Block the IOC domain bestbuydomain.com at the proxy/DNS resolver and add to Falcon IOC management; sweep for /tmp/osalogging.zip + /tmp/sync fleet-wide (S10 audit). (M1037 — Filter Network Traffic.)
Near term (1–4 weeks — pilot first)
  • Enforce Gatekeeper + notarization via MDM; block install of unsigned apps. Set AllowIdentifiedDevelopers/Gatekeeper to App Store + identified developers and disable spctl overrides. Reduces the fake-app vector. (M1038 — Execution Prevention; CIS Apple macOS Benchmark.)
  • Protect the Keychain & restrict scripting: use MDM/PPPC to limit which apps get Full Disk Access (gating login.keychain-db and browser stores), and where feasible restrict Terminal/osascript on non-developer fleets. (M1022 — Restrict File/Dir Permissions; M1042 — Disable or Remove Feature.)
  • Egress filtering from endpoints: require web egress through an inspecting proxy; alert on curl-issued HTTP PUT/uploads to rare external hosts from non-browser processes. (M1037.)
Strategic (1–3 months)
  • Credential hygiene program: move developer secrets off plaintext dotfiles (SSH key passphrases + agent, sealed kubeconfig, secret managers); enable browser passkeys / hardware-backed sync so a stolen cookie/keychain is less reusable. (M1027 / M1026.)
  • ClickFix-aware policy: consider MDM removal of applescript:// URL-scheme handling for Script Editor on standard fleets and keep macOS patched to retain Terminal paste-protection. (M1042; M1051 — Update Software.)
13

Deployable Playbooks

A · Enforce Gatekeeper + block unsigned apps (MDM config profile)

Deploy this com.apple.systempolicy.control payload via your MDM (Jamf/Intune/Kandji) to require notarized, identified-developer apps:

<!-- profile payload: com.apple.systempolicy.control -->
<key>EnableAssessment</key><true/>
<key>AllowIdentifiedDevelopers</key><true/>
<!-- forbid users disabling Gatekeeper (spctl --master-disable) -->
<key>PayloadType</key><string>com.apple.systempolicy.control</string>

B · Host triage / IOC sweep (shell — push via MDM)

# AMOS staging + scratch artifacts
ls -la /tmp/osalogging.zip /tmp/sync 2>/dev/null
# ClickFix curl|sh or osascript in shell history (per user)
grep -nE 'curl[^|]*\|[[:space:]]*(sh|zsh|bash)|osascript' \
  /Users/*/.zsh_history /Users/*/.bash_history 2>/dev/null
# Verify Gatekeeper is enforced
spctl --status

C · Block IOC domain at the resolver / proxy

# /etc/hosts sinkhole (endpoint stopgap) or push to DNS RPZ / proxy denylist
0.0.0.0  bestbuydomain.com
# Falcon: add domain to IOC Management (detect/block) — see S10 CSV

D · Credential rotation checklist (post-compromise)

# Treat ALL of these as exfiltrated on a confirmed host:
#  - macOS Keychain items (login.keychain-db copied)
#  - Chrome + Edge saved passwords, cookies/sessions  -> force re-auth
#  - SSH keys (~/.ssh)  -> revoke + reissue, rotate authorized_keys
#  - Kubeconfig (~/.kube)  -> rotate cluster creds/tokens
#  - Git creds / tokens (~/.gitconfig, credential stores)  -> revoke PATs
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain the host in Falcon; preserve memory + disk; do not reboot. Capture /tmp and shell history before they are wiped.SOC / IRFalcon containment record; /tmp/osalogging.zip + history captures
EradicateKill the loader process tree (Terminal→curl→sh→osascript); remove staged artifacts (/tmp/osalogging.zip, /tmp/sync); remove any dropped persistence (LaunchAgents/Daemons).IRProcess tree, removed-file inventory, persistence audit
Rotate credsAssume full exfil: rotate ALL Keychain items, Chrome/Edge passwords, and revoke browser sessions/cookies; reissue SSH keys, rotate kubeconfig + cloud tokens, revoke Git PATs (S13-D).IR / IdentityRotation log; session-revocation confirmations
RecoverReimage if integrity uncertain (stealer may have dropped second-stage tooling); restore from known-clean state; re-enroll in MDM with Gatekeeper enforced.SOC / EndpointReimage record; post-restore hunt (Q1–Q7) results
ReportDocument the lure (source site/command), data accessed, and credentials rotated; notify affected SaaS/cloud owners of session revocation.IR leadTimeline; lure source; impact + rotation record
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1059.004 / T1105curl -fsSL | sh from Terminal (loader)Q1Q1 (block candidate)Good
T1059.002osascript in install chainQ2Partial — FP tuning required
T1555.001login.keychain-db copiedQ3Q3 (file-keyed)Good
T1539 / T1552.001 / T1555.003Browser stores + dev keys readQ4Partial — needs reader baselining
T1560.001ditto → osalogging.zipQ5Q5 (block candidate)Good
T1041 / T1071.001Chunked PUT exfil / IOC DNSQ6Partial — curl-PUT FP tuning
T1070.004Cleanup rm of staging artifactsQ7Good
Wallet / crypto theftCrypto-wallet file collectionGAP — out of scope; extend Q4 with wallet paths

Validation: The loader spine (Q1), Keychain theft (Q3) and staging (Q5/Q7) are strong and low-FP. The credential-harvest read query (Q4) and exfil query (Q6) need reader/upload-endpoint baselining to keep FP acceptable. Crypto-wallet collection is not covered here — extend Q4's TargetFileName regex with wallet store paths if relevant to your fleet. Validate macOS file-event field names (FileOpenInfo vs FileCreateInfo) and the DomainName field against your tenant before deploying.

16

Hunt Summary Ticket

TITLE:      Hunt — AMOS / Atomic macOS Stealer (ClickFix Keychain-theft campaign)
SEVERITY:   High (active credential theft; Keychain + browser + dev keys exfiltrated)
SCOPE:      macOS endpoints (Falcon for macOS) — prioritize developer/admin laptops
HYPOTHESIS: ClickFix lure -> user pastes curl -fsSL | sh in Terminal -> AMOS copies
            login.keychain-db + browser/dev creds, ditto-stages /tmp/osalogging.zip,
            exfils via chunked HTTP PUT, then cleans up.
QUERIES:    Q1 curl|sh-from-Terminal | Q2 osascript | Q3 keychain copy |
            Q4 browser/dev-key reads | Q5 osalogging.zip staging |
            Q6 PUT/IOC-domain exfil | Q7 cleanup rm
DO FIRST:   1) Run Q1 + Q5 + Q3 across all macOS hosts
            2) Sweep fleet for /tmp/osalogging.zip and /tmp/sync (S10 audit)
            3) Any hit = treat as live infostealer -> containment + ROTATE ALL CREDS (S14)
FINDINGS:   <fill: hosts, lure source, files, process trees, creds exfiltrated>
GAPS:       Q4/Q6 need FP baselining; crypto-wallet collection out of scope
ACTIONS:    Block bestbuydomain.com; enforce Gatekeeper via MDM; user training;
            behavior-prevention on curl|sh; rotate Keychain/browser/ssh/cloud creds
OWNER:      HuntPack
VERSION:    v0.1 · 2026-06-22
17

Changelog

v0.32026-07-24CQL correctness pass. All table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.
v0.22026-06-29CQL syntax review (crowdstrike-logscale-v3): removed invalid FileCreateInfo event name from two hunts (Keychain access + ditto/zip staging).
v0.12026-06-22Initial HuntPack — 7 CQL hunts (Q1–Q7), 3 IOA candidates, tiered hardening (MDM Gatekeeper + user training + egress), deployable playbooks, containment runbook with full credential rotation, coverage map. Built from Trend Micro / Microsoft / Jamf / Hackread reporting on the June 2026 AMOS ClickFix Keychain-theft campaign.
18

References

TierSourceUsed ForAccess Date
1 · VendorTrend Micro — Skills used to distribute Atomic macOS StealerLoader curl -fsSL, ditto staging, chunked PUT, retry-8 mechanics2026-06-22
1 · VendorMicrosoft Security Blog — ClickFix fake macOS utilities deliver infostealersClickFix Terminal-paste lure; base64 → curl|sh; AMOS targets2026-06-22
1 · VendorJamf Threat Labs — ClickFix abuses Script Editor to deliver Atomic Stealerapplescript:// URL-scheme variant; Terminal paste-protection bypass2026-06-22
2 · PressHackread — AMOS steals macOS Keychain files & browser passwordslogin.keychain-db copy; Chrome/Edge; dotfiles; IOC domain2026-06-22
2 · PressSophos — Why AMOS matters: macOS malware stealing data at scaleAMOS scale, stealer-as-a-service context, ClickFix evolution2026-06-22