Security researchers at Aikido identified two malicious Python packages on the Python Package Index (PyPI)—spellcheckerpy and spellcheckpy—masquerading as legitimate spell-checking utilities but containing hidden functionality to deliver a remote access trojan (RAT). The packages were removed from PyPI after being downloaded a little over 1,000 times, highlighting ongoing software supply-chain risk in public repositories.
Analysis indicates the attacker hid a Base64-encoded payload inside a Basque-language dictionary resource (resources/eu.json.gz) copied from the legitimate pyspellchecker project, rather than placing obvious malicious logic in __init__.py. Early releases were intentionally dormant (payload present but not executed), but spellcheckpy v1.2.0 introduced an obfuscated execution trigger that runs on import and can be activated via a function call such as test_file("eu", "utf-8", "spellchecker"), which extracts the embedded downloader under a spellchecker key. The downloader retrieves a Python RAT from updatenet[.]work, a domain linked to infrastructure (including 172.86.73[.]139) associated with malicious hosting activity, and the RAT supports host fingerprinting, command parsing, and remote command execution.

Trace attribution and downstream blast radius.
4 events from the most recent confirmed update back to the earliest known activity.
The malicious spellcheckerpy and spellcheckpy packages were removed from PyPI after they had been downloaded more than 1,000 times. Their removal followed public identification of the packages' hidden RAT functionality.
Aikido researchers identified spellcheckerpy and spellcheckpy as malicious packages delivering a remote access trojan through PyPI, and linked the hosting infrastructure to an IP operated by RouterHosting LLC (Cloudzy). The campaign was also noted as resembling a November 2025 fake spell-checking package incident.
Attackers published the PyPI packages spellcheckerpy and spellcheckpy, masquerading as spell-checking tools while concealing a Base64-encoded malicious payload inside a Basque dictionary resource file. Early versions contained dormant or downloader-only functionality that did not yet execute the full malware on import.
Version 1.2.0 of spellcheckpy was released with an obfuscated trigger that executed on import, activating a downloader to retrieve a Python-based remote access trojan from updatenet[.]work. This marked the shift from hidden staging logic to active malware delivery.
Vulnerabilities, threat actors, malware, products, organizations, breaches, and observables Mallory has linked to this story. Indicator values are masked here and available in full in the app.
Indicator values are masked on this page. See the values in Mallory Domains, IPs, hashes, and URLs are exportable to your SIEM.
See attribution and downstream blast radius, and whether this package or vendor reaches your builds.
2 references tracked. Mallory keeps watching after this page renders.
Map indicators from this story to your assets and identify affected systems in minutes.
Every observed campaign, victim, and pivot linked to actors named in this story.
Malware, exploits, and IOCs connected to the activity described here.
YARA, Sigma, and Snort rules deployed to your SIEM as soon as they’re published.
Get matching new stories delivered to your team as they break — not the next morning.
Ask questions about this story and take action on the answers.