Install Hooks Were Never the Chokepoint
Three separate findings converge on the same structural error, and the control most teams reach for next already has a hole shaped like their own SaaS estate.
Slack is already on the allowlist
Aikido found malware on the Terraform registry, the first such finding on that registry per Risky Business. Two providers and two Go modules, command-and-control over a Slack channel. The code is a Go port of the Graphalgo npm malware from February, so the payload is recycled and what is new is that it shipped through the Terraform registry. Two structural reasons this is worse than another poisoned package. terraform init executes provider code on whatever host runs the plan, and that host usually holds cloud admin credentials. Slack-as-C2 defeats the first mitigation anyone reaches for: every developer laptop and CI runner already talks to slack.com, so an allowlist built from the corporate SaaS inventory already permits the exfiltration destination.
That cuts against other advice in the reporting. Computerworld's analysis of the npm case names default-deny runtime egress as the control of last resort, since nothing else observes a payload running inside your own process. Default-deny works only when the allowed destination set is enumerated per service instead of inherited from a corporate SaaS list. CSO First Look has the sharper version: an invoicing service has no legitimate reason to reach graph.microsoft.com, and backend services are where the legitimate destination set is short enough to write down.
Revoking the token left the backdoor running
The second finding rewrites a runbook section. A reverse-engineered implant ran C2 through a legitimate OneDrive account and could remotely replace every stolen credential, so revoking the compromised token left the backdoor fully operational (CSO First Look). TLDR IT's read of the same analysis names the durable object of compromise: the application registration. Whoever controls the registration mints new client secrets and certificates at will, and the audit trail stays clean while the implant re-provisions itself.
Any identity system with a rotation endpoint can behave this way. If a rotation endpoint accepts the credential it is rotating as sufficient proof of identity, rotation is a persistence feature. Every cycle hands the attacker a fresh valid credential and resets the revocation clock. Binding re-issuance to something that cannot be stolen over the network is the fix: a TPM-resident key, an attested workload identity, or out-of-band human approval. Autoscaled workloads that cannot hold hardware keys need the attestation path, control-plane dependency included.
| Control | What it actually catches | Coverage against these techniques |
|---|---|---|
--ignore-scripts, hook scanners | Lifecycle-hook payloads only | None — wrong file inspected |
| Popularity / maturity scoring in SCA | Abandoned or obscure packages | Inverted — mass adoption boosted trust |
| Release-age cooldown | Fast-burning malicious versions, wherever the payload sits | Holds |
| Token revocation | Session theft | None against credential re-issuance |
| Per-service enumerated egress | In-process exfiltration attempts | Holds — unless the allowlist includes general SaaS |
What to actually ship
Order matters, because the cheapest item is also the most effective. A 7–14 day release-age cooldown (Renovate's minimumReleaseAge or the pnpm equivalent) structurally prevents a version that burns two million downloads in a week from reaching production, and the cost is one documented break-glass override. Then the Terraform-specific controls: a private provider mirror, committed and CI-verified .terraform.lock.hcl hashes, plan runners on short-lived read-only credentials. Then the rotation-path inventory.
One verification gap to state out loud: no report here names the npm package, a GHSA ID, or a researcher, and CSO Update flags that explicitly. Pull the registry advisory before filing tickets that reference specific artifacts. Nobody should invent a CVE number to satisfy a Jira field.
If the rotation endpoint accepts the old credential as proof of identity, revocation does nothing.
What to do
Enable a 7–14 day dependency release-age cooldown this week with a documented break-glass override for advisory-driven patches.
Enumerate the outbound destination set for your three highest-credential services by the end of this sprint and enforce it at the network layer, excluding general-purpose SaaS domains.
Audit every credential rotation and re-enrollment path this quarter for whether the old credential alone authenticates the new one, then move app-registration credential enumeration ahead of token revocation in the IR runbook.