Look for unrecognised self-hosted runners, unexpected workflows, new branches, repeated secret access, and tokens being used from places they should never reach. Those signals show the incident has moved from one-off execution into ongoing control of the delivery environment.
How persistence shows up after a dependency compromise
A dependency compromise becomes a persistence problem when the attacker is no longer just executing once, but can keep re-entering the delivery path. That usually means they have found durable footholds in build, release, or automation paths, or they have obtained credentials that let them come back without re-exploiting the original weakness.
What teams are really trying to distinguish is transient abuse from ongoing control. If the same strange behaviour keeps repeating across pipelines, branches, tokens, or runners, the dependency is no longer just the entry point, it is part of the attacker’s continuing access path.
Persistency is often easiest to miss when the compromise looks operational rather than obviously malicious. A poisoned package, a compromised CI step, or a hijacked maintainer account can be used to seed trust in ways that survive cleanup unless the team checks whether attacker-controlled artefacts have been embedded into routine delivery activity.
Which signals suggest the compromise has durable control, not just initial access?
The strongest indicators are signs that the attacker can keep operating inside the delivery environment. Unrecognised self-hosted runners, unexpected workflows, new branches that nobody can explain, repeated secret access, and tokens being used from places they should never reach all point to continuing control rather than a single burst of misuse.
Look especially for evidence that normal automation has been altered to work for the attacker. If workflows are being triggered outside expected change windows, if job definitions have been modified to call unfamiliar endpoints, or if repository activity keeps reappearing after cleanup, the compromise likely includes persistence in the pipeline itself.
Another useful distinction is whether the compromise survives credential rotation. If access returns after secret resets, the problem is probably not just one leaked token. It may be a backdoor in the dependency chain, a hidden runner, an injected workflow, or another foothold that re-establishes trust after each response.
Why dependency persistence is hard to remove
Persistence in a dependency chain is difficult because delivery systems are built to trust automation, reuse secrets, and execute quickly. That makes them efficient for development, but it also means a compromised package, maintainer path, or CI integration can blend into normal operations and keep generating valid-looking activity.
The practical challenge is that one compromised dependency can create multiple surviving footholds at once. An attacker may abuse repository permissions, pipeline credentials, cached secrets, or release automation so that removal of one artefact does not fully remove their access. That is why persistence checks have to span source, build, and release paths rather than only the initially suspected package.
Teams also underestimate how much identity continuity exists in automation. When the same tokens, runners, or deployment roles are reused across jobs, a compromise can persist even after the original package is replaced. The issue is not only what was compromised, but what still trusts it.
Risk and Threat Considerations
A dependency compromise becomes materially more dangerous once it can reassert access after cleanup, because the attacker can continue to manipulate builds, exfiltrate secrets, or stage follow-on compromise from a trusted delivery path. At that point, the incident is not just supply-chain abuse, it is an enduring access problem.
Failure mechanism: Persistence usually comes from hidden runners, altered workflow logic, reused tokens, or retained trust relationships that survive the first remediation pass.
Impact: The attacker can keep obtaining secrets, modifying artefacts, or reintroducing malicious code even after the obvious compromised component has been removed.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
MITRE ATT&CK and OWASP Non-Human Identity Top 10 address the attack and risk surface, while CIS Controls v8 and NIST SP 800-53 Rev 5 set the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| MITRE ATT&CK | T1098 — Account Manipulation | Persistence via altered workflows, runners, and tokens maps to durable access changes. |
| T1505 — Server Software Component | Compromised dependency delivery and injected build components create lasting footholds. | |
| Recommendation — Hunt for unauthorized account and workflow changes that preserve attacker access. Inspect build and release components for attacker-modified persistence mechanisms. | ||
| CIS Controls v8 | CIS-5 — Account Management | Repeated token use and unexpected automation access indicate stale or abused accounts. |
| Recommendation — Remove unneeded automation accounts and rotate credentials tied to the compromise. | ||
| NIST SP 800-53 Rev 5 | AU-6 — Audit Review, Analysis, and Reporting | Repeated secret access and unexpected workflow activity require log review and analysis. |
| Recommendation — Correlate repository, CI, and secret-access logs to confirm whether access is recurring. | ||
| OWASP Non-Human Identity Top 10 | NHI-05 — Overprivileged NHI | Persistent pipeline abuse often depends on automation identities with too much privilege. |
| Recommendation — Reduce automation privilege so compromised delivery identities cannot persist broadly. | ||
Practitioner Guidance
What to prioritise: Treat repeatable access patterns as higher priority than the original malicious package or commit. If the compromise can still trigger jobs, read secrets, or create new branches after cleanup, focus on the delivery controls that are still trusting it.
What to verify: Confirm whether any self-hosted runners, workflow files, branch protections, or automation tokens were introduced or modified during the incident window. The key question is whether the attacker changed the control plane, not only the payload.
Decision rule: If access returns after credential rotation, assume persistence until proven otherwise and validate every automation path that can mint or reuse trust. If access stops immediately after rotation and control-plane review, the event may have been one-off abuse rather than entrenched persistence.
Practitioner takeaway: Persistence is established when the attacker can keep regaining trusted execution through the delivery system, so the response has to prove control-plane removal, not just remove the first compromised artefact.
Related resources from NHI Mgmt Group
- How do security teams know whether a package compromise has become CI/CD persistence?
- How do security teams know if a dependency compromise has become a credential incident?
- How do security teams know whether persistence has moved from a foothold to an active compromise?
- How do security teams know whether an RCE issue has become an identity problem?
Deepen Your Knowledge
Free weekly newsletter
Subscribe to the NHI & AI Identity Journal
The latest on NHI and Agentic AI security – articles, research, breaches, news and events every week.
Bonus 33% off our NHI Course when you subscribe.
Reviewed and updated by the NHIMG editorial team on October 7, 2026.
NHI Mgmt Group — the #1 independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org