One Fake Video Call, 193 Days Inside: A macOS Backdoor, a Fake Google Docs Extension, and a Stolen Telegram Account
The short version:
- One meeting invite put a root backdoor on a Mac in about four minutes. No zero-day was involved. All it took was a fake Teams waiting page and a fake system password prompt.
- The backdoor ran quietly for 193 days. On day 31 it installed a spyware Chrome extension disguised as “Google Docs Offline” that sent every website cookie out every 30 seconds.
- Telegram was taken over even with two-step verification (2FA) on, because the attacker stole an already logged-in session, not the password.
- If you think you were hit: from a separate clean device, log out every session first, then change passwords, then reinstall. The order matters.
This post is based on a real forensic investigation. The victim’s hostname, username and personal software inventory have been removed, and all times are UTC. It is written for a general audience; the full forensic detail is in the incident report and research paper linked at the end.
Last year I wrote about Telegram session hijacking, where a fake Zoom installer stole Telegram Desktop’s session. This case is the upgraded version of the same playbook: instead of stealing once, the attacker moved in and stayed.
How it started
On 24 April 2026, the victim received a business-style video meeting invite on Telegram. The link opened a fake Microsoft Teams waiting page saying “Someone in the meeting should let you in soon.” The victim remembered it as Zoom, until a screenshot taken at the time turned up during the investigation and showed Teams. A convincing fake page makes even the brand hard to recall.
The page then claimed the audio component or SDK needed an update. The victim ran the download, and a password prompt that looked like it came from macOS appeared. Typing the password handed the attacker administrator rights.
File creation times reconstruct those four minutes:
| Time (UTC) | What happened |
|---|---|
| 08:03:01 | Fake password prompt component ammad.Mac-Password-Popup appears |
| 08:04:47 | Victim screenshots the fake Teams waiting page |
| 08:06:28 | Root-owned backdoor cloudsync written to disk |
| 08:07:18 | LaunchDaemon com.safari.sync.service created to run the backdoor as root at boot |
The password prompt appears before any root-owned file is written, which fits the model of “run sudo with the password the user just typed.” The only thing the whole chain needed was for the victim to enter a password once.
sequenceDiagram
autonumber
actor A as Attacker
actor U as Victim
participant W as Fake meeting page
participant OS as macOS
participant BD as cloudsync backdoor
participant C2 as C2 check02id.com
A->>U: Meeting invite on Telegram
U->>W: Opens link, lands on fake Teams waiting page
W->>U: "Audio / SDK update required"
U->>OS: Runs the download
OS->>U: Fake system password prompt
U->>OS: Enters login password
OS->>BD: Writes backdoor and launch item as root
loop Every 60 seconds
BD->>C2: Beacon (TCP 5202)
end
What the attacker did over 193 days
Once the backdoor was in place, the attacker expanded in stages:
| Date | Action |
|---|---|
| 2026-04-24 | Root backdoor cloudsync and its LaunchDaemon in place |
| 2026-05-05 | Second-stage encrypted data /Users/Shared/.apple.auth downloaded |
| 2026-05-25 | Fake “Google Docs Offline” extension planted in all 4 Chrome profiles, plus an unsigned Native Messaging Host |
| 2026-06-03 | Second root binary /Users/Shared/.authds downloaded |
| 2026-06-23 | LaunchAgent com.apple.google.auth updated |
| 2026-11-03 | On the day of the investigation, both the backdoor and the extension were still talking to the C2 |
Look at the names: com.safari.sync.service, com.apple.google.auth, .apple.auth. Every one borrows Apple, Safari or Google branding, so a normal user scrolling through login items would assume they belong to the system.
Two layers of control: system backdoor plus browser spyware
The most notable design choice is that the attacker held two independent control channels:
- System layer (
cloudsync): root, starts at boot, can read and write anything on the machine. But logged-in browser sessions are encrypted and not easy to use from here. - Browser layer (the fake extension): lives inside Chrome, with direct access to cookies, page content and every keystroke.
Each layer talks to the C2 on its own, so removing one leaves the other alive. That is exactly what happened: after the first cleanup removed cloudsync, the extension kept talking to the C2 until a second, machine-wide scan for unsigned binaries found it.
What the fake “Google Docs Offline” extension can do
The extension calls itself Google Doc Sheets Offline (v1.97.1) with ID ppconlkbhfnachephglhgbhdgeapgjoj. The real Google Docs Offline has ID ghbmnnjooekpmoecnnnilnnbdlolhkhi and is only installed from the Chrome Web Store.
It requests <all_urls> plus cookies, history, tabs, scripting, desktopCapture and nativeMessaging. Its source code shows:
| Capability | Frequency / trigger |
|---|---|
| Upload every cookie for every site (including HttpOnly) | Every 30 seconds |
| Keylogging and clipboard logging | Uploaded every 60 seconds |
| Screenshots | Every 6 seconds |
| Upload each site’s localStorage | On every tab switch |
| Upload up to 10,000 history entries | On command |
| Inject arbitrary JavaScript into chosen URLs | On command |
| Wipe a chosen site’s cookies to force a fresh login | On command |
| Run arbitrary commands on the Mac through the Native Host | On command (real-time over WebSocket) |
Two combinations are especially nasty:
- Wipe cookies plus keylogging: kill your session on a site, then capture the new password you type when you log back in.
- JavaScript injection: run scripts on exchange or wallet sites, for example to silently swap a withdrawal address.
It also hooks Google Meet’s “Join now” button and asks for screen recording permission at the moment you join a call, when the request looks completely reasonable.
Why the browser sandbox did not help
Chrome’s Native Messaging exists so that software like password managers can talk to a local program1. When an attacker controls both the extension and the local program, the extension can effectively run any command on the machine and the sandbox no longer matters. Here the Native Host was called google.chrome.diagnostics: another Google-branded name on an unsigned binary.
The attacker also faked timestamps
Some files in the extension folder show a creation date of 2025-10-16, and Chrome recorded an install date of 2025-08-13. Both are earlier than the real intrusion. Taken at face value, they suggest the extension had nothing to do with this incident.
The real install date came from one file: the extension’s data.js contains the victim’s username and hostname, so it could only have been created on the victim’s machine, and its creation time is 2026-05-25. The later whole-disk sweep also found a copy of the extension’s background.js in Chrome’s Service Worker cache, created five seconds after data.js, which is exactly when the extension first loaded and ran. Timeline-only forensics can miss key components.
Why Telegram was taken over despite 2FA
This is the question most people ask. The answer: 2FA protects the act of logging in. It does not protect a session that is already logged in.
After you log in, a site stores a login credential in your browser’s cookies or localStorage. Every time you return, the browser presents it and the site knows it is you, without asking for a password or 2FA again.
Web apps like Telegram Web keep their login tokens in localStorage. This extension uploaded localStorage on every tab switch, so the attacker could load it into their own browser and simply be you, with no password and no 2FA prompt. MITRE ATT&CK calls this T1539 (Steal Web Session Cookie) plus T1550.004 (Use Web Session Cookie)2.
That is also why changing your password afterwards does not help: the session the attacker holds does not expire because you changed the password. You have to actively terminate all other sessions.
The Telegram account was taken over while the extension was active. Session or localStorage theft is the explanation best supported by the evidence, but because the relevant logs had aged out, it cannot be pinned to a specific upload.
What about BlueNoroff?
Public reporting describes the North Korea-linked BlueNoroff group (generally considered the Lazarus sub-group focused on financial and crypto theft) using fake video meetings against macOS users for years:
- Kaspersky’s October 2025 research on GhostCall and GhostHire says GhostCall mainly targets macOS, approaches victims via Telegram, and uses fake Zoom and Teams clients to deploy stealers34.
- In a June 2025 incident handled by Huntress, attackers used deepfaked participants in a meeting, then claimed the victim’s microphone was broken and had them run an AppleScript named
zoom_sdk_support.scpt56.
This case matches on the Telegram invite, the fake Zoom or Teams page, the fake system password prompt, the Apple and Google naming, and the focus on crypto holders. However, the samples were not reverse engineered or compared against threat intelligence platforms, so this is a technique match with medium confidence, not a formal attribution.
The “system backdoor plus extension plus Native Host” combination was not described in detail in any of the public material we reviewed.
How to check your own Mac
These commands only read; they change nothing. Paste them into Terminal.
1. Look for the known files from this case
ls -la /Library/LaunchDaemons/com.safari.sync.service.plist \
~/Library/LaunchAgents/com.apple.google.auth.plist \
~/Library/CloudSync \
~/Library/Identification \
~/Library/Staging \
"$HOME/Library/Application Scripts/ammad.Mac-Password-Popup" \
/Users/Shared/.authds /Users/Shared/.apple.auth /Users/Shared/.com.apple.better.env \
/Users/root \
2>/dev/null
No output means none of these files exist, which is good news.
A word on /Users/root: on macOS the root home directory is /var/root, so a normal Mac has no /Users/root. In this case the backdoor, running as root, created one there with a copy of the same state files it kept in the victim’s home (Identification/ and Authorization/auth.db).
2. Check Chrome extensions and Native Hosts
# The fake extension ID from this case
find "$HOME/Library/Application Support/Google/Chrome" -maxdepth 3 -type d \
-name ppconlkbhfnachephglhgbhdgeapgjoj 2>/dev/null
# List every registered Native Messaging Host
ls -la "$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts/" 2>/dev/null
Then open chrome://extensions in every Chrome profile and look for:
- Extensions with Google-looking names whose ID is not the official one.
- Extensions not installed from the Web Store (the details page shows the source).
- Extensions that can “read and change all your data on all websites”, and whether you really need that.
Each .json under NativeMessagingHosts points to a binary. Run codesign -dv <path> on it to see whether it is properly signed. Something called google.chrome.diagnostics without a Google signature is a red flag.
3. Look for C2 connections
lsof -nP -i | grep -E ':(5202|5078|8443)\b'
grep check02id /etc/hosts
4. General warning signs
These rules still apply if the attacker renames everything:
| ID | Warning sign |
|---|---|
| H1 | A LaunchDaemon or Agent uses /bin/sh -c to run something under ~/Library or /Users/Shared |
| H2 | A root-owned, unsigned binary under ~/Library or /Users/Shared |
| H3 | A label mixing vendors (e.g. com.apple.google.*, com.safari.*) whose signer is not that vendor |
| H4 | An unsigned binary under NativeMessagingHosts |
| H5 | An extension not installed from the store but sitting in Chrome’s Extensions/ directory |
| H6 | An extension named like an official Google one with a different ID |
Also look out for any folder under /Users/ that matches no account on the machine, such as /Users/root.
To list every launch item, run sudo sfltool dumpbtm, or go through System Settings → General → Login Items & Extensions.
If you were compromised
Order matters: cut off the attacker’s sessions first, then clean the machine. Any new password typed on an infected Mac will be captured too.
Immediately (within 24 hours, from a separate clean device)
- Telegram: Settings → Devices → “Terminate all other sessions”; set or change the two-step verification password and check the login email.
- Google account: Security → sign out of all other devices, change the password, move to passkeys or a hardware security key.
- Crypto: create a wallet with a brand-new seed phrase on a clean device and move everything; revoke token approvals on the old addresses.
- Exchanges, banks, email, cloud services: log out all sessions, then change passwords, and check API keys and withdrawal whitelists.
- Change your macOS login password and Apple Account password.
Cleaning the infected Mac
In this case the steps were:
- Unload the launch items:
sudo launchctl bootout system/com.safari.sync.serviceandlaunchctl bootout gui/$(id -u)/com.apple.google.auth. - Kill the
cloudsyncand.authdsprocesses. - Before deleting anything, record each file’s SHA-256 and archive the samples encrypted for law enforcement or researchers.
- Delete every file and directory listed in step 1 of the self-check.
- Quit Chrome completely, remove the fake extension and Native Host from all 4 profiles, then confirm in
chrome://extensions. - Add
0.0.0.0 check02id.comto/etc/hoststo block the C2.
Before deleting /Users/root, check that it holds only the files from this case and nothing else.
But be honest with yourself: manual cleanup only removes what you already know about. This case proves it: the first pass missed the entire browser layer, and two rounds of manual review missed /Users/root, which only turned up when a sweep of about 610,000 files for the IoC strings was run. So:
Within a week
- Back up documents only (not applications, not
~/Library), then erase the disk and reinstall macOS. - On the fresh install, do not sync old extensions into Chrome; reinstall what you need from the Web Store.
- Report to local law enforcement and your national CERT, with the IoCs and samples.
Staying safe
- Join meetings only through the official app. Any meeting page asking you to “update the SDK”, “install an audio plugin” or “fix your microphone” is an attack. Zoom, Teams and Google Meet never need extra installs to join a call.
- Never type into a system password prompt you did not trigger yourself. Cancel first, then work out who asked.
- Keep crypto in a hardware wallet and never type a seed phrase into a computer.
- Check
chrome://extensionsnow and then, especially for official-looking extensions you do not remember installing. - If you suspect a compromise, log out of all devices first, then change passwords.
Indicators of Compromise (IoC)
For security teams and EDR rules.
Network
| Type | Indicator | Notes |
|---|---|---|
| Domain | check02id.com | C2 shared by the backdoor and the extension |
| IP | 83.136.210.180 | Resolution of the domain at the time of investigation |
| Port | TCP 5202 | cloudsync beacon every 60 seconds |
| Port | TCP 5078 | Extension HTTPS /update (cookies, keylogs) |
| Port | TCP 8443 | Extension HTTPS /update (screenshots) and wss://…/realtime command channel |
File hashes (SHA-256)
| File | SHA-256 |
|---|---|
cloudsync | 4a8059ae03301e8b0397c0c26f8b5d01fb1cb05c2563e1c2f538e11c74d37c3b |
.authds | 7f2e8e4432d80194aadca7f051e0f243ecf727af4a95bb4fd7af34490e27ea0b |
google.chrome.diagnostics | 7a0ee74dcdb2d30ef63884e2505799d7f95e670b628a5504f0f292424da37c3d |
com.google.chrome.diagnostics.json | 2e76e387b1f6a4412ce6840bf1221a1d7de4df619c78b35a4106b9e36dc2fcf4 |
Extension background.js | 764b5681720001dc9af9da4d7aa948abf2bd458336e0bd8ccb1b2d6fcb1d66f0 |
Extension content-script1.js | cac1539fe2e8aa9d2db9928a384554839ae6d597ec61ef01b1089e976035a586 |
Extension content-script2.js | 530e7a28e79c8fc8d1fd651066de29c6926ec187da3d5d132c87539daa32e879 |
.apple.auth | 1b5dc3dda3c4f3b26bb9d19f731b646a794feb095af5fb382f8896c473a8fd7d |
.com.apple.better.env | d62e7d144cfb2ad761661ec2befcd2aa09ed335faafc279cd51db3a0f4af8551 |
com.safari.sync.service.plist | c189e4a9c69b7f07ce9533646f5bcaac58876da05f11795572a53fabbcb6e758 |
com.apple.google.auth.plist | 5d97e4a0e8da6cff7d85b986d1de71e992bb977119580757d45650ddba527758 |
/Users/root/.../Authorization/auth.db | fc2c4fce5446a04d33d6dfe24014ec088033d4a984bd4d095ee901e633a77c99 |
Host paths and identifiers
/Library/LaunchDaemons/com.safari.sync.service.plist
~/Library/LaunchAgents/com.apple.google.auth.plist
~/Library/CloudSync/cloudsync
~/Library/Identification/.verify
~/Library/Staging/
~/Library/Application Scripts/ammad.Mac-Password-Popup/
~/Library/Application Support/Authorization/auth.db
/Users/root/Library/Identification/
/Users/root/Library/Application Support/Authorization/auth.db
/Users/Shared/.authds
/Users/Shared/.apple.auth
/Users/Shared/.com.apple.better.env
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/google.chrome.diagnostics
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.google.chrome.diagnostics.json
Chrome extension ID: ppconlkbhfnachephglhgbhdgeapgjoj ("Google Doc Sheets Offline" v1.97.1)
Hard-coded extension token prefix: jfweibd234HFIDhfiwef…
Key MITRE ATT&CK mappings
| Tactic | Technique |
|---|---|
| Initial Access | T1566.003 Spearphishing via Service (Telegram invite) |
| Credential Access | T1056.002 GUI Input Capture (fake password prompt) |
| Privilege Escalation | T1548.003 Sudo and Sudo Caching |
| Persistence | T1543.004 Launch Daemon, T1543.001 Launch Agent, T1176 Browser Extensions |
| Defense Evasion | T1036.005 Masquerading, T1564.001 Hidden Files, T1070.006 Timestomp |
| Credential Access | T1539 Steal Web Session Cookie |
| Collection | T1056.001 Keylogging, T1115 Clipboard Data, T1113 Screen Capture |
| Execution | T1059.004 Unix Shell (via Native Host) |
| Command and Control | T1071.001 Web Protocols, T1571 Non-Standard Port |
| Account Takeover | T1550.004 Web Session Cookie |
Further reading: the full reports
The full forensic data, timeline, UML diagrams and verification scope are in two de-identified documents (switch to Traditional Chinese from the footer):
The samples are live malware and are not publicly distributed. Security researchers and law enforcement can request them privately.
References
-
Google, “Native messaging,” Chrome for Developers. https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging ↩
-
MITRE, “ATT&CK Enterprise Matrix.” https://attack.mitre.org/ ↩
-
Kaspersky GReAT, “BlueNoroff APT campaigns GhostCall and GhostHire,” Securelist, Oct. 2025. https://securelist.com/bluenoroff-apt-campaigns-ghostcall-and-ghosthire/ ↩
-
Kaspersky, “GhostCall and GhostHire: hunting for crypto assets,” Kaspersky Daily, Oct. 2025. https://www.kaspersky.com/blog/bluenoroff-ghostcall-ghosthire-lazarus/54681/ ↩
-
The Hacker News, “BlueNoroff Deepfake Zoom Scam,” Jun. 2025. https://thehackernews.com/2025/06/bluenoroff-deepfake-zoom-scam-hits.html ↩
-
BleepingComputer, “North Korean hackers deepfake execs in Zoom call to spread Mac malware,” Jun. 2025. https://www.bleepingcomputer.com/news/security/north-korean-hackers-deepfake-execs-in-zoom-call-to-spread-mac-malware/ ↩