How to Remove Secrets from CI/CD Pipelines for Good

Adi Chemoul's avatar
Adi Chemoul VP Marketing

Table of Contents

To remove secrets from CI/CD pipelines permanently, engineering teams must immediately revoke exposed credentials, purge static tokens from git history using tools like git-filter-repo, and transition deployment runners to short-lived workload identity federation. Platforms like Hush Security enable this transition by establishing identity-based access for non-human identities, allowing teams to eliminate hardcoded keys, static tokens, and traditional secret vaults across their pipelines. Completing a full transition across build runners, staging environments, and production deployments typically requires two to four weeks depending on pipeline complexity.

CI/CD pipelines frequently expose infrastructure because static credentials stored in pipeline variables or code commits persist indefinitely and surface in build logs, runner environments, or intermediate artifacts. Research from GitGuardian cited by Akeyless reveals that 35% of corporate private repositories contain plaintext credentials, and private repositories are 6 times more likely than public repositories to contain hardcoded secrets. Remediating these vulnerabilities permanently requires a systematic operational shift from stored secrets to dynamic, short-lived machine attestation.

Before You Start: Migration Prerequisites

Before modifying pipeline configurations, assemble the following tools and permissions:

  • Repository Admin Permissions: Access to update repository settings, configure branch protection rules, and execute force-pushes during history rewriting.
  • Cloud IAM Administrative Access: Permissions to create OpenID Connect (OIDC) identity providers and define role trust policies in Amazon Web Services (AWS), Google Cloud Platform (GCP), or Microsoft Azure.
  • Local Remediation Tooling: Python 3 and git-filter-repo installed locally, alongside secret detection utilities including Gitleaks and TruffleHog.
  • Comprehensive Secret Inventory: A catalog of all external services, cloud providers, internal databases, and artifact registries currently accessed by automation scripts.

Why Do CI/CD Pipelines Leak Production Secrets?

CI/CD pipelines leak production secrets because traditional deployment workflows rely on static, long-lived credentials injected into automated runners. According to Akeyless, simply removing a credential from the current HEAD commit does not secure the project, because every clone retains the entire git commit history and every secret ever committed to it. When developers paste access keys into workflow YAML files or platform variables, those values persist across git revisions, branch forks, and cached build layers.

Inconsistent credential scoping between build stages compounds this exposure. As highlighted by Khimananda Oli, granting wildcard permissions or sharing credentials across jobs allows credentials intended strictly for release promotions to bleed into untrusted build or testing stages. For instance, an environment variable introduced during an integration test remains visible to downstream diagnostic scripts, third-party actions, or error handlers that echo runtime state into accessible job logs.

The threat surface extends beyond stored repository secrets to include unmapped non-human identities, orphaned runner tokens, and unmonitored downstream service accounts. Attackers who achieve arbitrary code execution in a pipeline (such as through a pull request dependency update) inherit all broad-scoped environment variables accessible to that runner. Securing the pipeline requires addressing this structural flaw rather than relying on masking strings in console logs.

Pipeline Exposure Vector Root Cause Primary Failure Mode
Git History Retention Committing keys to repository tracking Secrets remain readable across clones even after HEAD deletion
Broad Stage Scoping Shared environment variables across all jobs Test scripts inherit production deployment privileges
Unscoped Cloud IAM Wildcard permission grants on pipeline roles Breached runners allow lateral cloud account compromise
Console Logging Verbose build script output Plaintext credentials echo into pipeline run records

How Do You Audit and Discover Non-Human Identities in CI/CD Workflows?

Auditing non-human identities in CI/CD workflows requires scanning both code history and active pipeline execution paths to identify every automation credential in use. As outlined in DevOps incident response guidelines documented by beefed.ai, the initial phase requires running automated scans across main and active feature branches using open-source scanners like Gitleaks and TruffleHog. Running these scanners identifies existing keys, database strings, and API tokens embedded across historical commits.

To audit code history for leaked credentials, execute a baseline Gitleaks detection scan across the entire repository:

gitleaks detect --source . --report-path gitleaks-report.json

This command evaluates git commits against signature patterns, outputting identified tokens, file locations, and commit hashes into a structured JSON report. However, static repository scanning only inspects static strings; it fails to track non-human identities that are generated dynamically or assigned broad privileges inside cloud platforms.

To achieve complete visibility, organizations use Hush Security to discover, attribute, govern, delegate, and audit non-human identities. Operating across pipeline workloads and agent interactions, Hush Security provides runtime discovery of non-human identities, ensuring every machine actor is identified, attributed to a specific owner, and monitored across every downstream call. Platform teams must evaluate their non-human identity inventory against four criteria:

  1. Credential Lifespan: Identify whether the credential is static (such as a long-lived cloud access key) or dynamic (such as an ephemeral STS token).
  2. Execution Scope: Determine whether the identity is scoped strictly to a single repository branch or shared across multiple development teams.
  3. Privilege Granularity: Verify if the identity uses least-privilege role definitions or wide wildcard administrator policies.
  4. Auditability: Confirm that every pipeline authentication event produces an immutable audit record in central security logs.

How Does Workload Identity Federation Replace Static Pipeline Secrets?

Workload identity federation replaces static pipeline secrets by allowing the CI/CD platform to mint short-lived OpenID Connect (OIDC) identity tokens that external clouds exchange for temporary access credentials. As explained by beefed.ai in their DevOps credential architecture guide, platforms like GitHub Actions and GitLab CI generate a cryptographically signed JSON Web Token (JWT) at job execution. Cloud providers like AWS, GCP, and Azure validate this token against their native IAM identity providers without requiring pre-shared static keys.

Federation eliminates the traditional “secret zero” bootstrap problem, in which an automation system requires a persistent secret simply to authenticate against a secret vault. Because the cloud provider verifies the authenticity of the token using the CI/CD platform’s public signing keys, no secret is ever stored within the pipeline configuration.

+--------------------------------------------------------------------------------+
|                       WORKLOAD IDENTITY FEDERATION FLOW                        |
|                                                                                |
|  +-------------------+       1. Mint OIDC JWT       +----------------------+   |
|  |   CI/CD Runner    | ---------------------------> |  GitHub / GitLab IDP |   |
|  | (Job Environment) | <--------------------------- |   (Signs Token)      |   |
|  +-------------------+        2. Signed Token       +----------------------+   |
|           |                                                                    |
|           | 3. AssumeRoleWithWebIdentity(Token)                                |
|           v                                                                    |
|  +-------------------+        4. Validate Claims    +----------------------+   |
|  |  Cloud Provider   | <--------------------------- |   Cloud IAM Trust    |   |
|  | (AWS / GCP / Az)  | ---------------------------> |       Policy         |   |
|  +-------------------+        5. Ephemeral STS      +----------------------+   |
|           |                      Credentials                                   |
|           v                                                                    |
|  +-------------------+                                                         |
|  | Target Resources  |  (Job runs with temporary, scoped access)               |
|  +-------------------+                                                         |
+--------------------------------------------------------------------------------+

While workload federation removes static credentials, implementing raw OIDC across dozens of microservices can lead to fragmented trust policies and policy sprawl. Each repository requires distinct IAM role trust boundaries, claims mapping, and environment restrictions. Without centralized governance, platform engineering teams struggle to track which repositories maintain trust relationships with production cloud accounts, creating an unmonitored management layer.


What Is the Difference Between Stored Secrets, Vaults, and Identity-Based Access?

Organizations handling CI/CD automation typically manage machine credentials through one of three architectural patterns: static stored secrets, centralized secrets vaults, or identity-based access platforms. Each model involves clear tradeoffs regarding operational complexity, rotation burden, and exposure risk.

+-----------------------+-----------------------+-----------------------------+
| Stored Pipeline Keys  |    Secrets Vaults     |    Identity-Based Access    |
+-----------------------+-----------------------+-----------------------------+
| Static long-lived     | Central storage;      | No static secrets or keys;  |
| secrets in repo vars; | short-lived leases;   | short-lived, just-in-time   |
| manual rotation; high | requires auth tokens; | runtime authorization; full |
| exfiltration blast    | complex operations    | non-human identity audit    |
| radius.               | and maintenance.      | visibility.                 |
+-----------------------+-----------------------+-----------------------------+

Stored Pipeline Variables

Storing static tokens in repository settings or CI tool variables is the legacy approach. While simple to configure, static tokens create significant operational overhead and security debt. These credentials rarely rotate automatically, are frequently echoed into build outputs, and offer no granular scoping. A compromise of the CI variable store exposes long-lived production access.

