| PyPI phishing (July 2025) | Passkeys (FIDO2/WebAuthn) on every maintainer account; cooldown on metadata-driven outreach; harden support flows against 2FA-reset phishing pretexts | |
| npm maintainer 2FA-reset phishing (Sept 2025) | Passkeys make phishing-pretext 2FA-resets meaningless; passkeys cannot be transferred via support reset | |
| Trivy PwnRequest (Feb 27) | Audit and remove pull_request_target triggers from workflows; never check out PR code in a pull_request_target workflow. Pair with atomic token rotation so the next compromise after first detection can't reuse the old PAT. | |
| Aqua incomplete rotation (Mar 1) | Atomic token rotation: revoke old before issuing new; verify with API list of active tokens | |
| Trivy main strike (Mar 19) | Pin GitHub Actions to commit SHA; verify action contents via in-toto attestation | |
| CanisterWorm (Mar 20) | Egress block to ICP canister C2 (raw.icp0.io); enforce npm package signature verification | |
| Checkmarx OpenVSX extensions (Mar 23) | Pin VS Code/OpenVSX extension versions in .vscode/extensions.json; disable auto-update | |
| KICS GitHub Action (Mar 23) | Pin to commit SHA (same control as Trivy); deny push permissions to bot accounts post-publish | |
| LiteLLM PyPI (Mar 24) | PyPI Trusted Publishers; `pip --require-hashes`; remove .pth files at install time | |
| Telnyx WAV steganography (Mar 27) | Static analysis of non-code files in package payload; behavior-based detection on install scripts | |
| Checkmarx Jenkins AST (Apr 1) | Verify package provenance and signature attestations before installation. Catch version-impersonation by detecting unexpected publishers or missing attestations. | |
| Bitwarden CLI (Apr 23) | Pin every GitHub Action to a full commit SHA (the compromise reused a CI/CD GitHub Action vector); enable npm --ignore-scripts to neutralize the preinstall payload. | |
| SAP CAP Mini Shai-Hulud (Apr 29) | Disable npm preinstall scripts (--ignore-scripts) and scope PyPI Trusted Publishers + npm OIDC trust narrowly to specific workflows on protected branches, never whole repos. The @cap-js packages were published via OIDC trust scoped to the entire cap-js/cds-dbs repo, so the worm just ran the legitimate trusted workflow. | |
| TanStack OIDC theft (May 11) | Restrict pull_request_target cache write scope; alert on /proc/<pid>/mem reads by non-systemd processes | |
| Shai-Hulud source code open-sourced (May 12) | Detection-rule sharing; expect copycats with leaked code; treat every Mini-Shai-Hulud-family compromise May 12+ as actor-ambiguous when investigating | |
| Nx Console v18.95.0 (May 18) | Two-admin manual approval on every publish (single-maintainer publish was the proximate cause); rotate any session credentials that touched a CI runner via a compromised dependency; minimum-release-age applied to extensions as well as packages. | |
| AntV mass-republish (May 18-19) | Adopt a minimum-release-age window (24h is a good default). The @antv mass-publish bursts were ~6 seconds each; any cooldown longer than that catches them before they reach production builds. | |
| DurableTask + AWS SSM (May 18) | AWS SSM permission audit; restrict SendCommand to specific role principals; isolate password manager from CI environment | |
| GitHub VS Code ext breach (May 19-20) | Pin developer-installed extension versions in .vscode/extensions.json with auto-update disabled; allowlist Marketplace publishers via VS Code's settings policy; EDR on developer workstations; treat the IDE as a privileged execution surface. | |