Docs/ Threat Model

Threat Model

Structured threat analysis following the AWS Threat Composer methodology

This threat model documents the threats Vouch is designed to address, the assumptions the design relies on, and the mitigations in place. It follows the STRIDE framework and is structured after the AWS Threat Composer methodology.

For background on Vouch’s security controls, see the Security Model page. For system design details, see the Architecture Overview page.


System description

Vouch is a credential broker that replaces long-lived developer secrets (AWS access keys, SSH private keys, GitHub PATs) with short-lived, hardware-backed credentials. The system has three components:

  • Vouch CLI + Agent — runs on the developer’s machine, holds session state in memory, and serves credentials to tools via standard protocols (credential helper, SSH agent).
  • Vouch Server — validates FIDO2 assertions, issues OIDC tokens, signs SSH certificates, and brokers credentials from external services.
  • External services — AWS STS, GitHub Apps, SSH hosts, container registries, and other services that consume Vouch-issued credentials.

Dataflow

┌──────────┐  FIDO2 assertion   ┌──────────────┐  kms:Sign (ES256)  ┌─────────┐
│  YubiKey │─-─────────────────►│ Vouch Server │──────────────────-►│ AWS KMS │
└──────────┘                    │              │◄──────────────────-┤         │
                                │              │  JWT signature     └─────────┘
┌──────────┐  session token     │              │
│Vouch CLI │◄────────────────-──┤              │  kms:Sign (Ed25519)
│ + Agent  │  (DPoP-bound)      │              │──────────────────-►┌─────────┐
│          │                    │              │◄──────────────────-┤ AWS KMS │
│          │  OIDC ID token     │              │  SSH cert signature└─────────┘
│          │──────────────────-►│              │
│          │  STS credentials   │              │  GitHub App key
│          │◄── ── ── ── ── ──--┤              │──────────────────-►┌─────────┐
│          │  (via AWS STS)     │              │◄─────────────────-─┤ GitHub  │
│          │                    │              │  installation token│ API     │
│          │  SSH cert request  │              │                    └─────────┘
│          │──────────────────-►│              │
│          │  signed SSH cert   │              │
│          │◄──────────────────-┤              │
└──────────┘                    └──────────────┘
      │  short-lived credential
┌──────────────────┐
│ Tool (aws, ssh,  │
│ git, docker)     │
└──────────────────┘

Data flows:

  1. Login — YubiKey signs FIDO2 assertion → CLI sends to server over TLS 1.3 → server validates against enrolled public key → returns DPoP-bound session token to agent (held in memory).
  2. AWS credential — CLI presents session token + DPoP proof → server issues OIDC ID token (signed via KMS ES256) → CLI calls AWS STS AssumeRoleWithWebIdentity → STS returns temporary credentials.
  3. SSH certificate — CLI sends signing request with session token → server delegates to KMS Ed25519 CA → returns signed SSH certificate → agent serves via SSH agent protocol.
  4. GitHub token — CLI requests token with session token → server exchanges GitHub App credentials for installation access token → returns short-lived token to CLI.

All CLI ↔ server traffic uses TLS 1.3. No credentials are written to disk at any point.


Assets

AssetLocationSensitivityProtection
FIDO2 public keysServer databaseLow — cannot impersonate usersDocument-level encryption (HPKE)
User metadata (email, org)Server databaseMedium — PIIDocument-level encryption (HPKE) + HMAC blind indexes
OIDC signing key (ES256)AWS KMSCritical — issuance authorityKMS access policy, non-extractable
SSH CA key (Ed25519)AWS KMSCritical — certificate authorityKMS access policy, non-extractable
Document encryption key (P-384)Encrypted by KMS, decrypted at runtimeCritical — protects data at restNitroTPM attestation binds decryption to attested instances
HMAC keyAWS KMSHigh — index integrityKMS HMAC operations, key never leaves KMS
Session tokensAgent process memoryHigh — grants credential accessNever written to disk, DPoP-bound
Audit logsServer databaseMedium — forensic evidenceDocument-level encryption, exported to external SIEM
SCIM tokensServer database (hashed)High — provisioning authorityStored as hashes, not reversible

