Search/example[.]com
● IOC

example[.]com

Type
DOMAIN
Source
News extraction
First seen
Oct 2, 2025
Last seen
Oct 21, 2026
Look up on VirusTotal
Related Stories
2
Stolen UpdraftCentral keys used to backdoor WordPress sites
Unknown threat actors breached TeamUpdraft's website and potentially gained unauthorized access to customers' connection keys for UpdraftCentral, UpdraftVault, and UpdraftClone, using them to backdoor WordPress sites. TeamUpdraft is the developer behind UpdraftPlus, a popular WordPress backup plugin with over four million active installations. The vendor also offers UpdraftCentral, a remote management service that's used for managing multiple sites remotely. A client component of UpdraftCentral is shipped within every copy of UpdraftPlus. "Over the weekend of 17-18 October we identified unauthorized access to the teamupdraft.com website," TeamUpdraft said in a statement. "Our team responded straight away and worked through the night to contain it – we closed the access route, signed out every account and replaced the keys and credentials that could have been affected." As a result of the incident, threat actors are believed to have accessed its customer database, which holds the following information - Names, email addresses, billing addresses and order history Account passwords, stored only in hashed (scrambled) form and never in plain text Two-factor authentication (2FA) settings Connection keys for UpdraftCentral, UpdraftVault and UpdraftClone TeamUpdraft said the database does not hold any financial information, and that they are handled by Stripe and PayPal. It also emphasized that the UpdraftPlus plugin, along with self-hosted versions of UpdraftCentral and backups sent to customers' own remote storage, are not impacted. "However, if your site was accessed through UpdraftCentral, please also re-authorise your remote storage and change any storage access keys, as a precaution," it said. In addition, TeamUpdraft said it deployed a fix to address the underlying issue, signed out every teamupdraft.com account and reset login security across the site, and released UpdraftPlus 1.26.13 (free) and 2.26.13 (Premium) to automatically disconnect every UpdraftCentral connection made before 10 p.m. BST on October 18, 2026, to prevent the old keys from working. Other steps taken by the developer are listed below - Disconnected every site from UpdraftVault and issued new credentials Replaced every UpdraftClone client key Rotated its keys with payment providers and other connected services Implemented additional monitoring in place Reported the incident to the U.K. Information Commissioner's Office (ICO) and other relevant authorities Users who have a teamupdraft.com account are advised to change their password with immediate effect (and elsewhere, if the same password has been reused), reset 2FA settings, and exercise caution when receiving unexpected emails claiming to be from TeamUpdraft. TeamUpdraft is also recommending that cloud customers of UpdraftCentral follow the steps below as soon as possible, since the connection keys can send commands to the connected sites - Log in to the site's own WordPress dashboard, not through UpdraftCentral. Update UpdraftPlus to version 1.26.12 (free) or 2.26.12 (Premium) or later. Disconnect it from UpdraftCentral: go to Settings > UpdraftPlus > Advanced Tools > UpdraftCentral and delete the connection key. Go to Users and check for any administrator accounts you don’t recognise. Remove them. Go to Plugins, including the Must-Use tab if you can see it, and check for anything you don’t recognise. Remove it. Change the passwords for all administrator accounts on the site. If you find anything suspicious, consider restoring the site from a backup taken before 17 October. Reconnect the site to UpdraftCentral. UpdraftVault users are being urged to reconnect their sites to the backup service, and UpdraftClone users who have created a client key are required to copy the new keys from My Account > UpdraftClone > UpdraftClone Key Management and share them with their clients. The development comes as WordPress security company Patchstack said it observed an attacker holding valid UpdraftCentral dashboard keys issuing commands to install backdoor plugins on connected WordPress sites. The campaign is said to have run continuously through an 18-hour window on October 18 and 19, 2026. "The attacker sends a signed plugin.upload_plugin command over the plugin's remote procedure call channel, which listens on ordinary POST requests to the site root. WordPress installs and activates the supplied plugin through its standard installer," Patchstack security researcher Dave Jong said. Slovakia-based penetration testing company Nethemba, which first detected the attack in the wild, has described the rogue plugin as a backdoor that hooks into every request to the site to check if the URL contains the parameter "?_9f5696=" and compares it with a 32-character token. If a matching token is detected, it creates a user "data-ops43" with the display name "Site Tools," assigns it the Editor role, and grants the account "manage_options" and "install_plugins" permissions, allowing the operator to upload arbitrary PHP plugins and open site settings. "Enabling registration and setting the default role to administrator is enough for the attacker to create a full administrator," Nethemba said. "On a standard WordPress site, an Editor also has unfiltered_html, so the account can put JavaScript into posts that runs in the browser of every administrator." "The backdoor has a second layer as well. The account it creates, with a known password, stays in WordPress even after the plugin is removed, and the attacker can log in with it through the normal login form unless two-factor authentication is enabled for that account." Although an early version of the plugin suffered from a coding error that causes impacted sites to fail with error 500, Nethemba said the threat actor deleted the broken backdoor by sending a "plugin.delete_plugin" command and then uploaded a working version that creates a full administrator account or logs in as an existing administrator. WordPress site owners are advised to check for the following indicators of compromise - Plugin names: Site Health Cache or Site Health 364F, Asset Forge 2, Content Helper, Wp Forge, Query Shelf, Style Bridge 8F5, Media Kit 183, Query Shelf, Post Dock 776, Nav Hub, Speed Desk, Speed Kit 300, Link Latch, Script Shelf, or Feed Case Account names: system_team850, web.tech988, cmseditor170, cms.tech644 or web_mgr684, with an email at @example.com and a display name such as System Team, Web Tech, System Staff, System Ops, or Cms Tech IP addresses: 43.250.53.42 and 2a09:bac5:4e21:2e3c::49b:9 In all, Patchstack said it observed 99 distinct backdoor plugin names, with each sample carrying the line "Small maintenance toolkit: keeps option storage tidy." Wordfence, which published its own analysis of the incident, said a WordPress site may be affected if the below criteria are satisfied - The site had UpdraftPlus Free or UpdraftPlus Premium installed and active while the affected UpdraftCentral connection key was present. The site has, or had during the incident, an active connection key for TeamUpdraft’s cloud-hosted UpdraftCentral service. "This is the second incident in this channel in five months," Patchstack warned. "In June 2026 the vendor fixed CVE-2026-10795 (CVSS 8.1), where an obsolete unsigned message format let an attacker forge UpdraftCentral commands with no keys at all. That was fixed in 1.26.5 and 2.26.5, but exploitation attempts continue, so sites below those versions face both problems at once." The development comes days after the website of the Rank Math PRO WordPress plugin was hit by a software supply chain attack, causing users who downloaded version 3.0.123 between October 15 at 8:02 p.m. UTC and October 16 at 7:12 a.m. UTC to receive compromised versions that planted hidden backdoors. The incident has been assigned the CVE identifier CVE-2026-111862 (CVSS score: 9.8). The issue was fixed in Rank Math PRO version 3.0.124. "The malware may establish persistent access, communicate with rank1cdn[.]com, recreate hidden backdoors on page visits, and expose WordPress credentials, database credentials, API keys, and other secrets accessible to the web server," Wordefence said. The findings also coincide with an advisory from PHP, which said it intends to ship a security release that fixes two critical vulnerabilities (CVE-2026-109618 and CVE-2026-109619, CVSS scores: 9.2), as information about the flaws leaked ahead of their scheduled disclosure. The flaws have been codenamed PHP2Shell. According to watchTowr CEO Benjamin Harris, the vulnerabilities affect PHP versions 5, 6, 7, and 8, and were originally due for release on October 22 at 11 a.m. ET. "PHP is everywhere. It quietly powers WordPress, Drupal, Joomla, and Magento sites, shared hosting platforms, control panels, and an awful lot of software that doesn't even advertise that it runs PHP under the hood," Huntress said. "When a critical bug lands in PHP itself, rather than in one app built on top of it, the number of places you have to go looking to identify vulnerable PHP versions gets very big, very fast."
1 shared
Oct 21, 2026
JFrog: rilevato sfruttamento in rete delle vulnerabilità CVE-2026-42016 e CVE-2026-42018 in Artifactory
JFrog Artifactory instances continue to get hit hard. Multiple attackers are exploiting three JFrog Artifactory bugs to gain administrative control over vulnerable instances - in some cases, just days after the vendor published a patch - and then using this illicit access to install malicious plugins and backdoors. The three vulnerabilities are: CVE-2026-42018 is a high-severity, improper authentication flaw that can return an internal anonymous-user token to an unauthenticated caller when anonymous access is disabled. An attacker can use this token to authenticate to the repository manager and then access sensitive resources. JFrog patched this vulnerability on August 12. CVE-2026-42016 is a high-severity privilege-escalation bug. Artifactory doesn’t properly validate the token’s scope, and this can allow an attacker with low-privileged access to elevate privileges and perform actions that they should not be allowed to do. JFrog fixed this one on July 27. CVE-2026-82329 is a critical authentication-bypass vulnerability that allows unauthenticated attackers with network access to obtain administrative privileges. JFrog published a patch for it on August 28. Earlier this month, security researchers told The Register that miscreants began battering internet-exposed systems vulnerable to CVE-2026-82329 just four days after JFrog disclosed the bug. In addition to creating new administrative credentials, watchTowr’s honeypot network caught miscreants “enumerating users, groups, credential sets and federated access topologies,” said Yordan Ganchev, principal threat intelligence specialist at watchTowr. The one thing everyone agrees upon is that attackers didn’t start exploiting any of these CVEs until after JFrog issued fixes. In a Thursday report, Wiz security researchers “confirmed in-the-wild exploitation of all three vulnerabilities across multiple environments,” and noted that “patching velocity has been slow.” JFrog has not responded to any of The Register’s inquiries about attacks against any of the three CVEs. 'Patching velocity has been slow' Six weeks after JFrog disclosed CVE-2026-42016, 59 percent of organizations remain vulnerable, and 62 percent remain vulnerable to CVE-2026-42018 after four weeks. Organizations have been quicker to remediate the critical bug, CVE-2026-82329, although 49 percent remain vulnerable two weeks after its publication, according to Wiz. Beginning August 15 and running through September 8, Wiz spotted “multiple” attackers chaining CVE-2026-42018 and CVE-2026-42016 against self-hosted Artifactory instances to gain admin access. Many of these intruders then dropped a custom Rust backdoor to establish command-and-control (C2) capabilities. While the post-exploitation activity varies, Wiz reports observing attackers doing all types of mischief with their administrative access to compromised Artifactory instances, including establishing persistent admin accounts, installing Groovy plugins to achieve remote code execution on the server, executing shell commands run through the plugin to perform reconnaissance and scan for sensitive files, deliver second-stage payloads, and upload web shells. Then, between September 1 and 8, Wiz saw “several” attackers exploiting CVE-2026-82329. These intrusions were not a “unified attack chain by a single threat actor,” but spanned multiple illicit behaviors including exfiltration of configuration details, establishing persistent admin accounts, token minting for long-lived credentials, stealing keys, attaching their own SSH keys to created users in some cases, and enumerating users, repositories, and tokens. If you haven't already, patch vulnerable instances Wiz advises - and we strongly concur - upgrading to a fixed Artifactory version as soon as possible. “Given that exploitation may be possible remotely without authentication under the default configuration, organizations should prioritize internet-accessible Artifactory instances and restrict network access to trusted users and systems where possible,” the researchers added. “Organizations should also review Artifactory authentication and administrative activity for unexpected privileged access.” These latest exploits follow a rough few months for JFrog's package management system, which has been under fire from both human and AI attackers. OpenAI and JFrog revealed that OpenAI’s models broke out of their cages to hack Hugging Face by exploiting an Artifactory zero-day in July, and at Black Hat, the model provider said agents used Artifactory to build message boards and help each other access the open internet. ®
1 shared
Sep 14, 2026
Connections
7 relationships
The Machine With Many Faces: Post-Exploitation Identity Misuse in SPIFFE/SPIRE
This research demonstrates post-exploitation techniques that could allow an attacker with root access on a compromised Kubernetes node to misuse an open standard and reference implementation for machine identity known as SPIFFE/SPIRE to impersonate co-located workloads and harvest SPIFFE Verifiable Identity Documents (SVIDs). We show how the trust assumption at the core of every machine-identity system — that the node is trusted — collapses once an attacker obtains root on that node. Unit 42 has not observed this technique exploited in the wild. The Secure Production Identity Framework for Everyone (SPIFFE)/the SPIFFE Runtime Environment (SPIRE) is widely deployed in Kubernetes and cloud-native environments to replace long-lived secrets with short-lived, cryptographically verifiable workload identities. Our research shows how an attacker with root can spoof the Linux control group (cgroup) information the SPIRE agent uses during workload attestation. This tricks the agent into issuing a co-located workload's SVID to an attacker-controlled process. As part of this research, we developed Spooffe, an open-source tool that defenders can use to test whether an attacker with administrative access could manipulate cgroup metadata to retrieve co-located workload identities and assess the resulting identity area of impact. When designing threat models for SPIFFE/SPIRE, organizations should assume that root-level access to a node grants access to all cryptographic identities scoped to it. We recommend performing the following activities to reduce exposure: Harden nodes Restrict root access Prohibit privileged containers, host access Minimize reliance on weak selectors Palo Alto Networks customers are better protected from the threats described here through the following products and services: If you think you might have been compromised or have an urgent matter, contact the Unit 42 Incident Response team. SPIFFE is an open standard for machine identity designed to solve the “Secret Zero” problem — the challenge of securely introducing the initial secret required to bootstrap trust — by replacing long-lived secrets with short-lived workload identities. When deployed correctly, SPIFFE enforces strong identity boundaries between workloads. However, these guarantees rely on a core assumption shared by all identity systems that the underlying node is trusted. If an attacker gains root access to a node, they can interact with identity mechanisms to retrieve all identities authorized to that compromised node. Our research explores how attackers can exploit root access to harvest workload identities from a compromised node. In this post, we lay the groundwork by explaining machine identity and how SPIFFE establishes and verifies trust in cloud-native environments. We then demonstrate workload impersonation through selector spoofing. Finally, we introduce Spooffe, a tool we built to automate the extraction of these workload identities (SVIDs). Note to readers: If you’re already familiar with SPIFFE/SPIRE concepts and architecture, you can jump directly to Workload Attestation and How the Agent Attests the Workload sections. Consider a scenario where two applications, a frontend and a backend, must communicate securely. We could generate key pairs and exchange public keys to communicate through Mutual Transport Layer Security (mTLS), but this option raises a few key questions: Who rotates those keys? Who revokes them if the app is compromised? Can we verify who/what is presenting the keys? SPIFFE addresses these issues by standardizing how machines are named and how short-lived credentials are issued. The term machines refers to two broad categories: Workloads: Containers, processes and services running application logic Devices: Endpoints such as desktops, mobile devices and internet of things (IoT) or operational technology (OT) systems - (Note: Device identity is not part of the core SPIFFE specification) Each workload is assigned three identity components: SPIFFE ID: Who you are (your name) SPIFFE Verifiable Identity (SVID): Proof that you are who you are claiming to be (your credentials) Trust Bundle: How others verify that a trusted authority issued your credential Let’s go into a little more detail about each of these. SPIFFE ID is a canonical name for a workload identity that follows a URI-style format like spiffe:// / (Figure 1). The middle part (example[.]com) in Figure 1 is the trust domain, the issuer of identity that acts as a security boundary. In this way, workloads can have an identity and know who to communicate with. However, identity alone does not guarantee trust or security, so we add the SPIFFE Verifiable Identity Document (SVID). This is a short-lived credential that a workload presents to prove its identity. It is cryptographically signed by the certificate authority (CA) server and always includes the workload's SPIFFE ID. SVIDs support two primary formats: X.509 SVID: A certificate with an embedded public key, typically used for mTLS JSON Web Token (JWT) SVID: A signed JWT token used as a bearer token for application-level authorization Finally, we have the trust bundle, which is a set of trust anchors — root CA certificates or JSON Web Key Sets (JWKS). These are used to verify that a trusted authority issued an SVID within a trust domain. To understand how these identity components are issued and verified in practice, we first need to look at the SPIRE architecture and its core runtime components. SPIRE is a production-ready implementation of the SPIFFE specification. While several implementations exist, we chose SPIRE for this research because it is widely deployed in Kubernetes environments and fully implements the SPIFFE standard. Furthermore, because SPIRE is open source, we can inspect its internals to understand how the specification works in practice. SPIRE is composed of a few simple pieces (as shown in Figure 2 below): Workload: A single piece of software deployed to do a specific job (e.g., a process, container, pod) SPIRE Server (control plane): This is the CA that stores registration entries. It also issues and cryptographically signs SVIDs. Additionally, it publishes the trust bundle for the trust domain. SPIRE Agent: This runs on every compute node (e.g., a Kubernetes node, VM or bare-metal host). It performs the following activities: - Accepts requests from workloads locally over the Workload API (UNIX socket) - Communicates with the server via the Node API - Performs attestation - Caches SVIDs - Handles rotation Registration entries and selectors: These are server-side policy objects that define which workloads are allowed to receive which SPIFFE IDs. When a workload requests an identity, the SPIRE agent collects runtime attributes (selectors) about the workload and the server compares them against registration entries to determine which identity, if any, should be issued. With the SPIRE architecture in mind, we can now walk through how workload-to-workload identity verification works end to end. When workload A needs to communicate with workload B over mTLS, it requests a short-lived credential from the local SPIRE agent. The agent attests the workload and forwards the attestation data to the SPIFFE server. Based on predefined registration policies, the server selects the appropriate SPIFFE ID for the workload and issues a short-lived X.509 SVID. The server also publishes the corresponding public keys as part of the trust bundle. When workload A initiates a connection, it presents its SVID during the mTLS handshake. Workload B verifies the SVID by validating the signature against the trust bundle, checking the certificate’s expiration, and confirming that the SPIFFE ID matches an expected identity. If these checks succeed, workload B can cryptographically authenticate workload A and establish a secure connection. This enables workload-to-workload communication based on identity rather than long-lived secrets (Figure 3). The identity flow described above depends on attestation, the process by which SPIRE determines whether a workload is allowed to receive an identity. SPIRE performs attestation at two levels: Node attestation establishes trust in the agent running on a node Workload attestation determines the identity of individual workloads In this post, we focus on workload attestation, as it is the mechanism directly involved in selector evaluation and the attacks discussed later. Before the agent attests the workloads, the SPIRE server’s administrator must register the workload selectors in the SPIRE server so it can later compare them to the selectors in the agent. In this Kubernetes example, the registration entry authorizes any pod running in the default namespace and using the default service account to receive the specified SPIFFE identity (spiffeID). The resulting record is stored on the SPIRE server as follows: The SPIRE agent periodically synchronizes and caches these registration entries from the server, using them locally during workload attestation to determine which identity applies. The agent generates key pairs for each registration entry, sends certificate signing requests (CSRs) to the server and caches the resulting SVIDs. When a workload wants to authenticate, it requests an identity from the agent over the Workload API (Figure 4, step 1). The agent performs workload attestation (Figure 4, step 2) by gathering selectors from the workload process and matching them against cached registration entries. Upon a successful match (Figure 4, step 3), the agent returns: X.509 SVID Private key Trust bundle Note: This example is based on an X.509 SVID request. For JWT SVID requests, the agent returns only a signed JWT token. With the high-level flow in mind, we can now examine how attestation works in practice. When a workload requests an SVID (via FetchJWTSVID or FetchX509SVID), it connects to the agent Workload API, typically via a Unix domain socket (such as /run/spire/sockets/agent.sock). The agent then extracts the PID for the calling process. Once the agent receives the PID, it passes it to the configured workload attestor plugins, which collect selectors based on process and container metadata. SPIRE agents support several workload-attestor plugins. Common plugins include docker, k8s, systemd, Unix and Windows. In our cluster, the agent uses the k8s and Unix plugins. The k8s plugin uses the workload PID to access /proc/ /mountinfo or /proc/ /cgroups. It calls GetPodUIDAndContainerID to extract the pod UID and the container ID. In our environment, this process looks like the following: After extracting the container ID and pod UID, the k8s plugin queries the kubelet to retrieve pod metadata. To do this, it uses the SPIRE agent’s service account token, stored at /var/run/secrets/kubernetes.io/serviceaccount/token. The agent's service account has the following permissions, which allow it to list pods and access node information: Using this token, the plugin calls getPodList to retrieve all pods on the node. It then identifies the pod whose UID and container ID match the values extracted from the /proc directory. Once matched, it collects selectors from the pod's metadata: The Unix plugin gathers information from /proc to produce selectors such as user identifier (UID) and group identifier (GID). These selectors are used during workload attestation to bind a workload’s identity to operating system level properties of the calling process, helping SPIRE distinguish between different workloads running on the same node. Here is an example of the selectors it collects: The agent combines these selectors from both the k8s and Unix plugins. It then matches this selector set against the locally cached registration entries. If an entry's selectors are a subset of the workload's selectors, the agent returns the corresponding cached SVID to the workload. This attack requires root-level access to the node. Our analysis revealed that workload attestation relies heavily on the workload’s cgroup path. An attacker with root access on the node can manipulate this cgroup path, potentially tricking the agent into believing the attestation claims belong to a different workload and obtain that workload’s identity. This could allow the attacker to impersonate the victim workload and access any services or resources trusted under that identity. As a first step, we created a registration entry for a pod named workload-a in the server and we verified that we could fetch its identity from the pod: We verified that we could not retrieve this identity from the host by requesting a JWT SVID: To spoof the workload-a cgroup, we first retrieve its PID: We checked its cgroup path based on the above PID: We copied this path to a mock cgroup path and wrote our shell’s current PID($$) into the mock cgroup’s cgroup.procs file: Notably, writing the PID directly into the original cgroup path would have also worked. We used a separate cgroup only to avoid modifying the original workload’s runtime state. Running the fetch command again successfully retrieved the identity associated with PID 9072: We can also see the workload-a SPIFFE ID inside the JWT token: The manual spoofing demonstration highlights that the security model relies entirely on a single, vulnerable assumption of node integrity. When we have root access, we can get the identity of any workload on the node. This manual spoofing demonstration highlights a critical trust assumption in workload attestation. When an attacker has root-level access to a node, they can manipulate cgroup information to cause the SPIRE agent to misattribute workload identities. Under these conditions, the attacker can impersonate other workloads running on the same node and obtain their identities. These findings motivated us to develop Spooffe, a tool that allows defenders to automate selector spoofing to retrieve all the workload identities from the node. Spooffe scans the node for running workloads, discovers their cgroup paths, and replicates them as a mock cgroup for its own process. It then queries the local SPIRE agent for the resulting identities (SVIDs), allowing us to collect all workload identities present on the host (Figure 5). Besides selector spoofing, Spooffe includes additional capabilities. However, in this post we focus only on the features relevant to this research. One such capability is agent impersonation, which examines whether an attacker can impersonate the SPIRE agent and communicate directly with the server to extract workload identities. In this article, we demonstrated how an attacker with root access on a compromised node can misuse SPIFFE/SPIRE workload attestation to impersonate co-located workloads and retrieve their identities. By manipulating cgroup metadata, we showed how attackers could mislead the SPIRE agent into issuing valid SVIDs to an attacker-controlled process. We also introduced Spooffe, a tool that automates this technique to enumerate and extract workload identities from a node. These findings highlight a fundamental assumption in workload identity systems: trust in the underlying node. While SPIFFE/SPIRE enforces strong cryptographic identity guarantees between workloads, those guarantees rely on the integrity of the environment where attestation occurs. Once that trust boundary is broken, identity isolation between workloads collapses, allowing attackers to move laterally using legitimate credentials rather than stolen secrets. Organizations adopting workload identity should treat node-level compromise as equivalent to compromise of all identities scoped to that node. To reduce risk, restrict privileged containers, limit direct host access and minimize reliance on weak or easily spoofable selectors. Palo Alto Networks has shared our findings with our fellow Cyber Threat Alliance (CTA) members. CTA members use this intelligence to rapidly deploy protections to their customers and to systematically disrupt malicious cyber actors. Learn more about the Cyber Threat Alliance. Palo Alto Networks customers are better protected from the threats discussed above through the following products: Cortex XDR and XSIAM can help protect against post-exploitation activities using the multi-layer protection approach. This approach combines several layers of protection, including Advanced WildFire, Behavioral Threat Protection, and Endpoint Protection Modules (EPM). Cortex Cloud Identity Threat Detection can help deliver end-to-end visibility across cloud providers and IdPs by baselining real-time access patterns. By continuously monitoring these behaviors, ITDR detects identity abuse and compromised credentials targeting critical cloud resources and Kubernetes workloads, automatically triggering containment actions to keep attackers out. If you think you might have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call: North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42) UK: +44.20.3743.3660 Europe and Middle East: +31.20.299.3130 Asia: +65.6983.8730 Japan: +81.50.1790.0200 Australia: +61.2.4062.7950 India: 000 800 050 45107 South Korea: +82.080.467.8774 Spooffe — GitHub
unit42.paloaltonetworks.comSep 10, 2026extracted
The npm Threat Landscape: Attack Surface and Mitigations
The security of the npm ecosystem reached a critical inflection point in September 2025. The Shai-Hulud worm, a self-replicating malware that automated the compromise and redistribution of malicious packages, marked the end of the “nuisance” era of npm attacks and the beginning of a high-consequence threat landscape. Since that watershed moment, Unit 42 has tracked an aggressive acceleration in the frequency and technical depth of supply chain compromises. Attacks have evolved from a series of isolated typosquatting incidents into systematic campaigns by various threat actors to weaponize the trust that powers modern software development. April 2026 Campaigns We have seen two campaigns in April: the first started April 22, 2026 and included the string Shai-Hulud: The Third Coming. The second started April 29, 2026 and is known as Mini Shai-Hulud. May 2026 Campaigns In May 2026, the Mini Shai-Hulud campaign continued with two new waves attributed to TeamPCP. These campaigns introduced two unique elements. One campaign used a credential-free initial access technique. The other campaign generated the highest single-hour package count of any Shai-Hulud worm to date. Copycat activity has made future attribution to TeamPCP more difficult. June 2026 Campaign A new supply chain attack on June 1, 2026 compromised at least 32 packages published under the @redhat-cloud-services npm namespace. The attacker bypassed code review entirely, pushing a payload named Miasma. July 2026 Campaign Attackers compromised the release pipelines of four core AsyncAPI GitHub repositories on July 14, 2026. In a campaign calling itself miasma-train-p1, they published five trojanized packages to npm: @asyncapi/[email protected] @asyncapi/[email protected] @asyncapi/[email protected] @asyncapi/[email protected] @asyncapi/[email protected] The payload appears to be a descendant of the Miasma remote access Trojan (RAT). The Shai-Hulud incident proved that the npm registry could be used as a force multiplier for malware distribution. In the months following, we have observed three core shifts in adversary TTPs: Wormable propagation: Malicious payloads now prioritize the theft of npm tokens and GitHub Personal Access Tokens (PATs) to automatically infect and republish legitimate packages, as seen in the March 2026 Axios compromise. Infrastructure-level persistence: Attackers are no longer just stealing data; they are embedding themselves into continuous integration/continuous delivery (CI/CD) pipelines to attain long-term, undetectable access to enterprise environments. Multi-stage payloads: Following the September 2025 template, current attacks often deploy dormant “sleeper” dependencies that only activate under specific environmental conditions to evade automated scanners. npm Attacks Seen As a Whole npm compromises have common themes. In the post-Shai-Hulud era, we believe it is helpful to consider the attack surface as a whole. This article will combine: Details of major incidents: Real-time analysis of significant package compromises (e.g., Shai-Hulud 2.0, Axios, Chalk/Debug) Cross-campaign correlation: Identifying common infrastructure or code snippets that link disparate attacks to the same threat actors Remediation playbooks: Actionable guidance for rotating credentials and purging malicious dependencies from local and cloud-based caches Shai-Hulud: A New Wave A malicious npm package published as @bitwarden/cli version 2026.4.0 was identified as part of a broader supply-chain campaign attributed to TeamPCP. The package impersonates the legitimate Bitwarden command-line interface (CLI) password manager. Upon installation, it executes a multi-stage payload that steals credentials from cloud providers, CI/CD systems and developer workstations. It then self-propagates by backdooring every npm package the victim can publish. It has been noted that inside public GitHub repositories that were published contained the string “Shai-Hulud: The Third Coming.” Attackers deployed the same payload across multiple Checkmarx distribution channels, indicating a coordinated campaign to weaponize compromised developer tooling credentials to maximize the area of impact: Docker Hub images GitHub Actions VS Code extensions Palo Alto Networks customers are better protected from the threats described in this article through the following products and services: The Unit 42 Incident Response team can also be engaged to help with a compromise or to provide a proactive assessment to lower your risk. July 2026 - Miasma Expansion or Potential Copycat? On July 14, 2026, attackers compromised the release pipelines of four core AsyncAPI GitHub repositories, publishing five trojanized packages to npm: @asyncapi/[email protected] @asyncapi/[email protected] @asyncapi/[email protected] @asyncapi/[email protected] @asyncapi/[email protected] The campaign calls itself miasma-train-p1, and the payload appears to be a descendant of the same Miasma RAT deployed in the June 2026 Red Hat supply chain operation. However, the initial access was different this time. Rather than a compromised employee account compromising the GitHub repository, the attackers exploited a process gap in the CI/CD pipeline itself. The AsyncAPI repositories maintained strict branch protections and peer-review mandates on their primary main branches. However, pre-production release branches, specifically next and schema, were left unprotected. The threat actors pushed malicious commits directly to these shadow release branches that bypassed all human review (e.g., Commit 3eab3ec9304aa26081358330491d3cfeb55cc245 by attacker GitHub ID 148100). This commit triggered automated GitHub Actions build and release workflows. The injected code ran inside the Continuous Integration (CI) runner itself, harvesting NPM_TOKEN and GITHUB_TOKEN environment secrets, then used the stolen npm token to programmatically publish backdoored package versions to the trusted @asyncapi scope on the public registry. In contrast to the previous Miasma payload, this version’s architecture has changed. When a developer runs npm install on a compromised package, a backdoored source file executes, such as index.js, validator.js or utils.js. To evade static code-integrity audits, the file exports a legitimate-looking schemas object with version-keyed JSON references. However, upon import, its main() function triggers a detached child process running an obfuscator.io-obfuscated script. That script determines the operating system via process.platform and creates a platform-specific persistence directory disguised as a legitimate NodeJS data folder: %LOCALAPPDATA%\NodeJS on Windows ~/Library/Application Support/NodeJS on macOS ~/.local/share/NodeJS on Linux ~/.config/node as a fallback The payload then fetches the Stage-2 Miasma RAT from the InterPlanetary File System (IPFS) via a hard-coded content identifier (CID) Qmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf or QmQobZSp1wRPrpSEQ56qnyq7ecZh5Bg5k1fnjt4SUwwHb9. It then writes the RAT as sync.js and spawns it with detached: true, stdio: 'ignore' and windowsHide: true. The parent process calls child.unref() and exits cleanly, giving the perception that nothing is wrong. The RAT is now running headlessly in the background. Once executing, the Miasma RAT writes an operational lockfile, ~/.config/.miasma/run/node.lock. It does so to prevent redundant instances and to establish persistence via a user-scoped systemd service (miasma-monitor.service on Linux and macOS, or a miasma-monitor Run key on Windows). To bypass automated system audits, the RAT writes its host-tracking identity cache to paths that mimic legitimate OS application storage: ~/Library/Application Support/com.apple.spotlight/index-v2.cache on macOS (mimicking the Spotlight search index) ~/.cache/mesa_shader_cache/gl_cache.bin on Linux (mimicking the Mesa OpenGL shader cache) %HOME%\AppData\Roaming\Microsoft\CryptnetUrlCache\Content\msrt.dat on Windows (mimicking the Cryptnet certificate cache) Credential theft targets are consistent with the June campaign: GitHub tokens npm tokens SSH keys Cloud provider credentials Kubernetes service-account tokens CI/CD secrets Perhaps the most notable escalation is the command-and-control (C2) infrastructure. During the June Red Hat incident, the variant used a straightforward central C2 server. This campaign layers a decentralized fallback network on top of its primary C2 at 85.137.53[.]71. The RAT regularly polls hxxp://85.137.53[.]71:8080/api/v1/beacon for task commands. It also exfiltrates harvested credentials via HTTP POSTs to hxxp://85.137.53[.]71:8080/api/v1/file-result, forwarded to a dedicated upload listener on port 8081. If the primary C2 IP address was blocked, the RAT accessed the public Ethereum RPC gateway at ethereum-rpc[.]publicnode[.]com to examine an on-chain smart contract (0x12c37A86a0Ed0beBe5d1d6a43E42f07860eAc710), which functioned as a decentralized registry for the active C2 address. This contract was launched by the adversary wallet 0x92d4C5413e4F7B258a114964101F9e1C6d64C6Ba and included a backup contract located at 0x1969ab05d67b67fdcaa26240f738ccb077e1cd84. If that was also blocked, the RAT established communication with public Nostr relays (wss://relay.damus[.]io and wss://relay.nostr[.]com/) as out-of-band backup channels. Finally, it implemented a BitTorrent DHT bootstrap routine (using router.bittorrent[.]com:6881 and dht.transmissionbt[.]com:6881) to join a peer-to-peer network and discover alternate controllers. This was a highly redundant, resilient and evasive C2 architecture designed to survive standard domain and IP-level mitigation strategies. Blocking any single layer does not kill the implant. On July 14, 2026, Unit 42 researchers analyzed a compromised macOS developer machine on which the developer opened a project workspace in GitHub Copilot. When the copilot parsed the workspace and triggered automated dependency loading, it imported the trojanized @asyncapi/[email protected] package. This silently launched the Stage-1 loader, which fetched Miasma sync.js from IPFS and spawned it under Homebrew Node.js v22, initiating active beaconing to 85.137.53[.]71:8080. The developer did not run npm install manually. The tooling did it for them. The campaign also features self-attributed configurations that suggest this is merely the first wave of a broader, phased rollout. The worm's self-propagation capability is limited to four hops via a hard-coded generation cap (maxGen = 4). Additionally, its rollout approach leverages a default canary deployment strategy (batch.defaultStrategy = CANARY), which initially infects 5% of potential targets before scaling up in waves of 100. This is not runaway malware. It is rate-limited by design to manage exposure and avoid triggering widespread detection during the initial spread. Attribution remains the same open question as with the June 2026 campaign. The Miasma campaign shares infrastructure hosting patterns with TeamPCP, including the same Dutch autonomous system (AS43641/VSYS-AMS) used in prior operations against AntV, TanStack and Red Hat. With the addition of this miasma-train-p1 campaign identifier it can be tied directly to the lineage that includes Mini Shai-Hulud and the June Red Hat compromise. It is difficult to determine whether TeamPCP threat actors are directly behind this campaign. The Mini Shai-Hulud source code has been public since May 12 and nothing in this operation requires insider access to TeamPCP tooling. On June 1, 2026, a new supply chain attack compromised at least 32 packages published under the @redhat-cloud-services npm namespace, with the malicious versions cumulatively averaging approximately 80,000 weekly downloads. The root cause was a compromised Red Hat employee GitHub account, used to push malicious orphan commits to multiple RedHatInsights repositories, bypassing code review entirely. The attacker triggered GitHub Actions workflows to request OpenID Connect (OIDC) tokens, publishing Trojanized packages with valid SLSA provenance. The certificate was accurate, the packages really were built by that pipeline. It just also happened to have malware injected into it at the time. The payload is called Miasma. It is named after the description that the malware stamps on attacker-created GitHub repositories, "Miasma: The Spreading Blight." The threat is derived from the Mini Shai-Hulud malware open-sourced by TeamPCP on May 12, with substantially identical tradecraft. The analyzed sample replaced a normal approximately 200 KB index.js with a 4.29 MB obfuscated payload. This is a 25x size increase that is itself a reliable detection signal. Stolen credentials include: GitHub tokens, npm tokens and SSH keys AWS, GCP and Azure credentials and cloud identities Kubernetes service-account tokens and HashiCorp Vault secrets CI/CD secrets from GitHub Actions, CircleCI and related platforms Attribution remains uncertain. The TTPs are consistent with TeamPCP, but the public release of the Mini Shai-Hulud source code means any competent actor can replicate the same attack. What is certain is the trend, which is that one compromised account and one CI pipeline delivered 32 trojanized packages automatically to every developer who ran npm install. Then the registry does the rest. May 2026 - Mini Shai-Hulud Continues Two further waves in May 2026 continued the Mini Shai-Hulud campaign: The first introduced a fundamentally new initial-access technique that requires no stolen credential and produced the first malicious npm packages with valid supply chain levels for software artifacts (SLSA) provenance The second demonstrated the largest single-hour package count of any Shai-Hulud wave Both are attributed to TeamPCP, though the public release of the worm's source code on May 12 has already spawned separate copycat activity, complicating future attribution. May 11, 2026: Mini Shai-Hulud Strikes Again On May 11, TeamPCP launched a coordinated supply chain attack across the npm and PyPI ecosystems. The initial vector was TanStack's GitHub Actions CI pipeline. Within six minutes, 84 malicious package artifacts were published across 42 @tanstack/* packages. The worm's self-propagation mechanism then expanded rapidly. By end of day, we had documented 373 malicious versions across 169 npm packages plus compromised PyPI packages. The affected scope went well beyond TanStack. The worm's self-propagation spread the compromise to packages across multiple industries and ecosystems: Enterprise infrastructure: @opensearch-project/opensearch (the official OpenSearch JavaScript client; versions 3.5.3–3.8.0) and 57 @uipath/* enterprise automation packages AI tooling: @mistralai/mistralai and its Azure/GCP variants, which is the official Mistral AI TypeScript client Specialized ecosystems: 19 @squawk/* aviation data packages, [email protected] (customer messaging) and dozens of others across @tallyui, @draftlab, @beproduct, @mesadev and several unscoped packages @tanstack/react-router alone receives over 12.7 million weekly downloads. We estimate 520 million cumulative downloads were in the affected window. Palo Alto Networks provides XDR and XQL queries to detect this activity. A New Initial Access: No Stolen Credential Required Every prior Shai-Hulud wave began with a stolen or phished credential. The TanStack attack needed neither. Instead, three GitHub Actions weaknesses were chained, none of which was sufficient alone. Step 1: Pwn Request On May 10, the attacker created a fork of TanStack/router under the account zblgg/configuration, deliberately named to avoid appearing in fork-list searches. A malicious commit was authored under the spoofed identity claude , impersonating the Anthropic Claude GitHub App, and prefixed [skip ci] to suppress automated CI on push. A pull request (PR #7378) against TanStack/router#main then triggered bundle-size.yml — a workflow that used the pull_request_target trigger and checked out the fork's merge ref. This gave the fork's code execution in the base repository's runner context, with full access to its cache scope. The threat actors used Bun, which is a lightweight JavaScript runtime and package manager alternative to Node.js and npm as shown in Figure 1. The attack used Bun to execute the malicious payload tanstack_runner.js. This in turn attempted to enumerate the system for sensitive credentials, including invoking the GitHub CLI to capture the GitHub authentication token (gh auth token). Kubernetes In a Linux-hosted Kubernetes environment, Unit 42 observed legitimate runc create container activity associated with a build pipeline that subsequently retrieved and executed the compromised JavaScript package. The runc create invocation itself was legitimate Kubernetes runtime activity associated with the containerized build process. During the build: The project again dynamically retrieved and executed the Bun runtime through its pnpm dependency chain It subsequently executed the malicious JavaScript payload tanstack_runner.js Then proceeded as in the Windows environment The process lineage is shown in Figure 2. Step 2: GitHub Actions Cache Poisoning The fork's code wrote a 1.1 GB poisoned pnpm store under the exact cache key that release.yml would later look up. The key was pre-computed from the public pnpm-lock.yaml using the same hashFiles() formula the workflow uses. The poisoned cache entry then sat dormant for eight hours. A critical detail: actions/cache@v5's post-job save uses a runner-internal token, not the workflow GITHUB_TOKEN, so setting permissions: contents: read on the workflow does not prevent the cache write. Step 3: OIDC Token Extraction From Runner Memory When a legitimate maintainer pushed to main, release.yml triggered, restored the poisoned cache and executed attacker-controlled binaries during the build phase. Those binaries read /proc/ /mem and extracted the OIDC token — minted lazily in runner memory only when id-token: write is set — then POSTed it directly to registry.npmjs.org. The workflow's own Publish Packages step was never reached; tests failed and that step was skipped. npm received 84 valid, signed, provenance-attested package publishes anyway. This is the same /proc-memory extraction technique documented in the tj-actions/changed-files compromise of March 2025 and reused in the April 2026 SAP and Bitwarden waves. The SLSA Provenance Problem This is the first documented case of a worm publishing malicious npm packages with valid SLSA Build Level 3 provenance. Sigstore correctly attested that the packages were built by release.yml from refs/heads/main of TanStack/router — because they were. SLSA provenance confirms which pipeline built a package, not whether that pipeline's internal state was clean. The root cause is the same OIDC trust-scope misconfiguration exploited in the April 29 @cap-js wave. The trusted-publisher binding trusted the entire repository rather than a specific workflow on a protected branch. Provenance verification is necessary but no longer sufficient. This is why behavioral analysis at install time is essential. Payload and Propagation The malicious payload, router_init.js (2.3 MB obfuscated), was not delivered via a preinstall hook on the compromised packages themselves. Instead, each tarball received an injected optionalDependencies entry pointing to an orphaned commit in the attacker's fork. This is a commit that GitHub surfaces under the legitimate TanStack/router URL due to shared fork-network commit object storage: The dependency is designed to fail silently during installation. The malicious code executes in the background while the install process appears normal, leaving near-zero trace in logs. The payload uses multiple layers of obfuscation and encryption to resist automated analysis. It shares the same custom cipher documented in the April 22 Bitwarden and April 29 SAP sections, confirming shared authorship across all three waves. For secondary victims infected via worm propagation (e.g., UiPath, Mistral AI and OpenSearch), the delivery mechanism reverted to the familiar preinstall hook from the April SAP wave. The pattern is now well-established. Once the worm gains a foothold in one ecosystem, it uses stolen credentials to republish itself into every other package the victim maintains, rapidly expanding its reach across unrelated projects and organizations. The Dead-Man's Switch: A Critical Remediation-Order Warning The May 11 payload installs a persistent background service that polls api.github.com/user with the stolen GitHub token every 60 seconds. If the token is revoked (HTTP 40x), the service executes rm -rf ~/ — destroying the user's home directory. The daemon auto-exits after 24 hours. May 12, 2026: Public Release of the Worm On the evening of May 12, 2026, the fully weaponized Mini Shai-Hulud source code was published to public GitHub repositories before being taken down. The toolchain including the CI cache-poisoning scripts, OIDC token extractor and the credential stealer with its propagation logic is now publicly available. Mini Shai-Hulud is no longer scoped to TeamPCP. Future incidents using this toolchain may not share TeamPCP's infrastructure or tradecraft and should not be attributed solely on the basis of worm lineage. May 19, 2026: @antv Wave On May 19, 2026, the npm maintainer account atool was compromised as part of a new Mini Shai-Hulud wave. In approximately one hour, 639 malicious package versions were published across 323 unique packages. This is the largest single-hour package count of any Shai-Hulud wave to date. The affected scope spans the @antv data visualization ecosystem and related libraries: @antv/g2, g6, x6, l7, s2, f2, g, g2plot, graphin, data-set and s2-vue Packages outside the @antv namespace including echarts-for-react ( approximately 1.1 million weekly downloads), timeago.js, size-sensor and canvas-nest.js The potential area of impact across data visualization, graphing, mapping, charting and React component ecosystems is significant. Infection Mechanism Unlike the TanStack wave's pipeline-hijack technique, this wave returns to a simpler model. This involves compromising a maintainer account and using it to republish packages directly. This is the same approach seen in the September and November 2025 campaigns. The attacker modified each package's package.json in three ways: Adding a preinstall hook ("preinstall": "bun run index.js") that executes the malicious payload via the Bun runtime Bundling Bun as a dependency to ensure it's available on any machine Inserting a git-based optional dependency pointing to an orphaned commit in the legitimate antvis/G2 repository as a backup execution path To ensure the malicious versions reached as many targets as possible, the attacker also bumped version numbers beyond the latest legitimate release (e.g., @antv/s2-vue jumped from the real version 2.2.0 to 2.4.0). Any project using a permissive version range like ^2.x would automatically pull the malicious version on its next install. Payload Capabilities The 499 KB obfuscated payload runs six credential collectors in parallel, sweeping a broad range of targets: Developer credentials: GitHub tokens, npm tokens, SSH keys, Git credentials and private keys Cloud and infrastructure: AWS credentials and parameters, Kubernetes service-account tokens, HashiCorp Vault secrets and Docker authentication CI/CD platforms: Tokens from 18-plus platforms including GitHub Actions, GitLab CI, CircleCI, Vercel and Netlify Third-party services: Database connection strings, Stripe, Slack and Twilio API keys Password managers (new to this wave): The payload directly queries 1Password, Bitwarden, pass and gopass via their local CLIs All stolen data is encrypted and sent to a C2 endpoint disguised as OpenTelemetry trace ingestion (t.m-kosche[.]com), meaning network monitoring tools may classify the traffic as legitimate observability telemetry. A fallback channel exfiltrates data to GitHub repositories created under the victim's account, using Dune-themed names and the reversed campaign marker Shai-Hulud: Here We Go Again as the description. Late April Mini Shai-Hulud Wave As of April 29, 2026, a new supply chain attack wave (dubbed Mini Shai-Hulud) is actively targeting the SAP developer ecosystem via four compromised npm packages. The affected versions are: @cap-js/[email protected] @cap-js/[email protected] @cap-js/[email protected] mbt @1.2.48 Combined, these packages carry approximately 570,000 weekly downloads, with @cap-js/sqlite and @cap-js/db-service each pulling around 250,000 and 260,000 downloads, respectively. All four packages are part of SAP's Cloud Application Programming (CAP) Model and multitarget application (MTA) build toolchain. This makes the targets of this attack enterprise developers and CI/CD pipelines with access to cloud credentials, GitHub tokens and deployment secrets. The campaign is a close structural continuation of the @bitwarden/[email protected] compromise earlier in April 2026. It uses the same toolchain, same obfuscation and same propagation logic, which is now turned against the SAP ecosystem. Attack Mechanism Each compromised package received two new files: setup.mjs execution.js These files arrived along with a modified package.json that adds a preinstall lifecycle hook ("preinstall": "node setup.mjs"). This means the malicious code executes automatically during the npm install process, before the installation is complete. The setup.mjs bootstrapper detects the host OS and architecture, then performs the following activities: Downloading the Bun JavaScript runtime (v1.3.13) from the official github[.]com/oven-sh/bun releases Extracting the runtime to a temporary directory Immediately using it to execute execution.js Payload Capabilities The 11.7 MB single-file, obfuscated credential stealer, execution.js, is a propagation framework. It performs the following activities: Using a custom string scrambling layer labeled ctf-scramble-v2 to hide sensitive strings from static analysis Including a Russian locale killswitch (exiting silently if the system locale is set as ru) Daemonizing itself on non-CI machines to run in the background It harvests the following information: GitHub tokens (including gh auth token output) npm tokens from .npmrc Full environment variable blocks GitHub Actions secrets AWS STS identity Secrets Manager and SSM parameters Azure Key Vault secrets GCP Secret Manager values Kubernetes service account tokens Claude and MCP configuration files Electrum wallets VPN configs A particularly aggressive CI path uses an embedded Python helper that reads the /proc memory of the GitHub Actions Runner.Worker process to extract masked secret values. All collected data is: Compressed AES-256-GCM encrypted with a key wrapped under an embedded RSA public key Exfiltrated to freshly created public GitHub repositories with randomized Dune-themed names and the description A Mini Shai-Hulud has Appeared Propagation and GitHub Dead Drop The campaign uses GitHub's public commit search API as a covert command and control (C2) channel. The malware performs the following activities: Searching for commits containing the keyword OhNoWhatsGoingOnWithGitHub Decoding matching commit messages as a token dead-drop to recover stolen GitHub tokens Using them to spread Once a usable token is obtained, the payload: Copies itself into execution[.]js Writes setup.mjs Sets "preinstall": "node setup.mjs" in package.json Increments the patch version Repacks the tarball for publishing The malware also pushes the following files directly into victim repositories: .vscode/setup.mjs .claude/execution.js .claude/settings.json The malware pushes the above files using commits authored as claude with the message chore: update dependencies. The three forensic links to @bitwarden/[email protected] are precise enough to indicate shared authorship or a directly reused toolchain. 1. The setup.mjs preinstall bootstrapper. In the Bitwarden campaign, setup.mjs was the self-replication artifact the worm (bw1.js) injected into every npm package the victim could publish. The SAP packages use that same filename as their bootstrapper, and the two share clear common lineage: same Bun version (1.3.13), same Alpine/musl detection logic and the same redirect-following download approach. 2. The decodeScramble / ctf-scramble-v2 obfuscation method. The Bitwarden payload encodes all sensitive strings using a custom seeded ASCII shuffle cipher. This is a Fisher-Yates shuffle over a 128-character ASCII table driven by a linear congruential PRNG seeded with 0x3039 (12345). The SAP execution.js uses a layer explicitly labeled ctf-scramble-v2, which is the same deterministic substitution scheme. This is not a library, it is a bespoke implementation. It is reused across both payloads. 3. The GitHub commit dead-drop pattern. The Bitwarden malware used GitHub's public commit search API as a covert C2 channel. It embedded stolen tokens in commit messages matching LongLiveTheResistanceAgainstMachines: and used them to bootstrap new exfiltration channels without attacker-controlled infrastructure. This wave applies the exact same pattern under a new keyword (OhNoWhatsGoingOnWithGitHub) with matching commit messages decoded as a token dead-drop. The mechanism is identical in implementation: Search the GitHub API for commits containing the keyword Parse the commit message body Decode the embedded token Validate it for repository access Rotating the keyword while keeping the technique intact is a hallmark of the same operator updating a reused codebase. According to Checkmarx's official security update, this npm package is one component of a broader supply-chain campaign that simultaneously compromised multiple Checkmarx distribution channels: Docker Hub: Poisoned checkmarx/kics images (v2.1.20, v2.1.21, latest, alpine, debian) GitHub Actions: Malicious checkmarx/ast-github-action v2.3.35 VS Code extensions: Backdoored checkmarx/ast-results (v2.63, v2.66) and checkmarx/cx-dev-assist (v1.17, v1.19) npm: The @bitwarden/cli package analyzed in this report Per Checkmarx's disclosure, all artifacts share the same C2 infrastructure (audit.checkmarx[.]cx), the same obfuscation techniques and the same credential harvesting and propagation logic. The VS Code extension variant delivered its payload (mcpAddon.js) from a backdated orphan commit in Checkmarx's own GitHub repository, making the download URL appear trustworthy. TeamPCP (@pcpcats) publicly took credit for the compromise. Per Socket's analysis, the group had previously targeted Checkmarx infrastructure in March 2026, along with Trivy and LiteLLM, suggesting an ongoing campaign against security tooling vendors. Table 1 shows the attributes of the attack. Table 1. Attributes of the attack. The Bitwarden security team provided the following information. They identified and contained the malicious package described in Table 1, which was briefly distributed through the npm delivery path for @bitwarden/[email protected] between 5:57 PM and 7:30 PM EST on April 22, 2026, in connection with the broader supply chain incident. Their investigation found no evidence that end user vault data was accessed or at risk, or that production data or production systems were compromised. Once the issue was detected, they: Revoked compromised access Deprecated the malicious npm release Immediately initiated remediation steps The issue affected the npm distribution mechanism for the CLI during that limited window, not the integrity of the legitimate Bitwarden CLI codebase or stored vault data. People who did not download the package from npm during that window were not affected. Bitwarden completed a review of internal environments, release paths and related systems. They found no additional impacted products or environments at this time. A CVE for Bitwarden CLI version 2026.4.0 is being issued in connection with this incident. The package.json provides two execution paths for the malicious script, as shown in Figure 3. The preinstall hook runs automatically during npm install. The bin field registers bw_setup.js as the bw command, symlinking it into the user's PATH. Since the legitimate Bitwarden CLI also uses bw as its binary name, this serves as a secondary trigger. Even if preinstall is blocked (e.g., via --ignore-scripts), the malware executes the next time the user or any script invokes bw. The shebang line #!/usr/bin/env node at the top of bw_setup.js ensures it runs as a Node.js script when called directly. The bootstrap script performs three actions: Platform detection: Identifies the OS and architecture (Linux, macOS, Windows; x64 or arm64), including musl versus glibc detection on Linux. Bun runtime download: Downloads the Bun JavaScript runtime (v1.3.13) from the official github[.]com/oven-sh/bun releases. This is needed because the main payload uses Bun-specific APIs (shell execution, file I/O, gzip) not available in Node.js. Payload execution: Runs bw1.js using the freshly downloaded Bun binary. A custom ZIP extraction implementation is included to avoid any dependencies, making the bootstrap entirely self-contained. The payload is an approximately 10 MB single-line JavaScript file containing approximately 285,000 lines when formatted. It bundles legitimate software developer kits (SDKs) (e.g., AWS SDK, Google Cloud client libraries, Azure Identity, Octokit, jsonwebtoken, tar) alongside the malicious orchestration code. The code employs multiple layers of obfuscation: String table rotation: A function _0x214e resolves hex indices to strings from a large rotated array (_0x1ee1), breaking simple static string analysis. Seeded ASCII shuffle cipher: Sensitive strings (domains, file paths, shell commands) are encoded as arrays of numeric indices into a Fisher-Yates-shuffled ASCII table. The shuffle uses a linear congruential PRNG seeded with 0x3039 (12345), as shown below in Figure 4. The 128-character ASCII set is shuffled deterministically, producing a substitution table where an index with the hex value 0x42 maps to the ASCII character a, 0x6e to u. For example, the C2 domain is stored as [0x42, 0x6e, 0x36, 0x4b, 0x2b, 0x5c, 0xd, 0x57, 0x0, 0xd, 0x7, 0x26, 0x42, 0x3, 0x2a, 0x5c, 0xd, 0x2a], which decodes to an ASCII string for the domain audit.checkmarx[.]cx. Gzip and Base64 embedded payloads: Several blobs are stored as gzip-compressed Base64 strings, including an RSA public key, a GitHub Actions workflow YAML, the worm's setup.mjs loader and a manifesto string Mangled identifiers: All variable and function names are replaced with hex patterns such as _0x3865d8 Credential Harvesting The payload deploys multiple provider classes, each targeting a different credential source. Every provider scans its results with regex patterns to extract npm and GitHub tokens, as shown in Figure 5. Reads sensitive files from the developer's workstation, with per-OS path lists decoded via the scrambler as shown below in Table 2. Table 2. OS path lists from the malware. Files larger than approximately 5 MB are skipped. All others are read in full and included in the exfiltration payload. Runs gh auth token via execSync to capture the GitHub CLI's active token, and then harvests the full process.env environment block. Both are returned for token-regex scanning and exfiltration. Unlike the cloud providers below, the Shell Provider does not use any SDK — it relies solely on the single shell command and environment variables. Detects CI/CD environments via process.env.GITHUB_ACTIONS === "true" and extracts all configured secrets by parsing {"value":"...","isSecret":true} patterns from the Actions runner context. Uses the bundled AWS SDK (SSMClient, DescribeParameters, GetParameter) to enumerate and read parameters from AWS Systems Manager Parameter Store. Uses Azure Identity and Key Vault SDK to call getSecretsFromVault, listing and reading secrets from all accessible vaults. Uses the Google Cloud Secret Manager client to listSecrets and accessSecretVersion, reading all accessible secrets across projects. All harvested credentials are processed through a two-tier exfiltration system. Results are serialized to JSON and compressed with gzip A random 32-byte AES-256-GCM symmetric key is generated The data is encrypted with AES-256-GCM The symmetric key is RSA-encrypted with a hard-coded 4096-bit public key (Fr) The encrypted envelope is sent via POST hxxps[:]//audit.checkmarx[.]cx:443/v1/telemetry. Using stolen GitHub tokens, the malware: Creates a new public repository under the victim's account with the description "Checkmarx Configuration Storage" and a Dune-themed name (e.g., gesserit-melange-813) Commits encrypted result files to a results/ directory Embeds stolen tokens in commit messages using the format LongLiveTheResistanceAgainstMachines: This dual exfiltration ensures data reaches the attacker even if the C2 domain is blocked. When the malware obtains a GitHub token with repo and workflow scopes, class u_ validates the scopes and then: Enumerates repositories the victim can push to, prioritizing recently active ones Checks whether each repo has configured GitHub Actions secrets (skips repos without them) Creates a new branch, commits .github/workflows/format-check.yml — a malicious workflow that dumps all secrets, as shown below in Figure 6. Downloads the resulting artifact containing all serialized secrets Deletes the branch and workflow run to cover its tracks This is the self-replicating component. When the malware finds an npm token (npm_...): Calls the npm tokens API with Authorization: Bearer , verifies the token has publish (write) permission on the package scope and that it bypasses two-factor authentication (2FA). Using the validated token: Fetches the npm username Iterates through the token's allowed resources (orgs, scopes, specific packages) Queries /-/org/ /package for writable packages Falls back to /-/v1/search?text=maintainer: for public packages For each target package: Downloads the latest tarball from the npm registry Extracts it to a temporary directory Copies the Bun binary into the package Rewrites package.json: - Clears all scripts - Sets "preinstall": "node setup.mjs" (decoded from the scrambler) - Bumps the patch version (e.g., 1.2.3 → 1.2.4) Writes setup.mjs with the full worm payload (K$, a gzip+Base64 encoded copy of the malware) Re-packs the tarball Writes a .npmrc with the stolen token's auth line (//registry.npmjs[.]org/:_authToken= ) and runs bun publish . Every newly infected package will trigger the same preinstall chain on any developer who installs it, creating an exponential propagation vector. The malware implements a fall back mechanism for C2 resilience using GitHub's public search API as a covert command channel. If the primary C2 server (audit.checkmarx[.]cx) is unreachable, the malware: Searches GitHub commits for the keyword beautifulcastle via the public Search API Finds a matching commit in helloworm00/hello-world (commit bc544f4, dated April 21 - one day before the main attack) Parses the commit message body with the regex /beautifulcastle ([A-Za-z0-9+/=]{1,30})\.([A-Za-z0-9+/=]{1,700})/ Decodes the first capture group from Base64 to get a domain Verifies the second capture group as a digital signature (512-byte RSA-4096) against the hard-coded public key Er, ensuring only the attacker can direct the malware to a new C2 server At the time of analysis, the dead drop contained a placeholder value (hxxps[:]//example[.]com), indicating it was pre-staged for future use. The attacker can rotate C2 infrastructure at any time by creating a new signed commit on any public GitHub repository. A second fall back (Hr function) searches for commits matching LongLiveTheResistanceAgainstMachines: to recover previously stolen GitHub tokens from exfiltration repos, bootstrapping new GitHub-based exfiltration channels without any attacker-controlled infrastructure. Russian locale killswitch: The mz0 function checks Intl.DateTimeFormat().resolvedOptions().locale, LC_ALL, LC_MESSAGES, LANGUAGE and LANG for Russian (ru). If any match, the malware calls process.exit(0) immediately without executing Daemonization: The Ml0 function re-spawns the process detached with __DAEMONIZED=1 in the environment, allowing the parent to exit cleanly while the payload runs in the background PID-based lock file: $l0 writes process.pid to a temp file and checks whether a previous instance is still alive via process.kill(pid, 0), preventing multiple instances from running simultaneously Signal handlers: Catch SIGINT/SIGTERM with no-op callbacks (() => {}) to prevent interruption Temp directory cleanup: After tarball manipulation removes forensic artifacts All sensitive strings: Encoded via the scrambler or gzip+Base64 Silent error handling: Failures are caught and suppressed Innocuous naming: The C2 path v1/telemetry mimics legitimate analytics endpoints Block the C2 domains and IPs listed above at the network perimeter. Rotate all credentials that may have been exposed: npm tokens, GitHub PATs, AWS/Azure/Google Cloud keys, SSH keys and CI/CD secrets. Audit npm packages you maintain for unauthorized version bumps or new preinstall hooks. Review GitHub for unauthorized repository creation, unexpected workflow files and artifact downloads. Search for the format-results artifact in GitHub Actions logs across your organization. Hunt for unexpected Bun process execution and outbound connections to the IoC infrastructure. Pin dependencies to known-good versions using lockfiles and integrity hashes. Unit 42 Managed Threat Hunting Queries The Unit 42 Managed Threat Hunting team continues to track any attempts to exploit this CVE across our customers, using Cortex XDR and the XQL queries below. Cortex XDR customers can also use these XQL queries to search for signs of exploitation. The following XQL query has been used to successfully identify execution of a JavaScript file through Bun that subsequently calls the GitHub CLI in a likely attempt to collect locally stored authentication tokens. While Bun is legitimate in many developer environments, its use as a runtime for package install malware in this campaign makes this behavior worth investigating when observed with credential access commands such as gh auth token: Unit 42 has witnessed a shift since the September 2025 Shai-Hulud incident, proving that it wasn’t a temporary spike but the new baseline for software supply chain risk. In an ecosystem where code is shared at the speed of thought, a single compromised dependency can trigger a global cascade. Ultimately, npm compromises share commonalities and organizations can navigate this volatility by keeping particular best practices in mind. As we continue to monitor, analyze and update our findings related to npm packages, we encourage you to move beyond static defenses and embrace a culture of continuous verification. The supply chain may be the new primary target, but with collective intelligence and relentless visibility, it doesn’t have to be the primary vulnerability. Palo Alto Networks customers are better protected by our products, as listed below. We will update this threat brief as more relevant information becomes available. Mitigations for Compromised npm Packages Enforce Cooldown Periods Implement a policy (via a private registry or proxy like Artifactory) that blocks any package version published within the last 24 to 72 hours. Most malicious packages are identified and removed from the public registry within this window. Disable Lifecycle Scripts Many compromises rely on preinstall or postinstall hooks to exfiltrate secrets. Use the following in your .npmrc: ignore-scripts=true. Version Pinning and npm ci Use package-lock.json and ensure your CI/CD pipelines use npm ci instead of npm install. This prevents the "hidden" update of dependencies during a build. Private Registry Proxying Never allow developer machines or CI runners to talk directly to registry.npmjs[.]org. Route all traffic through a private registry. Namespace Shadowing (Prevention of Dependency Confusion) Attackers often publish packages with the same name as your internal libraries to the public registry. Always use scoped packages (e.g., @myorg/internal-lib) and configure your private registry to only resolve that scope internally. Provenance Verification Verify the OpenID Connect Attestation. Many major packages provide "provenance," proving the code was built on a specific GitHub/GitLab runner. Use tools like slsa-verifier to check these during the build. Egress Filtering in CI/CD Most npm-based malware attempts to send ~/.npmrc tokens or ~/.ssh keys to a C2 server. Apply strict egress network policies to your CI runners. Only allow connections to your private registry and known deployment targets. Software Bill of Materials (SBOM) Automatically generate an SBOM for every production release. This allows your security team to perform instant impact analysis when a new zero-day is announced. Palo Alto Networks customers can leverage a variety of product protections and updates to identify and defend against this threat. If you think you might have been compromised or have an urgent matter, get in touch with the Unit 42 Incident Response team or call: North America: Toll Free: +1 (866) 486-4842 (866.4.UNIT42) UK: +44.20.3743.3660 Europe and Middle East: +31.20.299.3130 Asia: +65.6983.8730 Japan: +81.50.1790.0200 Australia: +61.2.4062.7950 India: 000 800 050 45107 South Korea: +82.080.467.8774 The Advanced WildFire machine-learning models and analysis techniques have been reviewed and updated in light of indicators associated with npm compromises, including the malicious Bitwarden package. Advanced URL Filtering and Advanced DNS Security identify known domains and IP addresses associated with this activity as malicious. Cortex Cloud’s Application Security Module (ASPM) supports the scanning of npm packages installed on cloud resources as well as monitoring audit logs from third party SaaS vendors, including GitHub as discussed within this article. Cortex Cloud prioritizes alerts, issues, policies and assets based on ingested applications as well as their usage. This allows security teams to maintain security awareness across their on-premises and cloud environment by identifying and remediating impacted cloud resources and actively responding to associated runtime operations from the threats discussed within this article through Cortex Cloud’s XDR Agent and serverless operations. For additional details about how to protect against this threat using Cortex Cloud, please see their blog. Koi Agentic Endpoint Security Koi Agentic Endpoint Security allows customers to delay automatic updates for all installed packages by a set time window, allowing newly pushed versions to establish reputation and undergo public scrutiny before being deployed in your environment. Indicators From July 14, 2026 Miasma Activity Indicators From April 29, 2026 Activity Affected Packages @cap-js/[email protected] @cap-js/[email protected] @cap-js/[email protected] [email protected] SHA256 Hashes setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34 execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95 URLs hxxps[:]//github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ (Bun download) hxxps[:]//api.github[.]com/search/commits?q=OhNoWhatsGoingOnWithGitHub (dead drop) Indicators From April 22, 2026 Activity Table 3 lists the network indicators from this activity. Table 3. Network indicators. Table 4 lists the GitHub indicators from this activity. Table 4. GitHub indicators. Table 5 lists the file and process indicators from this activity. Table 5. File and process indicators. Table 6 lists the npm indicators from this activity. Table 6. npm indicators. Indicators From June 1, 2026 Activity Repository/GitHub Attacker-created repository description: "Miasma: The Spreading Blight" Network Bun runtime download: github.com/oven-sh/bun/releases/download/bun-v1.3.13/ Checkmarx Security Update: April 22, 2026 – Checkmarx Malicious Checkmarx Artifacts Found in Official KICS Docker Repository and Code Extensions – Socket Weaponizing the Protectors: TeamPCP’s Multi-Stage Supply Chain Attack on Security Infrastructure Threat Brief: Widespread Impact of the Axios Supply Chain Attack – Unit 42, Palo Alto Networks "Shai-Hulud" Worm Compromises npm Ecosystem in Supply Chain Attack (Updated November 26) – Unit 42, Palo Alto Networks Bitwarden CLI Impersonation Attack Steals Cloud Credentials and Spreads Across npm Supply Chains – Cortex Cloud, Palo Alto Networks Updated April 27, 2026 at 2:15 p.m. PT to add information about Bitwarden and link to the Cortex Cloud article in the Additional References section. Updated May 1, 2026 at 4:55 p.m. PT to add information on the Mini Shai-Hulud campaign. Updated May 20, 2026 at 12:30 p.m. PT to update the Executive Summary with information on two new waves and add a new section on Mini-Shai Hulud May 2026 waves. Updated May 21, 2026 at 8:45 a.m. PT to add managed threat hunting queries and additional product protection information. Updated June 2, 2026 at 11:22 a.m. PT to add section on the Red Hat supply chain attack. Added affected packages in the Indicators of Compromise section. Updated July 15, 2026 at 4:10 p.m. PT to add section on July campaign using a Miasma variant. Updated the Indicators of Compromise section.
unit42.paloaltonetworks.comApr 24, 2026extracted
Vibe-Coded Malicious VS Code Extension Found with Built-In Ransomware Capabilities
Cybersecurity researchers have flagged a malicious Visual Studio Code (VS Code) extension with basic ransomware capabilities that appears to be created with the help of artificial intelligence – in other words, vibe-coded. Secure Annex researcher John Tuckner, who flagged the extension "susvsex," said it does not attempt to hide its malicious functionality. The extension was uploaded on November 5, 2025, by a user named "suspublisher18" along with the description "Just testing" and the email address "donotsupport@example[.]com." "Automatically zips, uploads, and encrypts files from C:\Users\Public\testing (Windows) or /tmp/testing (macOS) on first launch," reads the description of the extension. As of November 6, Microsoft has stepped in to remove it from the official VS Code Extension Marketplace. According to details shared by "suspublisher18," the extension is designed to automatically activate itself on any event, including installing or when launching VS Code, and invoke a function named "zipUploadAndEncrypt," which creates a ZIP archive of a target directory, exfiltrates it to a remote server, and replaces the files with their encrypted versions. "Fortunately, the TARGET_DIRECTORY is configured to be a test staging directory so it would have little impact right now, but is easily updated with an extension release or as a command sent through the C2 channel covered next," Tuckner said. Besides encryption, the malicious extension also uses GitHub as command-and-control (C2) by polling a private GitHub repository for any new commands to be executed by parsing the "index.html" file. The results of the command execution are written back to the same repository in the "requirements.txt" file using a GitHub access token embedded in the code. The GitHub account associated with the repository – aykhanmv – continues to be active, with the developer claiming to be from the city of Baku, Azerbaijan. "Extraneous comments which detail functionality, README files with execution instructions, and placeholder variables are clear signs of 'vibe-coded' malware," Tuckner said. "The extension package accidentally included decryption tools, command and control server code, GitHub access keys to the C2 server, which other people could use to take over the C2." Trojanized npm Packages Drop Vidar Infostealer The disclosure comes as Datadog Security Labs unearthed 17 npm packages that masquerade as benign software development kits (SDKs) and provide the advertised functionality, but are engineered to stealthily execute Vidar Stealer on infected systems. The development marks the first time the information stealer has been distributed via the npm registry. The cybersecurity company, which is tracking the cluster under the name MUT-4831, said some of the packages were first flagged on October 21, 2025, with subsequent uploads recorded the next day and on October 26. The names of the packages, published by accounts called "aartje" and "saliii229911," are below - abeya-tg-api bael-god-admin bael-god-api bael-god-thanks botty-fork-baby cursor-ai-fork cursor-app-fork custom-telegram-bot-api custom-tg-bot-plan icon-react-fork react-icon-pkg sabaoa-tg-api sabay-tg-api sai-tg-api salli-tg-api telegram-bot-start telegram-bot-starter While the two accounts have since been banned, the libraries were downloaded at least 2,240 times prior to them being taken down. That said, Datadog noted that many of these downloads could likely have been the result of automated scrapers. The attack chain in itself is fairly straightforward, kicking in as part of a postinstall script specified in the "package.json" file that downloads a ZIP archive from an external server ("bullethost[.]cloud domain") and execute the Vidar executable contained within the ZIP file. The Vidar 2.0 samples have been found to use hard-coded Telegram and Steam accounts as dead drop resolvers to fetch the actual C2 server. In some variants, a post-install PowerShell script, embedded directly in the package.json file, is used to download the ZIP archive, after which the execution control is passed to a JavaScript file to complete the rest of the steps in the attack. ' "It is not clear why MUT-4831 chose to vary the postinstall script in this way," security researchers Tesnim Hamdouni, Ian Kretz, and Sebastian Obregoso said. "One possible explanation is that diversifying implementations can be advantageous to the threat actor in terms of surviving detection." The discovery is just another in a long list of supply chain attacks targeting the open-source ecosystem spanning npm, PyPI, RubyGems, and Open VSX, making it crucial that developers perform due diligence, review changelogs, and watch out for techniques like typosquatting and dependency confusion before installing packages.
thehackernews.comNov 7, 2025extracted
Top 5 Tecniche per Monitorare il Dark Web e Raccogliere e Automatizzare Intelligence (OSINT)
Il Dark Web è spesso raccontato come un luogo misterioso, popolato da criminali informatici e marketplace di merce illegale. In realtà, per chi si occupa di cybersecurity e threat intelligence, rappresenta un’enorme fonte di dati utili: forum dove vengono vendute credenziali rubate, dump di database aziendali, annunci di Ransomware-as-a-Service e molto altro. Monitorare questi spazi in modo sistematico e sicuro permette ai team di threat intelligence e ai SOC di guadagnare tempo prezioso: scoprire prima che i propri dati vengano pubblicati, anticipare nuove TTP degli attaccanti e arricchire la detection con indicatori in tempo reale. In questo articolo vediamo 5 tecniche pratiche per monitorare il Dark Web, con esempi concreti di strumenti, piccoli script e pipeline di automazione. L’obiettivo non è “navigare per curiosità”, ma capire come un SOC o un team di incident response possa integrare queste informazioni nei propri processi di detection e difesa. 1. Crawler .onion personalizzati Il punto di partenza per esplorare il Dark Web è la creazione di un piccolo crawler in grado di visitare hidden services e scaricare i contenuti di interesse. Dal punto di vista tecnico, basta configurare Tor come proxy locale e usare una libreria come Stem per Python o semplici richieste HTTP instradate via SOCKS5. Questo permette di predisporre script che si connettono a indirizzi .onion, scaricano le pagine e le salvano localmente per successive analisi. Un esempio pratico in Python può essere realizzato con poche righe di codice usando requests e una sessione proxata su 127.0.0[.]1:9050. Naturalmente, l’ambiente deve essere isolato tramite VM dedicata (QUI la nostra guida per navigare in sicurezza nel dark web). Questo approccio consente di raccogliere contenuti senza interazione diretta, riducendo il rischio, dall’altro permette di costruire un archivio locale su cui applicare ricerche e analisi successive. Setup tecnico: Installare Tor e usare la libreria Stem per Python. Creare uno script che si connette via socks5://127.0.0.1:9050 e scarica contenuti. Esempio di snippet in Python: import requests session = requests.session() session.proxies = {'http': 'socks5h://127.0.0.1:9050', 'https': 'socks5h://127.0.0.1:9050'} url = "http://exampleonionaddress[.]onion" response = session.get(url) print(response.text[:500]) 2. Monitoraggio marketplace e forum Se i crawler servono a raccogliere dati, i forum e i marketplace sono i luoghi dove quei dati vengono messi in circolazione. Qui si trovano credenziali, database, accessi RDP o VPN in vendita, ma anche discussioni che anticipano trend futuri. Per documentare e analizzare in modo strutturato queste fonti esistono strumenti come OnionScan, capace di mappare hidden services e correlare metadata, e Hunchly, utile a conservare prove in maniera forense. Un’altra opzione è Spiderfoot, che permette di automatizzare OSINT e integrare moduli dedicati al Dark Web. Il metodo efficace è definire una lista di parole chiave: domini email aziendali, nomi di brand, prodotti interni. Lo scraper raccoglie i testi, un parser li analizza e li archivia in un database. A quel punto, ogni volta che un termine di interesse appare in un thread, è possibile investigare immediatamente. La difficoltà sta nel distinguere i “fake leak” da annunci reali: molti attori pubblicano campioni incompleti come anche falsi. Serve quindi un processo di validazione, che può includere analisi di hash, confronti con credenziali interne o sandboxing di file sospetti. Strumenti utili: OnionScan: scanner open source per analizzare hidden services. Hunchly: utile per documentare e preservare prove (catena di custodia). Spiderfoot: per automatizzare OSINT, anche su domini .onion. Come impostare un monitoraggio: Definire una lista di keyword (es. nome azienda, dominio email, nomi di prodotto). Usare cronjob o scheduler per eseguire scraping periodico. Salvare contenuti in un database locale per successiva analisi. 3. Feed Dark Web + integrazione CTI Oltre alle attività di raccolta autonoma, esistono feed pubblici e piattaforme di condivisione che forniscono indicatori già arricchiti. MISP e OpenCTI sono due strumenti open source ormai standard in molti SOC, che consentono di centralizzare IoC (indicatori di compromissione), correlare eventi e storicizzare campagne. Integrare i dati del Dark Web in queste piattaforme consente di arricchire le indagini. Lo scenario tipico prevede una pipeline dove: Il crawler scarica pagine .onion. Un parser estrapola email, domini, indirizzi IP, fingerprint PGP. Gli indicatori vengono importati in MISP o OpenCTI. Il SIEM aziendale li usa come lista di correlazione nei log di autenticazione, proxy e firewall. Snippet shell per grep di domini nei dump raccolti: grep -i “example[.]com” darkweb_dumps/*.txt | cut -d: -f1 | sort | uniq 4. Analisi di PGP keys e reti di trust Un aspetto spesso sottovalutato è l’uso delle chiavi PGP nel Dark Web. Molti attori firmano i propri messaggi con la stessa chiave per creare una sorta di reputazione. Collezionare e analizzare queste chiavi consente di correlare identità apparentemente distinte su più forum. Con GPG (GNU Privacy Guard) è possibile importare fingerprint e creare un database locale. A questo punto, è possibile osservare le chiavi utilizzati dai threat actor: se una chiave compare associata a un vendor in due marketplace diversi, vuol dire che si tratta dello stesso attore. Questa informazione è preziosa per analisi di attribution, ma anche per verificare la credibilità di un annuncio di leak. Le reti di fiducia costruite intorno a PGP permettono anche di individuare pattern di collaborazione tra gruppi criminali: incrociando le firme si scoprono spesso alleanze, rivalità o transizioni di identità tra nickname. Come fare: Salvare i fingerprint PGP pubblicati nei forum. Confrontare se la stessa chiave appare su più marketplace. Usare gpg –recv-keys per collezionare chiavi da keyserver pubblici. Caso pratico: Se un venditore usa lo stesso fingerprint PGP in due forum diversi, è probabile che le sue attività siano collegate: informazione preziosa in un’indagine di attribution. 5. Automazione e alerting continuo Il limite principale del monitoraggio manuale è la scalabilità. Un analista può esplorare un forum, ma non centinaia di hidden services contemporaneamente. La soluzione è l’automazione. Un esempio pratico: se una lista di username trapelati viene importata in Splunk, è possibile scrivere una query che correla questi account con tentativi di login falliti o accessi da geografie insolite. Lo stesso vale per indirizzi IP o hash di file malevoli. Anche il monitoraggio del traffico Tor in uscita può fornire insight: non sempre è segno di attività malevola, ma può indicare un comportamento anomalo su endpoint aziendali. Strumenti come Zeek o Suricata consentono di generare alert quando un host interno inizia a comunicare con nodi noti della rete Tor. Integrazione con SIEM: Importare indicatori in Elastic/Splunk. Creare alert per correlare username leaked con login sospetti. Query esempio Splunk: index=auth (user IN [list_user_leaked]) | stats count by user, src_ip Monitoraggio di traffico verso Tor: Bloccare o almeno loggare outbound traffic su porte 9050/9150. Con Suricata/Zeek, rilevare pattern tipici di handshake Tor. Pipeline consigliata (schema): Dark Web crawler → Parser → MISP/OpenCTI → SIEM (alert) → Incident Response Una pipeline efficace prevede un crawler periodico, un parser che normalizza i dati in JSON o CSV, un’integrazione con MISP/OpenCTI e infine l’invio degli IoC al SIEM. A quel punto si possono creare regole di alerting. Conclusione Il Dark Web non è per forza un luogo da cui stare alla larga; in ambito cybersecurity può essere una miniera di dati che possono fare la differenza in un programma di cyber threat intelligence. La chiave è trasformare dati grezzi in intelligence: osservare, raccogliere, arricchire e correlare. In questo modo un potenziale leak diventa un alert concreto in un SIEM, una chiave PGP diventa un collegamento tra due attori, un annuncio di vendita diventa l’inizio di un investigation playbook. L’elemento fondamentale resta la sicurezza: lavorare sempre in ambienti isolati, non interagire direttamente con i criminali e rispettare il quadro legale. Fatto in questo modo, il monitoraggio del Dark Web non è un esercizio accademico, ma uno strumento operativo per difendere in maniera proattiva le infrastrutture aziendali.
blog.8bitsecurity.comOct 2, 2025extracted