Skip to content
Malware

FlutterShell macOS Backdoor Abuses Flutter Framework and WKWebView for Stealthy Attacks

A newly analyzed macOS backdoor called FlutterShell has been quietly targeting Mac users by disguising itself as legitimate productivity apps. It abuses Google’s Flutter app development framework to blend in with real software, making it far harder to detect using traditional security tools. The mal...

· Jun 23, 2026 · 5 min read · 👁 0 views

A newly analyzed macOS backdoor called FlutterShell has been quietly targeting Mac users by disguising itself as legitimate productivity apps.

It abuses Google’s Flutter app development framework to blend in with real software, making it far harder to detect using traditional security tools.

The malware was active between December 2025 and March 2026, with researchers tracking three distinct generations of the threat.

The campaign, tracked under the name Operation FlutterBridge and the cluster identifier CL-CRI-1089, spread through malicious Google and YouTube advertisements.

The ads targeted users searching for terms like “podcast app for Mac” or “free PDF converter,” redirecting them to fake sites hosting digitally signed app bundles.

Since the apps carried valid Apple Developer certificates at distribution time, macOS Gatekeeper passed them without raising any warning.

Analysts at LevelBlue, in a report shared with Cyber Security News (CSN), conducted an in-depth static analysis of ten Mach-O binary samples collected across all three generations.

Rather than re-examining the broader campaign, the team focused on what those binaries revealed about the malware’s design, its evolution, and how defenders can reliably detect it as the actor rotates its infrastructure.

At its core, FlutterShell splits its work across two components: a small stub launcher that initializes the Flutter runtime, and a large payload library containing the actual Dart code and attack logic.

The payload library weighs around 10 MB and carries the full Flutter framework alongside custom commands. This structure helps the malware pass basic inspection because the launcher looks nearly identical to any legitimate Flutter application.

What makes FlutterShell especially difficult to catch in automated sandboxes is its C2-conditional design. The malware only activates when it receives live instructions from an attacker-controlled server.

In every sandbox test, the binary launched cleanly, displayed a working app interface, and then produced no activity at all. Without a live server to respond, the malware sits idle and appears completely harmless.

FlutterShell macOS Backdoor Abuses Flutter Framework and WKWebView

The most notable aspect of FlutterShell is how it receives commands from its operators.

Rather than hardcoding instructions in the binary, the malware opens a hidden WKWebView window and loads a page from an attacker-controlled domain.

That page then delivers JavaScript to the app, which passes commands through a named message channel called flutterInvoke.

This design means operators can update what the malware does at any time by simply changing their server content, without touching the binary.

The bridge command was named exec_sync in the first generation, renamed pdf_sync in the second, and became renderPDF in the third, camouflaging activity as normal behavior from a PDF application.

Any detection rule tied to a specific command name will break the moment the actor pushes a server-side update.

Cross-Generation Evasion and Persistence Tactics

What stands out across all three generations is how deliberately the actor rotated its identity. Apple revoked the first developer certificate on December 31, 2025, and a new generation appeared twelve days later with a fresh one.

A second revocation followed on January 31, 2026, and a third generation arrived in March using a self-signed certificate, trading Gatekeeper clearance for independence from Apple’s certificate authority.

Once connected to a live server, FlutterShell is assessed to perform hardware fingerprinting by running a system command that harvests the Mac’s unique hardware identifier.

It then modifies Chrome’s settings to silently swap the default search engine for an attacker-controlled domain, kills Chrome, and relaunches it with flags that hide any crash warning from the user.

Persistence is achieved by staging a replacement bundle in a local cache folder through the Sparkle update mechanism and quietly installing it.

The LevelBlue team recommends prioritizing behavioral endpoint detection over static signatures, since Generation 3 evaded most pattern-based tools after certificate rotation and Dart symbol obfuscation.

Monitoring for non-browser processes making outbound HTTPS connections to unknown domains, unusual child processes harvesting hardware identifiers, and unexpected writes to Chrome’s profile directory are the most reliable detection signals available.

Indicators of Compromise (IoCs):-

TypeIndicatorDescription
Network Domainatsheisdomestic.orgGen 1 C2 domain
Network Domainetoftheappyrince.orgGen 2 C2 domain
Network Domainhealightejustb.orgGen 3 C2 domain
Network Domainsinterfumesco.comChrome search hijack target
SHA-256363923500ce942bf1a953e8a4e943fbf1fb1b5ed6e5d247964c345b3ad5bfc34Stub Gen 0
SHA-2566c3f61d46d4de26b9cb16808bf17c33ae69f651a4b879e7b5612ff7f548e2a82Stub Gen 1 x86
SHA-256fc091ddb4d845280aeb7745cfdb6b7cb0013abc35db9e634f055b8e8fb0b5b1eStub Gen 1 arm64
SHA-256134517796178a150a1585672be134169d6877082b598d840baa3f37b0222be26Dylib Gen 1 x86
SHA-256cc4f048e66c5ab3c0f1d767bb8fc464d082641f4888ea3cd14ea3775077c4bf2Dylib Gen 1 arm64
SHA-256bf90fb31e6024d7e6616f5acd0e8aa28738a9095a508c1a986e1e974cb9e79a0Dylib Gen 2 x86
SHA-25632da1437a2734224406c7e5e8d756f0c0cd58c0c959478571cbfc0cd564d018aDylib Gen 2 arm64
SHA-2562c5bc9e95e1e9b73e3ba8870a008802899866a2c0e2e10112aefddf7a96af04eDylib Gen 3 x86
SHA-256f544bfab72d380cc20692d8ec9d31ea666785fe225dccd55beab29a3c0fdfad2Dylib Gen 3 arm64
Team IDUBZDAAV97YRevoked Apple Developer certificate, Gen 0–1
Team IDFW9NHQ8922Revoked Apple Developer certificate, Gen 2
Team IDB73CHZ24Y8External attribution, Gen 3
Bundle IDcom.app.podcastsLoungeGen 1 masquerade app identity
Bundle IDcom.app.pdfBrainGen 2 masquerade app identity
Bundle IDcom.pdfninja.appGen 3 masquerade app identity

Note: IP addresses and domains are intentionally defanged (e.g., [.]) to prevent accidental resolution or hyperlinking. Re-fang only within controlled threat intelligence platforms such as MISP, VirusTotal, or your SIEM.

Source: CybersecurityNews.com

Follow ShomoySoft for more: Follow on Facebook

💬 Comments (0)

Login to join the discussion.

No comments yet. Be the first!

Related Articles

Recommended for you