Threat actors

ActorDescriptionCapability
External attackerAn adversary with no prior access to the organization’s systems. Operates over the network.Phishing, credential stuffing, man-in-the-middle attacks, domain spoofing, supply chain attacks on public packages.
Malicious insiderAn authenticated employee or contractor who abuses legitimate access.Valid Vouch session, access to internal systems, knowledge of organizational structure and tooling.
Compromised endpointMalware or an attacker with code execution on a developer’s workstation.Can read process memory, intercept IPC, access filesystem, and make network requests as the local user.
Compromised serverAn attacker who has gained access to the Vouch server infrastructure.Can issue sessions, sign tokens, and read enrolled public keys and audit logs.
Supply chain attackerAn adversary who tampers with Vouch binaries, dependencies, or distribution channels.Can inject malicious code into CLI binaries or modify package repositories.

Trust boundaries

┌─────────────────────────────────────────────────────────────────────┐
│  Developer Workstation                                              │
│                                                                     │
│  ┌───────────┐    Unix socket    ┌────────────┐                     │
│  │ Vouch CLI │◄─────────────────►│ Vouch Agent│                     │
│  └─────┬─────┘  (owner-only)     └─────┬──────┘                     │
│        │                               │                            │
│  ┌─────┴─────┐                   ┌─────┴─────-─┐                    │
│  │  YubiKey  │                   │ In-memory   │                    │
│  │  (FIDO2)  │                   │ credentials │                    │
│  └───────────┘                   └────────────-┘                    │
│                                                                     │
└──────────────────────────┬──────────────────────────────────────────┘
                           │ TLS 1.3
              ─────────────┼──────────── Network boundary
┌──────────────────────────┴──────────────────────────────────────────┐
│  Vouch Server                                                       │
│                                                                     │
│  ┌──────────────┐  ┌──────────────┐  ┌────────────────────┐         │
│  │ FIDO2 RP     │  │ OIDC Provider│  │ SSH CA (Ed25519)   │         │
│  │ (assertion   │  │ (ES256 via   │  │ (signing via       │         │
│  │  validation) │  │  AWS KMS)    │  │  AWS KMS)          │         │
│  └──────────────┘  └──────────────┘  └────────────────────┘         │
│                                                                     │
│  ┌──────────────┐  ┌──────────────┐                                 │
│  │ User store   │  │ Audit log    │                                 │
│  │ (public keys,│  │ (auth events,│                                 │
│  │  metadata)   │  │  issuance)   │                                 │
│  └──────────────┘  └──────────────┘                                 │
│                                                                     │
└──────────────────────────┬──────────────────────────────────────────┘
                           │ TLS 1.3
              ─────────────┼──────────── Service boundary
┌──────────────────────────┴──────────────────────────────────────────┐
│  External Services                                                  │
│                                                                     │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌────────────────┐       │
│  │ AWS STS  │  │ GitHub   │  │ SSH Hosts│  │ Container      │       │
│  │          │  │ Apps API │  │          │  │ Registries     │       │
│  └──────────┘  └──────────┘  └──────────┘  └────────────────┘       │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Three trust boundaries separate the system:

  1. Hardware boundary — The YubiKey’s secure element. Private keys are generated on-device and cannot be extracted.
  2. Workstation boundary — The developer’s machine. The agent process, Unix socket, and in-memory credentials are protected by OS-level user isolation.
  3. Network boundary — All communication between CLI and server, and between server and external services, uses TLS 1.3.

Assumptions

These assumptions underpin the threat model. If an assumption is violated, the corresponding threats may not be adequately mitigated.

