Threat Modeling for Signing Specifications
STRIDE Framework Applied to Signing Systems
Spoofing
- Can an attacker forge the signer's identity?
- Can certificate SANs be manipulated?
- Can
skill_idownership be falsely claimed? - Is the OIDC provider's trust model sound?
Tampering
- Can signed content be modified after signing?
- Can the sidecar file be modified without detection?
- Can the policy file be weakened?
- Can the canonical form be manipulated to produce collisions?
Repudiation
- Can a signer deny having signed a skill?
- Is the transparency log tamper-evident?
- Are SET timestamps cryptographically bound?
Information Disclosure
- Does the signing process leak private information?
- Are OIDC tokens properly scoped and short-lived?
- Does the sidecar expose sensitive metadata?
Denial of Service
- Can verification be made unreasonably slow?
- Can YAML parsing be used for resource exhaustion (billion laughs)?
- Can the transparency log be overwhelmed?
- Are file size limits enforced?
Elevation of Privilege
- Can unsigned skills bypass verification?
- Can a weaker verification mode be forced?
- Can policy rules be manipulated to grant unauthorized trust?
Attack Trees for Signing Systems
Goal: Execute Malicious Skill as Trusted
Path 1: Supply Chain Compromise
- Compromise signer's GitHub account
- Use compromised credentials to obtain OIDC token
- Sign malicious skill with legitimate identity
- Distribute via normal channels
Path 2: Substitution Attack
- Obtain valid signature for
skill_id: github.com/org/legit-skill - Attempt to apply signature to different skill content
- Blocked by: digest includes content + skill_id + version
Path 3: Sidecar Rollback
- Retain old valid sidecar for previous version
- Serve old sidecar with current (modified) SKILL.md
- Blocked by: digest mismatch (content changed)
- Variant: serve old sidecar with OLD content (rollback attack)
- Partially mitigated by:
max_age_dayspolicy
Path 4: Bypass Verification
- Target environments that don't enforce verification
- Ship skill without sidecar (exits
UNSIGNED, code 2) - Blocked by:
default: denypolicy - Variant: corrupt sidecar to trigger
MALFORMED_SIDECARfallback
Path 5: Policy Weakening
- Gain filesystem access to policy file
- Change
default: denytodefault: allow - Or remove restrictive rules
- Blocked by: policy is unsigned (known limitation)
Path 6: Downgrade Attack
- Craft sidecar with
version: 0or unknown version - Hope client has lenient version handling
- Blocked by: unknown version =
MALFORMED_SIDECARhard failure
Path 7: TOCTOU Exploitation
- Pass verification with legitimate SKILL.md
- Swap file between verify and load
- Partially mitigated by: verify immediately before load
Goal: Impersonate a Trusted Signer
Path 1: GitHub Account Compromise
- Standard credential theft, phishing, session hijacking
- Mitigated by: GitHub's security model (2FA, etc.)
Path 2: OIDC Token Theft
- Intercept token between GitHub and Fulcio
- Short-lived, limited scope
- Mitigated by: TLS, token expiration
Path 3: Certificate Forgery
- Create certificate with arbitrary SAN
- Blocked by: must chain to Fulcio root
Path 4: Namespace Confusion
- Use case variations:
Anthropicvsanthropic - Use homoglyphs:
anthrop1cvsanthropic - Partially mitigated by: case-sensitive matching, ASCII-only skill_id
Temporal Attack Vectors
Expired Certificate Replay
- Sign with valid cert, replay after expiration
- Blocked by: SET proves signing was during cert validity
Backdated Signing
- Claim signing happened at an earlier time
- Blocked by: SET is issued by Rekor, not signer
Clock Skew Exploitation
- Signer's clock differs from Rekor's clock
timestampfield is signer's local clock (informational only)rekor_timestampis authoritative
Long-Lived Signature Staleness
- Valid signature from years ago still accepted
- Mitigated by:
max_age_dayspolicy
Review Methodology
Phase 1: Identify Assets
- Signed content (SKILL.md)
- Signer identity (certificate SAN)
- Trust policy (policy file)
- Transparency log entries
Phase 2: Identify Entry Points
- SKILL.md file parsing (canonical form)
- Sidecar YAML parsing
- Policy YAML parsing
- CLI arguments and flags
- Network (Fulcio, Rekor, TUF CDN)
Phase 3: Identify Threats (per entry point)
- What can an attacker control?
- What validation is missing?
- What assumptions are unstated?
Phase 4: Rate Severity
- Critical: Bypass verification entirely
- High: Forge identity or weaken policy
- Medium: Information disclosure, DoS, edge case exploits
- Low: Cosmetic issues, documentation gaps
Phase 5: Verify Mitigations
- Is each threat addressed in the spec?
- Is the mitigation in the signing spec or deferred to registry/tooling?
- Are deferred mitigations documented as known limitations?