One Sidecar Container Signed All Images and Then Validated None of Them

Jul 18, 2026 By Deepa Iyer

In early 2025, a platform team at a mid-sized SaaS company deployed a sidecar container to their CI/CD pipeline. The sidecar's job was straightforward: sign every container image built by the team, using a private key stored in a vault. Within a week, the sidecar had signed roughly 2,000 images spanning base layers, application code, and debug utilities. No one ever checked a single signature on the other side of the pipeline. The sidecar signed everything and validated nothing. That asymmetry is not an edge case. It is the default posture for most organizations that have adopted image signing.

The Sidecar That Signed Everything

Sidecar containers are a common Kubernetes pattern for extending the behavior of a pod without modifying the primary application. In this case, the sidecar ran alongside the build agent, intercepting each image tag and applying a cryptographic signature using cosign, the signing tool from the Sigstore project. The key was stored in AWS KMS and rotated every 90 days—or so the documentation claimed. An audit later revealed that the rotation policy had never been triggered; the same key had been used for eight months.

The sidecar's logic was simple: on every docker push, it would pull the image manifest, compute a digest, sign the digest with the private key, and store the signature as an attached tag in the same registry. The signing step took roughly 200–400 milliseconds per image, depending on layer count. The team celebrated the deployment as a win for supply chain security. They had achieved signing coverage for 100% of their images. What they had not achieved was any verification.

No admission controller or policy engine was configured to check those signatures during deployment. The Kubernetes cluster ran vanilla imagePullPolicy: Always, but no webhook validated that the pulled image's signature matched the one stored in the registry. The sidecar had turned image signing into a write-only operation. An attacker who gained write access to the registry could overwrite an existing image, and the sidecar would happily sign the new version on the next push—or, worse, the attacker could push a new image with a matching tag, and the sidecar would sign that too.

The team discovered the gap only after a penetration test. The testers overwrote a single layer in a base image, pushed the modified tag, and watched the sidecar sign it automatically. The deployment pipeline accepted the tampered image without a single warning. The signing sidecar had become a rubber stamp.

Supply Chain Trust as a Monoculture

The SaaS team's setup is a microcosm of a larger problem: the industry has treated image signing as a one-time act of provenance rather than a continuous chain of verification. Most signing implementations rely on a single key that signs everything in the registry. That key, if compromised, undermines the entire trust model. Docker Content Trust, for example, uses a single delegations key per repository; if that key leaks, an attacker can sign arbitrary images until the key is revoked—and revocation is rarely automated.

Notary v1, the original implementation behind Docker Content Trust, had no built-in key rotation policy. Teams that adopted it often generated a key once and used it for years. A 2023 analysis of public Notary repositories found that roughly 15% of signing keys had been active for more than three years without rotation. The same analysis noted that fewer than 5% of repositories enforced signature verification on pull. The signing infrastructure existed, but the verification infrastructure was absent.

This monoculture of trust is fragile. A single signing key represents a single point of failure. If an attacker obtains the key, they can sign any image, and the system will treat it as authentic. The sidecar pattern amplifies this risk because the signing key is often stored in the same cloud environment as the registry. An attacker who compromises the CI/CD pipeline gains access to both the signing key and the registry write path. The sidecar becomes an enabler, not a guard.

The monoculture extends to tooling. Most signing tools operate on the assumption that signing alone is sufficient. Cosign, for instance, defaults to cosign sign without requiring a subsequent cosign verify step. Kyverno, a popular policy engine for Kubernetes, can enforce image verification, but its default configuration allows unsigned images to pass. A survey by the CNCF in late 2024 estimated that roughly 60% of Kubernetes clusters in production had no image verification policy configured. The other 40% had policies that were either too permissive or never tested.

How the Validation Gap Persists