IDAssumptionLinked threatsLinked mitigations
A1The YubiKey secure element correctly implements FIDO2 and does not leak private key material.T-S1, T-S2FIDO2 origin binding, FIDO2 user verification (PIN + touch)
A2The operating system enforces Unix socket file permissions, preventing other users from accessing the agent socket.T-I1, T-E1Unix socket permissions (T-E1 mitigation)
A3TLS 1.3 is not broken — an attacker cannot decrypt or tamper with data in transit.T-T1, T-I2TLS 1.3 transport encryption
A4AWS STS, GitHub, and other external services correctly validate OIDC tokens and enforce their own access controls.T-E2OIDC audience restriction
A5The developer’s workstation has not been fully compromised at the kernel level (no rootkit). User-space isolation is intact.T-I1, T-E1In-memory only credentials, Unix socket permissions
A6SCIM de-provisioning events are delivered promptly by the identity provider.T-S3SCIM de-provisioning
A7The Vouch server infrastructure is hardened and access-controlled (encrypted at rest, network isolation, audited access).T-T2, T-E3Infrastructure hardening, audit log export
A8Developers keep their YubiKey PINs secret and report lost or stolen keys promptly.T-S2FIDO2 user verification (PIN + touch)
A9AWS KMS correctly protects signing key material and enforces access controls. NitroTPM attestation correctly binds decryption to attested instances.T-T2, T-E3KMS-managed signing keys, NitroTPM attestation, document-level encryption

Threats

Threats are organized using the STRIDE categories. Each threat follows the AWS Threat Composer grammar: a [threat source] with [prerequisites] can [threat action], leading to [threat impact], negatively impacting [impacted assets].

Spoofing

IDThreatSTRIDESeverityPriority
T-S1An external attacker who controls a lookalike domain can stand up a phishing site to capture developer credentials, leading to unauthorized access to the developer’s accounts, negatively impacting session tokens.SpoofingHighLow
T-S2An external attacker with physical access to a stolen YubiKey and knowledge of the PIN can authenticate as the enrolled user, leading to unauthorized credential issuance for the session lifetime, negatively impacting session tokens.SpoofingHighMedium
T-S3A former employee whose SCIM de-provisioning is delayed can continue to use an active session, leading to unauthorized access to organizational resources after offboarding, negatively impacting session tokens.SpoofingMediumLow

Mitigations:

  • T-S1: FIDO2 origin binding prevents the YubiKey from signing assertions for unregistered domains. Even if a developer visits a phishing site, the authenticator will not produce a valid assertion. → FIDO2 security properties
  • T-S2: YubiKey PINs provide a second factor — physical possession alone is insufficient. Keys should be reported lost immediately, and the enrolled credential should be removed from the user’s account. Session lifetime (8 hours) limits the window.
  • T-S3: SCIM integration enables automated de-provisioning. Sessions can also be revoked server-side. Outstanding short-lived credentials (≤1 hour) expire naturally.

Tampering

IDThreatSTRIDESeverityPriority
T-T1An external attacker in a network position (e.g., compromised Wi-Fi) can intercept and modify requests between the CLI and server, leading to session hijacking or credential injection, negatively impacting session tokens.TamperingHighLow
T-T2A compromised server operator can modify the OIDC signing keys or SSH CA key, leading to issuance of fraudulent credentials accepted by external services, negatively impacting OIDC signing key and SSH CA key.TamperingCriticalLow
T-T3A supply chain attacker can tamper with Vouch CLI binaries during build or distribution, leading to malicious code execution on developer workstations, negatively impacting session tokens.TamperingCriticalMedium

Mitigations:

  • T-T1: All CLI-to-server communication uses TLS 1.3. DPoP (RFC 9449) binds tokens to the client’s key pair — intercepted tokens cannot be used from a different machine. PAR (RFC 9126) transmits authorization parameters server-side, keeping sensitive data out of URLs and browser history.
  • T-T2: Signing keys (OIDC ES256 and SSH CA Ed25519) are managed by AWS KMS and cannot be extracted — server compromise does not expose signing key material. The document encryption private key is only decryptable on NitroTPM-attested EC2 instances, preventing extraction even with full server access. The server does not store external service credentials — it brokers them on demand. Infrastructure controls (network isolation, access auditing) provide defense in depth. → Shared responsibility
  • T-T3: Release binaries include SLSA Level 3 provenance attestations and SHA256 checksums. Package manager installs (Homebrew, APT, DNF) verify signatures automatically. → Supply chain security

