<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm" -->

---
title: AsyncAPI npm packages backdoored with Miasma botnet via...
description: 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...
canonical: https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: AsyncAPI npm packages backdoored with Miasma botnet via unprotected GitHub branch | daily.dev
og:description: 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...
og:url: https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm
og:image: https://api.daily.dev/og/posts/lkZRwCrRM.png
og:image:alt: AsyncAPI npm packages backdoored with Miasma botnet via unprotected GitHub branch
og:image:width: 1200
og:image:height: 630
og:locale: 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.

## Questions this post answers

### Which AsyncAPI npm packages were compromised with malware and what versions should I avoid?

Five packages were published with a malware dropper on July 14, 2025: @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. Combined weekly downloads exceeded 2.25 million, though the malicious versions were live for roughly four hours before removal from npm.

_Teams tracking dependency risk can follow supply chain incidents like this one on daily.dev._

### How did attackers publish malicious npm packages without stealing an npm token?

The attacker pushed a trojanized commit to the AsyncAPI repository's unprotected 'next' branch using a generic git identity. That branch auto-triggered the legitimate GitHub Actions release workflow, which published to npm via GitHub's OIDC trusted-publisher integration, so no token theft was needed and the packages still carried valid OIDC and SLSA provenance attestations.

_Anyone hardening release pipelines can weigh branch protection against token security with insights like this on daily.dev._

### Why would npm malware scanning tools miss the Miasma botnet payload in the AsyncAPI packages?

The payload was injected into src/utils.js and fires at require() time rather than during npm install, so security tooling that only watches preinstall or postinstall lifecycle hooks would miss it entirely. Once triggered, it spawns a hidden detached Node.js process disguised as sync.js that fetches the encrypted Miasma botnet payload from an IPFS gateway.

_Developers building detection for import-time threats can track cases like this on daily.dev._

## 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)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"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","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm"},"datePublished":"2026-07-14T18:36:24.147Z","dateModified":"2026-09-13T19:14:00.973Z","description":"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...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/726f700b151b591ea73cab5723034b27?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/726f700b151b591ea73cab5723034b27?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Collections","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Collections","logo":"https://media.daily.dev/image/upload/s--fk_6ycEi--/f_auto,q_auto/v1780996001/logos/collections?_a=BAMAMiWQ0","url":"https://daily.dev/sources/collections"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"security,malware,github-actions,npm","timeRequired":"PT4M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Collections","item":"https://daily.dev/sources/collections"},{"@type":"ListItem","position":3,"name":"AsyncAPI npm packages backdoored with Miasma botnet via unprotected GitHub branch"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm","comment":[{"@type":"Comment","text":"Another day, another NPM security breach","datePublished":"2026-07-15T05:56:58.629Z","url":"https://daily.dev/posts/lkZRwCrRM#c-JVX0qCJpA","author":{"@type":"Person","name":"Alex","url":"https://daily.dev/alvelinov","image":"https://media.daily.dev/image/upload/s---IBHXW6K--/f_auto/v1739260309/avatars/avatar_qeKHgWVZCS8FDvZfKwPnr"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/asyncapi-npm-packages-backdoored-with-miasma-botnet-via-unprotected-github-branch-lkzrwcrrm#faq","mainEntity":[{"@type":"Question","name":"Which AsyncAPI npm packages were compromised with malware and what versions should I avoid?","acceptedAnswer":{"@type":"Answer","text":"Five packages were published with a malware dropper on July 14, 2025: @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. Combined weekly downloads exceeded 2.25 million, though the malicious versions were live for roughly four hours before removal from npm. Teams tracking dependency risk can follow supply chain incidents like this one on daily.dev."}},{"@type":"Question","name":"How did attackers publish malicious npm packages without stealing an npm token?","acceptedAnswer":{"@type":"Answer","text":"The attacker pushed a trojanized commit to the AsyncAPI repository's unprotected 'next' branch using a generic git identity. That branch auto-triggered the legitimate GitHub Actions release workflow, which published to npm via GitHub's OIDC trusted-publisher integration, so no token theft was needed and the packages still carried valid OIDC and SLSA provenance attestations. Anyone hardening release pipelines can weigh branch protection against token security with insights like this on daily.dev."}},{"@type":"Question","name":"Why would npm malware scanning tools miss the Miasma botnet payload in the AsyncAPI packages?","acceptedAnswer":{"@type":"Answer","text":"The payload was injected into src/utils.js and fires at require() time rather than during npm install, so security tooling that only watches preinstall or postinstall lifecycle hooks would miss it entirely. Once triggered, it spawns a hidden detached Node.js process disguised as sync.js that fetches the encrypted Miasma botnet payload from an IPFS gateway. Developers building detection for import-time threats can track cases like this on daily.dev."}}]}
```