The validation gap is not a secret. It is a known trade-off that teams make consciously, often prioritizing deployment speed over security. In a typical CI/CD pipeline, signing is added as a post-build step that runs in a few hundred milliseconds. Verification, by contrast, requires an admission controller that intercepts every pod creation, fetches the signature from the registry, verifies the digest, and checks the key against a trust root. That process can add 500 milliseconds to a few seconds per deployment, depending on network latency and registry performance.

When teams are asked why they skip verification, the answer is almost always the same: "We didn't want to slow down deployments." A 2025 survey by a cloud-native security vendor found that 47% of respondents who used image signing did not enforce verification in production. The most common reason cited was deployment latency. The second most common was complexity: configuring a policy engine like OPA Gatekeeper or Kyverno to check signatures requires maintaining a trust bundle, handling key rotation, and managing exceptions for legacy images.

The complexity argument has merit. Kyverno policies for image verification can exceed 50 lines of YAML, and getting the trust bundle right requires understanding the Sigstore Fulcio and Rekor ecosystem. Teams that adopt keyless signing via Sigstore must configure OIDC identity tokens, which adds another layer of moving parts. The default behavior of many tools is to allow unsigned images, which means that a misconfigured policy silently accepts everything. The sidecar team at the SaaS company had a Kyverno policy, but it was scoped only to the default namespace and had an exception list that covered 80% of their workloads.

Some teams argue that verification is unnecessary if the registry is private and access is tightly controlled. That argument assumes that registry access cannot be compromised. But registry credentials are often stored in CI/CD secrets, and those secrets leak. The one maintainer's two-factor bypass story illustrated how a single misconfigured config file can expose credentials that grant write access to a registry. Once an attacker has registry write access, the absence of verification turns signing into a cosmetic feature.

A Concrete Attack Path

Consider a realistic attack path. The target is a Kubernetes cluster running a microservice that processes payment data. The microservice's image is built from a base image, say python:3.11-slim, with an application layer on top. The sidecar signs the final image after each build. The signature is stored as a tag like python:3.11-slim.sig in the same registry. No admission controller checks the signature at deploy time.

An attacker gains access to the registry through a leaked CI/CD token. The attacker pulls the manifest for the payment microservice image, identifies the base layer digest, and overwrites that layer with a version that includes a cryptominer. The attacker then pushes the modified manifest under the same tag. The sidecar, which is still running in the CI/CD pipeline, picks up the push event and signs the new manifest. The signature tag is updated. The attacker has now signed a tampered image using the legitimate signing key.

The deployment pipeline sees the new tag, pulls the image, and deploys it to the cluster. No verification step compares the signature against a known-good digest. The cryptominer runs undetected for weeks, consuming CPU and leaking data through DNS tunnels. The team notices the performance degradation but attributes it to a recent code change. By the time the incident is traced to the image tampering, the attacker has exfiltrated a significant amount of data.

This attack path is not hypothetical. In 2024, a public registry incident demonstrated the same pattern: an attacker overwrote a single layer in a popular base image, and the registry's signing infrastructure signed the new version automatically. The incident was caught only because a third-party scanner noticed a digest mismatch. The scanner was not part of the verification pipeline; it was an external monitoring tool that alerted the team after the image had been deployed for several days.

The root cause was not the signing key compromise. The key was never stolen. The root cause was the absence of a verification step that could detect the mismatch between the signed digest and the actual image content. The sidecar signed whatever was in the registry, regardless of whether it matched the original build.

Why Existing Tools Missed This

Existing supply chain security tools have focused heavily on signing and attestation but have underinvested in runtime verification. Sigstore, for example, provides a robust infrastructure for keyless signing and transparency logs, but it does not enforce verification in the deployment pipeline. The Sigstore ecosystem assumes that verification will be handled by external policy engines, but those engines are often configured too loosely or not at all.

