HabrJuly 24, 2026🇷🇺Translated from Russian

Container Image Risks: Why Skipping Verification Today Breaks Your Service Tomorrow

Nikita, technical leader of the Evolution Container Security and Addons team at Cloud.ru, outlines four common container security pitfalls that repeatedly appear in client Kubernetes environments. The post covers vulnerable dependencies, supply-chain attacks on image registries, secret leakage in layers, and CI/CD exposure points, supported by concrete incidents from production clusters.

Thin spot 1. Untracked vulnerabilities in dependencies

The most frequent issue is outdated software carrying known CVE entries combined with overly permissive configurations. Small teams often stay current because their infrastructure is simple, while large enterprises remain on old versions due to extensive custom integrations but compensate with strict access policies. Mid-sized organizations face the worst position: custom wrappers already hinder updates, yet they lack dedicated security staff or tooling to offset the risk.

A 2025 vulnerability in nvidia-container-toolkit (CVE-2025-23266) illustrates the danger. The flaw resided in OCI hooks that execute with host privileges. An attacker could embed a malicious library inside a minimal Dockerfile; after escaping the container, the attacker enumerated pods, located a service account with nodes/proxy rights, and used the kubelet port 10250 to execute commands on another node, ultimately accessing mounted secrets. The incident combined the NVIDIA component vulnerability with excessive service-account privileges. A second high-severity flaw appeared in the same component shortly afterward, reinforcing that privileged add-ons such as GPU operators and CNI plugins require patching within days rather than weeks.

Thin spot 2. Supply chain attacks: even pinned tags are not safe

The classic advice to avoid the latest tag proved insufficient when attackers compromised Aqua Security developer accounts in early 2026. They performed force pushes that reassigned more than seventy Trivy tags to malicious commits containing secret-exfiltration logic. Later, using a remaining compromised service account, they published tainted images directly to Docker Hub. Organizations pulling fresh images without cache or additional verification could have deployed the malicious versions.

Cloud.ru avoided impact through a private registry with caching and mandatory manual review plus secondary scanning before promotion. The incident demonstrated that a tag can be silently rebound to different content; the only reliable reference is the full SHA256 digest of the image manifest. Additional protection comes from Cosign signatures verified inside the cluster by Connaisseur, Kyverno, or Image Validating Admission Policies. The article also notes the gh0stEdit class of attacks that can alter unpacked layer contents while preserving manifest hashes.

Thin spot 3. Secret leakage: regex-based detection still works

Developers continue to commit private keys and hardcoded credentials that end up baked into container layers. Two real cases involved a DevOps engineer who left an SSH key in a working directory before pushing, and a tester who hardcoded credentials that survived the build pipeline. Simply overwriting the file or rebuilding a new image does not remove the secret from Git history or from previously pushed image layers; rotation of the secret itself remains the only reliable remediation.

Effective controls begin with pre-commit hooks that block commits containing obvious secret patterns locally. Subsequent layers include CI/CD scanning with tools such as Trivy and Checkov, followed by registry-level scanning provided by Evolution Container Security.

Thin spot 4. CI/CD as an attack vector

The article concludes by noting that supply-chain and secret issues ultimately converge in CI/CD pipelines. Automated verification of image signatures, continuous vulnerability monitoring, and strict service-account hygiene are required to prevent a single compromised upstream image or leaked credential from granting cluster-wide access.

Related articles

HabrSupply Chain & Open Source

Unicode Tricks Let Malicious Python Code Bypass Code Review

A detailed analysis shows how subtle Unicode manipulations allow code to pass human review while executing entirely different logic. The first technique replaces Latin characters with visually identical Cyrillic or other script letters inside identifiers, such as using Ukrainian 'і' instead of Latin 'i' in an is_admin variable. Python treats these as distinct names because NFKC normalization does not map Cyrillic to Latin. The second technique inserts bidirectional override characters that reorder text for the compiler while the editor displays the intended order. The third hides zero-width characters inside string literals to break comparisons and searches. A compact Python auditor using the tokenize module and explicit character sets detects all three classes of characters. The article recommends adding such checks to CI pipelines and configuring linters including ruff and flake8 to reject suspicious commits.

HabrSupply Chain & Open Source

redb 3.7.2 Released with Custom gRPC Protocol, Dependency Vulnerability Fixes and .NET 10 Migration

The redb ecosystem released versions 3.7.0, 3.7.1 and 3.7.2 in quick succession after 3.7.0 was withdrawn due to high-severity vulnerabilities in its .NET 9 build artifacts. NuGet audit detected issues only on full rebuilds, leading to updates for SSH.NET, Microsoft.Data.Sqlite, System.Security.Cryptography.Xml and Microsoft.Bcl.Memory across redb.Route, redb.Core, redb.Export and redb.Identity. The release introduces a native GrpcWire implementation that registers individual gRPC methods as routes on a shared Kestrel host, supports bidirectional streaming, real gRPC status codes and mTLS with pinned client certificates. redb.Route also gained a dedicated SOAP connector, Control Bus messaging for route lifecycle management and a corrected Claim Check pattern. File transports received critical fixes that prevent silent data loss when readLock and idempotency options are combined. All libraries now target net8.0;net9.0;net10.0 while host applications require .NET 10, aligning with Microsoft’s shortened support timeline for .NET 8 and 9.

安全客Supply Chain & Open Source

Poisoned Rust Crates Execute Malware at Build Time: 245 Million Downloads Hit in Supply-Chain Attack

Three widely used Rust crates on crates.io were poisoned on August 20 with malicious versions that execute automatically during cargo build. The attack leveraged a typosquatted proc-macro1 dependency containing a build script that downloads payloads and establishes persistence. arrayref alone has accumulated 245 million downloads and is pulled automatically through caret ranges in many dependency trees. Attack infrastructure overlaps with prior campaigns attributed to Sapphire Sleet and MIDNIGHT NEPTUNE. Rust security teams yanked the malicious releases within 86-107 minutes, but the incident highlights missing publish-age controls and weak maintainer-account protections in the Cargo ecosystem.

HabrSupply Chain & Open Source

PyPI Explores Prefix Reservation for Organizations Under PEP 752 to Prevent Name Squatting

PEP 752 proposes reserving package name prefixes for organizations on PyPI, allowing control over entire families of related package names rather than individual entries. The change addresses dependency confusion and name squatting risks where attackers register packages with familiar prefixes like google-cloud- or opentelemetry- to exploit user trust. Analysis of over 800,000 PyPI projects by CodeScoring shows that prefixes are rarely controlled by a single owner, with ecosystems like aws- managed by hundreds of accounts. The proposal introduces implicit namespaces and new metadata for clients and proxies while preserving the flat namespace model familiar to Python developers. PEP 755 will define the governance process for granting prefix rights, limiting applications to organizations and requiring clear justification. Existing packages receive backward compatibility exceptions, and the mechanism does not transfer across repositories.