Centralized Secrets Vaults

Centralized vaults like HashiCorp Vault address static storage by offering dynamic secrets engines that generate temporary database users or cloud credentials with explicit time-to-live leases, as described by beefed.ai. GitLab CI supports direct integration via secrets:vault stanzas combined with id_tokens to fetch credentials dynamically at job start. While vaults isolate secrets from source code, they introduce significant operational burdens: platform teams must deploy, unseal, monitor, and scale highly available vault clusters, while maintaining pipeline integration agents and managing bootstrap authentication tokens.

Identity-Based Access for Non-Human Identities

Identity-based access platforms eliminate stored secrets, static keys, and secret vaults entirely by authenticating workloads based on verified runtime context. Through Hush Security, organizations adopt identity-based access for non-human identities, enabling just-in-time, scoped access with full auditability. Shifting to identity-based access eliminates hardcoded, static, and long-lived access across the technology stack, significantly reducing the operational maintenance overhead typically borne by DevOps and SecOps teams.
Same styling, adjusted for four columns (first column a bit narrower, the other three equal):

“`html

Evaluation Metric Stored Pipeline Secrets Centralized Secrets Vault Identity-Based Access (Hush)
Credential Format Static, long-lived API keys Dynamic, leased secrets Ephemeral, just-in-time authorization
Storage Overhead Repository variable stores Dedicated vault infrastructure Secretless architecture (no vaults)
Rotation Burden Manual or scheduled script Automated lease expiration Fully automatic per-action evaluation
Bootstrap Secret Required Yes (stored in pipeline) Yes (token or app role ID) No (cryptographic identity token)
Non-Human Identity Audit Fragmented CI logs Vault access audit logs Comprehensive end-to-end outcome audit

 


How Do You Configure Ephemeral, Least-Privilege Access for Cloud Deployments?

Configuring ephemeral, least-privilege access requires establishing cryptographic trust between your CI/CD platform and cloud IAM, restricting permissions to distinct deployment environments, and purging exposed legacy credentials.

Step 1: Revoke and Purge Compromised Repository Credentials

When removing credentials from a pipeline, assume any token previously committed or stored in pipeline variables has been compromised. Immediate revocation at the issuing provider is mandatory. After revoking the active token, purge the string from your repository’s git history using git-filter-repo, as documented by beefed.ai:

echo 'AKIAIOSFODNN7EXAMPLE' > secrets-to-remove.txt
git filter-repo --replace-text secrets-to-remove.txt
git push --force --mirror origin

Check before moving on: Run a fresh gitleaks detect --source . scan to verify that zero instances of the compromised string remain in branch histories or tag references.

Step 2: Establish OIDC Trust in Cloud IAM

Configure an OpenID Connect identity provider within your cloud account pointing to your CI provider (such as GitHub Actions at https://token.actions.githubusercontent.com). Create an IAM role with a trust policy that restricts assumption to your exact organization, repository, and branch:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
        },
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:example-org/production-service:ref:refs/heads/main"
        }
      }
    }
  ]
}

Check before moving on: Verify that the condition blocks assumption attempts from feature branches or outside repositories.

Step 3: Implement Least-Privilege Environment Scoping

Adhere to the least-privilege principles detailed by Khimananda Oli. Scope deployment roles strictly to individual environments such as staging or production, and grant read-only or targeted write permissions rather than wildcard policies. Furthermore, do not pass secrets directly between pipeline jobs. Jobs should fetch their own scoped credentials independently, or encrypt intermediate artifacts with ephemeral keys if data transfer between stages cannot be avoided.

In your pipeline definition (such as a GitHub Actions workflow), request OIDC token minting permissions and assume the role dynamically at runtime:

name: Deploy Production Workload
on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Configure AWS Credentials via OIDC
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/cicd-production-deployer
          aws-region: us-east-1

      - name: Deploy Infrastructure
        run: |
          aws s3 sync ./build s3://production-workload-assets-bucket/

Check before moving on: Execute the pipeline and confirm in cloud audit logs that authentication succeeded using temporary session credentials without referencing long-lived access keys.

Step 4: Audit IAM Policies and Environment Protections

As advised by Khimananda Oli, configure environment protections requiring manual approvals or passing status checks before release workflows can access deployment roles. Additionally, schedule quarterly IAM policy reviews to eliminate stale role bindings, inspect trust policies for over-permissive wildcards, and continuously reduce the attack surface across your automation identities.


What Are the Phased Milestones to Achieve Secretless CI/CD?

Eliminating secrets across an enterprise delivery pipeline cannot happen in an unmanaged, single-day rollout. Attempting an immediate cutover across all repositories disrupts deployment operations. Instead, engineering teams should follow a structured, phased implementation roadmap based on identity maturity.

+--------------------------------------------------------------------------------+
|                    SECRETLESS CI/CD IMPLEMENTATION ROADMAP                     |
|                                                                                |
|  Phase 1: Discovery & Triage (Days 1-5)                                        |
|  + Run history scans with Gitleaks & TruffleHog                                |
|  + Map all non-human identities and cloud permissions                          |
|  + Identify hardcoded keys and plaintext environment variables                 |
|                                                                                |
|  Phase 2: Remediation & Git Scrubbing (Days 6-12)                              |
|  + Revoke all detected static keys at the issuing service                      |
|  + Rewrite git history with git-filter-repo and force-push                     |
|  + Add pre-commit hooks and PR scanner blocking gates                          |
|                                                                                |
|  Phase 3: Workload Identity Federation (Days 13-20)                            |
|  + Configure OIDC trust providers in cloud IAM                                 |
|  + Migrate workflow definitions to ephemeral role assumption                   |
|  + Enforce environment-level protection rules and approval gates               |
|                                                                                |
|  Phase 4: Identity-Based Governance (Days 21+)                                 |
|  + Decommission static vault credentials and access keys                      |
|  + Implement centralized runtime NHI governance and outcome auditing           |
|  + Conduct quarterly least-privilege IAM policy reviews                        |
+--------------------------------------------------------------------------------+

Common Pitfalls to Avoid at Each Step

When transitioning pipelines to secretless authentication, watch for these frequent implementation failures:

  • Deleting from HEAD Without History Rewriting: Removing an access key in a new commit leaves the credential exposed across prior git commits. Always purge history using git-filter-repo and immediately revoke the token.
  • Permissive OIDC Trust Policy Conditions: Setting the OIDC sub claim condition to a wildcard (repo:example-org/*:*) allows any repository or fork in the organization to assume production deployment roles. Always lock the subject claim to specific branches and environments.
  • Reusing Credentials Across Stages: Sharing an authentication token between testing and deployment stages exposes high-privilege credentials to untrusted third-party code. Always re-fetch credentials independently at each job stage.
  • Neglecting Non-Human Identity Governance: Implementing OIDC across hundreds of workflows without runtime discovery creates unmonitored identity sprawl. Centralize identity-based governance across your non-human workforce to ensure continuous visibility and auditability.

Resolving Your Next Operational Step

Platform and security engineering teams aiming to eliminate static secrets should begin by running automated baseline discovery scans across their core repositories. After cataloging existing non-human identities and revoking exposed credentials, transition deployment runners to workload identity federation and adopt identity-based access across all automated pipelines.

Find Every AI Agent and NHI, Free
Get a Demo

Table of Contents

The advisory arrives midweek. It ends the way they all do: rotate all your secrets.

This week it came from several directions at once. A poisoned LiteLLM release ran a credential stealer every time Python started, in every environment it was installed in, whether or not anything used it. Separately, Railway told all its users to revoke and rotate every key. And OpenCode reported customer API keys stolen.

The pattern isn’t new. In March, an earlier LiteLLM compromise pulled CI secrets from roughly 2,500 organizations.

Different doors. The same instruction.

“Rotate everything” is the only instruction anyone can give

The advice is reasonable. Exposure is easy to assume: everything the process could read. So everything gets rotated. The hard part is doing it safely, when nobody knows who uses each secret.

The hunt begins: every copy of every key, in every vault, config file and pipeline. Every service that reads it. Then the change, everywhere at once. Miss one consumer, and revoking the old key takes it down.

Meanwhile, the clock is not yours. In this week’s LiteLLM incident, attackers were testing stolen cloud keys the same day. A careful rotation takes days.

Mapping who uses each secret is a hard problem of its own, and runtime visibility changes it. That was the subject of our last post. This post asks why there is a long-lived secret to steal at all.

Workload identity works only where the other side trusts it

The industry knows the better answer: workload identity. A service proves what it is, instead of presenting something it holds. The platform vouches for it, and it gets a token that expires in minutes. The major clouds have worked this way for years. Workload identity federation extends it beyond them: OpenAI, Anthropic, Snowflake and Databricks now accept those identities too. Where it is available, use it.

But most systems don’t accept it. A SaaS vendor, a database, a legacy internal API, a partner’s endpoint: few accept a federated token. There are hundreds of SaaS apps, and waiting for all of them is not a plan.

Your side can prove who it is. The other side still wants a secret.

So make every secret disposable

If those systems will keep asking for secrets, and some will be stolen, the goal changes: make a stolen one worth little, and recovering from it routine.

A better vault won’t get you there. It keeps a long-lived secret safer, but still long-lived. Applications fetch it and hold it, and copies spread until there are many sources of truth. Access rules per vault path are hard to keep tight, so a workload can usually reach secrets it never uses, and one compromised workload exposes all of them.

A disposable secret needs five properties:

  • Short-lived. It expires soon after it is issued, so an attacker’s window is short.
  • Scoped to need. It grants only what the workload actually uses, so a stolen copy reaches little.
  • One per workload. When one leaks, you know whose it was, and replacing it touches nothing else.
  • Owned by the system, not a person. Rotation happens because policy says so, not because someone remembered.
  • No code changes. Applications receive it the way they already read secrets.

Hush Access Manager

This is what we built Hush Access Manager to do.

It bridges the two sides. On yours, access follows identity: a policy grants a workload access to a resource because of what it is, the way an IAM role does in the cloud. On the other side, the target still gets what it expects, a credential. But it is a disposable one, minted by Hush for that workload alone, scoped to its policy and short-lived. The workload never holds a long-lived secret, and nobody has to own one.

It works for the systems that never adopted workload identity: databases, SaaS, APIs and cross-cloud resources. Where a target does support federation, Hush provisions that instead.

Under the hood, it identifies workloads with SPIFFE, so you get workload identity without running SPIFFE yourself.

An example policy, simplified from the Hush console. It says who the workload is, what it may do, and how it receives its credentials. There is no secret in it. Rotate issues fresh credentials on demand.

How it works

  • Define. You set policies by API or infrastructure as code: which workloads reach which resources, with what rights.
  • Mint. The Access Manager runs in your environment. It creates scoped credentials at each target, per policy, keeps rotating them, and revokes them when no workload matches anymore.
  • Attest. When a workload starts, the Access Manager verifies its identity and matches it to policy.
  • Deliver. Each workload receives only its own credentials, as environment variables or files. It needs no access to a vault, and no code changes.
  • Connect. The workload talks to the resource directly, in its native protocol. There is no proxy in the path.

The Access Manager runs in your environment. It manages credentials at each target and hands each workload only its own (dashed). The workload then talks to the target directly (solid): Hush is never in the path of your traffic. Numbers follow the steps above.

The same week, replayed

Run this week again with every credential managed this way.

The stealer still runs. It still finds credentials, in environment variables or files, wherever the workload keeps them.

Each credential it takes is short-lived, and belongs to one workload.

Once the bad package is gone, you redeploy the affected workloads. Hush hands them fresh credentials and retires the stolen copies. Every other workload keeps running untouched. Its credentials were never exposed, so there is nothing to rotate.

No hunt for copies. No spreadsheet of owners. No lost weekend.

Where to start

Start with the secret you would least like to see in a stolen archive. Pick one workload and one resource. Hush can suggest the first policy from what that workload already uses. Then let the Access Manager take it from there, and move on to the next one.

And ask the question this week raised: if you had to rotate everything tonight, how long would it take, and how sure would you be that you got it all?

How long would “tonight” take?
Connect one environment and see every secret, and every one you’d miss.
See your secret inventory for FREE

Find Every AI Agent and NHI, Free
Get a Demo

Best Alternatives to HashiCorp Vault for Managing Secrets

Hush Security Engineering's avatar
Hush Security Engineering Engineering Team

Table of Contents

The best alternatives to HashiCorp Vault fall into three primary architectural categories: cloud-native managed secrets services, developer-focused secrets managers, and secretless non-human identity platforms. While traditional alternatives continue to store static credentials inside encrypted databases, modern platforms eliminate static secrets by issuing scoped, just-in-time access directly to workloads. For organizations managing non-human identities such as deployment pipelines, container workloads, and autonomous agents, secretless architectures represent the most secure alternative to managing a central secrets vault.

Centralized secrets vaults require ongoing operational maintenance, continuous token rotation, and complex replication topology design. Storing static credentials inside any centralized database creates an attractive target for credential compromise and requires specialized engineering teams to monitor storage backends, seal states, and disaster recovery. Modern security architectures address these operational burdens either by offloading vault infrastructure to managed cloud providers or by removing static credentials entirely through verified runtime identity.

What are the best alternatives to HashiCorp Vault for managing secrets?

Evaluating alternatives to HashiCorp Vault requires classifying solutions by their underlying architectural approach rather than treating all secrets tooling as identical. The three core alternatives to a self-hosted HashiCorp Vault deployment are cloud-provider key management services, developer-centric synchronization vaults, and secretless non-human identity platforms.

Secrets management architectures have evolved past the initial model of centralizing static tokens into an encrypted database. While early secrets managers focused on safeguarding static API tokens and database credentials, modern engineering environments feature dynamic workloads that need short-lived authorization rather than stored secrets.

Alternative Category Core Mechanism Operational Burden Credential Storage Risk
Cloud-Native Managed Services Hosted key-value stores bound to cloud-provider IAM Low (managed infrastructure) Medium (static secrets still persist in cloud storage)
Developer Secrets Platforms Centralized dashboard syncing secrets into environment variables Low to Medium High (secrets sync into external CI/CD and developer machines)
Open-Source Forked Vaults Self-hosted key-value and dynamic secrets engines High (self-managed storage, unsealing, high availability) Medium (central vault database contains plaintext on decryption)
Secretless Identity Platforms Runtime identity attestation and just-in-time scoped access Low Minimal (eliminates static stored secrets and vault databases)

Security teams choosing an alternative should determine whether their goal is simply replacing the underlying vault software or eliminating the operational overhead of managing static secrets altogether.

Why do engineering teams replace HashiCorp Vault?

Engineering teams replace HashiCorp Vault primarily to reduce operational complexity, escape restrictive software licensing terms, and lower the infrastructure burden of maintaining dedicated vault clusters. Running a self-hosted vault demands continuous platform engineering resources to manage high-availability storage backends, automated unsealing protocols, routine software upgrades, and multi-region synchronization.

Dedicated vault architectures also create significant developer friction. Application developers must learn proprietary API conventions, configure client token renewals, and handle vault connection failures gracefully inside application logic. When a vault cluster becomes unresponsive or enters a sealed state, dependent production services cannot authenticate, creating system-wide downtime.

Storage of static credentials represents another core reason teams migrate away from legacy vaults. When engineering teams store static secrets in a vault, those secrets still leak into environment variables, container layers, CI/CD run logs, and developer workstations. Managing secrets by merely storing them in a central repository fails to protect organizations against token theft once the secret is retrieved by a workload.

How do cloud-native secrets managers compare to centralized vaults?

Cloud-native secrets managers replace self-hosted vaults by delegating infrastructure management, high availability, and encryption-at-rest directly to major cloud providers. These services integrate natively with cloud identity and access management roles, eliminating the need to deploy and patch dedicated server instances or configure complex unsealing keys.

Cloud provider services simplify day-one operations for engineering teams committed to a single cloud ecosystem. Workloads running on managed cloud infrastructure authenticate directly using instance metadata and assigned runtime roles, bypassing the need for initial secret introduction problems common to traditional vault installations.

Multi-cloud enterprises, however, face architectural limitations when relying solely on cloud-native secret stores. Each cloud provider implements proprietary access control policies, unique API structures, and distinct audit logging formats. Platform teams operating across multiple cloud providers must maintain duplicate access policies and disparate operational workflows, recreating administrative complexity.

How does secretless access eliminate vault-stored credentials?

Secretless access platforms eliminate vault-stored credentials by replacing static API keys, tokens, and database passwords with real-time, identity-verified authorization. Instead of storing sensitive credentials in a vault and requiring applications to fetch them at runtime, workloads receive temporary, tightly scoped credentials minted dynamically for specific operations.

Non-human identities such as CI/CD pipelines, containerized microservices, background jobs, and autonomous agents represent the majority of access requests in modern cloud infrastructure. Traditional vaults treat these identities as consumers of static tokens, which leaves long-lived secrets susceptible to extraction from memory, logs, or compromised containers.

Runtime identity attestation evaluates the cryptographic provenance of a calling workload, confirming its binary hash, cloud environment, container namespace, and code repository before granting access. By validating identity at the moment of execution, platform teams remove the need to maintain static credentials inside vault databases, avoiding credential lifecycle management entirely.

Which alternative to HashiCorp Vault fits your security model?

Selecting an alternative to HashiCorp Vault depends on your organization’s deployment environment, engineering capacity, and security strategy regarding static versus dynamic credentials. Security architects should evaluate alternative solutions against specific infrastructure requirements:

  • Single-Cloud Infrastructure: Teams running workloads strictly inside one cloud provider achieve the lowest operational overhead by adopting that provider’s native secrets management service, leveraging native IAM policies without cluster management.
  • Existing Vault API Investments: Organizations with extensive codebase integrations written specifically for Vault APIs that require open-source licensing typically evaluate community-maintained open-source forks to minimize code rewrites.
  • Developer Experience and App Configs: Early-stage development teams focused primarily on synchronizing configuration files and environment variables across staging environments benefit most from developer-centric SaaS secrets managers.
  • Zero-Trust and Non-Human Identity Modernization: Enterprises managing microservices, automated pipelines, and artificial intelligence agents across diverse environments achieve the highest resilience by adopting secretless identity architectures that remove stored secrets from the attack surface.

Security teams evaluating these options must weigh the recurring labor of operating vault infrastructure against the security benefits of removing stored credentials from application memory.

How to evaluate your migration path away from HashiCorp Vault

Platform engineering teams planning a migration away from HashiCorp Vault should begin by cataloging the exact types of secrets stored within their current clusters. Auditing secrets usage reveals whether your workloads consume static third-party API keys, database credentials, internal service tokens, or public key infrastructure certificates.

Categorizing secrets by consumer type establishes whether your primary migration challenge is developer tooling or non-human workload authentication. Applications that rely on static database passwords can frequently be modernized to consume short-lived identity tokens, removing the need to migrate those secrets into a replacement vault.

Identity security assessments determine whether replacing HashiCorp Vault with another centralized vault solves your core security challenge. While swapping vault engines can reduce software licensing costs or cluster maintenance, migrating to secretless non-human identity access eliminates credential rotation failures, unauthorized token reuse, and static secret storage risks at the architectural level

Find Every AI Agent and NHI, Free
Get a Demo

AI Agents Don’t Have a Behavior Problem. They Have an Identity Problem.

Micha Rave's avatar
Micha Rave CEO and Co-Founder

Table of Contents

Personal AI agents just went mainstream

In a single month, the personal AI agent went mainstream. Meta’s Muse, launched on September 8, hit the top of Apple’s free app chart within 10 days. Instinct, a startup you text or call, just raised $1 billion at a $10 billion valuation.

These aren’t chatbots. They read your email, book, buy and correspond on your behalf. To do that, Instinct users give the agent broad authority to read and store data from any account they connect, and to make purchases and accept agreements in their name.

That’s the consumer version. The enterprise version is already running inside your organization: agents opening tickets, pushing code, pulling customer data and approving workflows. Same pattern, higher stakes. Once an agent acts, it needs access. And access is what attackers are looking for.

Behavior is only half the problem

Most of the security conversation is about agent behavior: guardrails, prompt injection, what the model is allowed to say. That’s real, but it’s half the problem.

Every agent authenticates to something: a database, an API, a SaaS app, another agent. That authentication is a non-human identity (NHI). A key, a token, a service account. Ship an agent, and you’ve also shipped an identity, usually one nobody registered and nobody owns. If that credential leaks, the guardrails don’t matter.

In research we published this month, we analyzed roughly 82,000 public MCP configuration files, the layer that connects agents to enterprise systems. We found secrets and access keys embedded in plain sight, available to grab and exploit. This isn’t a model problem. It’s an identity problem.

Three common questions leave organizations exposed. Here’s what to ask instead.

1. Don’t ask how many agents you have. Ask what identities they run on, who owns them, and how fast you can shut them down.

Picture two teams. A developer connects a coding agent to MySQL, Snowflake and CI. Marketing connects an agent to Drive, Salesforce and a REST API. Two agents, both approved. This is the picture most security teams have.

But to make them work, someone minted a password, a key, an API token, a service account, a personal access token and a certificate. Two agents. Six identities nobody inventoried. They weren’t provisioned as identities. They were created as a side effect of getting something to work, fast.

That’s why counting agents gives you the wrong number. The agents aren’t what touched your systems. Their credentials are. Every one of those identities needs a named owner, a place in a central inventory, and a risk profile: which systems it reaches, what data it can touch, and what happens if it’s compromised. An agent with read access to a wiki and an agent that can move money are not the same problem.

And every agent needs a kill switch. When one misbehaves or its credentials leak, the response can’t be a hunt for scattered keys across repos and config files. When each agent has a single verified identity, revoking it cuts off all access instantly, everywhere, in one action. If you can’t stop an agent in seconds, you don’t control it.

2. Don’t ask if the agent is secure. Ask what it’s allowed to do, and who decided.

The fastest way to connect an agent is to hand it a static key with broad permissions. That key usually carries whatever scope its creator had that day, serves every user the same way, and outlives the project, sometimes the employee. It works until it leaks. Then the attacker gets everything the agent can do, and often more.

The answer isn’t better secret rotation. It’s removing standing secrets altogether. Agents should authenticate as identities, not with shared keys, and receive least agency: only what the task requires, scoped to the user or team they act for, expiring when the task ends.

If an employee can’t delete a database, neither can their agent. That policy already lives in your identity provider. It just needs to extend to agents. Nothing to rotate, because nothing persists.

3. Don’t ask what happened after the incident. Ask what was stopped in the moment.

Plenty of tools produce polished risk dashboards and send alerts. That matters, but agents operate at machine speed. By the time the alert lands, the data is gone. And when you investigate, the log says “API key.” It doesn’t say which agent, which user, or which task.

The difference is between monitoring and enforcement. Real control sits in the path of the action itself: every agent request tied to an identity, checked against policy, allowed or blocked in real time, and recorded with full attribution. That delivers both protection and the ability to show regulators and the board exactly who did what, when and why.

Your new workforce needs identity-first security

What ties these questions together is a shift in how we think about enterprise identity. Your people get an identity, an owner, a lifecycle and offboarding. Your agents get a secret in a vault, or an env file, and a hope that someone remembers it exists.

AI agents are a new workforce: they operate like machines, decide like people, and multiply faster than both. They need to be managed like one.

Leadership doesn’t have to choose between speed and security. It needs to ask different questions: not how many agents, but what identities they run on; not whether they’re secure, but what they’re allowed to do; not what happened, but what was stopped.

Organizations that secure both the agent and the identity it runs on will scale AI with confidence. The rest will discover their shadow identities the hard way.

Find Every AI Agent and NHI, Free
Get a Demo

Agents Should Show Up in Inventories, Not Pentests

Shmulik Ladkani's avatar
Shmulik Ladkani CTO and Co-Founder

Table of Contents

Your AI inventory lists what was declared. The agents and MCP servers running in your clusters show up only in what they do.

The pentest of your production Kubernetes cluster wraps up. The report has one finding in red.

From a foothold in a single pod, the testers reached an MCP server – a small service that hands AI agents tools to call. Nobody had listed it. It answered without asking who was calling. One of its tools ran database queries. Its database credential was production’s.

At the readout, the first question is obvious. What else is out there like it – and who is calling it?

Nobody in the room can say. The AI inventory doesn’t have it. Servers like this rarely get registered. The testers found this one because they walked in.
One server is a finding. Not knowing how many there are is the risk.
Each of them holds whatever credential its team gave it. Each is called by agents that aren’t listed either. And nothing gets cleaned up, because a cleanup needs a list, and there isn’t one.

Agents became ordinary services

Agents used to live in a vendor’s console, or on a developer’s laptop. Now teams ship them the way they ship everything else: as a container in a Deployment, with credentials attached.

That part is old. A service holding credentials is a problem security teams already know.

The new part is that the service chooses its own actions. An agent decides which tool to call, and what to send it.

And tools are easy to add. A team stands up a small MCP server, or adds one more tool to one it already runs. Any agent that can reach the server can then use it.

The wiring is configuration, not deployment. Pointing an agent at a new server is a settings change. Which tools a server offers is whatever it lists when asked. When a server gains a tool, the agent needs no change at all. It finds the new tool the next time it asks.

Every list you have is a list of declarations

  • Agent platform consoles list the agents built on them. They are complete for what they host, and blind to a pod.
  • MCP registries list the servers someone registered. A shadow server is, by definition, not there. OWASP gives it its own entry in the MCP Top 10: MCP09, Shadow MCP Servers.
  • Code and image scanners find an agent framework in sixty images. They read repositories and registries, so they cannot say whether an image is deployed, or where. Nor what it calls, or with which credentials.
  • A network scan finds servers that answer. It cannot say which agents use them.

None of them answers what is running.
Where agents run inside a platform, the platform’s own list is the right source. The gap is the agents and servers you run yourself. What is missing there is observation.

Define an agent by what it does

A workload that speaks MCP and authenticates to a model provider is an agent. It does not need to register. Its traffic says so.

An MCP server is whatever agents call. If it runs in your cluster, it is a workload too, with an image, a service account and credentials of its own.

Both can be observed where they run. Watch what each workload calls, and what it authenticates with, and the pieces connect: the agent, the servers it calls, and the tools it uses.

Which ones matter comes down to what each agent and MCP server can reach. What do its credentials open, and are they long-lived? Does it run in production? Do its calls travel in the clear?

How Hush sees it

The Hush sensor already runs across your clusters, watching how secrets are used. It observes at the operating system level. Applications are not modified, nothing needs an SDK, and no traffic routes through it.

It reads agent traffic too. MCP, and A2A for agent-to-agent calls, are decoded the same way as HTTP or Postgres, including over TLS.

From that traffic, the Hush platform builds the inventory the readout asked for:

  • Agents: workloads that speak MCP or A2A and authenticate to a known model provider.
  • MCP servers: every host an agent calls. In-cluster servers resolve to the workload behind them.
  • Tools: what each server advertises, and what each agent actually calls.
  • Credentials: everything each agent and server authenticated with, traced to its source – the vault entry, the service account, the role.
  • Risk: each agent carries the risk of its credentials: what they can access and how much that matters, whether they belong to production, how long-lived they are, and whether they travel in the clear.

Take the server the testers found. The platform shows every agent calling it, the query tool it offered, and the production credential it held. And every other server like it.

One agent, as the sensor sees it: the model it calls, the MCP servers it uses, and for the in-cluster one, the credential and database behind it.

What changes

  • Inventory. Agents and MCP servers are found by behavior, not by registration.
  • Access. For each agent, the tools it calls and the credentials behind them – including what it reaches through a server.
  • Exposure. MCP and model calls in plaintext or over old TLS.
  • Priority. An agent that reaches a production database outranks one that reaches a test queue.
  • New reach. A server that adds a tool, or an agent that starts calling a new server, shows up from its first call.

The testers found one server because they walked in. The rest should show up in your inventory, not in the next pentest report.

Find Every AI Agent and NHI, Free
Get a Demo

You Found a Leaked Credential. What Breaks If You Revoke It?

Shmulik Ladkani's avatar
Shmulik Ladkani CTO and Co-Founder

Table of Contents

Revoking a leaked credential is the easy part. Knowing what breaks when you do is the part nobody can answer.

A scanner flags a credential in a repository. It’s the data lake key - read access to most of what the company has ever collected.

Nothing reads it from there. It was mistakenly committed two years ago and went unnoticed. But it is out, so it has to be rotated. Nobody argues about that.

Then someone asks which systems are using it.

Nobody can answer. You build a list from memory and from asking around. Twelve services, you think. Four teams.

You rotate on a Tuesday evening and watch. Nothing happens for forty minutes.

Then the reporting view goes blank. For customers.

That team keeps its workload secrets in a different secret manager. You updated the source of truth. You did not update theirs, because yours was never the only one.

Nobody did anything wrong. Two teams standardized at different times. That is how most estates end up.

The next rotation waits for a complete list of consumers. Nobody can produce one. It is still waiting.

The system you’re protecting can’t tell you who’s using it

A safe rotation needs two facts. Which services authenticate with the credential. And where each of them reads it from.

The first sounds like it should come from the data lake. It doesn’t. The lake records that the credential was used. It does not record which service used it. One credential handed to twelve services arrives as one caller, twelve times. The audit trail is fine. It is answering a different question.

The second assumes there is one place the credential is kept. Most estates have several, and one credential can sit in more than one. So a rotation is not one write. It is a write to every place the value is kept, and you have to know how many places that is.

What gets tried first

  • Ask the teams. Tribal knowledge, and the people who set it up have moved on.
  • Last-used data. The best of the existing answers, and still not enough. It tells you the key was used, not which service used it or where it read it from. And only some systems offer it at all.
  • Run two keys and phase it. Genuinely good, where the system supports it. You still need the consumer list to know when the old key has gone quiet.
  • Rotate and see what breaks. This is the one that created the problem.

The answer only exists on one side

Both missing facts are facts about the consumer, not the provider. So any answer has to be built from the authentication itself. Two things follow.

  • It has to work the same for a database password, for a cloud key, and for the API token a SaaS vendor issued you.
  • It cannot carry the secret. What gets recorded has to identify a value without holding it – enough to match two copies of the same value, not enough to reconstruct it.

Get both right and everything you know about one credential collapses into one picture: every place it is kept, and every service observed using it.

The sensor is already watching

Hush deploys a sensor across your clusters and hosts. It observes at the operating system level, so applications are not modified and nothing needs an SDK added to it. It watches; nothing routes through it.

It sees each authentication: which workload made it (a service, a job, a container), what it reached, and where that workload read the credential from an environment variable, a mounted secret, a vault, a cloud secret manager.

The secret value never leaves the machine. Only the fingerprint does.

So the rotation starts with both facts in hand, including the source of truth nobody remembered.

Why runtime matters

A scan can tell you a credential exists somewhere. Almost everything you decide afterwards depends on use.

A match in a repository is a guess. An authentication is proof.

That is why secret-scanning queues fill with findings nobody triages: expired keys, test values, strings that only look like credentials. When the same value turns up authenticating, the guess resolves. When it never does, it can wait.

Use is also what makes a finding rankable. Ranking needs three things: how serious the finding is, how important the system it reaches, and whether the workload using it runs in production. A scan gives you the first, and can often infer the second. But permissions say what a credential could reach. Runtime says what it did reach, and from where.

And what the sensor doesn’t see matters as much as what it does. A credential sitting in a secret manager that nothing has authenticated with is one nobody has needed lately. A credential authenticating from a workload with no secret manager behind it is one nobody owns, and something in production depends on it. Neither of those is visible to anything but a sensor watching the authentications.

What it still won’t tell you

Seeing a credential authenticate is proof it is in use. Not seeing it for thirty days is weaker evidence, because some jobs run once a quarter. An unused credential is a candidate for retirement, not a verdict.

So the output is a list of what breaks, not a promise that nothing will: it covers the workloads on machines the sensor runs on. That is still the difference between planning a rotation and hoping.

The deeper fix is not a better rotation. It is having nothing long-lived to rotate in the first place. Hush Access Manager gets rid of the stored credential. What grants access is a rule about the workload’s identity, the way an IAM role does: the workload gets access because of what it is, not because of what it holds. A short-lived key is minted for it when it runs. The idea is not new. Extending it to a database password and a vendor’s API token is, and that deserves its own post.

Until then, the key still has to be rotated. The difference is that the list already exists, so the rotation stops waiting. Nobody finds out from a customer.

Find Every AI Agent and NHI, Free
Get a Demo

When Your MCP Server Has No Concept of Users

Shmulik Ladkani's avatar
Shmulik Ladkani CTO and Co-Founder

Table of Contents

What to do when the MCP server your workforce depends on has no concept of users.

I’ve run into this more than once. A hundred developers need their agents to reach an MCP server that doesn’t support OAuth. The server authenticates with one service-account key, so the key is handed to all hundred.

Then someone left the company.

Rotating the key locks out that person. It also locks out the other ninety-nine, until each one updates a config file. So the key doesn’t get rotated, and a former employee keeps working access.

That’s the problem. The rest of this is why it shows up now, and what closes it.

Service-account keys are old. Handing one to a hundred people is not.

Before agents, a credential like this went to a handful of integrations built by a platform team. The number of copies tracked the number of integrations.

Now the caller is an agent, and it runs in each developer’s own environment. A credential has to be wherever the agent runs, so the number of copies tracks headcount.

Storage got worse at the same time. A CI secret lives in a secret store. An agent credential lives in a config file on a laptop – synced, screenshared, occasionally committed.

And the credential is now readable by the agent. A prompt injection arriving in a tool result is an adversary who can write text into the process holding the key. CI secrets were never exposed that way.

The admin had two options

  • Distribute the key. The usual outcome. Fast, and unrecoverable. You can’t take it back from a hundred laptops, and you can’t revoke one person.
  • Refuse. Doesn’t stop the work. Developers run the MCP server locally with a key they obtained themselves. One credential the admin knows about becomes an unknown number they don’t.

Notice what isn’t on the list: the option where one person loses access and nobody else notices.

There is a third option

Put something between the agents and the server. Not something you write – a gateway you deploy. Every MCP call, from every agent, goes through one place.

The gateway authenticates the person first. The agent presents a token identifying the user, not the resource.

From there it does what you’d expect. It decides which applications that person may reach and which tools they may call, gates the sensitive ones behind consent, and records every call against a name.

All of that happens before it talks to the resource at all.

For servers that speak OAuth, the loop closes

Each user connects once. The gateway holds their token. Calls carry their identity, and revoking one person is one action that affects one person.

This is why governance for agent access converged on OAuth. The model assumes the resource speaks it.

The assumption fails in two places, for the same reason:

  • SaaS MCP servers that authenticate with a static API key instead of implementing OAuth.
  • Internal MCP servers that bridge to an internal API. Usually worse: the bridge was written for one trusted caller, so its credential tends to be broad – a service account, an admin token, a connection string.

Some SaaS vendors will add OAuth in time. Internal bridges mostly won’t – few teams will build identity-provider integration into something whose job is to wrap an API. Either way, the timeline isn’t yours.

Let the gateway hold the key

Hush Gateway is that third option. Agents connect to it instead of to each server; every call is authorized against the person behind it and recorded under their name.

That holds whether or not the server speaks OAuth. The resource stops dictating your access model.

The gateway verifies a person either way, then presents a credential it holds on their behalf. Where the server speaks OAuth, that is the person’s own access token; where it doesn’t, it is the application’s own credential – a bearer token, a basic pair, or a value in a named header.

The credential is stored as a managed secret, encrypted per deployment, and decrypted only inside the gateway. It never reaches the agent, which carries only its Hush token. Access is decided before the credential is used: a user who isn’t entitled to the application is refused before any upstream request is made.

For a server with no OAuth to offer: identity arrives with the call and stops at the gateway. What continues upstream is a credential the resource shares across everyone.

What changes

  • Onboarding. Configure the credential once. Entitled users work immediately.
  • Offboarding. Remove one person’s entitlement. Their access stops. The key is untouched, and the other ninety-nine never notice.
  • Requests. An unentitled user’s agent is told to ask, and can raise an access request for review. No ticket.
  • Audit. Every call is recorded against a person, not a service account.

The credential still has no concept of users. The gateway supplies one.

Where the journey continues

The gateway decides whether a call happens and which tool runs. What a tool reaches once it runs is up to the tool.

The difference shows in the tool surface. A bridge exposing run_query(sql) hands an entitled user everything the service account can read. The gateway can allow that tool or block it, but it cannot tell one query from another.

A bridge exposing get_invoice(id) and list_open_invoices() is governable: allow one, block the other, put consent in front of the ones that write.

Neither gives you per-record authority – that still belongs to the resource. But the tool surface decides how much of the gap the gateway can cover, which is worth knowing before you write an internal bridge. Getting that authority down to the resource itself is the next step, and a harder one.

About Hush Identity Gateway

Hush Gateway is a single control point for everything your agents reach: MCP servers that speak OAuth, servers that don’t, and databases. Adding an application is configuration rather than a project, and enrolling a new agent or person takes minutes. Entitlement, tool policy, consent, guardrails and audit sit in one place and apply the same way to all of them. Available self-hosted or managed.

Find Every AI Agent and NHI, Free
Get a Demo

Table of Contents

Claude Tag (their new Slack-native agent) introduces a different authorization model. Instead of the agent acting as the user who invoked it, the agent gets its own identity — scoped per channel, with its own credentials and permissions.

What changes:

  • Old model: “What can this user do?” → agent inherits the requester’s permissions.
  • New model: “What can this agent do in this channel?” → permissions attach to the agent, not the human.

The engineering is solid, and the innovation is amazing. But security and risk seems a bit neglected.

The problems:

  1. Confused deputy. Any channel member can invoke the agent. So a user with no access to a repo can ask the agent to read it, if the channel grants the agent that access. The human’s own permissions are never checked — privilege escalation by design.
  2. Long-lived NHI sprawl. Every channel gets its own scoped identity. That’s a fleet of long-lived, broadly-scoped credentials multiplying by design — the exact problem the industry has spent years failing to contain with human service accounts, now reborn for agents and scaling faster.
  3. Audit gaps. Actions land under a shared service account. In ambient mode across many channels, you lose attribution — you can see that the agent acted, not which human triggered it or why. The log captures identity and config lifecycle, not the substance of what was done.
  4. Missing guardrails. Access is granted at the channel level, not the action level. There’s no least-agency enforcement — once the agent holds a credential, nothing constrains which actions it takes with it. Anthropic’s own advice is “grant generous access from the start.”

What should’ve been done:

  • Effective permissions = agent scope ∩ requesting user’s scope. The agent should never do what the human couldn’t.
  • Action-level least-agency, not channel-level grants.
  • Audit that ties every agent action back to a responsible human.
  • Open the auth layer to an emerging standard like ID-JAG, Identity Assertion JWT Authorization Grant. instead of a proprietary, single-vendor model. It lets the enterprise IdP broker cross-domain access — so agent identity travels across IdPs and tools under central control, not just inside Anthropic’s walls.

Credit where due: Anthropic’s own “What’s next” addresses two of these directly — just-in-time credential grants (approve a single sensitive action in the moment without permanently widening scope) and an identity-aware overlay that adds user-level checks, so Claude only acts when both the channel’s profile and the requesting user’s permissions allow it. That’s the agent ∩ user model, and it’s the right direction. The gap is that it’s roadmap, not shipped — and the access model went live with “grant generously” as the default in the meantime.

Find Every AI Agent and NHI, Free
Get a Demo

The Anthropic Zero Trust Guide Is Excellent. Here Is What You Need to Implement It.

Micha Rave's avatar
Micha Rave CEO and Co-Founder

Table of Contents

Zero Trust for AI agents is the right framework for this moment. Anthropic published their guide on it this month, and the thing I keep coming back to is how many of its controls rest on a single assumption: that you already have cryptographic, runtime identity for your agents and non-human workloads. Most organizations do not. That is the gap this post is about, and it is the gap Hush was built to close.

I want to say upfront that the guide is one of the best pieces of practical security writing I have seen on this topic. It is specific, grounded in real threats, and gives architects and engineers something actionable. If you build or secure AI-driven systems, read it. This post is my practitioner’s walkthrough, with a direct lens on where Hush fits into the implementation.

Why AI Agent Security Requires a New Zero Trust Approach

Most security frameworks describe what good looks like in theory. This one is grounded in what attacks already look like in practice. The opening observation alone is worth sitting with: frontier AI models are compressing the window between vulnerability and exploit from months to hours.

The framework introduces a design test worth applying to every control you currently have in place: does this make the attack impossible, or just tedious? Controls that work through friction, such as rate limits and non-standard ports, degrade significantly against an attacker operating at machine speed. I think that framing is exactly right.

Autonomous AI systems change the attack surface in ways traditional security models do not account for. Agents interpret natural language, invoke tools and MCP servers, maintain memory across sessions, and coordinate with other agents. A compromised MCP descriptor can silently redirect tool calls. A poisoned memory entry corrupts every session that follows. These are not hypothetical threats. The first malicious MCP server impersonating a legitimate email service, silently copying all outbound messages, was documented in the wild. The guide maps all of this carefully, and regulated industries in particular should pay attention: the framework aligns directly with HIPAA, FINRA, GDPR, and FedRAMP requirements that are already in force.

The Framework’s Design Test

When evaluating any control, ask: does this make the attack impossible, or just tedious? Controls whose value comes from friction degrade significantly against an adversary that can grind through tedious steps at scale.

Non-Human Identity Is the Foundation Zero Trust for AI Agents Requires

The guide structures recommendations across three tiers: Foundation, Enterprise, and Advanced.

Foundation requires unique cryptographic identifiers for every agent instance, appearing in all logs and access requests.

Enterprise adds certificate-based authentication with lifecycle management.

Advanced moves to hardware-backed identity with attestation.

These tiers give teams a clear progression. Worth calling out directly: static API keys and embedded credentials are among the first things an attacker with model-assisted code analysis will find. The prescription is short-lived tokens issued by an identity provider, measured in minutes rather than days. That is exactly the model Hush is built around.

Hush issues credentials at the moment a workload needs access, scoped to the exact task, and expires them immediately after use. No long-lived secrets to rotate, audit, or accidentally expose. The SPIFFE framework underpins all of it, giving every workload and agent a verifiable runtime identity.

On the Framework’s Credential Guidance

Short-lived, narrowly-scoped tokens issued by an identity provider are the new baseline. Rotating a credential that can be found in a lockfile does not meaningfully raise the cost to an AI-assisted attacker.

Agent Identity Verification: How Hush Maps to Each Zero Trust Tier

The table below maps each identity and authentication requirement from the guide to the corresponding Hush capability.

Tier Framework Requirement Hush Capability
Foundation Unique cryptographic identifiers per agent instance; IDs appear in all logs and access requests. Runtime discovery assigns persistent, cryptographically rooted identity to every workload, agent, and NHI. All telemetry is attributed to a specific identity automatically.
Enterprise Certificate-based authentication with lifecycle management, rotation, and revocation. Hush issues short-lived, just-in-time credentials at runtime and attest identity via the SPIFFE framework. Lifecycle is managed automatically. No manual rotation required.
Advanced Hardware-backed identity stored in HSMs or TPMs. Remote attestation to verify agent integrity before granting access. Confidential computing enclaves for sensitive operations. Hush operates on-premises and in hybrid environments, keeping credential issuance within the customer’s own infrastructure boundary. SPIFFE-based identity provides the cryptographic foundation that hardware-bound identity and attestation builds on.

Least Agency: The Access Control Principle Built for AI Agents

One concept I think deserves wider adoption is Least Agency, a term coined by OWASP and highlighted throughout the Anthropic framework. Least privilege constrains what a system can access. Least Agency goes further: it restricts what each agent tool can do, how often, and from where. An email-drafting agent needs email permissions, not access to the finance file share.

This matters because most credential systems are not built to express task-scoped permissions at the agent level. Approved actions, prohibited actions, escalation triggers, and scope limits all need to be explicit and enforced at the access layer, not just declared in agent instructions.

Hush enforces Least Agency through runtime policy. Machine-to-machine interactions are mapped continuously and converted into access policies that define exactly which workloads can reach which services. Any connection outside that policy is blocked at the point of access. The capabilities that deliver this:

  • Runtime Visibility and Discovery: continuous discovery of every workload, service, and AI agent from code to production, including shadow credentials and NHIs not visible in static scans.
  • Just-in-Time Scoped Access: credentials issued at the moment of access, scoped to the exact task, expired immediately after use. No standing access for agents to misuse.
  • Runtime Posture Analysis: risks prioritized based on actual runtime behavior and blast radius, not static configuration.
  • No Code or Application Changes: lightweight sensors run transparently in the background.

MCP Security and Supply Chain Risk for AI Agent Deployments

The framework’s section on MCP security and supply chain risk is one I recommend reading carefully. AI agent deployments compose capabilities at runtime, loading tools and personas dynamically from external sources. Traditional software composition analysis was not designed for this model, and the attack surface it creates is underappreciated.

Tool chaining attacks illustrate why this is hard to catch. An attacker does not need to compromise a single high-privilege tool. Instead, they manipulate an agent into combining two legitimate, low-privilege tools in a sequence that exposes data neither would surface on its own. Every command runs through trusted binaries under valid credentials, so host-based monitoring has nothing to flag. The access looks correct because the credentials are legitimate.

Running MCP servers on immutable infrastructure after code verification, signing them cryptographically, and requiring identity-based authentication for every tool connection is the right prescription. Hush enforces this at the access layer: every connection from an agent to a tool or service is governed by a named policy. If a workload is not explicitly authorized to reach a given service, the connection does not happen, regardless of what instructions the agent received. That external enforcement, sitting outside the agent itself, is what makes the control reliable.

Runtime Visibility and Incident Investigation for Non-Human Identities

Two metrics matter most before any other detection investment: dwell time, meaning how long from an anomaly to human awareness, and coverage, meaning the fraction of alerts actually investigated. Both depend entirely on attribution. Without knowing which specific agent instance made a decision or accessed a resource, you cannot trace the chain of events that produced an incident. You can measure that something went wrong. You cannot explain how.

Hush provides runtime telemetry with identity attribution for every workload and agent action. Because Hush facilitates the access itself, every connection is logged against the verified identity that initiated it. The visual lineage map shows exactly which agents connect to which services, what credentials they use, and when, giving security teams the starting point they need to reconstruct an incident rather than beginning from a pile of unattributed events. For teams dealing with compliance requirements around algorithmic explainability, that audit trail is not optional.

Implementing Zero Trust for AI Agents: Four Concrete Steps

The guide recommends beginning at Foundation and advancing tiers as deployments scale. Here is how to sequence that with Hush.

Step 1: Discover Every Non-Human Identity at Runtime

You cannot govern what you cannot see, and most teams discover NHIs and agents they did not know existed once runtime discovery is in place. Hush’s free tier provides continuous discovery across cloud, on-premises, and hybrid environments, building an inventory based on real-world usage rather than configuration assumptions. The first time most teams run it, something unexpected shows up.

Step 2: Map Your Static Secrets and Credential Exposure

Static API keys and embedded credentials are easier to find than most teams expect, and they are the first thing an AI-assisted attacker looks for. Hush detects exposed, leaked, and misconfigured secrets across code, cloud, and pipelines, surfaced with blast-radius prioritization so you know what to fix first and what the consequences of each exposure would be.

Step 3: Define Explicit Access Policies for Each Agent

An agent with vague permission to ‘help with customer service’ has no enforceable boundaries. Approved actions, prohibited actions, and scope limits need to be written down and enforced at the access layer. Hush converts observed machine-to-machine interactions into access policies automatically, giving you a starting point grounded in how your agents actually behave rather than how you assume they do.

Step 4: Replace Static Credentials with JIT Scoped Access

Start with the workload carrying the largest blast radius. Hush provisions just-in-time, scoped credentials at runtime and enforces policy at the point of access, with no code changes or infrastructure redesign required. Once one workload is running under JIT access the pattern is established. Expansion to the rest of the fleet follows the same process.

The Identity Access Layer That Makes Zero Trust for AI Agents Practical

What I find most valuable about the Anthropic framework is that it does not let you off the hook with vague principles. The tier structure forces a real question: are you at Foundation, or are you below it? Most teams, when they look honestly at their agent deployments, find they are below it. Not because they made bad decisions, but because the identity and access infrastructure the framework assumes has not existed in a practical, deployable form until recently.

That is what Hush is built to change. The framework sets the destination. We give you the access layer to get there from day one, without a multi-year infrastructure overhaul standing in the way.

If you want to see how it works in practice, get started for free or schedule a demo with the team.

Find Every AI Agent and NHI, Free
Get a Demo

You Didn’t Sign Up to Protect Your Customers’ Credentials

Chen Nisnkorn's avatar
Chen Nisnkorn CCO and Co-Founder

Table of Contents

If your platform holds OAuth tokens or API keys on their behalf, you already are.

This post is for you if your platform stores OAuth tokens or API keys on behalf of customers, provides integrations that act on users’ behalf (Zapier, Make, Nango, Composio, or similar), runs AI agents or automated workflows using customer credentials, or connects to tools like Slack, GitHub, Snowflake, HubSpot, or Workday. If none of those apply – this isn’t your problem yet. If one does – keep reading.

Think about the security team’s job description from five years ago.

You were responsible for your company’s credentials. Your service accounts.

Your API keys. Your team’s access to production systems. The perimeter was clear: protect what belongs to us.

Then something shifted – quietly, gradually, without a formal handoff.

AI agents started acting on behalf of users. Integration platforms started storing tokens to connect customer tools. Automation workflows started holding API keys to call third-party APIs on your customers’ behalf. Every new product feature that required access to a customer’s Slack, their GitHub, their Snowflake, their Workday – created a credential your platform now owned, stored, and was responsible for.

Nobody rewrote the security team’s mandate. Nobody drew a line in the org chart between “our credentials” and “credentials we hold for others.” It happened as a product decision, not a security one. The credential store grew one integration at a time, one customer at a time, and now it contains something nobody explicitly signed up to protect: the production access keys of every company that trusted you enough to connect their tools.

This is the new reality for security engineers and CISOs, mainly with  integration platforms, AI analytics companies, automation tools, and any SaaS product that acts on behalf of its customers. Your threat model doesn’t start and end with your own environment anymore. Your credential store is the threat model.

Most security teams at platforms like these don’t have a complete picture of what they’re holding until something forces them to look: at a compliance audit. A penetration test. A breach.

By the time an attacker forces that moment, it’s too late.

That’s the challenge this post is about – and why Composio’s May 2026 incident report is required reading for anyone building in this space.

Think of it like an earthquake.

The most destructive quake in a sequence is rarely the first one. There are foreshocks – smaller tremors nobody takes seriously. Then the main event hits. And then the aftershocks keep coming, spreading outward, each one weakening structures that were already cracked.

The Composio breach is that earthquake. And the fault line runs through every company that trusted them with credentials.

Each company in that second column had done nothing wrong. Their security controls hadn’t failed. They didn’t appear in the attacker’s initial target list. They were downstream – connected to Composio the way buildings are connected to the ground.

When the ground moves, they move with it.

And look at the third column (the customers of the customers). The blast radius doesn’t stop at Composio’s customers. It reaches their customers too – the end users, the employees, the data. Every level of the chain absorbs a shock it never felt coming and had no way to prepare for.

That’s what makes this threat model different from a standard breach. The earthquake happened in one place. The damage is affecting everywhere else.

The companies in that list didn’t feel the tremor. They felt the aftershock.

The math nobody is running

Every integration platform, AI agent infrastructure layer, and analytics connector that requires access to customer data operates on the same model: collect credentials at setup, store them, use them to service requests on the customer’s behalf. The secret store is how the product works.

The problem is what happens when that store becomes a target.

Composio’s May 2026 incident report gave a rare and unusually transparent window into what that exposure looks like in numbers. They disclosed that 0.3% of their active connections were in the blast radius of their breach. That 0.3% contained:

Now ask the question nobody in the post-incident coverage asked:

What does 100% look like?

If Composio’s 0.3% maps to roughly 5,000 connections, their full credential store contained approximately 1.7 million live credentials across hundreds of tools – each one a valid key to a real customer’s production environment.

That’s not a vulnerability in the traditional sense. That’s architecture. And it’s not unique to Composio. It’s the default state of every platform that holds customer credentials at scale.

Read the connector list differently

Security people instinctively reach for the big number. 5,001 GitHub tokens – that’s the headline. Source code, CI/CD pipelines, GitHub Actions secrets, private repos. Real damage.

Lets take a closer look on the 1 digit row exposed secret, and what it could affect 

Workday. One token. Workday is an HR system. A single compromised Workday OAuth token gives read access to employee records, compensation data, org charts, PII for an entire company’s workforce. One token. One company’s HR database. Entirely accessible.

Gong. One token. Gong records and transcribes every sales call. A compromised Gong integration exposes every recorded customer conversation, every deal discussed, every competitive intelligence shared on a call. For a sales-led company, that’s the whole game.

Metabase. One token. Metabase is a business intelligence tool that runs directly against production databases. A Metabase single  token isn’t access to a dashboard – it’s often access to the underlying data. Depending on configuration, it’s a query interface to your customer’s entire data warehouse.

Sentry. One token. Sentry captures exceptions and stack traces from production applications. That means function names, file paths, line numbers, and sometimes variable values at the moment of failure. It’s a map of application internals that an attacker with time can use to find the next vulnerability.

Vercel + Render. Deployment infrastructure. One token each. These aren’t data stores – they’re the keys to production deployments. Depending on permissions, a compromised Vercel token can trigger new deployments, pull environment variables, or access build logs that contain secrets.

Gmail × 12. Twelve email accounts. Email is the root of trust for almost everything else – password resets, 2FA codes, vendor communications. Twelve Gmail tokens in a compromised credential store aren’t twelve email inboxes. They’re twelve master keys.

That’s what 0.3% contains. Not a database of user records. Not a payment system. A set of live credentials with access to HR systems, communication infrastructure, BI tools, deployment pipelines, error monitoring, and source code.

The breach doesn’t stay inside your perimeter

Here’s what makes the integration platform threat model fundamentally different from a standard enterprise breach.

In a typical breach, the attacker gains access to your data. That’s serious. You do incident response, you notify affected parties, you remediate.

When an integration platform is breached, the attacker gains access to credentials for your customers’ environments. They never touch your customers’ networks. They never trigger an alert in your customers’ security tooling. The requests come from tokens that customers authorized. From IPs their tools have seen before.

The affected company finds out when someone tells them – or when the data is already being sold.

In the Anodot incident, a threat actor breached an AI analytics platform and used authentication tokens stored there to access Snowflake environments across a dozen customer organizations. The affected companies had done nothing wrong. Their security controls hadn’t failed. They were downstream victims of a breach they never experienced.

This is the domino effect . The first tile is your platform. The rest of them belong to your customers.

The governance questions that should keep a security architect awake

The instinct after reading an incident report is to think about controls at the point of breach: Tighter access to production systems, improved detection. Those matter.

But the deeper question is about the credential store itself – not how the attacker got in, but what they found when they arrived.

Most integration platforms can’t answer these questions with confidence:

How many credentials are you holding right now, and for whom? Not an approximation from your database. A live, queryable inventory with credential type, connected tool, scope, issuing user, creation date, and last-used timestamp.

Which of those credentials belong to users who no longer work at the company that authorized them? OAuth tokens don’t expire when employees leave. The token a developer granted to your platform in 2024, for a GitHub repo they managed, is still valid today if it was never explicitly revoked. Your system is holding a credential that the issuing company almost certainly doesn’t know about.

What do the scopes on your stored credentials actually allow – and how much of that do you use? Platforms typically request the scopes that make the integration work, or accept whatever the customer’s tool offers. Those scopes are rarely audited after issuance. A GitHub token with admin:org scope, stored because the integration needed repo:read, is sitting in your database right now.

What’s your revocation SLA? If you detect a breach at midnight, how long does it take to revoke all credentials associated with a specific customer? All credentials for a specific tool across all customers? All credentials in your system? If the answer involves any manual steps, the SLA is measured in hours, and the exfiltration window is measured in the same units.

Composio’s response to their May 2026 incident involved revoking OAuth tokens across ~100 tool integrations and asking customers to handle the rest. That’s an honest response. It’s not a fast one. And speed is the variable that determines blast radius.

What a governed credential store looks like architecturally

The solution isn’t fewer integrations or simpler architecture. It’s building the credential store with the security posture appropriate for what it actually is: a centralized store of third-party production access credentials that grows more valuable – and more dangerous – with every customer you add.

Credentials as first-class entities with lifecycle state. Every stored credential should have a lifecycle model: issued → active → dormant → expired/revoked. Transitions between states should trigger events. A credential moving from active to dormant after 90 days of inactivity should generate an alert. A credential that has never been used after 30 days should prompt a review.

Scope as a governed attribute, not a setup artifact. The scope granted at authorization time should be validated against what the integration actually requires, on an ongoing basis. Overprivileged credentials should be flagged and, where the tool supports it, downscoped via re-authorization.

Revocation as a first-class API operation. Revocation should be a single, fast, auditable operation – scoped to a customer, a tool, or the entire credential store. If it’s not, it’s a design debt that will cost you in your incident response window.

The uncomfortable truth about scale

There’s a tension that every integration platform security team lives with: the product gets better as connections deepen, and security gets harder as the credential store grows.

A platform with 10,000 connections has a manageable problem. A platform with 1.7 million has a different order of magnitude – one that requires automated governance, not periodic audits.

And the threat model shifts with scale. At 10,000 connections, you’re an interesting target. At 1.7 million connections across hundreds of tools, you’re one of the highest-value credential repositories in the systems of every company that uses your product.

The security architecture needs to reflect that. Not because something has gone wrong – but because of what you’ve built.

You’re not just holding an API key for a customer’s Slack integration. You’re holding the credential that unlocks their HR system, their deployment pipeline, their source code, their recorded sales calls, their production database – depending on which of your connectors they’ve enabled.

That’s a responsibility that deserves a dedicated security discipline. Not bolted onto standard SaaS security practices. Built for the specific problem of governing delegated credentials at scale.

At Hush Security, we work with platforms on exactly this problem – the discovery, lifecycle management, and governance of non-human identities that exist on behalf of your customers.

Find Every AI Agent and NHI, Free
Get a Demo