MAL-2026-4072
Vulnerability from ossf_malicious_packages
Part of the Mini Shai-Hulud supply chain attack campaign in which a threat actor compromised the npm account atool and published 631 malicious versions across 314 npm packages in an automated 22-minute burst. Each malicious version injects a preinstall hook that executes a 498KB obfuscated Bun script, using the GitHub API as a covert exfiltration channel. Credentials are committed to attacker-controlled repositories following Dune-themed naming patterns (e.g., harkonnen-melange-742). Stolen data includes AWS keys, GitHub PATs, npm tokens, GCP service accounts, Azure credentials, Kubernetes service account tokens, SSH keys, Docker auth configs, database connection strings, Stripe keys, and Slack tokens. Malicious versions also establish persistence via CI/CD workflow injection (a GitHub Actions workflow named Run Copilot dumps all secrets via toJSON(secrets)), AI agent session hooks, and a system daemon named kitty-monitor.
This specific package (@antv/narrative-text-editor) was modified to include a malicious preinstall hook executing the obfuscated Bun payload.
-= Per source details. Do not edit below this line.=-
Source: amazon-inspector (b6c860df004f49eacd9b820f084f31c6454b4525875cd0f446de8c1d5bddd684)
The package @antv/narrative-text-editor was found to contain malicious code.
Source: google-open-source-security (847ef6b381d410bf176f7414a6f0fbbcf46a5f39b6d9011e126b279bd2d781df)
This package was compromised as part of the ongoing "Mini Shai-Hulud is back" worm by the TeamPCP threat actor.
The package will steal credentials and then propogate it to every package it has access to. The package also attempts to remain persistent.
{
"affected": [
{
"package": {
"ecosystem": "npm",
"name": "@antv/narrative-text-editor"
},
"versions": [
"0.3.20",
"0.4.20"
]
}
],
"credits": [
{
"contact": [
"actran@amazon.com"
],
"name": "Amazon Inspector",
"type": "FINDER"
},
{
"contact": [
"https://safedep.io"
],
"name": "SafeDep",
"type": "FINDER"
}
],
"database_specific": {
"malicious-packages-origins": [
{
"import_time": "2026-05-19T05:55:55.089101Z",
"modified_time": "2026-05-19T05:36:35Z",
"sha256": "847ef6b381d410bf176f7414a6f0fbbcf46a5f39b6d9011e126b279bd2d781df",
"source": "google-open-source-security",
"versions": [
"0.3.20",
"0.4.20"
]
},
{
"import_time": "2026-05-19T17:50:35.434585509Z",
"modified_time": "2026-05-19T16:47:48Z",
"sha256": "b6c860df004f49eacd9b820f084f31c6454b4525875cd0f446de8c1d5bddd684",
"source": "amazon-inspector",
"versions": [
"0.3.20",
"0.4.20"
]
}
]
},
"details": "Part of the **Mini Shai-Hulud** supply chain attack campaign in which a threat actor compromised the npm account `atool` and published 631 malicious versions across 314 npm packages in an automated 22-minute burst. Each malicious version injects a `preinstall` hook that executes a 498KB obfuscated Bun script, using the GitHub API as a covert exfiltration channel. Credentials are committed to attacker-controlled repositories following Dune-themed naming patterns (e.g., `harkonnen-melange-742`). Stolen data includes AWS keys, GitHub PATs, npm tokens, GCP service accounts, Azure credentials, Kubernetes service account tokens, SSH keys, Docker auth configs, database connection strings, Stripe keys, and Slack tokens. Malicious versions also establish persistence via CI/CD workflow injection (a GitHub Actions workflow named `Run Copilot` dumps all secrets via `toJSON(secrets)`), AI agent session hooks, and a system daemon named `kitty-monitor`.\n\nThis specific package (`@antv/narrative-text-editor`) was modified to include a malicious `preinstall` hook executing the obfuscated Bun payload.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (b6c860df004f49eacd9b820f084f31c6454b4525875cd0f446de8c1d5bddd684)\nThe package @antv/narrative-text-editor was found to contain malicious code.\n\n## Source: google-open-source-security (847ef6b381d410bf176f7414a6f0fbbcf46a5f39b6d9011e126b279bd2d781df)\nThis package was compromised as part of the ongoing \"Mini Shai-Hulud is back\" worm by the TeamPCP threat actor.\n\nThe package will steal credentials and then propogate it to every package it has access to. The package also attempts to remain persistent.\n",
"id": "MAL-2026-4072",
"modified": "2026-05-19T17:52:41Z",
"published": "2026-05-19T00:00:00Z",
"references": [
{
"type": "REPORT",
"url": "https://safedep.io/mini-shai-hulud-strikes-again-314-npm-packages-compromised/"
},
{
"type": "ARTICLE",
"url": "https://socket.dev/blog/antv-packages-compromised"
},
{
"type": "ARTICLE",
"url": "https://safedep.io/mini-shai-hulud-strikes-again-314-npm-packages-compromised/"
},
{
"type": "ARTICLE",
"url": "https://opensourcemalware.com/blog/teampcp-compromises-npm-maintainer-with-over-540-packages"
}
],
"schema_version": "1.7.4",
"summary": "Malicious code in @antv/narrative-text-editor (npm)"
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.