Habr•October 26, 2026•🇷🇺Translated from Russian

Passwordless Kubernetes Image Pulling with Artifact Keeper via ServiceAccount Tokens

Kubernetes clusters often require copying registry passwords into every namespace that pulls private images, repeating the process on every rotation. Dynamic cluster creation makes this routine endless, and copied secrets can expire or leak.

Kubernetes 1.34 introduces a cleaner path. The kubelet can now pass a pod’s ServiceAccount token to an image credential provider plugin. The plugin exchanges the token at the registry for short-lived, read-only credentials. The token is issued only for that specific pod and never appears in any manifest.

Artifact Keeper is an open-source (MIT) Rust registry that stores Docker/OCI images and Maven, PyPI, npm, Cargo, Go, and Helm packages, with metadata in PostgreSQL. Its OIDC provider accepts Kubernetes ServiceAccount tokens and returns temporary credentials scoped to read access only.

How the kubelet invokes the plugin

The credential provider runs on every node. Kubelet sends the image name and, since 1.34 (KEP-4412), the pod’s ServiceAccount token. The plugin returns username, password, and cache duration. Configuration uses tokenAttributes with a dedicated audience such as “artifact-keeper” to avoid conflicts with the API server audience.

Nodes require a ClusterRole granting the “request-serviceaccounts-token-audience” verb for the chosen audience. Without it, kubelet logs “is not authorized to request tokens for this audience” and falls back to unauthenticated pulls.

Registry-side configuration

Administrators create an OIDC provider of type “kubernetes” and supply the cluster’s JWKS keys. They then define mappings that filter claims (for example, namespace equals “team”) and bind matching ServiceAccounts to a read-only group. All ServiceAccounts covered by one mapping share the same registry identity while remaining distinguishable in logs by namespace, ServiceAccount, pod, and node.

Security controls in the plugin

  • The 1.7 MB static Rust binary rejects http URLs and follows no redirects.
  • Any token appearing in registry error responses is replaced with [REDAUTED].
  • A single 10-second timeout covers the entire exchange.
  • With cacheType set to ServiceAccount, credentials are cached per ServiceAccount, reducing repeated token exchanges.

Tests on kind 1.34.3 showed authorized pods pulling images on the first attempt, while unauthorized namespaces received 401 errors containing “CI JWT did not match any identity mapping” in the kubelet journal. Push operations and API-token creation are denied because the issued token carries only read scope.

The plugin and installation manifests are published in the artifact-keeper-kubelet-provider repository with cosign signatures. An open issue requests moving the code into the main Artifact Keeper organization and adding a web UI form for OIDC providers.

Related articles

Habr•Supply Chain & Open Source

Anthropic Funds New Security Developer Role at Python Software Foundation Following Sharp Rise in Vulnerabilities

Anthropic has financed a new security position within the Python Software Foundation in response to a marked increase in vulnerabilities and malicious packages affecting the Python ecosystem. Data published by Seth Larson showed a significant spike in reported issues during 2026. Brett Smith has been appointed as Security Developer and will collaborate with Larson, who serves as Security Developer-in-Residence, and Mike Fiedler, the PyPI security engineer. The expanded team will focus on scaling automated quarantine mechanisms in PyPI and streamlining the workflows of the Python Security Response Team. At PyCon US 2026, the team reported handling three to four times more vulnerability disclosures for Python and pip compared with the previous year, alongside a 60 percent increase in malware detections and removals from the repository.

Habr•Supply Chain & Open Source

Malicious ZIP Archive Delivers Git-Based Remote Code Execution via Hooks and Filters

A developer received a fake job offer from Cryptic Heaven through LinkedIn, leading to a ZIP file containing a rigged Git repository. The archive included a pre-configured .git directory with altered hooksPath pointing to .git/objects/interrupt and a custom clean filter named ltr. Upon git status or branch checkout, the setup triggered a shell script that downloaded and executed remote code from a server hosted on vercelscript.vercel.app. The attack leveraged post-checkout hooks and Git filters to run silently without requiring install scripts or explicit execution. Multiple trigger paths existed, including automatic detection in Visual Studio Code, Git-aware terminal prompts, and following README instructions to switch branches. The technique worked on both Linux/macOS and Windows through Git for Windows shell support. The incident highlights risks of opening untrusted Git repositories delivered outside standard clone workflows.

Habr•Supply Chain & Open Source

OIDC-Based Push Deployment on VPS Removes SSH Keys from CI While Enforcing Strict Isolation

A new self-hosted deployment system called cd enables secure continuous delivery to single Linux VPS hosts running Docker without storing any long-lived secrets in CI repositories. The architecture relies on short-lived OIDC JWT tokens issued by GitHub Actions or GitLab CI, verified on the target server through JWKS public keys. The server component cdd performs token validation, archive checks, resource-limited builds inside BuildKit, health checks, and automatic rollback on failure. All containers are launched with read-only root filesystems, dropped capabilities, no-new-privileges, and network binding restricted to 127.0.0.1 behind Caddy or Nginx. Administrative control is provided by the cdctl CLI that registers projects, sets RAM/CPU limits, and manages DNS records via Porkbun integration. The entire solution avoids external databases, web panels, and persistent secrets while enforcing one-repository-to-one-application boundaries.

安全客•Supply Chain & Open Source

Stolen Credentials Poison cPGuard Update Channel, Turning Security Software into Data Theft Backdoor

Attackers used compromised OPSSHIELD credentials to hijack the cPGuard update distribution network on November 2 at 02:06 UTC, injecting malicious scripts into versions 5.88.12 through 5.88.19. The poisoned updates targeted Linux servers running the security tool, which holds root privileges on hosting provider and cloud infrastructure machines. The script harvested /etc/shadow, /etc/passwd, MariaDB/MySQL root credentials from my.cnf, root shell history containing API tokens, and SSH authorized_keys files before exfiltrating them via the vendor's own infrastructure. A persistent backdoor was also dropped at /var/tmp/.cpg91511_sh. OPSSHIELD detected the intrusion within 12 hours and halted distribution, but confirmed that 32 customer servers had their data accessed. The incident highlights risks of relying on static credentials for security product update pipelines without code signing or behavioral restrictions.