<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Security on Catalyst9 Engineering</title><link>https://blog.catalyst9.ai/tags/security/</link><description>Recent content in Security on Catalyst9 Engineering</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 11 Jun 2026 00:00:00 -0600</lastBuildDate><atom:link href="https://blog.catalyst9.ai/tags/security/index.xml" rel="self" type="application/rss+xml"/><item><title>I had 47 places I stored secrets. Then I built this.</title><link>https://blog.catalyst9.ai/posts/part-1-scattered-secrets/</link><pubDate>Tue, 21 Apr 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-1-scattered-secrets/</guid><description>A few weeks ago I went hunting for an API key. I found my secrets in 47 places. Here&amp;rsquo;s what I built to fix that.</description></item><item><title>Your .env files are a liability — even when they never leave your machine</title><link>https://blog.catalyst9.ai/posts/part-2-env-files-liability/</link><pubDate>Wed, 22 Apr 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-2-env-files-liability/</guid><description>Your .env never touched git. The password leaked anyway. Nine separate places, depending on which tools you used that afternoon. Here&amp;rsquo;s the better model.</description></item><item><title>AI coding agents make the secrets problem worse. Here's the fix.</title><link>https://blog.catalyst9.ai/posts/part-4-ai-agents/</link><pubDate>Mon, 27 Apr 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-4-ai-agents/</guid><description>When your AI coding agent runs, it should see the Anthropic key and the project context — not your production database password. Unless you explicitly said so.</description></item><item><title>When a credential leaks, you know everything in 30 seconds</title><link>https://blog.catalyst9.ai/posts/part-6-forensics/</link><pubDate>Fri, 01 May 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-6-forensics/</guid><description>GitHub emails you at 2am about a leaked token. Old world: rotate everything, file a ticket, investigation takes a week. New world: one command, 30 seconds, ticket closed.</description></item><item><title>The airport-recovery demo: losing your laptop and recovering in two minutes</title><link>https://blog.catalyst9.ai/posts/part-9-airport-recovery/</link><pubDate>Thu, 21 May 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-9-airport-recovery/</guid><description>Lose the laptop at the gate, buy a new one, be back in your secrets in under two minutes. Here is what that actually looks like.</description></item><item><title>Multi-principal zero-trust identity: humans, devices, workloads, and agents</title><link>https://blog.catalyst9.ai/posts/part-10-multi-principal-identity/</link><pubDate>Thu, 21 May 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-10-multi-principal-identity/</guid><description>Classic identity models handle one principal type at a time. Real systems have four interacting simultaneously — and most auth stacks are not built for that.</description></item><item><title>What shipping a WebAuthn flow actually looks like</title><link>https://blog.catalyst9.ai/posts/part-11-shipping-webauthn/</link><pubDate>Thu, 21 May 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-11-shipping-webauthn/</guid><description>Phase 1 piece #4 and Phase 1b-C were both marked complete based on unit tests. Then I drove a real browser ceremony and five bugs cascaded out at once.</description></item><item><title>Stacking policy: defaults + fine-grained overrides for high-value secrets</title><link>https://blog.catalyst9.ai/posts/part-13-policy-stacking/</link><pubDate>Thu, 11 Jun 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/part-13-policy-stacking/</guid><description>We built a real ABAC policy engine on top of the identity and step-up work. You can now express &amp;rsquo;everything under LLM/* needs a human in the loop&amp;rsquo; as a default, while stacking a more specific rule that says only principals with an openai_admin label can write or delete under LLMS/OPENAI. The client (kpm) consumes the policy signals so get forces step-up, env/run warns about high-value paths, and strict mode makes every decrypt a fresh policy-checked round-trip.</description></item><item><title>The GitHub VS Code Extension Breach, in Threat-Model Terms</title><link>https://blog.catalyst9.ai/posts/2026-05-20-github-vscode-extension-breach/</link><pubDate>Wed, 20 May 2026 00:00:00 -0600</pubDate><guid>https://blog.catalyst9.ai/posts/2026-05-20-github-vscode-extension-breach/</guid><description>GitHub&amp;rsquo;s internal repos got exfiltrated through a poisoned VS Code extension. Here&amp;rsquo;s the threat model that actually matters — and what credential-storage architecture can and can&amp;rsquo;t do about it.</description></item></channel></rss>