SLSA (Supply-chain Levels for Software Artifacts) defines levels of build integrity, from SLSA 1 (documented build) to SLSA 4 (hermetic, reproducible build). However, SLSA levels do not mandate runtime signature enforcement. A project can achieve SLSA 4 with a fully hermetic build and signed provenance, yet still deploy those signed artifacts without any verification. The SLSA specification explicitly leaves verification to the deploying organization, which means that the gap between signing and verification persists regardless of the SLSA level.

Grafeas and in-toto attestations provide a rich model for describing what happened during a build, but adoption has been slow. A 2025 analysis of public repositories found that fewer than 2% of images published to Docker Hub included in-toto attestations. The attestations that do exist are rarely checked at deploy time. The same analysis found that even among images that included attestations, fewer than 10% were deployed in clusters that enforced attestation verification. The attestation infrastructure is like a library of books that no one reads.

Vulnerability scanners, such as Trivy and Grype, check for known CVEs in image layers, but they do not check signer identity. A tampered image with no known vulnerabilities will pass a scanner check. The scanner cannot detect that the image's content differs from what the original developer built. The sidecar team's images were scanned and found clean. The tampered image also scanned clean because the cryptominer used a zero-day exploit that no scanner had a signature for. The scanner provided a false sense of security.

Industry inertia plays a role. Signing and verification are often treated as checkbox items on a security compliance form. A team can claim they use image signing, and an auditor will check the box without asking whether verification is enforced. The one CI platform standardized on JSON schema story showed how a well-intentioned standardization can create blind spots when defaults are not validated. The same dynamic applies to signing: the default is to sign, not to verify.

Fixing the Loop: Sign Then Verify

Closing the validation gap requires a shift from a sign-only posture to a sign-and-verify posture. The first step is to add a mandatory verification step after signing, either in the CI/CD pipeline or at the admission controller level. In the CI/CD pipeline, the build process should include a cosign verify command that checks the signature immediately after signing. This catches misconfigurations early, before the image is pushed to production. The SaaS team added a verification step that runs in roughly 300 milliseconds and rejects any image whose signature does not match the expected digest.

The second step is to use short-lived keys per image or per build stage. Instead of a single key that signs everything, each image can be signed with a key that expires after a few hours. Tools like Sigstore's keyless signing already implement this pattern: the signing key is derived from an OIDC token that expires after the CI job completes. The signature can be verified against the transparency log, which provides a tamper-evident record of when the key was valid. Short-lived keys limit the blast radius of a key compromise.

Policy enforcement is the third step. Kubernetes admission controllers like Kyverno and OPA Gatekeeper can be configured to require a valid signature for every image in a namespace. The policy should check not only that a signature exists but that the signing key matches a trusted identity. The trust bundle should be updated automatically, not stored as a static file that goes stale. The SaaS team now uses a Kyverno policy that rejects any image without a valid signature from their CI system's OIDC identity. The policy is scoped to production namespaces, with a gradual rollout to staging.

Audit logging is often overlooked. Every signing and verification event should be logged to an immutable store. The logs should include the image digest, the signing key identifier, the timestamp, and the identity of the entity that performed the operation. If a tampered image is later discovered, the audit log can pinpoint when and by whom the image was signed. The SaaS team now ships signing and verification logs to a dedicated S3 bucket with object lock enabled.

Finally, adopting a framework like TUF (The Update Framework) can provide key rotation and delegation policies that are missing from ad-hoc signing setups. TUF separates root keys from target keys and supports automatic key rotation. A TUF repository can enforce that images are signed by specific delegations, and that verification checks the full delegation chain. Several container registries, including Docker Hub and GitHub Container Registry, are exploring TUF integration as a way to bridge the signing-verification gap.

The Cost of Trust Is Verification

Adding verification to the deployment pipeline comes with costs. Admission controllers add latency to every pod creation. In clusters that deploy hundreds of pods per minute, a few hundred milliseconds per verification can accumulate. Some teams report that verification adds roughly 1–3 seconds to the total deployment time for a typical microservice. That latency can be mitigated by caching verification results for images that have already been validated within a configurable window.

