Your security scanner is the breach.
Cisco source code stolen, AWS keys breached, 300 repositories cloned. The exfiltration channel was Trivy operating inside Cisco's CI pipeline.
Opening Position
Cisco source code was stolen. AWS keys were breached. 300 repositories were cloned. The mechanism was Trivy, a container vulnerability scanner that operated inside Cisco’s CI pipeline with the trust and execution context required to read source.
The attack vector was the security tool. The control surface that organisations install to find vulnerabilities was the same surface used to extract them. This is not a defence failure at the application boundary. The application boundary was not the boundary that mattered. The compromise occurred one layer inward, at the tooling that developers grant implicit trust and elevated context to operate.
The actor is identified as ShinyHunters. The exposure is not a single incident at a single firm. 300 cloned repositories is inventory. What is in adversary possession is whatever those repositories contain, and whatever the credentials inside them reach. Hardcoded credentials in private repositories remain endemic. Private is not a control. Private is a visibility setting. When the tooling running inside that visibility boundary becomes the exfiltration channel, the boundary is meaningless.
What Actually Failed
Cisco’s CI pipeline executed Trivy. Trivy had read access to repository contents. Repository contents included AWS credentials. Those credentials were exfiltrated. 300 repositories were cloned. Source code is in adversary possession. These are the confirmed conditions.
The execution context granted to Trivy was sufficient to reach secret material. No control intercepted that reach. No control prevented the scanner process, the scanner output, or the pipeline execution surface from operating as a disclosure channel for the credentials. The pipeline behaved exactly as configured. The behaviour was the failure.
The credentials were in repository content rather than in a runtime secret broker scoped to least privilege. Their location inside the repository made scanner reach equivalent to credential exposure. The repository being private was not a constraint on a tool already authorised to read it. The credential was a static artefact in a path the scanner was designed to traverse.
Sequence is not confirmed. Whether the 300 repositories were enumerated and cloned through the breached AWS keys, through a separate access path, or through credential reuse across systems, is not confirmed. Dwell time inside the CI pipeline is not confirmed. Whether Trivy’s distributed binaries were modified, or whether the attack used Trivy’s stated functionality against unmodified inputs, is not confirmed. Treat absence of these facts as a condition, not as a gap to fill.
Why It Failed
Trivy was granted execution inside the CI pipeline with read access to repository contents. That is an observable condition. Read access to source is the scanner’s stated requirement. The scanner cannot scan what it cannot read. Granting that access is the cost of using the tool for its stated purpose.
Hardcoded AWS credentials existed inside the repository contents being scanned. That is the second observable condition. The combination of these two conditions produced the outcome. Scanner reach plus credential location equals credential exposure. No exotic mechanism is required to explain the result. The configuration alone is sufficient.
The boundary between tool authorised to read code and principal authorised to hold AWS access was not enforced as a separation. The same execution context that ran the scanner was the context in which the credentials were resident. Identity was not a boundary inside this pipeline. Trust was extended once, at tool installation, and propagated to every artefact the tool could see. The pipeline operated as a single trust zone. Anything reaching that zone reached everything inside it.
Whether additional controls were designed and bypassed is not confirmed. What is confirmed is that the controls present did not stop the exfiltration. Controls that do not enforce the relevant boundary are not controls in this context. They are documentation. The relevant boundary, in this case, is between code-reading tools and credential-bearing principals. That boundary was not present in the observed behaviour.
Mechanism of Failure or Drift
The mechanism is trust extended once, applied broadly. A CI pipeline executes a scanner. The scanner is granted the access required to perform its stated function, which is full read access to repository content. That grant is not a vulnerability in the scanner. It is the contract under which the scanner is designed to operate. The vulnerability is the assumption that the contract ends at the scanner. It does not. The contract extends to whatever process, output, or pipeline state the scanner can influence. Anything the scanner can read becomes a candidate for movement out of the pipeline through any channel the pipeline supports.
Repositories are the corpus the scanner is pointed at. Whatever lives inside the corpus inherits the same exposure level. Hardcoded credentials, private keys, internal endpoint URLs, customer identifiers, signing material. None of these are protected from the scanner by being inside a private repository. Private is a visibility scope for the outside world. It is not a constraint on principals already operating inside the perimeter. The scanner is one of those principals. Once a credential is resident in a file the scanner is authorised to read, the credential is operationally equivalent to one held by the scanner itself.
The drift is the absence of separation between code-reading tools and credential-holding principals. In the Cisco condition, those two categories occupied the same execution context. The scanner’s authorisation to read source produced reachability to AWS keys. The pipeline did not enforce that these were distinct trust zones. The configuration treated all artefacts inside the CI environment as equivalently accessible to all tools running inside it. That is the mechanism. It is not exotic. It is structural. Whether the binary delivered as Trivy was modified, or whether the attack exercised the tool’s stated functionality against unmodified inputs, is not confirmed. The mechanism does not require modification. The mechanism only requires the read grant.
Expansion into Parallel Pattern
The same mechanism applies to any tooling layer granted broad read context inside an automation pipeline. SBOM generators read repository content. License scanners read repository content. Static analysis tools read repository content. Dependency resolvers read repository content. Each of these is a tool authorised to traverse the corpus. Each of them inherits the exposure of whatever lives inside that corpus. The exfiltration surface is not specific to vulnerability scanners. The exfiltration surface is the read grant itself, applied to a corpus that contains material the read grant was never intended to expose.
The pattern repeats wherever a control surface is installed with broader access than the control function strictly requires. A scanner that needs to read code does not need to read credentials. A linter that needs to parse syntax does not need access to runtime secret material. A dependency tool that needs to resolve manifests does not need access to repository history containing accidentally committed keys. When access is granted at the corpus level rather than the artefact level, the tooling’s effective authority is the union of every artefact in the corpus. That union is rarely audited. The grant is reviewed once, at installation. The corpus changes continuously. The grant does not.
The same mechanism extends to the outputs those tools produce. Scanner reports, build logs, test artefacts, and CI step outputs are themselves artefacts. They can be retrieved, cached, mirrored, or shipped to external systems by design. If the output includes content derived from the corpus, the output channel becomes a second path with the same exposure profile as the original read. The credential lived in source. The scanner read it. The output referenced it, summarised it, or quoted it. The output was retained. The retention surface became the disclosure surface. The mechanism is identical to the one observed in the Cisco condition. The channel is different. The boundary that was not enforced is the same boundary.
Hard Closing Truth
The boundary that matters is between principals authorised to read code and principals authorised to hold credentials. Those two principals must not occupy the same execution context. If they do, the scanner is the credential broker by configuration. The control failure is not a missing detection rule. The control failure is a trust topology that treats the CI pipeline as a single zone. Until that topology is split, every tool installed inside it inherits the exposure of every secret resident inside it. Identity is the boundary. In this pipeline, identity was not a boundary. It was a label.
Credentials in repository content are not credentials. They are public material with a delayed disclosure window. Private repositories delay the window. They do not prevent it. The number of authorised principals with read access to a private repository, including human accounts, service accounts, automation tokens, vendor scanners, and pipeline tooling, is the number of independent paths to the credentials inside it. Each path is an independent compromise vector. The repository being private does not change the count. It only changes who is on the list. Years of warnings about hardcoded credentials have not removed them from production corpora. The condition is endemic because the cost of leaving them in place is paid only on the day of disclosure. That day arrived for Cisco.
300 cloned repositories is not a story. It is inventory. What an actor does with inventory is search it, correlate it, and convert what is correlatable into access. Credential reuse across repositories produces lateral movement without further exploitation. Reference to internal endpoints produces target lists. Source code produces logic for bypass and abuse. Whether ShinyHunters has executed any of these conversions is not confirmed. What is confirmed is that the inventory is in adversary possession. The breach does not end when the original access path is closed. It ends when every credential, endpoint, and logic artefact inside those 300 repositories is treated as adversary-known. Until that work is complete and verified, the exposure is live. Controls that did not stop the exfiltration are not controls. They were documentation.
See also: NordVPN for tunneled traffic when operating outside controlled networks.
#ad Contains an affiliate link.
Keep Reading
supply chain securityShinyHunters, Trivy, and the Pipeline Identity Problem
ShinyHunters cloned 300 Cisco repositories through Trivy running in a CI/CD pipeline. This is what failed structurally, why it failed, and what pipeline identity enforcement must look like.
supply-chain-securityThe Advisory Told You to Update. It Didn't Tell You What's Already Running.
Patching the advisory isn't enough. If your CI pipeline ran during the compromise window, the compromised code is baked into your container images and still running. Here's how to find it.
physical securityA postcard breached a warship
A 5 dollar Bluetooth tracker hidden in a postcard broadcast a 585 million dollar warship's position for 24 hours. The control that failed was classification.
Stay in the loop
New writing delivered when it's ready. No schedule, no spam.