VORANT. Threat Intelligence Research Sign in Create a free account

Heartbreaker: Metamorphic macOS Ransomware Decrypted

routine threat

Free public brief. The indicators, the detections with Splunk SPL already written (plus Elastic and KQL where they apply), and a Slack alert the next time this touches a vendor you run are in the app — free account, no card.

Objective-See found a novel macOS ransomware, Heartbreaker, that uses a hardcoded AES-GCM key, letting defenders freely decrypt files despite its self-rebuilding design.

Objective-See researchers analyzed Heartbreaker, a previously unknown, AV-undetected ransomware sample for Apple Silicon Macs, uploaded to VirusTotal in May 2025 and discovered by independent researcher Megan Carney. Written in Rust, the ad hoc-signed ARM64 Mach-O binary recursively encrypts files under the victim's ~/Downloads directory using AES-256-GCM, renames them with a .heartbreaker extension, drops a ransom note on the Desktop demanding 0.003 BTC, and attempts persistence via a LaunchAgent (~/Library/LaunchAgents/com.network.startup.plist). Crucially, every file and apparently every victim is encrypted with the same hardcoded key embedded in the binary, allowing full file recovery without payment — the researchers published a working decryptor based on this flaw.

The sample's most notable feature is an attempt at metamorphism: it embeds its own Rust source code via include_str!, and on each run invokes a framework (mimicore, apparently related to the still-available 'metacore' project) that strips prior junk code, randomizes identifiers, inserts new junk functions, and recompiles itself with cargo, aiming to produce a new binary hash each generation. This process is fragile and noisy — it depends on an unavailable upstream repository and a visible Rust/Cargo installation and build workflow — and does not alter the malware's core behavior.

The authors used Heartbreaker to validate their free, open-source RansomWhere? tool, which uses Apple's Endpoint Security framework to detect rapid creation/modification of high-entropy files by untrusted processes rather than static signatures. RansomWhere? successfully detected and suspended Heartbreaker regardless of its changing binary hash, because the behavioral impact (bulk file encryption) remains constant across generations. The article assesses Heartbreaker as a low real-world threat given its narrow scope, universal recovery key, and reliance on an unavailable build dependency, but notes it is a useful case study in both metamorphic malware design and behavior-based ransomware detection on macOS.

Mentioned in this report

Malware Heartbreakermimicore/metacore

Detection guidance

Heartbreaker Ransomware LaunchAgent Persistence File Created

ATT&CK T1543.001

Creation of the com.network.startup.plist LaunchAgent that Heartbreaker uses for persistence on macOS. Auto-generated starting point — validate and tune in your environment before deploying. IOC matches can false-positive on shared infrastructure and decay as adversary infrastructure rotates.

title: Heartbreaker Ransomware LaunchAgent Persistence File Created
description: Detects creation of a user LaunchAgent plist named com.network.startup.plist,
  the persistence mechanism used by the Heartbreaker macOS ransomware. The generic
  network/startup naming is unusual for legitimate software.
tags:
- attack.persistence
- attack.t1543.001
logsource:
  category: file_event
  product: macos
detection:
  selection:
    TargetFilename|contains: /Library/LaunchAgents/
    TargetFilename|endswith: /com.network.startup.plist
  condition: selection
falsepositives:
- Unlikely; an internally developed agent that happens to reuse the same plist name
level: high
id: 6411204f-2b14-50ff-b274-90a42ebd3e0b
status: experimental
author: Vorant
references:
- https://objective-see.org/blog/blog_0x8A.html

Files Written With .heartbreaker Extension

ATT&CK T1486

Files created or renamed with the .heartbreaker extension, indicating Heartbreaker ransomware encrypting user files. Auto-generated starting point — validate and tune in your environment before deploying. IOC matches can false-positive on shared infrastructure and decay as adversary infrastructure rotates.

title: Files Written With .heartbreaker Extension
description: Detects file creation events for files with the .heartbreaker extension
  that Heartbreaker ransomware appends after encrypting files under the user's Downloads
  directory with AES-256-GCM.
tags:
- attack.impact
- attack.t1486
logsource:
  category: file_event
  product: macos
detection:
  selection:
    TargetFilename|endswith: .heartbreaker
  condition: selection
falsepositives:
- Security staff or researchers handling Heartbreaker samples or test data
level: high
id: c8ae11b7-cbcf-5494-bbb4-d6ead2d7b568
status: experimental
author: Vorant
references:
- https://objective-see.org/blog/blog_0x8A.html

Cargo or Rustc Spawned by Binary in User-Writable Location on macOS

ATT&CK T1027

A binary run from Downloads or a temp directory launching cargo or rustc, consistent with Heartbreaker's metamorphic self-recompilation. Auto-generated starting point — validate and tune in your environment before deploying. IOC matches can false-positive on shared infrastructure and decay as adversary infrastructure rotates.

title: Cargo or Rustc Spawned by Binary in User-Writable Location on macOS
description: Detects cargo or rustc launched by a parent executing from Downloads
  or a temp directory. Heartbreaker embeds its own Rust source, mutates it (junk code,
  renamed identifiers) and recompiles itself with cargo on each run to change its
  hash.
tags:
- attack.stealth
- attack.t1027
logsource:
  category: process_creation
  product: macos
detection:
  selection_child:
    Image|endswith:
    - /cargo
    - /rustc
  selection_parent:
    ParentImage|contains:
    - /Downloads/
    - /tmp/
    - /private/var/tmp/
    - /private/var/folders/
  filter_rustup:
    ParentImage|endswith:
    - /rustup
    - /cargo
  condition: selection_child and selection_parent and not filter_rustup
falsepositives:
- Developers building Rust projects from a checkout located under Downloads or a temp
  directory
- Build scripts in CI runners that use temporary working directories
level: medium
id: ad6eafd1-9495-5f16-9fb4-921f09720aa5
status: experimental
author: Vorant
references:
- https://objective-see.org/blog/blog_0x8A.html

Behavioural rules are generated from public reporting — validate in your environment before deploying.

Source reporting: https://objective-see.org/blog/blog_0x8A.html

What this brief leaves out

This page is the free tier: the write-up, the severity, the names. In the app the same report carries its extracted indicators, its detections (Splunk SPL already written, plus Elastic and Microsoft KQL where they apply), the actors and CVEs it names as live profiles, and the vendor research on the same campaign — the primary source the news paraphrased, cited and read directly.

It sits in a corpus of 13,579 reports from 145 sources, 596 of them written in the last seven days, and it grows through the day.

A new account starts with three days of all of it, no card, then keeps the government and CERT reporting free. Name the vendors you run and Slack hears about the reports that touch them — about forty a week that are yours, not the four hundred that are not.

Create a free account   What it costs