16 distinct techniques documented for this family, organized by ATT&CK tactic.
Initial Access Supply Chain Compromise: Software Dependencies & Tools T1195.001 Typosquat nhmpy of numpy
Execution Command & Scripting Interpreter T1059 Bun runs _index.js ; execSync , curl , unzip
Execution User Execution: Malicious Package T1204.003 Victim installs the package
Persistence Event Triggered Execution ( .pth auto‑run) T1546 nhmpy-setup.pth runs on every Python start
Persistence Event Triggered Execution ( .pth auto‑run) T1546 nhmpy-setup.pth runs on every Python start
Defense Evasion Obfuscated/Encrypted Files & Information T1027 ROT‑17 → AES‑128‑GCM → obfuscator.io → custom G1 cipher (4 layers)
Defense Evasion Masquerading T1036 Verbatim NumPy clone; commits as chore: / fix: ci ; codeql.yml lure
Credential Access Steal Application Access Token T1528 GitHub/npm/PyPI/RubyGems/Azure/GCP/Anthropic tokens & OIDC exchange
Credential Access Credentials in Files T1552.001 ~/.aws , ~/.npmrc , ~/.pypirc , Vault token files, wallets
Credential Access Cloud Instance Metadata API T1552.005 AWS IMDS 169.254.169[.]254 , ECS 169.254.170[.]2 , Azure IMDS
Credential Access Container/K8s API token theft T1552.007 …/serviceaccount/token , kube config, Vault K8s
Discovery Cloud Service / Account Discovery T1526 / T1087 GraphQL identity & repo enumeration
Discovery Cloud Service / Account Discovery T1526 / T1087 GraphQL identity & repo enumeration
It self‑propagates by committing a malicious GitHub Actions workflow disguised as .github/workflows/codeql.yml ... into the victim’s repositories, then pushes and polls the workflow run.
Collection Data from Local System T1005 Aggregates discovered secrets
It fires on every Python start, fetches the Bun runtime from GitHub, and runs _index.js via a LOLbin.
Exfiltration Exfiltration Over Web Service T1567 Secrets written to attacker‑controlled GitHub repo
1 sources tracked across advisories, community write-ups, and news. New activity surfaces here as Mallory finds it.