Summary
Two malicious versions of @asyncapi/specs were published to npm on 2026-07-14 via a compromised alpha branch. The current latest tag points to the malicious version. This is a second, separate compromise from the same attacker who simultaneously hit the asyncapi/generator monorepo.
The asyncapi/spec-json-schemas maintainers are victims - this is a branch write token compromise, not an insider issue.
Affected Versions
| Package |
Version |
Tag |
Status |
@asyncapi/specs |
6.11.2-alpha.1 |
alpha |
MALICIOUS |
@asyncapi/specs |
6.11.2 |
latest |
MALICIOUS - currently live |
Safe version: 6.11.1 (published 2026-01-30, last clean version)
What Happened
The attacker (GitHub user ID 148100, login invalid-email-address) gained write access to the alpha branch and made 5 commits between 07:51-08:04 UTC under the identity "Your Name" / you@example.com (unconfigured git placeholder - not any real contributor).
The key injection commit is 61a930fca7241763e306e31abe4557221e84a76c (08:04 UTC), which modified index.js (+26 lines prepended at top of file).
The release workflow (.github/workflows/if-nodejs-release.yml) triggered automatically and asyncapi-bot published via GitHub Actions OIDC:
6.11.2-alpha.1 published at 08:06 UTC
6.11.2 promoted to latest at 08:30 UTC
Injected Payload
26 lines prepended to the top of index.js. Fires immediately on require('@asyncapi/specs') - no install hook needed:
import * as fs from 'fs';
import * as path from 'path';
import * as https from 'https';
import { spawn } from 'child_process';
import * as os from 'os';
async function main() {
const child = spawn('node', ['-e', `<obfuscated_downloader>`], {
detached: true,
stdio: 'ignore',
windowsHide: true
});
child.unref();
}
main();
The obfuscated downloader (decoded):
- Creates a hidden persistence directory per OS:
- Linux:
~/.local/share/NodeJS/
- macOS:
~/Library/Application Support/NodeJS/
- Windows:
%LOCALAPPDATA%\NodeJS\
- Downloads
sync.js (8.25MB RAT) from IPFS CID Qmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf
- Executes it silently detached, then calls
process.exit(0)
The RAT steals: browser saved passwords and cookies, SSH keys, .npmrc, GITHUB_TOKEN, NPM_TOKEN, ~/.aws/credentials, ~/.config/gh/, macOS keychain, crypto wallets.
Connection to asyncapi/generator Compromise
This is the same attacker, same campaign ("Miasma"), same day. The generator monorepo (next branch) was hit at 07:10 UTC, this repo (alpha branch) was hit at 07:51 UTC. Same GitHub user ID 148100, same unconfigured git identity, same payload structure.
Full details: asyncapi/generator#2184
Indicators of Compromise
| Type |
Value |
| Malicious commit |
61a930fca7241763e306e31abe4557221e84a76c |
| Branch compromised |
alpha |
| IPFS CID |
Qmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf |
| Drop file (Linux) |
~/.local/share/NodeJS/sync.js |
| Drop file (macOS) |
~/Library/Application Support/NodeJS/sync.js |
| Drop file (Windows) |
%LOCALAPPDATA%\NodeJS\sync.js |
| C2 / exfil IP |
85.137.53.71 (NL, AS43641) |
| Attacker GitHub ID |
148100 |
| GH Actions run |
https://github.com/asyncapi/spec-json-schemas/actions/runs/29318133538 |
Recommended Actions
For asyncapi/spec-json-schemas maintainers (urgent)
For users who installed @asyncapi/specs@6.11.2 or 6.11.2-alpha.1
- Check for and delete
sync.js in the drop paths above
- Kill any orphaned node processes from those directories
- Rotate: npm token, GitHub token, SSH keys, AWS credentials
- Treat browser saved passwords as compromised
Disclosure Timeline
| Time (UTC) |
Event |
| 2026-07-14 07:51 |
First malicious commit on alpha branch |
| 2026-07-14 08:04 |
Final payload injection commit (61a930fc) |
| 2026-07-14 08:06 |
@asyncapi/specs@6.11.2-alpha.1 published |
| 2026-07-14 08:30 |
@asyncapi/specs@6.11.2 published as latest |
| 2026-07-14 ~10:00 |
Detected by Upwind Supply Chain scanner |
| 2026-07-14 ~11:00 |
Confirmed, public disclosure |
Reported by Lidor Machluf / Upwind Security - lidor.machluf@upwind.io
Full technical analysis available on request. Related: asyncapi/generator#2184
Summary
Two malicious versions of
@asyncapi/specswere published to npm on 2026-07-14 via a compromisedalphabranch. The currentlatesttag points to the malicious version. This is a second, separate compromise from the same attacker who simultaneously hit theasyncapi/generatormonorepo.The
asyncapi/spec-json-schemasmaintainers are victims - this is a branch write token compromise, not an insider issue.Affected Versions
@asyncapi/specs6.11.2-alpha.1alpha@asyncapi/specs6.11.2latestSafe version:
6.11.1(published 2026-01-30, last clean version)What Happened
The attacker (GitHub user ID 148100, login
invalid-email-address) gained write access to thealphabranch and made 5 commits between 07:51-08:04 UTC under the identity "Your Name" / you@example.com (unconfigured git placeholder - not any real contributor).The key injection commit is
61a930fca7241763e306e31abe4557221e84a76c(08:04 UTC), which modifiedindex.js(+26 lines prepended at top of file).The release workflow (
.github/workflows/if-nodejs-release.yml) triggered automatically andasyncapi-botpublished via GitHub Actions OIDC:6.11.2-alpha.1published at 08:06 UTC6.11.2promoted tolatestat 08:30 UTCInjected Payload
26 lines prepended to the top of
index.js. Fires immediately onrequire('@asyncapi/specs')- no install hook needed:The obfuscated downloader (decoded):
~/.local/share/NodeJS/~/Library/Application Support/NodeJS/%LOCALAPPDATA%\NodeJS\sync.js(8.25MB RAT) from IPFS CIDQmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyfprocess.exit(0)The RAT steals: browser saved passwords and cookies, SSH keys,
.npmrc,GITHUB_TOKEN,NPM_TOKEN,~/.aws/credentials,~/.config/gh/, macOS keychain, crypto wallets.Connection to asyncapi/generator Compromise
This is the same attacker, same campaign ("Miasma"), same day. The generator monorepo (
nextbranch) was hit at 07:10 UTC, this repo (alphabranch) was hit at 07:51 UTC. Same GitHub user ID 148100, same unconfigured git identity, same payload structure.Full details: asyncapi/generator#2184
Indicators of Compromise
61a930fca7241763e306e31abe4557221e84a76calphaQmet4fhsAaWMBUxNDfREHwgiyDeSWy4YSYs9wiKUW5jGyf~/.local/share/NodeJS/sync.js~/Library/Application Support/NodeJS/sync.js%LOCALAPPDATA%\NodeJS\sync.js85.137.53.71(NL, AS43641)Recommended Actions
For asyncapi/spec-json-schemas maintainers (urgent)
alphabranch write token is compromised (separate from the generator repo tokens)alpha- identify how attacker gained push accessalphabranch to remove the malicious commits (coordinate with GitHub Security first)@asyncapi/specs@6.11.3(or next patch) from a clean state to supersede6.11.2aslatest6.11.2and6.11.2-alpha.1For users who installed
@asyncapi/specs@6.11.2or6.11.2-alpha.1sync.jsin the drop paths aboveDisclosure Timeline
alphabranch61a930fc)@asyncapi/specs@6.11.2-alpha.1published@asyncapi/specs@6.11.2published aslatestReported by Lidor Machluf / Upwind Security - lidor.machluf@upwind.io
Full technical analysis available on request. Related: asyncapi/generator#2184