Repudiation

IDThreatSTRIDESeverityPriority
T-R1A malicious insider can deny performing an action (e.g., accessing a production resource) if audit logs are insufficient, leading to inability to attribute actions during incident response, negatively impacting audit logs.RepudiationMediumLow
T-R2A compromised server can tamper with or delete audit logs, leading to loss of forensic evidence, negatively impacting audit logs.RepudiationHighMedium

Mitigations:

  • T-R1: Every credential issuance is tied to a hardware-verified FIDO2 identity. The Vouch server logs all authentication events and credential exchanges. AWS CloudTrail records STS credential usage with the Vouch-issued identity as the principal.
  • T-R2: Audit logs should be exported to an immutable, external log store (e.g., AWS CloudWatch, a SIEM) so that server compromise cannot erase the trail. → Shared responsibility

Information disclosure

IDThreatSTRIDESeverityPriority
T-I1A compromised endpoint with code execution as the local user can read the Vouch agent’s process memory, leading to theft of the active session token and cached credentials, negatively impacting session tokens.Information disclosureHighMedium
T-I2An external attacker who compromises a network intermediary can observe credential exchange traffic, leading to exposure of tokens or credentials, negatively impacting session tokens.Information disclosureHighLow
T-I3An external attacker can enumerate the OIDC discovery endpoint (/.well-known/openid-configuration) to learn the server’s signing keys and supported configuration, leading to information useful for targeted attacks, negatively impacting OIDC signing key (public component only).Information disclosureLowLow

Mitigations:

  • T-I1: DPoP binds tokens to the CLI’s key pair — stolen tokens cannot be used from a different machine. Credentials are never written to disk (no ~/.aws/credentials, no ~/.ssh/id_*). Session lifetime is limited to 8 hours, and AWS STS credentials expire within 1 hour. Full endpoint compromise with kernel access is out of scope (see assumption A5).
  • T-I2: TLS 1.3 encrypts all traffic in transit. DPoP provides an additional layer — even if a token is somehow intercepted, it cannot be replayed from another client.
  • T-I3: OIDC discovery is public by design (required for AWS OIDC federation). The exposed information (issuer URL, JWKS, supported algorithms) does not enable impersonation. Private keys are never exposed through these endpoints.

Denial of service

IDThreatSTRIDESeverityPriority
T-D1An external attacker can flood the Vouch server with authentication requests, leading to developers being unable to obtain credentials, negatively impacting session tokens.Denial of serviceMediumLow
T-D2An external attacker can disrupt network connectivity between the CLI and the Vouch server, leading to inability to establish new sessions or obtain fresh credentials, negatively impacting session tokens.Denial of serviceMediumLow

Mitigations:

  • T-D1: The Vouch server implements rate limiting and is deployed behind infrastructure-level DDoS protection. Authentication requires a valid FIDO2 assertion, making automated abuse expensive.
  • T-D2: Cached credentials remain valid for their remaining lifetime (up to 8 hours for sessions, 1 hour for AWS STS). Developers can continue working with existing credentials during an outage. → Availability and Failure Modes

Elevation of privilege

IDThreatSTRIDESeverityPriority
T-E1A compromised endpoint can access the Unix domain socket and use the active session to request credentials for any role the user is authorized for, leading to unauthorized access to cloud resources within the user’s permission set, negatively impacting session tokens.Elevation of privilegeHighMedium
T-E2A malicious insider can use their valid Vouch session to access resources beyond their intended scope if IAM roles are overly permissive, leading to unauthorized access to production systems or sensitive data, negatively impacting session tokens.Elevation of privilegeHighMedium
T-E3A compromised server can issue sessions for any enrolled user, leading to impersonation of any developer and access to their authorized resources, negatively impacting OIDC signing key, SSH CA key, user metadata, and audit logs.Elevation of privilegeCriticalLow

