Impact: Notifications marked for deletion could be unexpectedly retained on the device
Description: A logging issue was addressed with improved data redaction.
Apple did not mark the vulnerability as exploited. However, recent news articles reported that the FBI used this vulnerability to extract Signal messages from a device seized in a criminal case. The suspect in the case used Signal to communicate. Signal is encrypted end-to-end and attempts not to store retrievable data on the device itself. However, Signal may display a notification on the screen whenever a new message is received. These notifications may include the sender's username and some of the message's content. Signal used Apple's Notification Services framework to generate these notifications, and iOS did not delete their contents even when they were marked for deletion.
The use of OS libraries and APIs like that has caused problems before, as they may not be designed with the same threat model in mind as the one used to create secure messaging applications.
--
Johannes B. Ullrich, Ph.D. , Dean of Research, SANS.edu
Twitter|
A few weeks ago, my honeypot logged an incident that changed how I think about modern attacks. A threat actor broke into my system using weak SSH credentials and immediately started running commands. What started as a routine resource-hijacking attempt was followed by credential harvesting targeting Telegram Desktop session data.
This incident isn't just another story about cryptocurrency mining malware. It's a window into how modern threat actors are evolving their tactics - chaining initial access with credential theft to enable persistent, multi-layered exploitation. The commands I observed tell a story of methodical reconnaissance, from checking for competing miners to hunting for Telegram's tdata directory.
In this post, I'll walk through what I found, explain why the tdata folder is so valuable to threat actors, and share practical ways to protect it and manage your sessions.
Before diving into the actual commands, let's establish what we're looking at. Modern attacks rarely consist of a single malicious action and instead follow a progression. Below is the attack chain and corresponding MITRE ATT&CK Techniques. [2]
What made this particular attack notable was the explicit targeting of Telegram's local session data. Threat actors aren't just after CPU cycles anymore—they're after persistent access through compromised accounts that can be leveraged for ongoing exploitation.
The following commands were captured in the honeypot's SSH logs immediately after the threat actor gained access. They show the threat actor’s intent to map the system, check for competition, and locate the tdata directory.
/ip cloud printifconfiguname -a cat /proc/cpuinfo #looks to have an issue with cloudflareps | grep '[Mm]iner' ps -ef | grep '[Mm]iner'ls -la ~/.local/share/TelegramDesktop/tdata /home/*/.local/share/TelegramDesktop/tdata /dev/ttyGSM* /dev/ttyUSB-mod* /var/spool/sms/* /var/log/smsd.log /etc/smsd.conf* /usr/bin/qmuxd /var/qmux_connect_socket /etc/config/simman /dev/modem* /var/config/sms/*locate D877F783D5D3EF8Csecho Hi | cat -n[Initial SSH Access]
|
_________V_________________________________________________________
| RECONNAISSANCE PHASE |
| • /ip cloud print → MikroTik RouterOS status,configuration |
| • ifconfig → Network interface enumeration |
| • uname -a → OS/kernel identification |
| • cat /proc/cpuinfo → Hardware capability assessment |
___________________________________________________________________
|
_________V_________________________________________________________
| MINER DETECTION |
| • ps | grep '[Mm]iner' → Check for competing miners |
| • ps -ef | grep... → Full process list scan |
__________________________________________________________________
|
_________V_________________________________________________________
| CREDENTIAL HARVESTING |
| • ls -la .../tdata → Locate Telegram session directory |
| • /home/*/... → Wildcard search for user accounts |
| • /dev/ttyGSM*, etc. → Modem/SMS 2FA bypass attempts |
___________________________________________________________________
|
_________V_________________________________________________________
| EXFILTRATION PREPARATION |
| • locate D877F783... → Specific tdata folder lookup |
| • echo Hi | cat -n → Shell verification |
| • [Compress & upload] → Likely next step (not captured) |
__________________________________________________________________
While the timeline shows what happened, understanding the why requires looking at the attack from a strategic view. Each command serves a specific purpose in a larger plan.
The initial reconnaissance (ifconfig, uname -a) was an attempt to confirm the system had the processing power to support a cryptominer and the network connectivity to send data out. Next came the miner detection phase (ps | grep). If the threat actor found an existing miner, they would need to remove those processes to free up resources and avoid conflicts before installing their own.
The next set of commands gets interesting as the threat actor shifts focus to Telegram Desktop tdata. This move reveals that stealing CPU cycles is a short-term gain, whereas stealing the Telegram session is a long-term asset. The threat actor searched for modem devices and SMS logs to get around the victim's two-factor authentication (2FA). This ensured that even if the stolen session stopped working, the threat actor could still reset the account password via SMS to take full control. This shows a clear shift from just using someone's computer for a quick profit to stealing their digital identity for long-term use.
Understanding why the tdata folder is so valuable is essential for defense. This directory contains the session data that authenticates the user to Telegram's servers.
According to an Imperva Threat Research report from 2025 regarding the sale of Telegram identities [3], copying the tdata folder to another machine grants a threat actor full access to the victim's Telegram account without needing the phone number or two-factor authentication code.
The session information stored in tdata acts as persistent login credentials. Because the authentication tokens are self-contained within the folder, the threat actor doesn't need to re-authenticate or bypass 2FA. They simply need to move the folder to a machine where they can run Telegram.
This flexibility is what makes the attack so dangerous. The threat actor does not need a specific version of the software, such as ‘Telegram Portable.’ Any standard Telegram Desktop client works because:
Below are scenarios on how a threat actor may use stolen tdata:
tdata folder from the victim's system.tdata folder with the victim's copy.tdata folder on the victim's system.tdata to a USB drive or portable installation.Because the session appears as a legitimate login from a new device, it is often indistinguishable from normal user activity, making detection difficult without specific monitoring of the tdata directory.
Here are the most effective steps to protect your system and your Telegram account.
Implement File Integrity Monitoring by setting up alerts for any access to the tdata directory. If a process other than Telegram itself tries to read or copy files in that folder, you want to know immediately.
Harden SSH Access since many of these attacks begin with weak SSH credentials. The most effective fix is to disable password authentication and use SSH keys instead. If you must use passwords, make them long and unique.
Monitor for Reconnaissance Commands such as grep, '[Mm]iner', ls -la .../tdata, or searches for modem devices /dev/ttyGSM*, and treat them as critical alerts. These aren't normal user activities and usually indicate a threat actor is mapping your system.
Conduct Regular Session Audits by navigating to Telegram Settings > Privacy and Security > Active Sessions. If you see a device or location you don't recognize, terminate it immediately. This is your first line of defense if tdata is stolen.
Log Out of Unused Devices because every device you're logged into is a potential entry point. If you're not actively using Telegram on a laptop or tablet, log out. Fewer active sessions mean fewer targets for threat actors.
Consider Mobile Usage as these devices offer better session controls. Telegram on iOS and Android supports biometric authentication and makes it harder to exfiltrate session data via file copying. If you're concerned about tdata theft, use Telegram primarily on mobile.
Enable Two-Factor Authentication (2FA) even though tdata theft bypasses it. 2FA protects against standard account takeovers where the threat actor doesn't have your session token, and it could make it harder for the threat actor to reset the password after the session expires.
Monitor for Telegram Bot API Traffic since threat actors often use the Telegram Bot API to send stolen data or receive commands. Research by SonicWall [4] has documented campaigns where phishing emails deliver HTML attachments that exfiltrate credentials directly to Telegram bots, highlighting the need to monitor for this traffic.
Block Known Malicious IPs as many of these attacks come from known command-and-control servers. Subscribe to threat intelligence feeds that track Telegram-based attack infrastructure and block those IPs at your firewall.
Despite Telegram banning millions of accounts, threat actors continue to migrate to the platform due to its infrastructure simplicity, encryption, and massive scale. The platform's marketplace ecosystem and resilience against take-downs make it an attractive venue for criminal activity. According to Beeble.com's analysis ‘The Great Telegram Purge: Why 43 Million Bans Couldn’t Break the Cybercrime Grip’ [5], Telegram has evolved from a messaging app into a comprehensive criminal infrastructure platform.
Silobreaker's research [6] further indicates that ransomware groups like BlackCat use Telegram for both data exfiltration and selling stolen credentials on public marketplaces, while Kaspersky [7] notes that Telegram has become a hub for crypto scams, generating millions in fraudulent revenue through fake support bots and investment channels.
The multi-layered attack captured in my honeypot reflects current priorities in the threat landscape. The combination of cryptojacking reconnaissance with Telegram credential harvesting demonstrates that threat actors are thinking beyond simple resource theft. They are building persistent access through account takeover to enable ongoing exploitation.
The key insight is that Telegram's features, while legitimate for many users, have been repurposed by threat actors for credential theft, C2 communication, and data exfiltration. Defenders must monitor not just for malware installation, but for the specific indicators of credential harvesting that enable account takeover and lateral movement through social channels.
By understanding the attack chain, recognizing the indicators, and implementing robust protections for the tdata folder and session management, we can better protect ourselves against these evolving threats.
Acknowledgments: This analysis was assisted by Lumo AI (Proton) [8] for content organization and structuring.
[1] https://www.sans.edu/cyber-security-programs/bachelors-degree/
[2] https://attack.mitre.org/techniques/
[3] https://www.imperva.com/blog/telegram-identity-theft/
[4] https://www.sonicwall.com/blog/threat-actors-caught-using-telegram-bot-to-harvest-credentials
[5] https://beeble.com/en/blog/the-great-telegram-purge-why-43-million-bans-couldn-t-break-the-cybercrime-grip
[6] https://www.silobreaker.com/blog/cyber-threats/mapping-threat-actor-abuse-of-telegram-from-c2-to-hacktivism/
[7] https://www.kaspersky.com/blog/phishing-and-scam-in-telegram-2025/54090/
[8] https://lumo.proton.me
--
Jesse La Grew
Senior Handler
It's a proper .wav file, but they didn't use staganography. The .wav file will play, but you'll just hear noise:

That's because the TAs have just replaced the bytes that encode the sound with the BASE64 representation of their payload:

Thus I don't need a .wav parser to extract the encoded payload, I can just use my base64dump.py tool:

The BASE64-decoded payload is an XOR-encoded PE file. So I don't need to make a custom decoder, I can just perform a known-plaintext attack looking for the DOS header with my xor-kpa.py tool:

The XOR key was found. Thus we can easily dump the decoded PE file and see the MZ header at position 0x08 and a bit further down the DOS header we used in the known-plaintext-attack:

And my tool pecheck.py can extract an analyse the sample:

Didier Stevens
Senior handler
blog.DidierStevens.com
The root cause of this explosion is structural: the security research community has grown dramatically, bug bounty programs, automated scanning has industrialised vulnerability discovery, and software supply chains expose orders of magnitude more attack surface than legacy monolithic architectures ever did. And don’t forget AI used more and more to find vulnerabilities!
Every CVE receives a CVSS (Common Vulnerability Scoring System) that is a score between 0 and 10 attempts to express the intrinsic severity of a vulnerability. This score is based on core questions like: How bad it is if exploited? How complex exploitation is? What privileges are required? And what impact on confidentiality, integrity, and availability to expect?
CVSS is a well-designed standard, and is useful. But it remains challenging to perform the initial triage: Which CVEs deserve to be investigated first? A CVSS 9.8 that sits dormant in an obscure software is less dangerous in practice than a CVSS 6.5 actively chained in ransomware campaigns!
The Exploit Prediction Scoring System (EPSS) was developed by FIRST (Forum of Incident Response and Security Teams)[2] and has gone through successive iterations since its public launch in 2021, with EPSS v3 released in March 2023 as the current production model. Its design philosophy is fundamentally different from CVSS: instead of rating theoretical impact, EPSS answers a probabilistic question. We already talked about EPSS a long time ago[3] but it does get enough attention from the community (IMHO)
How does it work?
EPSS = P(exploitation within 30 days | CVE is published)
Score range: 0.00001 → 1.0 (probability)
Model: gradient-boosted machine learning (XGBoost)
Input features: ~1,400 signals updated daily
Data sources: exploit databases, darkweb telemetry, threat intel feeds, PoC repositories, NVD metadata
Theory is nice but let’s be more pragmatic! FIRST offers an API to query for EPSS scores:
$ curl -s https://api.first.org/data/v1/epss?cve=CVE-2026-23099 | jq .
{
"status": "OK",
"status-code": 200,
"version": "1.0",
"access": "public",
"total": 1,
"offset": 0,
"limit": 100,
"data": [
{
"cve": "CVE-2026-23099",
"epss": "0.000180000",
"percentile": "0.044770000",
"date": "2026-04-19"
}
]
}
How to automate this? Most SIEM or log management solutions can interact with external services through APIs. Let me show you how I enrich my vulnerabilities alert in Wazuh.
I set up an integration[4] that will query the EPSS score of CVEs detected in my environment:
A Python script will be invoked when a vulnerability is detected (with alert group "vulnerability-detector", the fetched EPSS score will be used to create a new alert with more relevant data:
<integration> <name>custom-epss</name> <group>vulnerability-detector</group> <alert_format>json</alert_format> </integration>
The new rules:
<group name="epss,vulnerability,enrichment">
<rule id="120200" level="3">
<decoded_as>json</decoded_as>
<field name="integration">epss</field>
<description>EPSS enrichment event received for $(epss.cve)</description>
<options>no_full_log</options>
</rule>
<rule id="120201" level="5">
<if_sid>120200</if_sid>
<field name="epss.risk_label">low</field>
<description>EPSS: $(epss.cve) — Low exploitation probability (score=$(epss.score_pct)%)</description>
</rule>
<rule id="120202" level="9">
<if_sid>120200</if_sid>
<field name="epss.risk_label">medium</field>
<description>EPSS: $(epss.cve) — Medium exploitation probability (score=$(epss.score_pct)%)</description>
</rule>
<rule id="120203" level="12">
<if_sid>120200</if_sid>
<field name="epss.risk_label">high</field>
<description>EPSS: $(epss.cve) — High exploitation probability (score=$(epss.score_pct)%)</description>
</rule>
<rule id="120204" level="15">
<if_sid>120200</if_sid>
<field name="epss.risk_label">critical</field>
<description>EPSS: $(epss.cve) — CRITICAL exploitation probability (score=$(epss.score_pct)%)</description>
<group>pci_dss_6.3.3,nist_800_53_SI.2,gdpr_IV_35.7.d,hipaa_164.308.a.5,tsc_CC7.1</group>
</rule>
<rule id="120205" level="3">
<if_sid>120200</if_sid>
<field name="epss.cached">True</field>
<description>EPSS: $(epss.cve) — Score served from local cache (age < 24h)</description>
</rule>
</group>
Here is an example of alert:

The script sets the risk based on this:
if score >= 0.90:
return "critical"
if score >= 0.50:
return "high"
if score >= 0.10:
return "medium"
return "low"
The Python integration script is available here[5].
[1] https://www.cvedetails.com/browse-by-date.php
[2] https://www.first.org/epss/
[3] https://isc.sans.edu/diary/EPSScall+An+Exploit+Prediction+Scoring+System+App/28732
[4] https://documentation.wazuh.com/current/integrations-guide/index.html
[5] https://xameco.be/files/custom-epss.py
Xavier Mertens (@xme)
Xameco
Senior ISC Handler - Freelance Cyber Security Consultant
PGP Key