The cost of not verifying, however, is orders of magnitude higher. A single tampered image can lead to data exfiltration, cryptomining, or lateral movement within a cluster. The average cost of a software supply chain incident, according to a 2025 study by a cybersecurity research firm, was roughly $4.6 million for mid-sized organizations. The SaaS team's penetration test did not result in a real breach, but the remediation effort—re-signing all 2,000 images, rotating keys, and implementing verification—took three weeks and cost roughly $80,000 in engineering time.

Teams should start with critical paths: production images that handle sensitive data or are exposed to the internet. Verification can be gradually expanded to staging and development environments as the process matures. The key is to automate verification in the CI/CD pipeline, not just in admission control. A verification failure in CI is a fast feedback loop; a verification failure in admission is a blocked deployment that can cause an incident.

The sidecar that signed everything and validated nothing is a cautionary tale, but it is not unique. It is the natural outcome of a security industry that has sold signing as a solution without emphasizing that verification is the other half of the equation. The tools exist—cosign, Kyverno, OPA, TUF—but they require deliberate configuration and ongoing maintenance. The cost of trust is verification, and that cost must be paid every time an image is deployed. There is no one-time setup that makes the supply chain secure. The loop must be closed on every push.

Some readers will argue that the sidecar team's mistake was obvious and that any competent security engineer would have caught it. That may be true, but the prevalence of similar gaps suggests otherwise. The CNCF survey that found 60% of clusters lack image verification indicates that the gap is widespread. The sidecar story is not an outlier; it is the median. The industry has collectively decided that signing is enough, and that decision is a vulnerability waiting to be exploited.

The fix is not complicated, but it is not automatic. It requires a change in mindset from signing as a ceremony to verification as a continuous practice. Every signature must be checked. Every key must be rotated. Every policy must be tested. The sidecar can be part of the solution, but only if it is paired with a validator that refuses to deploy unsigned or mismatched images. The alternative is a supply chain that trusts everything and verifies nothing—a chain that is only as strong as the weakest sidecar.

Recommend Posts
Tech

One Sidecar Container Signed All Images and Then Validated None of Them

By Deepa Iyer/Jul 18, 2026

A sidecar signed every image in a registry but never verified a single signature afterward. That gap opened a supply-chain attack path that most teams still ignore.
Tech

One Apache License Fork Broke an Open Source Trust Model No Contributor Had Written Down

By Deepa Iyer/Jul 18, 2026

The Redis-to-Valkey fork exposed unwritten rules of open source trust. When an Apache-licensed project changes license, contributors have no recourse—unless they write the contract first.
Tech

One Maintainer's Two-Factor Bypass Was a Flag in an Unread Config File

By Deepa Iyer/Jul 18, 2026

A single misconfigured 2FA bypass flag sat unread for 18 months, enabling a Steam crypto theft. The story reveals how authentication failures hide in the operational noise of config drift.
Tech

One Rust Package Manager’s Build Cache Broke Across Eight Maintainer Machines

By Sara Park/Jul 18, 2026

A corrupted Cargo cache stumped eight maintainers for days. The root cause: filesystem assumptions that broke across Docker, macOS, and NFS. A deep dive into reproducible build challenges.
Tech

One Monorepo's Build Graph Cache Completely Vanished on a Patch Tuesday Commit

By Sara Park/Jul 18, 2026

A Patch Tuesday commit wiped a monorepo's build cache to zero. Here's how Windows updates, timestamp poisoning, and toolchain drift caused the outage—and what Google and Meta do differently.
Tech

One NVIDIA Switch Fabric Took Fifteen Minutes to Map a Topology That Changed Every Day

By Deepa Iyer/Jul 18, 2026

NVIDIA's NVSwitch fabric remaps topology daily, costing clusters 1% throughput. The firmware gap between hardware and software leaves operators patching around bugs.
Tech

Architects Bill Two Million Dollars a Year Running a Query That Returns Zero Rows

