---
title: "AsyncAPI npm packages backdoored with Miasma botnet via unprotected GitHub branch"
url: https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm
source_url: https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm
type: collection
source: "Collections"
published: 2026-07-14T18:36:24.147Z
updated: 2026-07-17T00:18:36.294Z
tags: ["security", "malware", "github-actions", "npm"]
reading_time: 4
upvotes: 1
comments: 1
language: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# AsyncAPI npm packages backdoored with Miasma botnet via unprotected GitHub branch

**[Collections](https://daily.dev/sources/collections)** · 4 min read · 1 upvotes · 1 comments

## Summary

Five AsyncAPI npm packages were backdoored on July 14, 2026, via a malicious commit pushed to an unprotected GitHub branch that auto-triggered the legitimate release workflow. The packages received real npm OIDC provenance attestations, making them appear clean to automated checks. The embedded malware, called Miasma, fires on a plain require() rather than install hooks, spawns a hidden Node.js child process, fetches an encrypted second-stage payload via IPFS, and connects to a C2 server every 30 seconds to execute shell commands, harvest credentials, and identify high-value developer targets (Cursor, Claude, VS Code). Affected environments should be treated as fully compromised, with all credentials rotated and sync.js processes investigated. The attack highlights that provenance attestations only verify the pipeline, not the legitimacy of the underlying commit, and that branch protection on release-triggering branches is as critical as npm token hygiene.

## Content

## What happened

On July 14, 2025, five npm packages in the AsyncAPI namespace were published carrying a multi-stage malware dropper. The affected packages — `@asyncapi/generator@3.3.1`, `@asyncapi/generator-helpers@1.1.1`, `@asyncapi/generator-components@0.7.1`, `@asyncapi/specs@6.11.2`, and at least one related package — had a combined weekly download count exceeding 2.25 million. All five malicious versions have since been removed from npm, but the exposure window lasted roughly four hours.

## How the attacker got in

No npm token was stolen. The attacker pushed a trojanized commit to the repository's unprotected `next` branch using a generic git identity. That branch was configured to auto-trigger the project's legitimate GitHub Actions release workflow, which published the packages to npm using GitHub's OIDC trusted-publisher integration.

The result: the packages carry valid npm OIDC provenance attestations and SLSA provenance records. This is worth sitting with for a moment. Provenance attestations only prove *which workflow* produced a package — not that the commit feeding that workflow was legitimate. If a release-triggering branch isn't protected, attestations provide a false sense of security.

Two separate GitHub repositories were compromised in the same operation, suggesting a coordinated attack rather than opportunistic branch squatting.

## What the malware does

The payload is injected into `src/utils.js`, hidden behind whitespace, and fires at `require()` time — not during `npm install`. This matters because most security tooling watches for malicious install scripts (`preinstall`, `postinstall`). Anything that only scans lifecycle hooks would miss this entirely.

On import, the code spawns a hidden detached Node.js child process that fetches an encrypted second-stage payload — called **Miasma** — from an IPFS gateway. The payload is written to disk as `sync.js`, disguised as a NodeJS system process.

Miasma is a botnet framework with a fairly complete feature set:

- **Remote shell** — beacons to a C2 server every 30 seconds and executes arbitrary shell commands
- **Credential harvesting** — targets npm tokens, GitHub tokens, cloud credentials, SSH keys, CI/CD secrets, browser data, AI tool data (Cursor, Claude, VS Code are specifically checked for), and cryptocurrency wallets
- **File operations and persistence** — config fields like `safeMode` and `actualPersist` appear to disable persistence, but call-graph analysis shows persistence actually runs regardless
- **Multi-protocol C2** — communicates over HTTP, Nostr relays, Ethereum smart contracts, and a libp2p mesh
- **Self-propagation code** — present but currently toggled off
- **Evasion** — the detached process and disguised filename are designed to blend into normal Node.js activity

## Who's at risk

Any developer workstation or CI/CD environment that imported one of the affected packages during the exposure window should be treated as compromised. The trigger is `require()`, so this includes any build or test run that loaded the package — not just explicit installs.

## What to do

**Immediate steps:**

1. Check your lockfiles and `node_modules` for the affected versions. Hunt for imports, not just installs — `grep` for `require('@asyncapi/generator')` and equivalents across your codebase and CI configs.
2. Look for a `sync.js` process running as NodeJS, and check for outbound connections to unfamiliar IPs on 30-second intervals.
3. Rotate everything that was accessible from affected environments: npm tokens, GitHub tokens, cloud credentials, SSH keys, and CI/CD secrets.
4. Rebuild any compromised hosts rather than trying to clean them.

**Longer-term:**

- Pin dependencies to verified versions and audit lockfiles and SBOMs regularly.
- Treat branch protection on release-triggering branches as seriously as npm token hygiene. An unprotected `next` branch with publish permissions is an open door.
- Don't rely solely on provenance attestations as a trust signal — they confirm the pipeline, not the commit.
- Add detection for Node.js child processes spawned at import time, not just at install time.

## Community discussion

Top comments from developers on daily.dev.

**@alvelinov** · 0 upvotes

> Another day, another NPM security breach

## Similar posts on daily.dev

- [Miasma Attack Hits Red Hat npm Packages](https://daily.dev/posts/miasma-attack-hits-red-hat-npm-packages-bzd1muxsa) · Snyk · 0 upvotes · 0 comments

---

Tags: [#security](https://daily.dev/tags/security), [#malware](https://daily.dev/tags/malware), [#github-actions](https://daily.dev/tags/github-actions), [#npm](https://daily.dev/tags/npm)

[View this post on daily.dev](https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm)
