A malicious campaign used typosquatting to publish npm packages that delivered the Skuld infostealer, resulting in hundreds of downloads and likely credential theft. The actor (k303903, linked to aliases shegotit2 and pressurized) used obfuscated JavaScript to fetch and run a payload (download.exe) and exfiltrate data via webhooks. #Skuld #npm
Keypoints
- Threat actor k303903 (likely linked to shegotit2 and pressurized) published disguised npm packages to distribute the Skuld infostealer.
- Malicious packages (e.g., windows-confirm, windows-version-check, downloadsolara, solara-config) were downloaded over 600 times before takedown.
- Attack relied on typosquatting, obfuscated JavaScript, and commodity tooling (Obfuscator.io) to evade detection and fetch a payload named download.exe.
- Payloads were hosted on impersonating domains and developer platforms (replit, trycloudflare) and used webhooks for exfiltration (Discord/Telegram).
- IOC sets (package names, URLs, webhooks, SHA256 hashes) were enumerated for multiple aliases to aid detection and remediation.
- Recommendations emphasize layered defenses: verify authorship, use automated supply-chain scanners, and block suspicious dependencies early.
MITRE Techniques
- [T1195.002] Supply Chain Compromise – Delivered Skuld via malicious npm packages and typosquatting to compromise the software supply chain (‘typosquatting’ / ‘disguised malicious packages’).
- [T1059.007] Command and Scripting Interpreter: JavaScript – Malicious behavior implemented in package JavaScript that downloads and executes a binary (‘const fetch = require(“node-fetch”)’ / ‘exec(exeFilePath)’).
- [T1036.005] Masquerading: Match Legitimate Name or Location – Packages mimicked legitimate libraries and Windows utilities to deceive developers (‘masquerading as Windows-related utilities’ / ‘posed their malicious package as a legitimate library’).
- [T1027.013] Obfuscated Files or Information: Encrypted/Encoded File – Code was obfuscated using Obfuscator.io to evade detection (’employed Obfuscator.io’ / ‘deobfuscated, defanged, and annotated’).
- [T1546.016] Event Triggered Execution: Installer Packages – The package installation triggered fetching and execution of a downloaded executable (‘silently fetched and executed the malware under the filename download.exe’).
- [T1555.003] Credentials from Password Stores: Credentials from Web Browsers – Skuld targeted browsers to steal stored credentials and cookies (‘steal passwords, cookies, sensitive files, and browsing history from Chromium and Gecko-based browsers’).
- [T1552.001] Unsecured Credentials: Credentials In Files – Campaign likely exposed tokens and credentials present in files or dev environments (‘Credentials, tokens, and other sensitive data were likely stolen’).
- [T1567.004] Exfiltration Over Web Service: Exfiltration Over Webhook – Data exfiltration performed via Discord and Telegram webhooks (‘Discord webhook’ / provided webhook URLs in IOCs).
Indicators of Compromise
- [Malicious packages] npm package names used to distribute Skuld – windows-confirm, windows-version-check, and many more (aaaa89852889, downloadsolara, solara-config, plus numerous aliases across accounts).
- [Malicious URLs] Payload hosting and download endpoints – hxxps://alternatives-suits-obtained-bowl.trycloudflare[.]com/page, hxxps://971cfdde-59b5-4929-b162-6118a1825652-00-2zv0j6z5p6zi4.riker.replit[.]dev/page, and many additional replit/trycloudflare hosts.
- [Webhooks] Exfiltration endpoints used by the actor – Discord webhook hxxps://discord[.]com/api/webhooks/1316651715591667752/GNxf9DlNvCZmJ27gRfOlHCEVgvOG-kYbj6d2h5zaX48DpP41elqDEdBvoK1y4F1gpbbw; Telegram bot API hxxps://api.telegram[.]org/bot7740258238:AAFZwAKMURbNCg1N0L12TTCRXWYfqUe93To.
- [File name] Executable filename used by downloader – download.exe (the package writes and executes this filename when fetching the payload).
- [SHA256 hashes] Known payload hashes for detection – 27b86c1a24a1c97952397943f7b7ef21ee6859145556fe1b197e89074672bd07; and additional hash 3f78493b9bf7a448bec44c154343e6a372ebb0dc3188e61b4699f166896d7181 (other hashes exist for related aliases).
Read more: https://socket.dev/blog/skuld-infostealer-returns-to-npm