By Lucas Mendes/Jul 18, 2026

A query that returns zero rows can cost over $2 million annually in cloud spend. This article explores why engineers don't delete dead code and how to fix the waste.
Tech

One Postgres DBA Traced a Quarter-Million Dollar Query to One Missing Index

By Deepa Iyer/Jul 18, 2026

A missing index on a Postgres orders table cost $250k per year in extra compute. A DBA traced it in weeks. This is the economics of indexing at scale.
Tech

One iOS Dev's App Store Review Bypass Took Three Months of Negotiation

By Deepa Iyer/Jul 18, 2026

A solo iOS developer spent 12 weeks negotiating with Apple for a review bypass. This article examines the hidden costs of platform lock-in, career trade-offs, and how indie devs can build leverage.
Tech

Platform Fees Fund One iOS Calendar but Block Two Android Widgets

By Deepa Iyer/Jul 17, 2026

How Apple's and Google's platform fees shape mobile development: iOS calendar apps thrive under subscription models, while Android widgets struggle to monetize. A look at the economics behind the code.
Tech

One Firmware Maintainer's Bus Factor Was One Person With One Laptop

By Lucas Mendes/Jul 18, 2026

The story of a single maintainer holding a chip's fate on one laptop. How firmware becomes a single-point failure, the funding gap, and practical mitigation steps.
Tech

Three Database Migrations Delayed a Quarterly Release by Six Weeks Each

By Lucas Mendes/Jul 18, 2026

Three large-scale database migrations each delayed a quarterly release by six weeks, costing an estimated $10M–$20M per migration. An analysis of the operational failures and business impact.
Tech

One Document Store Renewal Tied a SaaS Company Into a Five-Year Licensing Lock

By Yusuke Tanaka/Jul 18, 2026

How a SaaS startup's $200k document store migration ballooned to $2.8 million, and why MongoDB's SSPL license and proprietary extensions made escape nearly impossible.
Tech

One Frontend Framework Paid for Faster Renders With a Two-Week Onboarding Cliff

By Sara Park/Jul 18, 2026

Framework X cuts render times by 40% but introduces a two-week onboarding cliff. Teams weigh performance gains against cognitive overhead and hiring challenges.
Tech

One Auth0 Engineer Compressed Twenty MFA Vendor Logins Into One SAML Bridge

By Lucas Mendes/Jul 18, 2026

How an Auth0 engineering team reduced twenty separate MFA vendor portals to a single SAML bridge, boosting adoption from 40% to 98% and cutting incident response time.
Tech

One Package Manager's Storage Bill Exceeds Its Entire Maintainer Budget

By Lucas Mendes/Jul 18, 2026

npm's storage bill runs millions yearly, far outstripping what it pays maintainers. The economics of centralized package registries and what can be done.
Tech

One CI Platform Standardized on JSON Schema Then Broke Every Config's Default

By Sara Park/Jul 18, 2026

CircleCI adopted JSON Schema for validation but omitted default values, breaking every config. This analysis explores the fallout, workarounds, and lessons for schema-driven tooling.
Tech

One React Render Architecture Shapes Three UI Team Career Paths

By Sara Park/Jul 18, 2026

React's Fiber architecture creates three distinct career tracks: build-infrastructure specialist, client-side performance engineer, and design-system architect. Each path pays differently and demands different trade-offs.
Tech

One iOS Market Forces Forty Teams to Dual-Write Every Screen

By Sara Park/Jul 18, 2026

An investigation into why forty teams across ten companies maintain parallel iOS and Android codebases, and why cross-platform tools haven't eliminated the dual-write burden.
Tech

One CDN SRE Tracks a Thousand Dollar Spike to a Single Misconfigured Cache Key

By Sara Park/Jul 18, 2026

How a single misconfigured cache key caused a $1,000 CDN spike overnight, and what it reveals about the economics of edge infrastructure in 2026.