Mitigations:

  • T-E1: The Unix socket is restricted to the owning user by filesystem permissions. DPoP prevents extracted tokens from being used on a different machine. Credential scope is limited to the user’s authorized roles — the attacker cannot escalate beyond what the user could already access. This threat is bounded by session lifetime (8 hours) and credential lifetime (≤1 hour).
  • T-E2: IAM roles should follow least-privilege principles. Vouch enables fine-grained role mapping per user via OIDC claims. CloudTrail provides full attribution of which user assumed which role. → Shared responsibility
  • T-E3: Signing keys are in AWS KMS (non-extractable). The document encryption private key requires NitroTPM attestation for decryption — an attacker with disk or database access alone cannot decrypt user data. Server infrastructure is hardened with network isolation, encrypted storage, audited access, and minimal attack surface. The server does not store external credentials — it brokers them — so compromise enables credential issuance (while the attacker maintains access) but not extraction of stored secrets.

Mitigation summary

ControlThreats addressedLayer
FIDO2 origin bindingT-S1 (phishing)Hardware
FIDO2 user verification (PIN + touch)T-S2 (stolen key)Hardware
DPoP sender-constrained tokensT-T1, T-I1, T-I2, T-E1 (token theft, replay)Protocol
PAR + signed JWTsT-T1 (parameter injection)Protocol
TLS 1.3T-T1, T-I2 (network interception)Transport
In-memory only credentialsT-I1 (disk exfiltration)Application
Short credential lifetimesT-S3, T-I1, T-E1 (blast radius)Application
SCIM de-provisioningT-S3 (offboarding)Identity
OIDC audience restrictionT-E2 (cross-service abuse)Protocol
SLSA Level 3 provenanceT-T3 (supply chain)Build
Audit logging + CloudTrailT-R1, T-R2 (repudiation)Operational
Rate limiting + DDoS protectionT-D1 (server flood)Infrastructure
Credential cachingT-D2 (outage resilience)Application
KMS-managed signing keysT-T2, T-E3 (key extraction)Cryptographic
NitroTPM attestationT-T2, T-E3 (runtime key protection)Infrastructure
Document-level encryption (HPKE)T-E3, T-R2 (data-at-rest protection)Application
HMAC blind indexesT-I3 (database-level identifier protection)Application

Out of scope

The following threats are explicitly out of scope for this threat model:

ThreatRationale
Kernel-level endpoint compromiseIf an attacker has root/kernel access, all user-space isolation (process memory, socket permissions) is bypassed. Endpoint detection and response (EDR) tools are the appropriate mitigation layer.
Vulnerabilities in external servicesAWS STS, GitHub APIs, container registries, and SSH implementations have their own security models. Vouch trusts their documented behavior.
Cryptographic breaksIf ECDSA (P-256), Ed25519, or TLS 1.3 are broken, the impact extends far beyond Vouch.
Physical coercionAn attacker who can physically compel a developer to authenticate is outside the scope of a technical threat model.
YubiKey hardware vulnerabilitiesVouch trusts the FIDO2 implementation of enrolled authenticators. Hardware side-channel attacks on the YubiKey secure element are outside scope.

Validation

  • Automated scanning – Dependency auditing (cargo deny), SAST, and supply chain verification run on every commit.
  • SLSA provenance – Release binaries include Level 3 provenance attestations, verifiable against the source repository.
  • FIDO2 conformance – WebAuthn assertion validation is tested against the FIDO Alliance conformance test vectors.
  • Client diagnosticsvouch doctor performs runtime checks (connectivity, agent health, credential helper configuration) to validate the local setup.

Review schedule

This threat model is reviewed quarterly and after any significant architecture change. The revision history below tracks updates.


Revision history

DateChange
2026-03-02Updated TLS requirement to 1.3 (TLS 1.2 removed). Added KMS signing architecture, NitroTPM attestation, and document-level encryption. Added assets inventory, validation, and review schedule sections. Aligned to AWS Threat Composer methodology: added dataflow diagram, impacted assets to all threat statements, priority metadata, and assumption-to-mitigation links. Updated mitigation summary table.
2026-02-28Initial threat model published on vouch.sh, structured using STRIDE and the AWS Threat Composer methodology.