OIDC-Based Push Deployment on VPS Removes SSH Keys from CI While Enforcing Strict Isolation
A new open-source tool named cd allows teams to deploy applications to a single Linux VPS by pushing to the main branch without embedding SSH keys or static tokens in CI secrets. The system replaces three common but risky patterns: direct SSH access from runners, heavy PaaS panels such as Coolify or Dokploy, and webhook endpoints protected by long-lived tokens.
The solution centers on OpenID Connect tokens issued by GitHub Actions or GitLab CI. Instead of storing a private key, the workflow requests a short-lived JWT signed by the provider. The token contains claims including repository, ref, environment, and audience that the server validates against project rules before accepting any deployment archive.
Architecture and components
The deployment server cdd runs as a systemd service behind a reverse proxy. It exposes an HTTP API that receives git archives, verifies OIDC tokens via standard-library JWKS fetching, builds images inside isolated BuildKit containers limited to 1 GB RAM and 15 minutes, and performs zero-downtime container rotation with health checks. The companion utility cdctl lets administrators register projects, define resource limits, generate Caddy snippets, and clone entire deployments. Client integration is supplied as a GitHub Action or GitLab CI include.
All binaries are written in Go with zero external dependencies and total under 2 700 lines, making security audits straightforward. Project metadata lives in JSON files under /etc/cdd/projects; runtime state is kept on disk without any database.
Deployment flow and security controls
After requesting an OIDC token with permissions id-token: write, the runner sends a tar archive via POST together with the bearer token. The server validates issuer, audience, expiration, and repository claims, then unpacks the archive inside a hardened build environment that rejects symlinks, absolute paths, and Zip-Slip attempts.
Containers start as UID 10001 with read-only root filesystem, /tmp on tmpfs, all Linux capabilities dropped, no-new-privileges enforced, and CPU/memory limits applied. Ports are published exclusively on 127.0.0.1 so traffic must pass through the reverse proxy. On health-check failure the new container is discarded and the previous release is restored automatically.
Additional features include automatic Porkbun DNS record creation and Caddy configuration reload when a project is added with the --domain flag, as well as instant cloning of an existing project that inherits updates from the parent repository.
Related articles
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.
Polymarket Suffers Supply Chain Attack via Compromised DebugBear Monitoring Script
Attackers compromised DNS records of DebugBear, a real user monitoring provider, to inject malicious JavaScript into Polymarket pages. The script extracted wallet data and trading credentials from browser storage, then used the platform's official relayer to execute unauthorized withdrawals totaling approximately $2.7 million across 737 wallets. No smart contract vulnerabilities were exploited; all 985 unauthorized transactions carried valid user signatures. The incident occurred on October 29 and was resolved within an hour after trading was halted, with Polymarket returning $3.9 million including compensation. This attack class matches the 2023 Ledger Connect Kit compromise, highlighting risks from third-party scripts in browser sessions. Polymarket has since committed to stricter CSP policies, script pinning, and sandboxing. The case underscores that browser-based sessions with full API privileges remain a critical trust boundary in crypto platforms.
Approved Stamp: How Container Images Pass Rigorous Security Checks Before Reaching Production
DevSecOps engineer Vitaly Matveev from ecom.tech describes a comprehensive lifecycle process for securing Docker images from build to deployment. The approach combines base image validation through a centralized manifest, Dockerfile checks via Infra Gate, Security Quality Gate results stored as attestations in Harbor, and cryptographic signing only after all checks pass. Kyverno policies in production Kubernetes clusters enforce signature verification and block unsigned or unapproved images. Daily automated scans of base images using EPSS scoring detect new vulnerabilities and notify responsible platform teams. The system ensures traceability from pipeline ID to running pod while maintaining a developer-centric workflow with clear remediation guidance.
Passwordless Kubernetes Image Pulling with Artifact Keeper via ServiceAccount Tokens
Kubernetes 1.34 and later enables kubelet to forward a pod's ServiceAccount token to an external image credential provider plugin, allowing the plugin to exchange it for short-lived read-only credentials from a compatible registry. Artifact Keeper, an open-source Rust-based OCI and package registry, implements an OIDC provider that validates these tokens and issues temporary credentials without requiring imagePullSecrets in manifests. The approach follows zero-trust principles by eliminating long-lived secrets that can leak across namespaces or clusters. A custom credential provider binary handles the token exchange, enforces audience restrictions, and redacts sensitive data from logs. The solution requires specific ClusterRole permissions for nodes, kubelet flags, and registry-side OIDC mappings that bind Kubernetes namespaces to read-only groups. Testing on kind 1.34.3 confirmed successful pulls for authorized ServiceAccounts and clear 401 errors for unauthorized ones when imagePullPolicy is set to Always.