Not in the top 1,000 by GitHub stars
ShieldNet-360/secure-vibe
SecureVibe — prevention-first security for AI-written code. Signed SKILL.md knowledge that makes AI coding assistants write secure code at generation time, plus a deterministic CI gate. Offline · keyless · Ed25519-signed. By ShieldNet360.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
dist/agent-skills/.agents/skills/api-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/auth-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/cicd-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/container-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/cors-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/crypto-misuse/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/database-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/deserialization-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/dynamic-verification/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/electron-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/error-handling-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/file-upload-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/frontend-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/graphql-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/iac-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/iam-best-practices/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/llm-app-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/logging-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/ml-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/mobile-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/protocol-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/saas-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/secret-detection/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/secure-code-review/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/security-regression-tests/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/serverless-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/ssrf-prevention/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/supply-chain-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/template-injection/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/threat-modeling/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/agent-skills/.agents/skills/websocket-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/api-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/auth-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/cicd-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/container-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/cors-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/crypto-misuse/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/database-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/deserialization-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/dynamic-verification/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/electron-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/error-handling-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/file-upload-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/frontend-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/graphql-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/iac-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/iam-best-practices/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/llm-app-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/logging-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/ml-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/mobile-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/protocol-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/saas-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/secret-detection/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/secure-code-review/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/security-regression-tests/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/serverless-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/ssrf-prevention/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/supply-chain-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/template-injection/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/threat-modeling/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
dist/claude-skills/.claude/skills/websocket-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/api-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/auth-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/cicd-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/container-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/cors-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/crypto-misuse/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/database-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/deserialization-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/dynamic-verification/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/electron-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/error-handling-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/file-upload-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/frontend-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/graphql-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/iac-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/iam-best-practices/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/llm-app-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/logging-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/ml-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/mobile-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/protocol-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/saas-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/secret-detection/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/secure-code-review/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/security-regression-tests/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/serverless-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/ssrf-prevention/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/supply-chain-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/template-injection/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/threat-modeling/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → eaba88102d91
No earlier version was observed for comparison.
skills/websocket-security/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
eaba88102d91 → eaba88102d91
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → eaba88102d91
No earlier version was observed for comparison.
Verified commit eaba88102d91df65a9aa6397e8507c315c018f5e
git clone --filter=blob:none --no-checkout https://github.com/ShieldNet-360/secure-vibe.git .hotskills/shieldnet-360-secure-vibe && git -C .hotskills/shieldnet-360-secure-vibe checkout --detach eaba88102d91df65a9aa6397e8507c315c018f5e
# Copy each selected skill directory from .hotskills/shieldnet-360-secure-vibe into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/ShieldNet-360/secure-vibe.git .hotskills/shieldnet-360-secure-vibe && git -C .hotskills/shieldnet-360-secure-vibe checkout --detach eaba88102d91df65a9aa6397e8507c315c018f5e
# Copy each selected skill directory from .hotskills/shieldnet-360-secure-vibe into .agents/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/ShieldNet-360/secure-vibe.git .hotskills/shieldnet-360-secure-vibe && git -C .hotskills/shieldnet-360-secure-vibe checkout --detach eaba88102d91df65a9aa6397e8507c315c018f5e
# Copy each selected skill directory from .hotskills/shieldnet-360-secure-vibe into .cursor/skills/<skill-name>/Heat
0.3- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- api-security
dist/agent-skills/.agents/skills/api-security - auth-security
dist/agent-skills/.agents/skills/auth-security - cicd-security
dist/agent-skills/.agents/skills/cicd-security - container-security
dist/agent-skills/.agents/skills/container-security - cors-security
dist/agent-skills/.agents/skills/cors-security - crypto-misuse
dist/agent-skills/.agents/skills/crypto-misuse - database-security
dist/agent-skills/.agents/skills/database-security - deserialization-security
dist/agent-skills/.agents/skills/deserialization-security - dynamic-verification
dist/agent-skills/.agents/skills/dynamic-verification - electron-security
dist/agent-skills/.agents/skills/electron-security - error-handling-security
dist/agent-skills/.agents/skills/error-handling-security - file-upload-security
dist/agent-skills/.agents/skills/file-upload-security - frontend-security
dist/agent-skills/.agents/skills/frontend-security - graphql-security
dist/agent-skills/.agents/skills/graphql-security - iac-security
dist/agent-skills/.agents/skills/iac-security - iam-best-practices
dist/agent-skills/.agents/skills/iam-best-practices - llm-app-security
dist/agent-skills/.agents/skills/llm-app-security - logging-security
dist/agent-skills/.agents/skills/logging-security - ml-security
dist/agent-skills/.agents/skills/ml-security - mobile-security
dist/agent-skills/.agents/skills/mobile-security - protocol-security
dist/agent-skills/.agents/skills/protocol-security - saas-security
dist/agent-skills/.agents/skills/saas-security - secret-detection
dist/agent-skills/.agents/skills/secret-detection - secure-code-review
dist/agent-skills/.agents/skills/secure-code-review - security-regression-tests
dist/agent-skills/.agents/skills/security-regression-tests - serverless-security
dist/agent-skills/.agents/skills/serverless-security - ssrf-prevention
dist/agent-skills/.agents/skills/ssrf-prevention - supply-chain-security
dist/agent-skills/.agents/skills/supply-chain-security - template-injection
dist/agent-skills/.agents/skills/template-injection - threat-modeling
dist/agent-skills/.agents/skills/threat-modeling - websocket-security
dist/agent-skills/.agents/skills/websocket-security - api-security
dist/claude-skills/.claude/skills/api-security - auth-security
dist/claude-skills/.claude/skills/auth-security - cicd-security
dist/claude-skills/.claude/skills/cicd-security - container-security
dist/claude-skills/.claude/skills/container-security - cors-security
dist/claude-skills/.claude/skills/cors-security - crypto-misuse
dist/claude-skills/.claude/skills/crypto-misuse - database-security
dist/claude-skills/.claude/skills/database-security - deserialization-security
dist/claude-skills/.claude/skills/deserialization-security - dynamic-verification
dist/claude-skills/.claude/skills/dynamic-verification - electron-security
dist/claude-skills/.claude/skills/electron-security - error-handling-security
dist/claude-skills/.claude/skills/error-handling-security - file-upload-security
dist/claude-skills/.claude/skills/file-upload-security - frontend-security
dist/claude-skills/.claude/skills/frontend-security - graphql-security
dist/claude-skills/.claude/skills/graphql-security - iac-security
dist/claude-skills/.claude/skills/iac-security - iam-best-practices
dist/claude-skills/.claude/skills/iam-best-practices - llm-app-security
dist/claude-skills/.claude/skills/llm-app-security - logging-security
dist/claude-skills/.claude/skills/logging-security - ml-security
dist/claude-skills/.claude/skills/ml-security - mobile-security
dist/claude-skills/.claude/skills/mobile-security - protocol-security
dist/claude-skills/.claude/skills/protocol-security - saas-security
dist/claude-skills/.claude/skills/saas-security - secret-detection
dist/claude-skills/.claude/skills/secret-detection - secure-code-review
dist/claude-skills/.claude/skills/secure-code-review - security-regression-tests
dist/claude-skills/.claude/skills/security-regression-tests - serverless-security
dist/claude-skills/.claude/skills/serverless-security - ssrf-prevention
dist/claude-skills/.claude/skills/ssrf-prevention - supply-chain-security
dist/claude-skills/.claude/skills/supply-chain-security - template-injection
dist/claude-skills/.claude/skills/template-injection - threat-modeling
dist/claude-skills/.claude/skills/threat-modeling - websocket-security
dist/claude-skills/.claude/skills/websocket-security - api-security
skills/api-security - auth-security
skills/auth-security - cicd-security
skills/cicd-security - container-security
skills/container-security - cors-security
skills/cors-security - crypto-misuse
skills/crypto-misuse - database-security
skills/database-security - deserialization-security
skills/deserialization-security - dynamic-verification
skills/dynamic-verification - electron-security
skills/electron-security - error-handling-security
skills/error-handling-security - file-upload-security
skills/file-upload-security - frontend-security
skills/frontend-security - graphql-security
skills/graphql-security - iac-security
skills/iac-security - iam-best-practices
skills/iam-best-practices - llm-app-security
skills/llm-app-security - logging-security
skills/logging-security - ml-security
skills/ml-security - mobile-security
skills/mobile-security - protocol-security
skills/protocol-security - saas-security
skills/saas-security - secret-detection
skills/secret-detection - secure-code-review
skills/secure-code-review - security-regression-tests
skills/security-regression-tests - serverless-security
skills/serverless-security - ssrf-prevention
skills/ssrf-prevention - supply-chain-security
skills/supply-chain-security - template-injection
skills/template-injection - threat-modeling
skills/threat-modeling - websocket-security
skills/websocket-security
How it works
api-security
When your agent uses it
OWASP API Top 10 for HTTP, GraphQL, and gRPC endpoints: input validation, route rate limiting, mass assignment, response caching, and gateway-versus-service control placement. Use when generating or reviewing HTTP handlers, GraphQL resolvers, gRPC service methods, or any API endpoint change.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
986 tokensWhen the skill is activated
Reference documents
522 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore4,615 bytesSKILL.mdcore4,615 bytesmetadata.jsonasset1,105 bytesreferences/verifying-findings.mddoc2,236 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/api-security/SKILL.md. -->
# API Security
OWASP API Top 10 for HTTP, GraphQL, and gRPC endpoints: input validation, route rate limiting, mass assignment, response caching, and gateway-versus-service control placement. Use when generating or reviewing HTTP handlers, GraphQL resolvers, gRPC service methods, or any API endpoint change.
## ALWAYS
- Require authentication on every non-public endpoint. Default to authenticated; opt out for genuinely public routes by explicit annotation.
- Consult `auth-security` for **who the caller is and what they may touch**. It owns the credential (algorithm pinning, expiry, lifetime, session, CSRF) and the permission (object-level BOLA/IDOR checks, multi-key routes, streaming subjects, function-level role gating). Any endpoint that reads or writes a resource by id needs it; this skill covers everything else about the endpoint.
- Validate all request inputs against an explicit schema (JSON Schema, Pydantic, Zod, validator/v10 struct tags). Reject early; never propagate untrusted input deeper.
- Enforce rate limits at the route level for authentication endpoints, password reset, and any expensive operation.
- Consult `error-handling-security` for what an error response may carry. It owns the boundary between what crosses to the client and what stays in the log, including presence-of-record disclosure (`User not found` vs `Invalid credentials`).View the complete source on GitHubauth-security
When your agent uses it
[Credential-related source omitted]
What it loads into context
Frontmatter
105 tokensAlways available to the agent
SKILL.md
1,480 tokensWhen the skill is activated
Reference documents
1,062 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,779 bytesSKILL.mdcore6,779 bytesmetadata.jsonasset1,565 bytesreferences/verifying-findings.mddoc4,338 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/auth-security/SKILL.md. -->
# Authentication & Authorization Security
[Credential-related source omitted]
## ALWAYS
- Authorize at the **object level** — confirm the authenticated subject actually has access to the requested resource ID, not just that they are logged in. Being signed in is not permission to read record 4,182 (OWASP API1 — BOLA / IDOR).
- Bind object-level authorization to the **authenticated principal**, never to an actor id echoed in the request: checking that a request-supplied `senderId`/`ownerId`/`actedBy` is a valid member validates the *claimed* actor, not the caller (looks like authorization, isn't).
- On `/{scopeId}/.../{subjectId}` routes, authorize the **relationship** — confirm the subject belongs to that scope. A caller-vs-scope check alone does not authorize the subject (multi-key BOLA).
- Authorize **each subject on streaming responses** (SSE/chunked/WebSocket): the `200` is committed before the handler runs, so an empty/filtered stream — not a `4xx` — is the deny signal; an unauthorized subject gets zero events.
- Enforce a **function-level role / privilege check** on any write that publishes into a shared or global namespace (a global gallery, shared catalog, public template list). Authentication is not authorization (OWASP API5 — Broken Function Level Authorization); a low-privilege user posting into a globally-visible store is a delivery vector for stored-XSS and malicious-link chains.View the complete source on GitHubcicd-security
When your agent uses it
Harden GitHub Actions, GitLab CI, and similar pipelines against supply-chain attacks, secret exfiltration, and pwn-request abuse. Use when authoring or reviewing workflow files, adding a third-party action, image, or script, wiring cloud or registry credentials into CI, or triaging a suspected pipeline compromise.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
1,299 tokensWhen the skill is activated
Reference documents
927 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,751 bytesSKILL.mdcore5,751 bytesSKILL.mdcore5,751 bytesSKILL.mdcore5,751 bytesmetadata.jsonasset1,314 bytesreferences/verifying-findings.mddoc3,879 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/cicd-security/SKILL.md. -->
# CI/CD Pipeline Security
Harden GitHub Actions, GitLab CI, and similar pipelines against supply-chain attacks, secret exfiltration, and pwn-request abuse. Use when authoring or reviewing workflow files, adding a third-party action, image, or script, wiring cloud or registry credentials into CI, or triaging a suspected pipeline compromise.
## ALWAYS
- Pin every third-party GitHub Action by **commit SHA** (full 40-char), never by a floating tag (`@v1`, `@main`, `@latest`) — tags can be re-pushed. The tj-actions/changed-files March 2025 incident exfiltrated secrets from 23,000+ repositories specifically because consumers used floating tags. Same applies to GitLab CI `include:` references and reusable workflows. Renovate / Dependabot can keep the SHA pins fresh.
[Credential-related source omitted]
[Credential-related source omitted]
- Treat `pull_request_target`, `workflow_run`, and any `pull_request` job that uses `actions/checkout` with `ref: ${{ github.event.pull_request.head.ref }}` as **trusted-context-on-untrusted-code** — the "pwn request" pattern documented by GitHub Security Lab. Either don't run them, or run with no secrets and no write tokens. A fork's GitLab merge-request pipeline is the same shape — it runs the fork's own `.gitlab-ci.yml` on your runners: isolate them, expose no protected variables.
- Echo every untrusted expression (`${{ github.event.* }}`) through an environment variable first; never interpolate it directly into `run:` body — that's the canonical GitHub Actions script-injection sink. The GitLab sink has the same shape: `$CI_*` / `$TRIGGER_*` interpolated into `bash -c` or `eval`, where merge-request metadata carries the shell metacharacters.View the complete source on GitHubcontainer-security
When your agent uses it
Hardening for Dockerfiles, OCI images, Kubernetes manifests, and Helm charts. Use when generating a Dockerfile or image build, writing Kubernetes, Helm, or Kustomize manifests, or reviewing container changes in a pull request.
What it loads into context
Frontmatter
54 tokensAlways available to the agent
SKILL.md
2,380 tokensWhen the skill is activated
Reference documents
1,397 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore10,216 bytesSKILL.mdcore10,216 bytesSKILL.mdcore10,216 bytesSKILL.mdcore10,216 bytesmetadata.jsonasset1,062 bytesreferences/eol-base-images.mddoc1,644 bytesreferences/verifying-findings.mddoc3,962 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/container-security/SKILL.md. -->
# Container Security
Hardening for Dockerfiles, OCI images, Kubernetes manifests, and Helm charts. Use when generating a Dockerfile or image build, writing Kubernetes, Helm, or Kustomize manifests, or reviewing container changes in a pull request.
## ALWAYS
- Use **multi-stage builds**: separate builder/test stages from the final runtime image so build toolchains and source aren't shipped. The last stage should be a minimal base — `gcr.io/distroless/<variant>`, `scratch`, or a versioned `-slim` / `-alpine` variant — pinned by SHA256 digest, not just tag. Two bases have nothing to pin: `scratch`, and a reference to an earlier stage in the same file (`FROM base`), which is pinned on that stage's own `FROM` line.
- Run as a non-root user: set `USER` explicitly on the **final stage**, as a **number** not a name. Omitting it leaves the container running as root. K8s `runAsNonRoot` rejects UID 0 and cannot resolve a username, so `USER appuser` fails at startup with "image has non-numeric user"; any non-zero UID passes, and 10000+ by convention also avoids colliding with host accounts.
- Use **`npm ci`** (and equivalents `pnpm install --frozen-lockfile`, `yarn install --frozen-lockfile`) in container builds, not `npm install`. `npm install` mutates the lockfile and resolves versions per-build, producing non-deterministic images that drift from the lockfile.
- Add a `.dockerignore` excluding `.git`, `node_modules`, `.env`, `*.pem`, `*.key`, `target/`, `.terraform/`, `dist/`, `coverage/`.
- Build with **BuildKit** (default since Docker Engine 23; `DOCKER_BUILDKIT=1` on older engines) so `RUN --mount=type=secret,id=<name>` is available for build-time credentials. `# syntax=docker/dockerfile:1` selects the frontend and does **not** enable BuildKit by itself.View the complete source on GitHubcors-security
When your agent uses it
Strict CORS: no wildcard with credentials, exact-match origin allowlists, sane preflight cache, minimal exposed headers. Use when generating CORS middleware or framework config, setting CORS headers in API Gateway, CloudFront, or Nginx, or reviewing a cross-origin browser-facing endpoint.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
1,079 tokensWhen the skill is activated
Reference documents
871 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,055 bytesSKILL.mdcore5,055 bytesmetadata.jsonasset1,040 bytesreferences/verifying-findings.mddoc3,778 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/cors-security/SKILL.md. -->
# CORS Security
Strict CORS: no wildcard with credentials, exact-match origin allowlists, sane preflight cache, minimal exposed headers. Use when generating CORS middleware or framework config, setting CORS headers in API Gateway, CloudFront, or Nginx, or reviewing a cross-origin browser-facing endpoint.
## ALWAYS
- For any non-public endpoint, allow origins from an explicit allowlist. `*` is correct only when the resource is intentionally public *and* cross-origin access never carries credentials.
- When a cross-origin request carries credentials — the browser's credentials mode is `include`, meaning cookies, TLS client certificates, or browser-managed HTTP auth — respond with `Access-Control-Allow-Credentials: true` and a **single explicit origin**. On a credentialed request every CORS header loses its wildcard meaning: `*` in `Allow-Origin`, `Allow-Methods`, `Allow-Headers`, or `Expose-Headers` is read as the literal string `"*"` and the browser blocks the response. That is why "just set it to `*` for now" fails in a way that is hard to debug.
- Compare origins by exact match on the **serialized** origin — scheme, host, and port, all three. Never substring, prefix, or suffix matching: `endsWith("example.com")` accepts `https://example.com.evil.com`, and an unescaped `.` in `^https://api.example.com$` accepts `https://apiXexample.com`.
- Include `Vary: Origin` on any response whose headers depend on the request `Origin`, so a shared cache cannot hand one origin's `Access-Control-Allow-Origin` to another.
[Credential-related source omitted]View the complete source on GitHubcrypto-misuse
When your agent uses it
Block weak ciphers, predictable RNG, undersized keys, fast-hash password storage, nonce reuse, and non-constant-time comparison. Use when generating code that hashes, encrypts, or signs, code that compares secrets, MACs, or tokens, or config for key sizes and randomness.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
1,603 tokensWhen the skill is activated
Reference documents
1,110 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,168 bytesSKILL.mdcore7,168 bytesmetadata.jsonasset1,113 bytesreferences/verifying-findings.mddoc4,833 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/crypto-misuse/SKILL.md. -->
# Cryptographic Misuse
Block weak ciphers, predictable RNG, undersized keys, fast-hash password storage, nonce reuse, and non-constant-time comparison. Use when generating code that hashes, encrypts, or signs, code that compares secrets, MACs, or tokens, or config for key sizes and randomness.
## ALWAYS
- Use a maintained, widely reviewed cryptographic API — the platform's own (Node `crypto`, Java JCE, .NET `System.Security.Cryptography`, Go `crypto/*`) or a reputable third-party one (PyCA `cryptography`, `golang.org/x/crypto`, Bouncy Castle). Prefer high-level, misuse-resistant APIs over assembling low-level primitives yourself. In Python, `from Crypto…` resolves to either the abandoned `pycrypto` or its maintained fork `pycryptodome` depending on what is installed — the import line is identical, so depend on `pycryptodome` explicitly.
- Use a cryptographically secure RNG for anything security-relevant: Python `secrets.token_bytes` / `secrets.token_urlsafe`, JS `crypto.getRandomValues` / `crypto.randomBytes`, Go `crypto/rand.Read`, Java `SecureRandom`.
- Hash passwords with a password-specific KDF and a unique random salt per password. Prefer Argon2id; scrypt where appropriate; bcrypt for legacy compatibility; PBKDF2-HMAC-SHA-256 where FIPS-140 compliance is required. Take minimum parameters from the current [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html), then benchmark on production hardware and choose the highest cost that still meets the application's authentication latency and availability budget. The cost is meant to be raised over time as hardware gets cheaper — it is not a constant to copy once.
- Account for bcrypt's 72-byte input limit: it silently truncates, so a long passphrase and its 72-byte prefix hash identically. If bcrypt must take unbounded input, pre-hash with SHA-256 and pass the digest **base64-encoded**, never as raw bytes — a raw digest can contain a NUL byte, which truncates the input again.
- Encrypt with a vetted AEAD: AES-GCM or ChaCha20-Poly1305, or AES-GCM-SIV where nonce-misuse resistance is specifically useful and the platform ships a reviewed implementation. Absent a stated key-size requirement, AES-256-GCM or ChaCha20-Poly1305 is a safe default — AES-128-GCM is not a finding.View the complete source on GitHubdatabase-security
When your agent uses it
Prevent SQL and NoSQL injection, unsafe ORM and raw-query use, over-privileged database identities, weak tenant isolation, and unauthenticated database transport. Use when generating SQL or raw query strings, NoSQL filters, ORM models or queries, database migration files, or connection strings.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
1,349 tokensWhen the skill is activated
Reference documents
1,775 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,783 bytesSKILL.mdcore6,783 bytesmetadata.jsonasset1,427 bytesreferences/orm-safe-query-examples.mddoc4,806 bytesreferences/verifying-findings.mddoc2,331 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/database-security/SKILL.md. -->
# Database Security
Prevent SQL and NoSQL injection, unsafe ORM and raw-query use, over-privileged database identities, weak tenant isolation, and unauthenticated database transport. Use when generating SQL or raw query strings, NoSQL filters, ORM models or queries, database migration files, or connection strings.
## ALWAYS
- Bind every untrusted data value through the driver or ORM parameter API. Never place it into SQL with language-level interpolation or concatenation — `+`, f-strings, `%` formatting, `.format()`, JavaScript template interpolation. Driver placeholders (`%s`, `?`, `$1`, `:name`, `@name`) are the binding *mechanism*, not string formatting; confusing the two is how this rule is most often misread. The same applies to values read back out of the database and used to build a later query: stored input is still input, and second-order injection is this bug with a delay.
- Prefer the ORM's structured query-expression API over textual SQL. Where raw SQL is genuinely needed, use that framework's documented parameter-binding mechanism and never interpolate untrusted values into it. `references/orm-safe-query-examples.md` carries the verified form per framework.
- For SQL structure that cannot be a bind parameter — table and column identifiers, sort direction, sometimes the operator itself — map the external value to a fixed operator-controlled allowlist. Never copy an untrusted identifier or SQL fragment into the statement, escaped or not.
- Treat a NoSQL query as a structure, not a string. Build filters with the driver's typed query objects, and coerce every request-supplied value to its expected scalar type before it reaches a filter. A JSON body substituting `{"$ne": null}` where a string was expected turns an equality check into a match-all — operator injection needs no quote to break out of.
- Give each application its own database identity with the minimum grants it needs, and separate runtime privileges from migration privileges. The runtime identity must not receive schema-owner or DDL rights merely because migrations require them.View the complete source on GitHubdeserialization-security
When your agent uses it
Block unsafe deserialization and unsafe XML parsing in Java, Python, .NET, PHP, and Ruby: gadget chains, unrestricted type resolution, external entity expansion, and safer formats. Use when parsing or deserializing data from an untrusted source, wiring cookies, sessions, queues, or RPC payloads, or reviewing pickle, unserialize, Marshal, ObjectInputStream, BinaryFormatter, or XML parser configuration.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
910 tokensWhen the skill is activated
Reference documents
4,121 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore4,602 bytesSKILL.mdcore4,602 bytesmetadata.jsonasset1,450 bytesreferences/dotnet.mddoc1,945 bytesreferences/java.mddoc3,581 bytesreferences/php-ruby.mddoc2,481 bytesreferences/python.mddoc2,670 bytesreferences/verifying-findings.mddoc3,764 bytesreferences/xml.mddoc3,409 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/deserialization-security/SKILL.md. -->
# Deserialization Security
Block unsafe deserialization and unsafe XML parsing in Java, Python, .NET, PHP, and Ruby: gadget chains, unrestricted type resolution, external entity expansion, and safer formats. Use when parsing or deserializing data from an untrusted source, wiring cookies, sessions, queues, or RPC payloads, or reviewing pickle, unserialize, Marshal, ObjectInputStream, BinaryFormatter, or XML parser configuration.
## ALWAYS
- Prefer data-only serialization formats — JSON, Protobuf, MessagePack with an explicit type map — over formats that reconstruct arbitrary runtime objects. What makes a format safe here is not schema validation; it is whether the parser can instantiate a class the payload names.
- Constrain polymorphic type resolution to an explicit set of expected application types. Never let payload data choose the runtime class — that is the mechanism behind every gadget chain, whichever serializer is involved.
- Treat an object-reconstructing deserializer crossing a trust boundary as high risk: `pickle`, `ObjectInputStream`, `BinaryFormatter`, `unserialize`, `Marshal.load` and their framework equivalents. Adding one to a request-handling path needs explicit review — check the platform reference for the exact API and the version behaviour before accepting or remediating a use.
- Disable external entity resolution and DTD processing on every XML parser that receives untrusted input. A parser that resolves entities is a file-read and server-side request primitive before it is a parser; `ssrf-prevention` owns where the outbound request lands.
- Where serialized state carries a signature or MAC, verify it **before** invoking the deserializer — and treat that as defense in depth, not a licence to keep an unsafe format. `crypto-misuse` owns the signing key, its algorithm and its rotation.View the complete source on GitHubdynamic-verification
When your agent uses it
Confirm or refute a vulnerability candidate against a live target with a deterministic probe, respecting authorization and scope. Use when a SAST or LLM review flags a possible injection or SSRF, when triaging a finding before filing a bug or shipping a fix, or when a verification result turns out wrong.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
1,137 tokensWhen the skill is activated
Reference documents
1,141 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,076 bytesSKILL.mdcore5,076 bytesmetadata.jsonasset1,191 bytesreferences/oracles-by-class.mddoc4,524 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/dynamic-verification/SKILL.md. -->
# Verify Findings
Confirm or refute a vulnerability candidate against a live target with a deterministic probe, respecting authorization and scope. Use when a SAST or LLM review flags a possible injection or SSRF, when triaging a finding before filing a bug or shipping a fix, or when a verification result turns out wrong.
## ALWAYS
- Treat a static-analysis or LLM-review hit as a *candidate*, not a vulnerability, until a probe with a deterministic oracle confirms it against a live target.
- Prefer an oracle that proves server-side behaviour over one that inspects the response text: out-of-band callbacks (SSRF, blind command injection, XXE) and timing deltas (blind SQLi, command injection) catch *blind* bugs that leave no trace in the body.
- Re-confirm any timing-based result a second time before trusting it — one slow response is noise, a repeatable delay over baseline is signal.
- For reflected oracles (XSS, SSTI), require the dangerous form: XSS confirms only when the payload comes back UNESCAPED; SSTI confirms only when the arithmetic is EVALUATED (the product appears as a standalone number and the raw expression does not).
- Pin file-read oracles (path traversal) to a content signature of a known system file (`root:…:0:0:` from `/etc/passwd`, `[fonts]` from `win.ini`), never to a generic 200/404.View the complete source on GitHubelectron-security
When your agent uses it
Harden Electron: renderer trust boundary (nodeIntegration, contextIsolation, sandbox), build-time fuses, contextBridge and IPC allowlists, shell.openExternal, navigation guards, deep-link auth, safeStorage. Use when generating main-process code, a preload script, or custom-protocol handlers, when packaging a release, or when storing tokens in an Electron app.
What it loads into context
Frontmatter
81 tokensAlways available to the agent
SKILL.md
1,735 tokensWhen the skill is activated
Reference documents
2,117 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,910 bytesSKILL.mdcore7,910 bytesmetadata.jsonasset1,521 bytesreferences/electron-hardening.mddoc4,627 bytesreferences/verifying-findings.mddoc4,345 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/electron-security/SKILL.md. -->
# Electron Desktop Security
Harden Electron: renderer trust boundary (nodeIntegration, contextIsolation, sandbox), build-time fuses, contextBridge and IPC allowlists, shell.openExternal, navigation guards, deep-link auth, safeStorage. Use when generating main-process code, a preload script, or custom-protocol handlers, when packaging a release, or when storing tokens in an Electron app.
## ALWAYS
- **Treat the renderer as untrusted.** Any renderer-side code execution — XSS in rendered content, a redirect, a deep link — must not be able to reach Node, the shell, the filesystem, or session tokens. Every other rule here follows from this one, and every IPC sink you expose is reachable from a compromised renderer.
- Keep the renderer's process isolation at its defaults rather than restoring them: `nodeIntegration: false`, `contextIsolation: true` and `sandbox: true` have been Electron's defaults for several major versions, so the finding is the line that **turns one off**. Note the coupling: under `sandbox: true` a preload gets a polyfilled module subset, so a preload needing `fs` fails — move that work behind IPC into the main process, never drop the sandbox.
- Set the packaging **fuses** on release builds: disable `RunAsNode`, `EnableNodeCliInspectArguments` and `EnableNodeOptionsEnvironmentVariable`. With `RunAsNode` on, an attacker runs your signed binary as a plain Node process and every renderer-side control above becomes irrelevant — a build-time setting no runtime hardening substitutes for.
- Expose a **minimal, typed** API from the preload via `contextBridge.exposeInMainWorld`. Expose named functions only — never hand the renderer `ipcRenderer`, `require`, `process`, or whole modules. Do not add `@electron/remote`: it restores the main-process object access that was removed from core precisely because it defeats the boundary.
- Validate **every** IPC argument in the main-process handler: type-check, bound, and allowlist. The renderer is an attacker-controlled input source.View the complete source on GitHuberror-handling-security
When your agent uses it
Decide what an error tells the client and what stays server-side: no stack traces, SQL, or paths in responses, no silent suppression, and no distinction between outcomes that would reveal protected state. Use when generating HTTP, GraphQL, or RPC error handlers, exception, panic, or rescue blocks, or configuring production error pages.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
906 tokensWhen the skill is activated
Reference documents
1,588 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore4,505 bytesSKILL.mdcore4,505 bytesmetadata.jsonasset1,214 bytesreferences/framework-error-pages.mddoc3,863 bytesreferences/verifying-findings.mddoc3,206 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/error-handling-security/SKILL.md. -->
# Error-Handling Security
Decide what an error tells the client and what stays server-side: no stack traces, SQL, or paths in responses, no silent suppression, and no distinction between outcomes that would reveal protected state. Use when generating HTTP, GraphQL, or RPC error handlers, exception, panic, or rescue blocks, or configuring production error pages.
## ALWAYS
- Catch exceptions at the boundary — HTTP handler, RPC method, message consumer — and decide *there* what crosses to the client and what stays server-side. Record the failure with a correlation ID under `logging-security`'s policy; do not bypass its redaction rules to attach "full context", which is how request bodies, cookies and tokens end up in logs.
- Put only client-actionable information in an external error: a stable error code, a short human-readable message, and the correlation ID. Anything the caller cannot act on belongs in the log entry that shares that ID.
- Keep responses **consistent within an error class**, and make security-equivalent outcomes externally indistinguishable. Different classes may and should differ — `400 VALIDATION_FAILED`, `401`, `403`, `409`, `429` are not a finding. What must not differ is a pair of outcomes whose distinction reveals protected state: whether an account exists, whether a record the caller may not see is present. `auth-security` owns making the login paths cost the same; this rule owns what they return.
- Disable developer error pages and detailed exception rendering in every non-development environment, and route unhandled errors through the framework's production error handler. This is a wiring decision, not the same thing as an environment variable reading `production` — the setting and its name differ per framework, and `references/framework-error-pages.md` has them.
- Render every external error through one helper, so the sanitization rules live in a single place instead of being re-derived at each handler.View the complete source on GitHubfile-upload-security
When your agent uses it
Accept, store, process, and serve user uploads safely: type-appropriate content validation, decompression limits, generated storage keys, quarantine before publication, isolated media processing, and scoped direct-to-storage credentials. Use when generating a file-upload endpoint, wiring presigned or SAS uploads to S3, GCS, or Azure Blob, processing user-supplied images or documents, or serving user-generated content.
What it loads into context
Frontmatter
90 tokensAlways available to the agent
SKILL.md
1,367 tokensWhen the skill is activated
Reference documents
2,545 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,535 bytesSKILL.mdcore6,535 bytesmetadata.jsonasset1,423 bytesreferences/direct-upload.mddoc3,112 bytesreferences/format-handling.mddoc4,597 bytesreferences/verifying-findings.mddoc3,517 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/file-upload-security/SKILL.md. -->
# File Upload Security
Accept, store, process, and serve user uploads safely: type-appropriate content validation, decompression limits, generated storage keys, quarantine before publication, isolated media processing, and scoped direct-to-storage credentials. Use when generating a file-upload endpoint, wiring presigned or SAS uploads to S3, GCS, or Azure Blob, processing user-supplied images or documents, or serving user-generated content.
## ALWAYS
- Put every new upload in a **non-public quarantine** location, and do not expose it, link it, index it, or hand it to a downstream workflow until validation has succeeded. Quarantine → validate → process → publish, in that order. This is the invariant the rest of these rules hang from, and the one direct-to-storage uploads most often skip.
- Validate content **server-side with checks appropriate to the format**. Where a format has a reliable signature, verify it; for container and document formats — DOCX, XLSX and ZIP are all ZIP at the container level — also validate structure against the format you expect. Text-based formats such as SVG and CSV have no signature to check at all, so a signature check alone is not a content policy. The client's `Content-Type` and the filename are attacker-controlled and are never the check.
- Keep a **per-endpoint allowlist** of accepted types and deny everything else. Deny `image/svg+xml` by default: an SVG is a document that can carry script. Where an endpoint genuinely requires SVG, treat it as active content — rasterize it, or run a maintained **SVG-aware** sanitizer with an explicit element, attribute, URL and CSS allowlist. A generic HTML sanitizer is the wrong tool for it.
- Bound the **expansion**, not only the upload. For archives and compressed or container formats, cap expanded bytes, entry count, nesting depth, compression ratio, per-entry size and processing time, and reject before extracting when the projected expansion exceeds policy. A limit on the compressed bytes says nothing about what they become (CWE-409).
- Store under an **application-generated identifier** — a UUID or content hash — outside the executable or web document root, and never build the storage path from the user-supplied name. Keep the original filename as bounded metadata only, and encode it for the specific output context where it is displayed. There is no "escaped at rest" that is safe in every context.View the complete source on GitHubfrontend-security
When your agent uses it
Browser-side hardening: XSS and safe text binding, per-sink URL policy, DOM clobbering, nonce-based CSP, Trusted Types, subresource integrity, iframe capability minimization, postMessage validation, and where client state may live. Use when generating HTML, JSX, Vue, or Svelte templates, setting response headers in a web app, embedding third-party scripts or frames, or storing anything client-side.
What it loads into context
Frontmatter
94 tokensAlways available to the agent
SKILL.md
1,637 tokensWhen the skill is activated
Reference documents
2,268 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,513 bytesSKILL.mdcore7,513 bytesSKILL.mdcore7,513 bytesmetadata.jsonasset1,545 bytesreferences/browser-controls.mddoc6,071 bytesreferences/verifying-findings.mddoc3,363 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/frontend-security/SKILL.md. -->
# Frontend Security
Browser-side hardening: XSS and safe text binding, per-sink URL policy, DOM clobbering, nonce-based CSP, Trusted Types, subresource integrity, iframe capability minimization, postMessage validation, and where client state may live. Use when generating HTML, JSX, Vue, or Svelte templates, setting response headers in a web app, embedding third-party scripts or frames, or storing anything client-side.
## ALWAYS
- Render untrusted data through the framework's ordinary text interpolation, which escapes for the output context. Do not reach for a raw-HTML API merely to display user data. Where rich HTML genuinely must be rendered, put it through a maintained sanitizer (DOMPurify) with an explicit allowlist first.
- Validate URL-bearing attributes **per sink**, not against one global scheme list. A navigation target (`href`, `action`, `formaction`, an `<iframe src>`) and an image source do not share a trust model: `javascript:` is never acceptable anywhere, while a narrowly constrained `data:image/…` or `blob:` may be exactly what an image sink requires. Decide the permitted schemes for each sink and check against that list.
- Read security-sensitive configuration and control-flow values from lexical variables or an object you own — never from a named `window` / `document` property (`window.config`, `document.redirectTo`, an implicit global). The browser exposes elements by `id` and `name` as named properties, so injected markup can shadow the value your code expected. An explicit `getElementById()` lookup is not the problem; trusting an ambient global is. Type-check what you read before using it in a privileged way.
- Build the `Content-Security-Policy` around a **nonce or hash as the trust root**: `script-src 'nonce-{value}' 'strict-dynamic'; object-src 'none'; base-uri 'none'`. Keeping `'self'` beside the nonce means every same-origin script is still trusted — that is a host-allowlist policy wearing a nonce, which may be the right trade-off but is not a strict CSP, so do not call it one. Generate the nonce from a CSPRNG afresh for **every HTML response**, and apply it only to scripts the server itself authorizes.
- Where you deploy Trusted Types, enforce `require-trusted-types-for 'script'` **and** restrict which policies may exist with the `trusted-types` directive. The first makes DOM sinks demand a typed value; without the second, any code can mint a pass-through policy (`createHTML: s => s`) and the guarantee is gone. Keep policies few, named, and centrally reviewed.View the complete source on GitHubgraphql-security
When your agent uses it
Bound and control a GraphQL endpoint: operation cost budgets, cost-based rate limiting, pre-registered operations, alias and batch abuse on authentication paths, introspection, cache keying, and untyped scalar inputs. Use when generating schemas, resolvers, or server config, wiring limits or persisted operations, or reviewing a public /graphql endpoint.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
1,192 tokensWhen the skill is activated
Reference documents
1,878 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,857 bytesSKILL.mdcore5,857 bytesmetadata.jsonasset1,373 bytesreferences/graphql-limits.mddoc4,810 bytesreferences/verifying-findings.mddoc3,332 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/graphql-security/SKILL.md. -->
# GraphQL Security
Bound and control a GraphQL endpoint: operation cost budgets, cost-based rate limiting, pre-registered operations, alias and batch abuse on authentication paths, introspection, cache keying, and untyped scalar inputs. Use when generating schemas, resolvers, or server config, wiring limits or persisted operations, or reviewing a public /graphql endpoint.
## ALWAYS
- Enforce a **cost budget** on every operation: a maximum depth, plus a complexity score that weights list fields by the page size they can request. Derive the numbers from your own schema and measure them — a depth of 7 is generous for a flat schema and far too permissive for one with a many-to-many edge, where five levels of nesting can address billions of nodes. `references/graphql-limits.md` covers how to derive them and where each server configures them.
- Rate-limit by **cost consumed**, not by request count. Every operation arrives at the same URL, so the per-route limit `api-security` specifies cannot tell a trivial query from one costing a thousand times more. Charge the complexity score against the caller's budget.
- For a public or high-traffic API, restrict it to **pre-registered operations** — a build-time allowlist of the documents the client bundle actually contains, keyed by hash. Automatic Persisted Queries are **not** this: APQ lets a client register any operation it likes and then send its hash, which is a bandwidth optimization. Turning on APQ and believing the API is now allowlisted is a common and expensive mistake.
- Cap aliases per operation and operations per batch, and apply that counting to **authentication and other rate-limited paths**. One request carrying a hundred aliased `login` fields is a hundred attempts against any counter that increments once per request — this is the mechanism behind the account-takeover-by-batching incidents, not a bandwidth concern.
- Batch resolver fetches with a DataLoader or a join. An N+1 resolver turns one cheap-looking query into a database round trip per parent row — the same amplification the cost limit exists to bound, except it happens below the cost analysis where that limit cannot see it.View the complete source on GitHubiac-security
When your agent uses it
Terraform, CloudFormation, and Pulumi hardening: state as a secret store, pinned providers and modules, encryption and network defaults, drift, and the privilege of the pipeline that applies the plan. Use when generating infrastructure code, reviewing IaC changes in a pull request, configuring a state backend, or setting up a new cloud account or workspace.
What it loads into context
Frontmatter
79 tokensAlways available to the agent
SKILL.md
1,128 tokensWhen the skill is activated
Reference documents
1,918 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,312 bytesSKILL.mdcore5,312 bytesSKILL.mdcore5,312 bytesSKILL.mdcore5,312 bytesSKILL.mdcore5,312 bytesSKILL.mdcore5,312 bytesmetadata.jsonasset1,299 bytesreferences/backends-and-state.mddoc4,291 bytesreferences/verifying-findings.mddoc3,440 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/iac-security/SKILL.md. -->
# Infrastructure-as-Code Security
Terraform, CloudFormation, and Pulumi hardening: state as a secret store, pinned providers and modules, encryption and network defaults, drift, and the privilege of the pipeline that applies the plan. Use when generating infrastructure code, reviewing IaC changes in a pull request, configuring a state backend, or setting up a new cloud account or workspace.
## ALWAYS
- Treat the **state file as a secret store**. Every value that passes through Terraform — a generated password, an RDS master credential, a private key, the contents of a data source — is written to state in plaintext. `sensitive = true` only hides a value from CLI output; it changes nothing about what is stored. So read access to the backend is read access to those secrets, and the backend's access policy has to be written on that basis.
- Configure a **remote backend** with encryption at rest, state locking, and versioning. Prefer the backend's own locking where it exists — recent Terraform supports S3-native locking, so a separate DynamoDB lock table is no longer required for new stacks. `references/backends-and-state.md` has the per-backend form.
- Pin providers and modules to an exact version or a pessimistic constraint (`~> 5.42`), and pin a third-party module sourced from a git URL to a **commit SHA**, not a branch or tag. A module is code that runs with your apply credentials, and a registry or repository you do not control is a supply-chain input like any other.
- Give the **apply identity** the least privilege that the stack actually needs, and keep it separate from the plan identity. A pipeline role with account-wide admin turns any CI compromise into a full account compromise — `cicd-security` owns hardening the pipeline itself, `iam-best-practices` owns the role's shape.
- Encrypt persistent resources by default with a customer-managed key: object storage, block storage, managed databases, queues, log groups. Prefer a module or default that applies it, so a new resource is encrypted because of how the code is organised rather than because someone remembered.View the complete source on GitHubiam-best-practices
When your agent uses it
Least-privilege cloud IAM: policy scope, privilege-escalation paths, permissions boundaries, workload identity over static keys, MFA enforced by policy, cross-account trust, and separating deploy from runtime. Use when generating IAM policies, roles, or trust documents, wiring CI/CD service accounts or workload identities, delegating role creation, or designing cross-account access.
What it loads into context
Frontmatter
83 tokensAlways available to the agent
SKILL.md
1,387 tokensWhen the skill is activated
Reference documents
1,903 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,699 bytesSKILL.mdcore6,699 bytesmetadata.jsonasset1,480 bytesreferences/escalation-paths.mddoc4,769 bytesreferences/verifying-findings.mddoc3,174 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/iam-best-practices/SKILL.md. -->
# Identity & Access Management Best Practices
Least-privilege cloud IAM: policy scope, privilege-escalation paths, permissions boundaries, workload identity over static keys, MFA enforced by policy, cross-account trust, and separating deploy from runtime. Use when generating IAM policies, roles, or trust documents, wiring CI/CD service accounts or workload identities, delegating role creation, or designing cross-account access.
## ALWAYS
- Grant the minimum permissions the workload's stated job requires: deny by default, then add concrete actions against concrete resources. A wildcard action on a wildcard resource — in a custom policy, in `AdministratorAccess`, or in `iam:*` attached to something that runs continuously — is the same finding wearing three different names.
- Read a policy for the **privileges it can reach**, not only the ones it names. A principal that can write policy (`iam:PutRolePolicy`, `iam:AttachRolePolicy`, `iam:CreatePolicyVersion`) can grant itself anything, and a principal that can pass a role into a compute service it may also create (`iam:PassRole` with `lambda:CreateFunction`, `ec2:RunInstances`, `glue:CreateJob`) inherits that role's privileges. These read as narrow grants and are administrative ones. `references/escalation-paths.md` lists the combinations worth failing a review over.
- Bound delegated permissions with a **permissions boundary** or an organization-level policy (SCP, GCP org policy, Azure management-group policy) when teams may create their own roles. The boundary caps what any role they create can do, which is what makes self-service role creation safe rather than a privilege-escalation primitive.
- Prefer **workload identity** — IRSA on EKS, GKE Workload Identity, Azure Managed Identity, OIDC federation from CI — over a static key. The goal is that no long-lived credential exists to leak. Where one is genuinely unavoidable, give it a documented rotation cadence and automatic disablement on inactivity, and treat that as a temporary state rather than the steady state.
- Enforce MFA for human principals through a **policy condition** (`aws:MultiFactorAuthPresent`), not only a directory setting, so a credential that bypasses the directory still cannot act.View the complete source on GitHubllm-app-security
When your agent uses it
Securing a feature that calls an LLM: prompt injection as an unsolved input problem, bounding what model output is allowed to reach, tool authorization against the human rather than the model, approval gates on consequential actions, RAG context provenance, system-prompt leakage, and cost limits. Use when sending prompts to an LLM API, building a RAG pipeline, giving a model tools, rendering or executing model output, or exposing an LLM-backed endpoint.
What it loads into context
Frontmatter
103 tokensAlways available to the agent
SKILL.md
1,350 tokensWhen the skill is activated
Reference documents
775 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,670 bytesSKILL.mdcore6,670 bytesmetadata.jsonasset1,559 bytesreferences/verifying-findings.mddoc3,520 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/llm-app-security/SKILL.md. -->
# LLM Application Security
Securing a feature that calls an LLM: prompt injection as an unsolved input problem, bounding what model output is allowed to reach, tool authorization against the human rather than the model, approval gates on consequential actions, RAG context provenance, system-prompt leakage, and cost limits. Use when sending prompts to an LLM API, building a RAG pipeline, giving a model tools, rendering or executing model output, or exposing an LLM-backed endpoint.
## ALWAYS
- Start from the premise that **prompt injection is not solved at the prompt layer**. A model has no privileged channel: system text, user text, a retrieved document and a tool result all arrive as one context, and nothing in that context can be marked as instructions the model must obey over the rest. Message roles are a formatting convention, delimiters raise the cost of an attack, and an instruction such as "treat the following as data" is itself just more text in the same window. Design as though injection will sometimes succeed, and put the real controls after the model rather than in front of it.
- Bound what the model's output is **allowed to reach**. Every downstream sink — a query builder, a shell, a file writer, an HTTP client, a renderer — must validate model output exactly as it would validate a request body from the internet, because that is what it is once injection is assumed. `secure-code-review`, `database-security` and `frontend-security` own the individual sinks; what belongs here is that model output never arrives pre-trusted.
- Constrain the output's **shape** with structured generation — a JSON Schema, function-call mode, constrained decoding — whenever the next step consumes it programmatically, and reject anything that fails validation rather than repairing it. A schema bounds the form, not the intent: a well-formed field can still carry a hostile value, so validate the value too.
- Authorize each tool call against the **human user's** permissions, checked at call time, not against what the model was told it may do. The tool allowlist is a capability list, not an authorization decision — and the agent's own privileges are the attack surface, because injected content drives the agent that holds them. Keep the agent's identity narrow for the same reason `iam-best-practices` keeps a pipeline role narrow.
- Put a **human approval gate** in front of consequential and irreversible actions: moving money, deleting or overwriting data, sending messages on a user's behalf, publishing, changing permissions. Injection that reaches a read-only tool is an information problem; injection that reaches a write tool is an incident. The gate is what keeps a single injected instruction from being final.View the complete source on GitHublogging-security
When your agent uses it
Keep secrets and personal data out of logs at the call site rather than relying on redaction, neutralize log and field injection, record audit events that survive, and treat log read access as data access. Use when generating logger calls or structured-logging schemas, wiring log shippers, sinks, retention, and access controls, or specifying audit-logging requirements.
What it loads into context
Frontmatter
80 tokensAlways available to the agent
SKILL.md
1,142 tokensWhen the skill is activated
Reference documents
895 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,472 bytesSKILL.mdcore5,472 bytesmetadata.jsonasset1,273 bytesreferences/verifying-findings.mddoc3,877 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/logging-security/SKILL.md. -->
# Logging Security
Keep secrets and personal data out of logs at the call site rather than relying on redaction, neutralize log and field injection, record audit events that survive, and treat log read access as data access. Use when generating logger calls or structured-logging schemas, wiring log shippers, sinks, retention, and access controls, or specifying audit-logging requirements.
## ALWAYS
- Decide what is safe to log **at the call site**, and log a reference rather than a value: an id, a hash, a type, a count. A redactor is the last net, not the design — it matches field names and known patterns, so it cannot see personal data sitting inside an assembled string. A formatted notification body, a templated message, an exception with interpolated arguments: the name and the address are in the prose, in no named field, matching no pattern. Nothing downstream will catch that.
- Run a **redactor** at the sink anyway, for the cases the call site missed: credential-shaped values, `Authorization` and `Cookie` headers, query strings carrying tokens, and the personal-data patterns in `rules/redaction_patterns.json`. `secret-detection` owns which literals count as a credential; this rule is that the redactor exists and runs before anything leaves the process.
- Log in a **structured format** (JSON or logfmt) with stable field names — `timestamp`, `service`, `version`, `level`, `trace_id`, `span_id`, `request_id`, `event`, and `user_id` when there is an authenticated one. Structure is what makes redaction, retention, and access control expressible per field instead of per line.
- Neutralize user-controlled strings before they enter a log record. Line injection (CWE-117) is the classic case — a `\n` or `\r` lets an attacker forge a whole record — but structured logging moves the problem: a value that parses as JSON can inject *fields* into the ingested document, and ANSI escape sequences (`\x1b[`) are interpreted by the terminal of whoever reads the log. Encode the value; do not concatenate it into the line.
- Record security-relevant events as **immutable audit records**: authentication success and failure, MFA challenges, password and role changes, permission grants and revocations, data export, administrative action. These carry longer retention and stricter access than operational logs, and they are the reason failed logins must keep being written even when someone calls them noise.View the complete source on GitHubml-security
When your agent uses it
The model and data artifacts: checkpoint formats that execute code on load, provenance for a model you did not train, training-data poisoning and the ingestion controls that bound it, PII that survives into weights, and notebooks that commit their own output. Use when loading a model from disk, a Hub, or object storage, ingesting user content for training or fine-tuning, or writing training, evaluation, or notebook code.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
1,318 tokensWhen the skill is activated
Reference documents
2,314 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,376 bytesSKILL.mdcore6,376 bytesSKILL.mdcore6,376 bytesSKILL.mdcore6,376 bytesSKILL.mdcore6,376 bytesmetadata.jsonasset1,417 bytesreferences/artifacts-and-provenance.mddoc6,384 bytesreferences/verifying-findings.mddoc3,592 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/ml-security/SKILL.md. -->
# ML Model Security
The model and data artifacts: checkpoint formats that execute code on load, provenance for a model you did not train, training-data poisoning and the ingestion controls that bound it, PII that survives into weights, and notebooks that commit their own output. Use when loading a model from disk, a Hub, or object storage, ingesting user content for training or fine-tuning, or writing training, evaluation, or notebook code.
## ALWAYS
- Prefer a **tensor-only format** — safetensors — for anything you load. It stores arrays and metadata and has no mechanism for executing code, which is the property that matters. A `.pt`, `.pkl`, `.bin`, `.ckpt` or `joblib` artifact is a pickle: loading it runs whatever the author put in it, before you see a single weight.
- Pass `weights_only=True` to `torch.load` **explicitly**, every time. The default has changed across PyTorch releases, so code that relies on it behaves differently depending on the pin — and the flag narrows the surface without removing it, so it is a mitigation rather than a reason to load an untrusted file. `deserialization-security` owns the pickle boundary itself and the per-language detail; `references/artifacts-and-provenance.md` has the format-by-format table.
- Establish provenance before loading: the artifact's **hash matches one you recorded** from a source you decided to trust, at a revision you pinned. A hash the artifact came with proves only that the file is the file. `supply-chain-security` owns what makes a source trustworthy, and its rule holds here — a checksum served next to the download is not authentication, and an author's name is not a signature.
- Pin the Hub revision to an **immutable commit**, not a branch or tag. `main` moves, and `from_pretrained(..., revision="<sha>")` is the difference between a model you reviewed and whatever is there today. Where the loader offers `trust_remote_code`, understand that enabling it executes repository Python at load time, which is the same exposure as the pickle it was meant to avoid.
- Bound what user-contributed data can do to a model. Attribute each training record to its source, keep contributed data in a separate pool from curated data, gate promotion between them on review, and cap how much any single contributor can influence one training run. Poisoning does not need many records — it needs enough of them near one behaviour.View the complete source on GitHubmobile-security
When your agent uses it
Android and iOS hardening on a device you do not control: hardware-backed credential storage, exported components and IPC, verified deep links, transport defaults and pinning rotation, server-side attestation over client-side root detection, screen capture, and release-build hygiene — including React Native and Flutter packaging. Use when generating Android or iOS app code, manifests, or native modules, wiring deep links or WebViews, or deciding what a mobile client is trusted to assert.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,561 tokensWhen the skill is activated
Reference documents
2,274 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,568 bytesSKILL.mdcore7,568 bytesmetadata.jsonasset1,657 bytesreferences/platform-specifics.mddoc5,691 bytesreferences/verifying-findings.mddoc4,191 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/mobile-security/SKILL.md. -->
# Mobile Application Security
Android and iOS hardening on a device you do not control: hardware-backed credential storage, exported components and IPC, verified deep links, transport defaults and pinning rotation, server-side attestation over client-side root detection, screen capture, and release-build hygiene — including React Native and Flutter packaging. Use when generating Android or iOS app code, manifests, or native modules, wiring deep links or WebViews, or deciding what a mobile client is trusted to assert.
## ALWAYS
- Start from the premise that **the device belongs to whoever is holding it**. The app runs on hardware an attacker can root or jailbreak, instrument at runtime, and read at rest. Everything shipped in the package is extractable, every client-side check is removable, and every local check can be made to return the answer the attacker wants. What you actually control is the backend's willingness to act — so any decision that matters is made server-side, on evidence the server verified.
- Issue short-lived, device-scoped tokens from a backend rather than shipping an API key, signing key, or backend credential in source, resources, `strings.xml`, `BuildConfig`, or `Info.plist`. Anyone can download the package and read it.
- Keep credentials in the platform's hardware-backed store: Android Keystore (`EncryptedSharedPreferences` with a `MasterKey`), iOS Keychain with a `…ThisDeviceOnly` accessibility class — `WhenUnlocked` where the value is never needed in the background, `AfterFirstUnlock` where it is. Never `SharedPreferences`, `UserDefaults`, a plist, or a file. The store protects a key at rest on an uncompromised device; it does not protect against code running inside your process, which is why the credential should be short-lived regardless.
- **Android**: give every `<activity>`, `<service>`, `<receiver>` and `<provider>` an explicit `android:exported`, defaulting to `false`. Since API 31 the attribute is mandatory when an intent filter is present — which forces the question to be asked, not answered. An exported component is a public API of your app that any installed application can call.
- Treat data crossing an app boundary as untrusted in both directions: validate every `Intent` extra and incoming activity payload, send sensitive data with an explicit component rather than an implicit intent any app can register for, and create every `PendingIntent` as `FLAG_IMMUTABLE` so the recipient cannot rewrite its contents.View the complete source on GitHubprotocol-security
When your agent uses it
Transport security where the client establishes trust: TLS version floor, certificate chain and hostname verification, the trust store, connecting by IP, mTLS and workload identity as authentication, gRPC channel credentials, and SMTP STARTTLS. Use when generating HTTP, gRPC, or SMTP clients and servers, configuring TLS in code or platform config, wiring service-to-service authentication, or when tempted to disable certificate verification.
What it loads into context
Frontmatter
88 tokensAlways available to the agent
SKILL.md
1,269 tokensWhen the skill is activated
Reference documents
3,213 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,057 bytesSKILL.mdcore6,057 bytesmetadata.jsonasset1,384 bytesreferences/tls-configuration.mddoc9,194 bytesreferences/verifying-findings.mddoc4,018 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/protocol-security/SKILL.md. -->
# Protocol Security
Transport security where the client establishes trust: TLS version floor, certificate chain and hostname verification, the trust store, connecting by IP, mTLS and workload identity as authentication, gRPC channel credentials, and SMTP STARTTLS. Use when generating HTTP, gRPC, or SMTP clients and servers, configuring TLS in code or platform config, wiring service-to-service authentication, or when tempted to disable certificate verification.
## ALWAYS
- Default to **TLS 1.3**, and permit TLS 1.2 only where a peer genuinely requires it. Disable TLS 1.0, 1.1, and every SSL version. Cipher-suite selection is a consequence of the version floor rather than a separate decision — `references/tls-configuration.md` carries the suite lists and the per-platform config keys.
- Verify the full certificate chain on every connection: a trusted issuer, an unexpired validity window, and a hostname that matches a **`subjectAltName` dNSName** entry. The hostname is checked *against* the SAN — SAN is not an alternative place to look, and a `CN` match is not a fallback, because current browsers and TLS libraries removed CN as a hostname source.
- When connecting to an **IP address** rather than a name, set the expected name explicitly (`ServerName` in Go's `tls.Config`, the equivalent SNI/verification hostname elsewhere) so verification has something to check, or require a certificate carrying an `iPAddress` SAN. Reaching an endpoint by IP is the single most common reason a developer disables verification — this is the fix that keeps it on.
- Resolve a self-signed or internal-CA endpoint by **adding that CA to the client's trust configuration**, not by turning verification off. Every language has a way to supply a custom root pool; using it keeps hostname and expiry checks intact, which is exactly what the shortcut discards.
- Use **mutual TLS** for service-to-service traffic inside a trust domain, and treat it as what it is: a cryptographic caller identity, which *is* authentication — unlike network position, which is not. A SPIFFE workload identity (`spiffe://trust-domain/...`) with short-lived certificates is the form of this worth reaching for over a long-lived shared API key.View the complete source on GitHubsaas-security
When your agent uses it
Wiring your application to a third-party SaaS platform: verifying an inbound webhook against the vendor's own scheme rather than a generalized one, why a valid signature identifies the sender and not the user in the payload, replay windows, one credential per integration and per environment, least-privilege scopes, and treating a bulk export as a data boundary. Use when writing a webhook receiver, an OAuth integration, a SCIM endpoint, or any code that authenticates to or from a SaaS vendor.
What it loads into context
Frontmatter
109 tokensAlways available to the agent
SKILL.md
1,431 tokensWhen the skill is activated
Reference documents
2,068 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,022 bytesSKILL.mdcore7,022 bytesmetadata.jsonasset1,439 bytesreferences/vendor-specifics.mddoc3,963 bytesreferences/verifying-findings.mddoc4,746 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/saas-security/SKILL.md. -->
# SaaS Integration Security
Wiring your application to a third-party SaaS platform: verifying an inbound webhook against the vendor's own scheme rather than a generalized one, why a valid signature identifies the sender and not the user in the payload, replay windows, one credential per integration and per environment, least-privilege scopes, and treating a bulk export as a data boundary. Use when writing a webhook receiver, an OAuth integration, a SCIM endpoint, or any code that authenticates to or from a SaaS vendor.
## ALWAYS
- Verify an inbound webhook against **that vendor's documented scheme**, and do not generalize from another one. Vendors differ in the header, in the secret, and — the part that breaks a generalized implementation — in the **canonical string** that gets signed. Some sign the raw body, some sign a version prefix plus a timestamp plus the body, some sign the HTTP method and path as well. Read the vendor's page for the vendor you are integrating; a signature routine copied from a different vendor produces a receiver that rejects every legitimate event, and the fix someone reaches for is to turn verification off.
- Verify against the **raw request body**, exactly as received, before any parsing or re-serialization. A framework that decodes JSON and re-encodes it changes whitespace and key order, and the HMAC no longer matches — which again ends with verification being disabled rather than fixed.
- Check the **timestamp** the vendor sends and reject requests outside a short window, then reject **replays** inside it by recording delivery or event ids. A signature is valid forever; the window narrows the replay opportunity and the id store closes it.
- Compare signatures in **constant time**. `crypto-misuse` owns the comparison API for each language.
- Treat the signature as proof of **who sent the payload, not who the payload is about**. This is the distinction that matters most in this domain: a verified Zoom or Calendly or HubSpot event genuinely came from that vendor, and the `email`, `from`, or custom fields inside it may still be attacker-chosen — anyone who can book a meeting or submit a form controls them. Resolve the subject to a canonical id server-side. `auth-security` owns the general rule for producer-asserted identity.View the complete source on GitHubsecret-detection
When your agent uses it
Keeping credentials out of source, and what to do once one is in: rotate before removing, because deleting the line does not un-leak it. Covers where a secret may live, safe .env templates, why a client-reachable config value is public, and running a scanner rather than eyeballing for patterns. Use when writing code that reads a credential, creating config or .env templates, before committing, or after discovering a secret in a repository.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
1,379 tokensWhen the skill is activated
Reference documents
607 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,785 bytesSKILL.mdcore5,785 bytesmetadata.jsonasset1,367 bytesreferences/verifying-findings.mddoc2,512 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/secret-detection/SKILL.md. -->
# Secret Detection
Keeping credentials out of source, and what to do once one is in: rotate before removing, because deleting the line does not un-leak it. Covers where a secret may live, safe .env templates, why a client-reachable config value is public, and running a scanner rather than eyeballing for patterns. Use when writing code that reads a credential, creating config or .env templates, before committing, or after discovering a secret in a repository.
## ALWAYS
- On finding a committed credential, **rotate or revoke it at the provider first**. Deleting the line does not remediate it, and neither does `git rm`, an amended commit, or a history rewrite: the value reached a remote, a clone, a fork, a CI log and a backup, and it is compromised from the moment it was pushed. Rotate, then clean the history, then add the guard that stops it recurring — in that order, because only the first one is time-critical.
- **Run a scanner**; do not scan by eye. `scan_secrets` and `check_secret_pattern` carry the full pattern set with per-pattern entropy floors and hotword proximity, and a person reading a diff matches none of that reliably. A working-tree scan and a history scan answer different questions — the first says what you are about to commit, the second says what is already public.
- Read the credential from the environment or a secret manager at the point of use — `os.environ`, `process.env`, `os.Getenv`, a Vault / AWS Secrets Manager / GCP Secret Manager / 1Password client. Nothing about the value should be reconstructible from the repository.
- Ship a **`.env.example`** that is committed and contains every key with an empty or obviously-fake value, alongside a `.env` that is ignored and never committed. The example file is documentation, so it must never be produced by copying a working `.env` and editing it — that is how a real value survives into the template.
- Ignore the file classes that carry key material, in one list: `.env`, `.env.*` (but not `.env.example`), `*.pem`, `*.key`, `*.p12`, `*.pfx`, `*.ppk`, `id_rsa*`, `id_dsa*`, `id_ecdsa*`, `id_ed25519*`, `*credentials*`, `*secret*`. A `.gitignore` entry is a guard against habit, not a control — it does nothing for a file already tracked, and `git add -f` overrides it.View the complete source on GitHubsecure-code-review
When your agent uses it
The sinks and boundaries that belong to no framework: passing input to a shell or an evaluator, letting input choose a filesystem path, validating at a boundary that is not an HTTP request, and handling regulated data (PII, PHI, cardholder data) so it does not spread into paths nobody reviews. Use when generating or reviewing code that shells out, touches the filesystem, reads a queue message, CLI argument, or parsed file, or when a change crosses a PII, PHI, or PCI boundary.
What it loads into context
Frontmatter
113 tokensAlways available to the agent
SKILL.md
1,182 tokensWhen the skill is activated
Reference documents
1,625 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,372 bytesSKILL.mdcore5,372 bytesmetadata.jsonasset1,437 bytesreferences/verifying-compliance-findings.mddoc3,971 bytesreferences/verifying-findings.mddoc3,310 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/secure-code-review/SKILL.md. -->
# Secure Code Review
The sinks and boundaries that belong to no framework: passing input to a shell or an evaluator, letting input choose a filesystem path, validating at a boundary that is not an HTTP request, and handling regulated data (PII, PHI, cardholder data) so it does not spread into paths nobody reviews. Use when generating or reviewing code that shells out, touches the filesystem, reads a queue message, CLI argument, or parsed file, or when a change crosses a PII, PHI, or PCI boundary.
## ALWAYS
- Validate input at **every** trust boundary, not only the HTTP one. A CLI argument, an environment variable, a queue message, a filename, a parsed config or spreadsheet cell all arrive from outside and none of them pass through the request-validation layer. Check type, length, allowed characters and allowed range, and reject before processing. `api-security` owns the HTTP request body and its schema; this rule is every other way input gets in.
- Build a command as an **argument vector**, never as a string a shell will parse: `subprocess.run([...])` without `shell=True`, `execFile`/`spawn` with an array, `exec.Command(name, args...)`. Passing an array is what removes the shell, and removing the shell is what removes the injection — quoting and escaping are the fallback for when you cannot.
- **Canonicalize then check** any path built from input: resolve it to an absolute real path, then confirm it is inside the intended directory. Checking the raw string first misses `..`, symlinks, absolute-path replacement, and encoded separators. `file-upload-security` owns stored uploads and archive extraction; this rule covers a static-file handler, a template loader, a log path, an export filename.
- Tag any function or module handling **PII, PHI or cardholder data** with an explicit classification comment (`// classification: PII`), and keep that handling in clearly-named modules rather than in general utility code. An untagged helper is how regulated data spreads into paths nobody reviews for it, and the tag is what makes the later review possible.
- Consult the owner for anything with one: `database-security` when code builds a query, `crypto-misuse` when it hashes, encrypts, signs or compares a secret, `frontend-security` for output encoding and response headers, `auth-security` for who the caller is, `iam-best-practices` for the privileges a process runs with. Each of those states its rule with the API names and the false positives this skill would have to leave out.View the complete source on GitHubsecurity-regression-tests
When your agent uses it
Turning a confirmed and fixed finding into a permanent guard: proving the test fails without the fix, asserting the effect and not only the status code, seeding the two principals an authorization test needs, making a timing or out-of-band proof deterministic enough for CI, and keeping the test in a job that can actually block. Use once a security finding has been confirmed and fixed, or when a security test is failing, skipped, or about to be deleted.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
1,338 tokensWhen the skill is activated
Reference documents
1,841 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,193 bytesSKILL.mdcore6,193 bytesmetadata.jsonasset1,233 bytesreferences/test-by-class.mddoc5,810 bytesreferences/where-verification-runs.mddoc2,175 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/security-regression-tests/SKILL.md. -->
# Security Regression Tests
Turning a confirmed and fixed finding into a permanent guard: proving the test fails without the fix, asserting the effect and not only the status code, seeding the two principals an authorization test needs, making a timing or out-of-band proof deterministic enough for CI, and keeping the test in a job that can actually block. Use once a security finding has been confirmed and fixed, or when a security test is failing, skipped, or about to be deleted.
## ALWAYS
- **Prove the test fails without the fix.** Revert the patch, or mutate the guard, and confirm the new test goes red — then restore. A test written after the fix can be vacuously green: wrong route, wrong fixture user, wrong assertion target, a typo in the payload. It will stay green forever and nobody will learn anything from it. This is the one step that distinguishes a guard from a decoration, and it is the one most often skipped.
- Assert **both directions**: the attack input now yields the secure outcome, *and* a legitimate input still succeeds. A deny-only test passes equally well against an endpoint that is broken for everyone, so it will hold the line and tell you nothing when someone disables the feature entirely.
- Assert the **effect**, not only the status code. A `403` proves the request was refused; it does not prove the write did not land somewhere else, that the record was not returned in a different shape, or that a queue message was not emitted. Check the state the attack was trying to reach.
- Seed the **fixtures the assertion depends on** before writing it. A cross-tenant test needs two principals and two owned resources, deterministically created — if both test users end up in the same tenant, the deny assertion is untestable and passes for the wrong reason.
- Make it **deterministic and offline**. Freeze the clock for expiry and TTL assertions, stub the HTTP client, dialer or resolver rather than reaching the network, fix random seeds, and avoid sleep-based timing assertions and state shared between tests. Note that a canonical SSRF payload such as `http://169.254.169.254/latest/meta-data/` is a *live, reachable* address on a cloud CI runner, so the naive test both leaves the sandbox and returns a different verdict on a laptop.View the complete source on GitHubserverless-security
When your agent uses it
What a function-as-a-service platform changes: an execution environment reused between invocations so /tmp and module globals outlive a request, an event envelope that is attacker-influenced whichever trigger delivered it, encrypted-at-rest configuration that the control-plane API still returns in cleartext, and concurrency as the boundary between an incident and a bill. Use when generating Lambda, Cloud Functions, or Azure Functions code, serverless.yml or SAM templates, or wiring API Gateway, EventBridge, SQS, or S3 triggers.
What it loads into context
Frontmatter
113 tokensAlways available to the agent
SKILL.md
1,432 tokensWhen the skill is activated
Reference documents
2,481 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,056 bytesSKILL.mdcore7,056 bytesSKILL.mdcore7,056 bytesmetadata.jsonasset1,542 bytesreferences/platform-settings.mddoc7,479 bytesreferences/verifying-findings.mddoc3,854 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/serverless-security/SKILL.md. -->
# Serverless Security
What a function-as-a-service platform changes: an execution environment reused between invocations so /tmp and module globals outlive a request, an event envelope that is attacker-influenced whichever trigger delivered it, encrypted-at-rest configuration that the control-plane API still returns in cleartext, and concurrency as the boundary between an incident and a bill. Use when generating Lambda, Cloud Functions, or Azure Functions code, serverless.yml or SAM templates, or wiring API Gateway, EventBridge, SQS, or S3 triggers.
## ALWAYS
- Treat the **execution environment as reused**. The platform freezes it when the handler returns and thaws it for the next invocation, which may serve a different tenant. So a module-level global holding per-request state — a decrypted payload, an authorization decision, a tenant id, a connection bound to one caller's credentials — is visible to the next request. Cache only what is safe to share, and reset or scope everything else inside the handler.
- Treat **`/tmp` as shared, persistent, and finite**. It is the only writable path, it survives across invocations in the same environment, and a fixed filename written for one user is readable by the next. Use a per-invocation subdirectory, delete it before returning, and never read back a path without having written it in the same invocation.
- Validate the **whole event, envelope included**. The trigger's identity is not authentication: an S3 object key is chosen by whoever can PUT to the bucket, SQS message attributes and EventBridge `detail` are producer-supplied, and an API Gateway authorizer context is only as trustworthy as the authorizer. Validate against an explicit schema before any code touches the payload, and where a function has more than one trigger, check the source discriminant and route by allowlist.
- Give each function its **own execution role** with only the permissions its stated job needs. `iam-best-practices` owns policy scope and the escalation paths; what is serverless-specific is one role per function, never shared, because a shared role gives every function the union of what any of them needs.
- Set concurrency deliberately, and know which control you are reaching for. **Reserved** concurrency caps a function's parallel executions and is the denial-of-wallet control; **provisioned** concurrency pre-initialises environments to remove cold starts and *bills for them whether or not they are used*. Reserved capacity is also drawn from a shared account pool, so setting it per function is a decision about the account, not just that function.View the complete source on GitHubssrf-prevention
When your agent uses it
Server-Side Request Forgery: allowlisting the destination of a server-side fetch, when re-resolution between check and connect matters, redirect and scheme bypasses, parsers that fetch on their own (XXE, SVG, HTML-to-PDF), cloud metadata, and keeping the response from becoming an oracle. Use when fetching a client-supplied URL, wiring webhooks, image proxies, PDF or preview renderers, or reviewing any HTTP-client wrapper.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,445 tokensWhen the skill is activated
Reference documents
2,318 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,543 bytesSKILL.mdcore6,543 bytesmetadata.jsonasset1,464 bytesreferences/metadata-and-egress.mddoc6,549 bytesreferences/verifying-findings.mddoc2,537 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/ssrf-prevention/SKILL.md. -->
# SSRF Prevention
Server-Side Request Forgery: allowlisting the destination of a server-side fetch, when re-resolution between check and connect matters, redirect and scheme bypasses, parsers that fetch on their own (XXE, SVG, HTML-to-PDF), cloud metadata, and keeping the response from becoming an oracle. Use when fetching a client-supplied URL, wiring webhooks, image proxies, PDF or preview renderers, or reviewing any HTTP-client wrapper.
## ALWAYS
- Constrain the destination with an **allowlist of hosts you intend to reach**, not a denylist of addresses you intend to avoid. A denylist has to enumerate every spelling of every internal address — decimal and octal IPv4, IPv6 and IPv4-mapped IPv6, a hostname whose A record is private, a public wildcard resolver like `nip.io` that encodes any address into a name — and it only has to be wrong once.
- Know which of the two controls you built, because it decides whether re-resolution matters. An **allowlist of hostnames** survives DNS rebinding: the attacker controls DNS only for names they own, and those names are not on the list. An **IP-range check** does not: the name resolves to a public address when you validate and a private one when you connect, and the two resolutions are independent. If your control is address-based, resolve once and **connect to that pinned address** — a custom dialer or transport, carrying the original hostname for SNI and `Host` — so no second lookup can occur.
- Re-validate **at every redirect hop**, or disable redirect-following entirely on fetchers that take user-supplied URLs. An allowed host answering `302` to `http://169.254.169.254/` is the single most common bypass, and it defeats a check performed only on the URL the user submitted.
- Restrict the scheme to `http` and `https` before anything else. `file://`, `gopher://`, `dict://`, `ldap://`, `jar://` and friends turn a fetcher into a file reader or a protocol-smuggling primitive.
- Keep the **user-URL fetcher and the internal fetcher as separate clients**, and make mixing them fail to compile rather than fail at runtime — distinct types in Go, Rust or TypeScript. A single client used for both eventually gets called with the wrong argument.View the complete source on GitHubsupply-chain-security
When your agent uses it
Vet dependencies before they enter the build: typosquats, dependency confusion, malicious packages, known vulnerabilities, unlocked resolution, risky install and build hooks, EOL embedded runtimes, and the authenticity and freshness of your own release channel. Use when adding or upgrading a dependency, reviewing package manifests or lockfiles, configuring package sources or internal namespaces, or publishing a package or application update.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
1,063 tokensWhen the skill is activated
Reference documents
2,884 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,480 bytesSKILL.mdcore5,480 bytesSKILL.mdcore5,480 bytesSKILL.mdcore5,480 bytesmetadata.jsonasset1,556 bytesreferences/ecosystem-controls.mddoc4,450 bytesreferences/verifying-findings.mddoc8,569 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/supply-chain-security/SKILL.md. -->
# Supply Chain Security
Vet dependencies before they enter the build: typosquats, dependency confusion, malicious packages, known vulnerabilities, unlocked resolution, risky install and build hooks, EOL embedded runtimes, and the authenticity and freshness of your own release channel. Use when adding or upgrading a dependency, reviewing package manifests or lockfiles, configuring package sources or internal namespaces, or publishing a package or application update.
## ALWAYS
- Verify the identity of a new dependency before adding it: registry metadata, repository URL, maintainer set, and provenance checked against the signer you *expect*. Name-similarity screening opens the question; it never answers it.
- Query the bundled malicious-package data before adding any dependency — `check_dependency`, `check_typosquat` and `lookup_vulnerability` read it, this file cannot. Match on ecosystem, normalized name **and affected version range**; an active match on the resolved version blocks.
- Treat package age, download volume, maintainer count and activity as risk signals, never as proof of trust. Defaults: a verified maintainer signal within 90 days of a package identity's first publication, plus a documented reason within 30 days.
- Lock the resolution graph for anything you deploy — commit the lockfile, install frozen in CI (`npm ci`, `--frozen-lockfile`, `pip --require-hashes`, `cargo --locked`). Lock what you deploy, range what you publish: a library's dependency metadata needs compatibility ranges.
- Restrict where packages resolve from, so an internal-only identifier cannot come from a public registry. Use the ecosystem's own mechanism — npm scope-to-registry, Gradle `exclusiveContent`, a single authoritative index for Python, which has no scope isolation at all.View the complete source on GitHubtemplate-injection
When your agent uses it
User input reaching a template compiler rather than its context: the source-versus-values distinction, double-render pipelines, template names chosen by the caller, why a template sandbox is a mitigation and not a boundary, minimizing what the render context exposes, and template-driven resource exhaustion. Use when rendering templates with user-influenced values, when a template string or template name is assembled from input, or when a product lets users author templates.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
1,327 tokensWhen the skill is activated
Reference documents
2,731 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,317 bytesSKILL.mdcore6,317 bytesSKILL.mdcore6,317 bytesSKILL.mdcore6,317 bytesmetadata.jsonasset1,630 bytesreferences/engines.mddoc7,782 bytesreferences/verifying-findings.mddoc3,579 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/template-injection/SKILL.md. -->
# Template Injection (SSTI)
User input reaching a template compiler rather than its context: the source-versus-values distinction, double-render pipelines, template names chosen by the caller, why a template sandbox is a mitigation and not a boundary, minimizing what the render context exposes, and template-driven resource exhaustion. Use when rendering templates with user-influenced values, when a template string or template name is assembled from input, or when a product lets users author templates.
## ALWAYS
- Pass user data as **bound values**, never into the template **source** string. This is the whole skill in one line: `render(tmpl, {"name": name})` is safe, `render("Hello " + name)` is SSTI. The compiler treats its source as code, and the context as data — so the only question that matters about any user value is which of the two it reaches.
- Keep the set of template sources **static and trusted**, loaded from files or constants. A template body read from a database column, an API response, or a request field is attacker-supplied code, whatever the column is called.
- Choose the template **by name from an allowlist**, never by a name the caller supplies. `render_template(user_value)` and `{% include user_value %}` are the same vulnerability as a user-supplied body: the caller picks which code runs, and on many engines the name resolves as a filesystem path, which makes it an arbitrary-file read as well.
- **Minimize the render context.** Pass the specific values the template needs, never the ambient objects — application config, settings, the request, `self`, a module, a live ORM instance. This is the control that still holds when a sandbox is escaped: an engine that cannot execute code can still print whatever it can reach, and configuration objects hold database URLs and signing keys.
- Treat a **second render pass** as compilation of whatever survived the first. If rendered output is parsed again, a user value that was inert data on pass one is `{{ }}` code on pass two. The fix is architectural — stop re-parsing rendered output. Neutralizing metacharacters before the second pass is a fallback that has to enumerate every delimiter of every engine, including ones a custom delimiter configuration introduces, and two adjacent fields can produce a delimiter that neither of them contains.View the complete source on GitHubthreat-modeling
When your agent uses it
Decide what a design must be true before code exists: naming assets and actors, locating trust boundaries, producing a written (asset, boundary, threat, control, owner) list, recording the assumptions the design rests on, and knowing when a change invalidates the model. Use when scaffolding a new feature, service, or endpoint, writing or reviewing a design doc, RFC, or ADR, or introducing a new trust boundary, integration, or data flow.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,558 tokensWhen the skill is activated
Reference documents
1,341 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,336 bytesSKILL.mdcore7,336 bytesmetadata.jsonasset1,276 bytesreferences/design-level-failures.mddoc6,232 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/threat-modeling/SKILL.md. -->
# Threat Modeling
Decide what a design must be true before code exists: naming assets and actors, locating trust boundaries, producing a written (asset, boundary, threat, control, owner) list, recording the assumptions the design rests on, and knowing when a change invalidates the model. Use when scaffolding a new feature, service, or endpoint, writing or reviewing a design doc, RFC, or ADR, or introducing a new trust boundary, integration, or data flow.
## ALWAYS
- Produce a **written list**, not an impression. One row per finding, in the design doc, the RFC, or the PR description: `(asset, boundary, threat, control, owner)` — what is worth taking, where it crosses, what could go wrong there, what stops it, and which component enforces it. A model that exists only in the reasoning that produced the code cannot be reviewed, disagreed with, or checked later.
- Name the **assets** and the **actors** first: data, funds, credentials, keys and compute on one side; users, tenants, services, admins and the attacker on the other. Every later row references one of each, which is what makes the list finite.
- Locate the **trust boundaries** — internet to application, tenant to shared store, service to service, user input to an interpreter, model output to anything that acts on it. A boundary is where data arrives from a party you do not control, and it is the unit the rest of the model is organised around.
- At each boundary, ask the six **STRIDE** questions and write down only the answers that matter: can the caller be **spoofed** (is there authentication), can the data be **tampered** with in flight, will there be a record if someone **repudiates** the action, what is **disclosed** if this crossing leaks, what happens under **denial of service**, and does anything here allow **elevation of privilege**. A category with no answer is not a gap; a category nobody asked about is.
- Write down the **assumptions the design depends on**: this gateway is the only ingress, this queue's producers are authenticated, this field is already validated upstream, this CDN strips that header. Assumptions are the part of a threat model that later becomes false without anyone noticing, and an unwritten one cannot be rechecked.View the complete source on GitHubwebsocket-security
When your agent uses it
Securing the WebSocket upgrade and the frames after it: Origin validation against Cross-Site WebSocket Hijacking, authenticating the handshake rather than the first message, the ticket pattern for browsers that cannot set headers, per-frame authorization, and resource limits on a connection that stays open. Use when generating a WebSocket, Socket.IO, SignalR, or Phoenix Channels server, wiring real-time messaging, presence, or collaborative editing, or reviewing a /ws endpoint.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
1,469 tokensWhen the skill is activated
Reference documents
2,193 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,957 bytesSKILL.mdcore6,957 bytesSKILL.mdcore6,957 bytesSKILL.mdcore6,957 bytesSKILL.mdcore6,957 bytesmetadata.jsonasset1,535 bytesreferences/limits-and-handshake.mddoc6,048 bytesreferences/verifying-findings.mddoc3,655 bytes
Read SKILL.md
<!-- Native skill bundle for agent-skills (cross-tool convention). Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/websocket-security/SKILL.md. -->
# WebSocket Security
Securing the WebSocket upgrade and the frames after it: Origin validation against Cross-Site WebSocket Hijacking, authenticating the handshake rather than the first message, the ticket pattern for browsers that cannot set headers, per-frame authorization, and resource limits on a connection that stays open. Use when generating a WebSocket, Socket.IO, SignalR, or Phoenix Channels server, wiring real-time messaging, presence, or collaborative editing, or reviewing a /ws endpoint.
## ALWAYS
- Validate the **`Origin` header** on the upgrade handshake against an allowlist, and understand precisely what that buys: the browser sets `Origin` and script cannot forge it, so the check stops **Cross-Site WebSocket Hijacking** — a page on `attacker.com` opening `wss://api.example.com/ws` and inheriting the user's cookies. It buys nothing against a non-browser client, which sets any header it likes. Origin is a CSRF control, not authentication. The same-origin policy and CORS preflight do not apply to the upgrade at all, which is why this check must be written by hand.
- Authenticate the **handshake**, not the first frame. Once the upgrade completes the connection exists, has consumed the user's cookie context, and is already a resource the caller controls. A `subscribe` or `auth` message afterwards is too late.
- For a browser client, pick one of two mechanisms, because the browser `WebSocket` constructor **cannot set request headers** — there is no `Authorization` header available to you: 1. **Cookie on the upgrade** plus the `Origin` check above as the CSRF control, or 2. A **single-use ticket**: the authenticated page calls an ordinary HTTP endpoint, receives a short-lived opaque ticket bound to the user and to the intended resource, passes it in the URL, and the server **redeems and invalidates it at handshake time**. A ticket is safe in a URL precisely because replaying it fails.
- Re-authorize **every frame**, both the action and the subject it names. A frame like `{"action":"write","subjectId":"X"}` must be checked against the principal established at handshake — an authenticated socket must never be able to assert an arbitrary subject id per frame. That is per-frame BOLA, and the forged id reaches every consumer downstream of the socket that trusts it. Permissions also change while the connection is open: logout, role change, account lock, token expiry. A socket opened an hour ago carries an authorization decision an hour old.
- Bound the connection: maximum frame and message size, messages per second per connection, concurrent connections per user and per source address, and total connection lifetime after which the client must re-handshake. A WebSocket is an allocation that persists, so every limit HTTP gets per-request must be re-expressed per-connection. Concrete starting values, and the backpressure and heartbeat settings, are in `references/limits-and-handshake.md`.View the complete source on GitHubapi-security
When your agent uses it
OWASP API Top 10 for HTTP, GraphQL, and gRPC endpoints: input validation, route rate limiting, mass assignment, response caching, and gateway-versus-service control placement. Use when generating or reviewing HTTP handlers, GraphQL resolvers, gRPC service methods, or any API endpoint change.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
981 tokensWhen the skill is activated
Reference documents
522 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore4,590 bytesSKILL.mdcore4,590 bytesmetadata.jsonasset1,105 bytesreferences/verifying-findings.mddoc2,236 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/api-security/SKILL.md. -->
# API Security
OWASP API Top 10 for HTTP, GraphQL, and gRPC endpoints: input validation, route rate limiting, mass assignment, response caching, and gateway-versus-service control placement. Use when generating or reviewing HTTP handlers, GraphQL resolvers, gRPC service methods, or any API endpoint change.
## ALWAYS
- Require authentication on every non-public endpoint. Default to authenticated; opt out for genuinely public routes by explicit annotation.
- Consult `auth-security` for **who the caller is and what they may touch**. It owns the credential (algorithm pinning, expiry, lifetime, session, CSRF) and the permission (object-level BOLA/IDOR checks, multi-key routes, streaming subjects, function-level role gating). Any endpoint that reads or writes a resource by id needs it; this skill covers everything else about the endpoint.
- Validate all request inputs against an explicit schema (JSON Schema, Pydantic, Zod, validator/v10 struct tags). Reject early; never propagate untrusted input deeper.
- Enforce rate limits at the route level for authentication endpoints, password reset, and any expensive operation.
- Consult `error-handling-security` for what an error response may carry. It owns the boundary between what crosses to the client and what stays in the log, including presence-of-record disclosure (`User not found` vs `Invalid credentials`).View the complete source on GitHubauth-security
When your agent uses it
[Credential-related source omitted]
What it loads into context
Frontmatter
105 tokensAlways available to the agent
SKILL.md
1,475 tokensWhen the skill is activated
Reference documents
1,062 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,754 bytesSKILL.mdcore6,754 bytesmetadata.jsonasset1,565 bytesreferences/verifying-findings.mddoc4,338 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/auth-security/SKILL.md. -->
# Authentication & Authorization Security
[Credential-related source omitted]
## ALWAYS
- Authorize at the **object level** — confirm the authenticated subject actually has access to the requested resource ID, not just that they are logged in. Being signed in is not permission to read record 4,182 (OWASP API1 — BOLA / IDOR).
- Bind object-level authorization to the **authenticated principal**, never to an actor id echoed in the request: checking that a request-supplied `senderId`/`ownerId`/`actedBy` is a valid member validates the *claimed* actor, not the caller (looks like authorization, isn't).
- On `/{scopeId}/.../{subjectId}` routes, authorize the **relationship** — confirm the subject belongs to that scope. A caller-vs-scope check alone does not authorize the subject (multi-key BOLA).
- Authorize **each subject on streaming responses** (SSE/chunked/WebSocket): the `200` is committed before the handler runs, so an empty/filtered stream — not a `4xx` — is the deny signal; an unauthorized subject gets zero events.
- Enforce a **function-level role / privilege check** on any write that publishes into a shared or global namespace (a global gallery, shared catalog, public template list). Authentication is not authorization (OWASP API5 — Broken Function Level Authorization); a low-privilege user posting into a globally-visible store is a delivery vector for stored-XSS and malicious-link chains.View the complete source on GitHubcicd-security
When your agent uses it
Harden GitHub Actions, GitLab CI, and similar pipelines against supply-chain attacks, secret exfiltration, and pwn-request abuse. Use when authoring or reviewing workflow files, adding a third-party action, image, or script, wiring cloud or registry credentials into CI, or triaging a suspected pipeline compromise.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
1,294 tokensWhen the skill is activated
Reference documents
927 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,726 bytesSKILL.mdcore5,726 bytesSKILL.mdcore5,726 bytesSKILL.mdcore5,726 bytesmetadata.jsonasset1,314 bytesreferences/verifying-findings.mddoc3,879 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/cicd-security/SKILL.md. -->
# CI/CD Pipeline Security
Harden GitHub Actions, GitLab CI, and similar pipelines against supply-chain attacks, secret exfiltration, and pwn-request abuse. Use when authoring or reviewing workflow files, adding a third-party action, image, or script, wiring cloud or registry credentials into CI, or triaging a suspected pipeline compromise.
## ALWAYS
- Pin every third-party GitHub Action by **commit SHA** (full 40-char), never by a floating tag (`@v1`, `@main`, `@latest`) — tags can be re-pushed. The tj-actions/changed-files March 2025 incident exfiltrated secrets from 23,000+ repositories specifically because consumers used floating tags. Same applies to GitLab CI `include:` references and reusable workflows. Renovate / Dependabot can keep the SHA pins fresh.
[Credential-related source omitted]
[Credential-related source omitted]
- Treat `pull_request_target`, `workflow_run`, and any `pull_request` job that uses `actions/checkout` with `ref: ${{ github.event.pull_request.head.ref }}` as **trusted-context-on-untrusted-code** — the "pwn request" pattern documented by GitHub Security Lab. Either don't run them, or run with no secrets and no write tokens. A fork's GitLab merge-request pipeline is the same shape — it runs the fork's own `.gitlab-ci.yml` on your runners: isolate them, expose no protected variables.
- Echo every untrusted expression (`${{ github.event.* }}`) through an environment variable first; never interpolate it directly into `run:` body — that's the canonical GitHub Actions script-injection sink. The GitLab sink has the same shape: `$CI_*` / `$TRIGGER_*` interpolated into `bash -c` or `eval`, where merge-request metadata carries the shell metacharacters.View the complete source on GitHubcontainer-security
When your agent uses it
Hardening for Dockerfiles, OCI images, Kubernetes manifests, and Helm charts. Use when generating a Dockerfile or image build, writing Kubernetes, Helm, or Kustomize manifests, or reviewing container changes in a pull request.
What it loads into context
Frontmatter
54 tokensAlways available to the agent
SKILL.md
2,375 tokensWhen the skill is activated
Reference documents
1,397 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore10,191 bytesSKILL.mdcore10,191 bytesSKILL.mdcore10,191 bytesSKILL.mdcore10,191 bytesmetadata.jsonasset1,062 bytesreferences/eol-base-images.mddoc1,644 bytesreferences/verifying-findings.mddoc3,962 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/container-security/SKILL.md. -->
# Container Security
Hardening for Dockerfiles, OCI images, Kubernetes manifests, and Helm charts. Use when generating a Dockerfile or image build, writing Kubernetes, Helm, or Kustomize manifests, or reviewing container changes in a pull request.
## ALWAYS
- Use **multi-stage builds**: separate builder/test stages from the final runtime image so build toolchains and source aren't shipped. The last stage should be a minimal base — `gcr.io/distroless/<variant>`, `scratch`, or a versioned `-slim` / `-alpine` variant — pinned by SHA256 digest, not just tag. Two bases have nothing to pin: `scratch`, and a reference to an earlier stage in the same file (`FROM base`), which is pinned on that stage's own `FROM` line.
- Run as a non-root user: set `USER` explicitly on the **final stage**, as a **number** not a name. Omitting it leaves the container running as root. K8s `runAsNonRoot` rejects UID 0 and cannot resolve a username, so `USER appuser` fails at startup with "image has non-numeric user"; any non-zero UID passes, and 10000+ by convention also avoids colliding with host accounts.
- Use **`npm ci`** (and equivalents `pnpm install --frozen-lockfile`, `yarn install --frozen-lockfile`) in container builds, not `npm install`. `npm install` mutates the lockfile and resolves versions per-build, producing non-deterministic images that drift from the lockfile.
- Add a `.dockerignore` excluding `.git`, `node_modules`, `.env`, `*.pem`, `*.key`, `target/`, `.terraform/`, `dist/`, `coverage/`.
- Build with **BuildKit** (default since Docker Engine 23; `DOCKER_BUILDKIT=1` on older engines) so `RUN --mount=type=secret,id=<name>` is available for build-time credentials. `# syntax=docker/dockerfile:1` selects the frontend and does **not** enable BuildKit by itself.View the complete source on GitHubcors-security
When your agent uses it
Strict CORS: no wildcard with credentials, exact-match origin allowlists, sane preflight cache, minimal exposed headers. Use when generating CORS middleware or framework config, setting CORS headers in API Gateway, CloudFront, or Nginx, or reviewing a cross-origin browser-facing endpoint.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
1,074 tokensWhen the skill is activated
Reference documents
871 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,030 bytesSKILL.mdcore5,030 bytesmetadata.jsonasset1,040 bytesreferences/verifying-findings.mddoc3,778 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/cors-security/SKILL.md. -->
# CORS Security
Strict CORS: no wildcard with credentials, exact-match origin allowlists, sane preflight cache, minimal exposed headers. Use when generating CORS middleware or framework config, setting CORS headers in API Gateway, CloudFront, or Nginx, or reviewing a cross-origin browser-facing endpoint.
## ALWAYS
- For any non-public endpoint, allow origins from an explicit allowlist. `*` is correct only when the resource is intentionally public *and* cross-origin access never carries credentials.
- When a cross-origin request carries credentials — the browser's credentials mode is `include`, meaning cookies, TLS client certificates, or browser-managed HTTP auth — respond with `Access-Control-Allow-Credentials: true` and a **single explicit origin**. On a credentialed request every CORS header loses its wildcard meaning: `*` in `Allow-Origin`, `Allow-Methods`, `Allow-Headers`, or `Expose-Headers` is read as the literal string `"*"` and the browser blocks the response. That is why "just set it to `*` for now" fails in a way that is hard to debug.
- Compare origins by exact match on the **serialized** origin — scheme, host, and port, all three. Never substring, prefix, or suffix matching: `endsWith("example.com")` accepts `https://example.com.evil.com`, and an unescaped `.` in `^https://api.example.com$` accepts `https://apiXexample.com`.
- Include `Vary: Origin` on any response whose headers depend on the request `Origin`, so a shared cache cannot hand one origin's `Access-Control-Allow-Origin` to another.
[Credential-related source omitted]View the complete source on GitHubcrypto-misuse
When your agent uses it
Block weak ciphers, predictable RNG, undersized keys, fast-hash password storage, nonce reuse, and non-constant-time comparison. Use when generating code that hashes, encrypts, or signs, code that compares secrets, MACs, or tokens, or config for key sizes and randomness.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
1,598 tokensWhen the skill is activated
Reference documents
1,110 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,143 bytesSKILL.mdcore7,143 bytesmetadata.jsonasset1,113 bytesreferences/verifying-findings.mddoc4,833 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/crypto-misuse/SKILL.md. -->
# Cryptographic Misuse
Block weak ciphers, predictable RNG, undersized keys, fast-hash password storage, nonce reuse, and non-constant-time comparison. Use when generating code that hashes, encrypts, or signs, code that compares secrets, MACs, or tokens, or config for key sizes and randomness.
## ALWAYS
- Use a maintained, widely reviewed cryptographic API — the platform's own (Node `crypto`, Java JCE, .NET `System.Security.Cryptography`, Go `crypto/*`) or a reputable third-party one (PyCA `cryptography`, `golang.org/x/crypto`, Bouncy Castle). Prefer high-level, misuse-resistant APIs over assembling low-level primitives yourself. In Python, `from Crypto…` resolves to either the abandoned `pycrypto` or its maintained fork `pycryptodome` depending on what is installed — the import line is identical, so depend on `pycryptodome` explicitly.
- Use a cryptographically secure RNG for anything security-relevant: Python `secrets.token_bytes` / `secrets.token_urlsafe`, JS `crypto.getRandomValues` / `crypto.randomBytes`, Go `crypto/rand.Read`, Java `SecureRandom`.
- Hash passwords with a password-specific KDF and a unique random salt per password. Prefer Argon2id; scrypt where appropriate; bcrypt for legacy compatibility; PBKDF2-HMAC-SHA-256 where FIPS-140 compliance is required. Take minimum parameters from the current [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html), then benchmark on production hardware and choose the highest cost that still meets the application's authentication latency and availability budget. The cost is meant to be raised over time as hardware gets cheaper — it is not a constant to copy once.
- Account for bcrypt's 72-byte input limit: it silently truncates, so a long passphrase and its 72-byte prefix hash identically. If bcrypt must take unbounded input, pre-hash with SHA-256 and pass the digest **base64-encoded**, never as raw bytes — a raw digest can contain a NUL byte, which truncates the input again.
- Encrypt with a vetted AEAD: AES-GCM or ChaCha20-Poly1305, or AES-GCM-SIV where nonce-misuse resistance is specifically useful and the platform ships a reviewed implementation. Absent a stated key-size requirement, AES-256-GCM or ChaCha20-Poly1305 is a safe default — AES-128-GCM is not a finding.View the complete source on GitHubdatabase-security
When your agent uses it
Prevent SQL and NoSQL injection, unsafe ORM and raw-query use, over-privileged database identities, weak tenant isolation, and unauthenticated database transport. Use when generating SQL or raw query strings, NoSQL filters, ORM models or queries, database migration files, or connection strings.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
1,344 tokensWhen the skill is activated
Reference documents
1,775 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,758 bytesSKILL.mdcore6,758 bytesmetadata.jsonasset1,427 bytesreferences/orm-safe-query-examples.mddoc4,806 bytesreferences/verifying-findings.mddoc2,331 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/database-security/SKILL.md. -->
# Database Security
Prevent SQL and NoSQL injection, unsafe ORM and raw-query use, over-privileged database identities, weak tenant isolation, and unauthenticated database transport. Use when generating SQL or raw query strings, NoSQL filters, ORM models or queries, database migration files, or connection strings.
## ALWAYS
- Bind every untrusted data value through the driver or ORM parameter API. Never place it into SQL with language-level interpolation or concatenation — `+`, f-strings, `%` formatting, `.format()`, JavaScript template interpolation. Driver placeholders (`%s`, `?`, `$1`, `:name`, `@name`) are the binding *mechanism*, not string formatting; confusing the two is how this rule is most often misread. The same applies to values read back out of the database and used to build a later query: stored input is still input, and second-order injection is this bug with a delay.
- Prefer the ORM's structured query-expression API over textual SQL. Where raw SQL is genuinely needed, use that framework's documented parameter-binding mechanism and never interpolate untrusted values into it. `references/orm-safe-query-examples.md` carries the verified form per framework.
- For SQL structure that cannot be a bind parameter — table and column identifiers, sort direction, sometimes the operator itself — map the external value to a fixed operator-controlled allowlist. Never copy an untrusted identifier or SQL fragment into the statement, escaped or not.
- Treat a NoSQL query as a structure, not a string. Build filters with the driver's typed query objects, and coerce every request-supplied value to its expected scalar type before it reaches a filter. A JSON body substituting `{"$ne": null}` where a string was expected turns an equality check into a match-all — operator injection needs no quote to break out of.
- Give each application its own database identity with the minimum grants it needs, and separate runtime privileges from migration privileges. The runtime identity must not receive schema-owner or DDL rights merely because migrations require them.View the complete source on GitHubdeserialization-security
When your agent uses it
Block unsafe deserialization and unsafe XML parsing in Java, Python, .NET, PHP, and Ruby: gadget chains, unrestricted type resolution, external entity expansion, and safer formats. Use when parsing or deserializing data from an untrusted source, wiring cookies, sessions, queues, or RPC payloads, or reviewing pickle, unserialize, Marshal, ObjectInputStream, BinaryFormatter, or XML parser configuration.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
905 tokensWhen the skill is activated
Reference documents
4,121 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore4,577 bytesSKILL.mdcore4,577 bytesmetadata.jsonasset1,450 bytesreferences/dotnet.mddoc1,945 bytesreferences/java.mddoc3,581 bytesreferences/php-ruby.mddoc2,481 bytesreferences/python.mddoc2,670 bytesreferences/verifying-findings.mddoc3,764 bytesreferences/xml.mddoc3,409 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/deserialization-security/SKILL.md. -->
# Deserialization Security
Block unsafe deserialization and unsafe XML parsing in Java, Python, .NET, PHP, and Ruby: gadget chains, unrestricted type resolution, external entity expansion, and safer formats. Use when parsing or deserializing data from an untrusted source, wiring cookies, sessions, queues, or RPC payloads, or reviewing pickle, unserialize, Marshal, ObjectInputStream, BinaryFormatter, or XML parser configuration.
## ALWAYS
- Prefer data-only serialization formats — JSON, Protobuf, MessagePack with an explicit type map — over formats that reconstruct arbitrary runtime objects. What makes a format safe here is not schema validation; it is whether the parser can instantiate a class the payload names.
- Constrain polymorphic type resolution to an explicit set of expected application types. Never let payload data choose the runtime class — that is the mechanism behind every gadget chain, whichever serializer is involved.
- Treat an object-reconstructing deserializer crossing a trust boundary as high risk: `pickle`, `ObjectInputStream`, `BinaryFormatter`, `unserialize`, `Marshal.load` and their framework equivalents. Adding one to a request-handling path needs explicit review — check the platform reference for the exact API and the version behaviour before accepting or remediating a use.
- Disable external entity resolution and DTD processing on every XML parser that receives untrusted input. A parser that resolves entities is a file-read and server-side request primitive before it is a parser; `ssrf-prevention` owns where the outbound request lands.
- Where serialized state carries a signature or MAC, verify it **before** invoking the deserializer — and treat that as defense in depth, not a licence to keep an unsafe format. `crypto-misuse` owns the signing key, its algorithm and its rotation.View the complete source on GitHubdynamic-verification
When your agent uses it
Confirm or refute a vulnerability candidate against a live target with a deterministic probe, respecting authorization and scope. Use when a SAST or LLM review flags a possible injection or SSRF, when triaging a finding before filing a bug or shipping a fix, or when a verification result turns out wrong.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
1,132 tokensWhen the skill is activated
Reference documents
1,141 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,051 bytesSKILL.mdcore5,051 bytesmetadata.jsonasset1,191 bytesreferences/oracles-by-class.mddoc4,524 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/dynamic-verification/SKILL.md. -->
# Verify Findings
Confirm or refute a vulnerability candidate against a live target with a deterministic probe, respecting authorization and scope. Use when a SAST or LLM review flags a possible injection or SSRF, when triaging a finding before filing a bug or shipping a fix, or when a verification result turns out wrong.
## ALWAYS
- Treat a static-analysis or LLM-review hit as a *candidate*, not a vulnerability, until a probe with a deterministic oracle confirms it against a live target.
- Prefer an oracle that proves server-side behaviour over one that inspects the response text: out-of-band callbacks (SSRF, blind command injection, XXE) and timing deltas (blind SQLi, command injection) catch *blind* bugs that leave no trace in the body.
- Re-confirm any timing-based result a second time before trusting it — one slow response is noise, a repeatable delay over baseline is signal.
- For reflected oracles (XSS, SSTI), require the dangerous form: XSS confirms only when the payload comes back UNESCAPED; SSTI confirms only when the arithmetic is EVALUATED (the product appears as a standalone number and the raw expression does not).
- Pin file-read oracles (path traversal) to a content signature of a known system file (`root:…:0:0:` from `/etc/passwd`, `[fonts]` from `win.ini`), never to a generic 200/404.View the complete source on GitHubelectron-security
When your agent uses it
Harden Electron: renderer trust boundary (nodeIntegration, contextIsolation, sandbox), build-time fuses, contextBridge and IPC allowlists, shell.openExternal, navigation guards, deep-link auth, safeStorage. Use when generating main-process code, a preload script, or custom-protocol handlers, when packaging a release, or when storing tokens in an Electron app.
What it loads into context
Frontmatter
81 tokensAlways available to the agent
SKILL.md
1,730 tokensWhen the skill is activated
Reference documents
2,117 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,885 bytesSKILL.mdcore7,885 bytesmetadata.jsonasset1,521 bytesreferences/electron-hardening.mddoc4,627 bytesreferences/verifying-findings.mddoc4,345 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/electron-security/SKILL.md. -->
# Electron Desktop Security
Harden Electron: renderer trust boundary (nodeIntegration, contextIsolation, sandbox), build-time fuses, contextBridge and IPC allowlists, shell.openExternal, navigation guards, deep-link auth, safeStorage. Use when generating main-process code, a preload script, or custom-protocol handlers, when packaging a release, or when storing tokens in an Electron app.
## ALWAYS
- **Treat the renderer as untrusted.** Any renderer-side code execution — XSS in rendered content, a redirect, a deep link — must not be able to reach Node, the shell, the filesystem, or session tokens. Every other rule here follows from this one, and every IPC sink you expose is reachable from a compromised renderer.
- Keep the renderer's process isolation at its defaults rather than restoring them: `nodeIntegration: false`, `contextIsolation: true` and `sandbox: true` have been Electron's defaults for several major versions, so the finding is the line that **turns one off**. Note the coupling: under `sandbox: true` a preload gets a polyfilled module subset, so a preload needing `fs` fails — move that work behind IPC into the main process, never drop the sandbox.
- Set the packaging **fuses** on release builds: disable `RunAsNode`, `EnableNodeCliInspectArguments` and `EnableNodeOptionsEnvironmentVariable`. With `RunAsNode` on, an attacker runs your signed binary as a plain Node process and every renderer-side control above becomes irrelevant — a build-time setting no runtime hardening substitutes for.
- Expose a **minimal, typed** API from the preload via `contextBridge.exposeInMainWorld`. Expose named functions only — never hand the renderer `ipcRenderer`, `require`, `process`, or whole modules. Do not add `@electron/remote`: it restores the main-process object access that was removed from core precisely because it defeats the boundary.
- Validate **every** IPC argument in the main-process handler: type-check, bound, and allowlist. The renderer is an attacker-controlled input source.View the complete source on GitHuberror-handling-security
When your agent uses it
Decide what an error tells the client and what stays server-side: no stack traces, SQL, or paths in responses, no silent suppression, and no distinction between outcomes that would reveal protected state. Use when generating HTTP, GraphQL, or RPC error handlers, exception, panic, or rescue blocks, or configuring production error pages.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
901 tokensWhen the skill is activated
Reference documents
1,588 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore4,480 bytesSKILL.mdcore4,480 bytesmetadata.jsonasset1,214 bytesreferences/framework-error-pages.mddoc3,863 bytesreferences/verifying-findings.mddoc3,206 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/error-handling-security/SKILL.md. -->
# Error-Handling Security
Decide what an error tells the client and what stays server-side: no stack traces, SQL, or paths in responses, no silent suppression, and no distinction between outcomes that would reveal protected state. Use when generating HTTP, GraphQL, or RPC error handlers, exception, panic, or rescue blocks, or configuring production error pages.
## ALWAYS
- Catch exceptions at the boundary — HTTP handler, RPC method, message consumer — and decide *there* what crosses to the client and what stays server-side. Record the failure with a correlation ID under `logging-security`'s policy; do not bypass its redaction rules to attach "full context", which is how request bodies, cookies and tokens end up in logs.
- Put only client-actionable information in an external error: a stable error code, a short human-readable message, and the correlation ID. Anything the caller cannot act on belongs in the log entry that shares that ID.
- Keep responses **consistent within an error class**, and make security-equivalent outcomes externally indistinguishable. Different classes may and should differ — `400 VALIDATION_FAILED`, `401`, `403`, `409`, `429` are not a finding. What must not differ is a pair of outcomes whose distinction reveals protected state: whether an account exists, whether a record the caller may not see is present. `auth-security` owns making the login paths cost the same; this rule owns what they return.
- Disable developer error pages and detailed exception rendering in every non-development environment, and route unhandled errors through the framework's production error handler. This is a wiring decision, not the same thing as an environment variable reading `production` — the setting and its name differ per framework, and `references/framework-error-pages.md` has them.
- Render every external error through one helper, so the sanitization rules live in a single place instead of being re-derived at each handler.View the complete source on GitHubfile-upload-security
When your agent uses it
Accept, store, process, and serve user uploads safely: type-appropriate content validation, decompression limits, generated storage keys, quarantine before publication, isolated media processing, and scoped direct-to-storage credentials. Use when generating a file-upload endpoint, wiring presigned or SAS uploads to S3, GCS, or Azure Blob, processing user-supplied images or documents, or serving user-generated content.
What it loads into context
Frontmatter
90 tokensAlways available to the agent
SKILL.md
1,362 tokensWhen the skill is activated
Reference documents
2,545 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,510 bytesSKILL.mdcore6,510 bytesmetadata.jsonasset1,423 bytesreferences/direct-upload.mddoc3,112 bytesreferences/format-handling.mddoc4,597 bytesreferences/verifying-findings.mddoc3,517 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/file-upload-security/SKILL.md. -->
# File Upload Security
Accept, store, process, and serve user uploads safely: type-appropriate content validation, decompression limits, generated storage keys, quarantine before publication, isolated media processing, and scoped direct-to-storage credentials. Use when generating a file-upload endpoint, wiring presigned or SAS uploads to S3, GCS, or Azure Blob, processing user-supplied images or documents, or serving user-generated content.
## ALWAYS
- Put every new upload in a **non-public quarantine** location, and do not expose it, link it, index it, or hand it to a downstream workflow until validation has succeeded. Quarantine → validate → process → publish, in that order. This is the invariant the rest of these rules hang from, and the one direct-to-storage uploads most often skip.
- Validate content **server-side with checks appropriate to the format**. Where a format has a reliable signature, verify it; for container and document formats — DOCX, XLSX and ZIP are all ZIP at the container level — also validate structure against the format you expect. Text-based formats such as SVG and CSV have no signature to check at all, so a signature check alone is not a content policy. The client's `Content-Type` and the filename are attacker-controlled and are never the check.
- Keep a **per-endpoint allowlist** of accepted types and deny everything else. Deny `image/svg+xml` by default: an SVG is a document that can carry script. Where an endpoint genuinely requires SVG, treat it as active content — rasterize it, or run a maintained **SVG-aware** sanitizer with an explicit element, attribute, URL and CSS allowlist. A generic HTML sanitizer is the wrong tool for it.
- Bound the **expansion**, not only the upload. For archives and compressed or container formats, cap expanded bytes, entry count, nesting depth, compression ratio, per-entry size and processing time, and reject before extracting when the projected expansion exceeds policy. A limit on the compressed bytes says nothing about what they become (CWE-409).
- Store under an **application-generated identifier** — a UUID or content hash — outside the executable or web document root, and never build the storage path from the user-supplied name. Keep the original filename as bounded metadata only, and encode it for the specific output context where it is displayed. There is no "escaped at rest" that is safe in every context.View the complete source on GitHubfrontend-security
When your agent uses it
Browser-side hardening: XSS and safe text binding, per-sink URL policy, DOM clobbering, nonce-based CSP, Trusted Types, subresource integrity, iframe capability minimization, postMessage validation, and where client state may live. Use when generating HTML, JSX, Vue, or Svelte templates, setting response headers in a web app, embedding third-party scripts or frames, or storing anything client-side.
What it loads into context
Frontmatter
94 tokensAlways available to the agent
SKILL.md
1,632 tokensWhen the skill is activated
Reference documents
2,268 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,488 bytesSKILL.mdcore7,488 bytesSKILL.mdcore7,488 bytesmetadata.jsonasset1,545 bytesreferences/browser-controls.mddoc6,071 bytesreferences/verifying-findings.mddoc3,363 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/frontend-security/SKILL.md. -->
# Frontend Security
Browser-side hardening: XSS and safe text binding, per-sink URL policy, DOM clobbering, nonce-based CSP, Trusted Types, subresource integrity, iframe capability minimization, postMessage validation, and where client state may live. Use when generating HTML, JSX, Vue, or Svelte templates, setting response headers in a web app, embedding third-party scripts or frames, or storing anything client-side.
## ALWAYS
- Render untrusted data through the framework's ordinary text interpolation, which escapes for the output context. Do not reach for a raw-HTML API merely to display user data. Where rich HTML genuinely must be rendered, put it through a maintained sanitizer (DOMPurify) with an explicit allowlist first.
- Validate URL-bearing attributes **per sink**, not against one global scheme list. A navigation target (`href`, `action`, `formaction`, an `<iframe src>`) and an image source do not share a trust model: `javascript:` is never acceptable anywhere, while a narrowly constrained `data:image/…` or `blob:` may be exactly what an image sink requires. Decide the permitted schemes for each sink and check against that list.
- Read security-sensitive configuration and control-flow values from lexical variables or an object you own — never from a named `window` / `document` property (`window.config`, `document.redirectTo`, an implicit global). The browser exposes elements by `id` and `name` as named properties, so injected markup can shadow the value your code expected. An explicit `getElementById()` lookup is not the problem; trusting an ambient global is. Type-check what you read before using it in a privileged way.
- Build the `Content-Security-Policy` around a **nonce or hash as the trust root**: `script-src 'nonce-{value}' 'strict-dynamic'; object-src 'none'; base-uri 'none'`. Keeping `'self'` beside the nonce means every same-origin script is still trusted — that is a host-allowlist policy wearing a nonce, which may be the right trade-off but is not a strict CSP, so do not call it one. Generate the nonce from a CSPRNG afresh for **every HTML response**, and apply it only to scripts the server itself authorizes.
- Where you deploy Trusted Types, enforce `require-trusted-types-for 'script'` **and** restrict which policies may exist with the `trusted-types` directive. The first makes DOM sinks demand a typed value; without the second, any code can mint a pass-through policy (`createHTML: s => s`) and the guarantee is gone. Keep policies few, named, and centrally reviewed.View the complete source on GitHubgraphql-security
When your agent uses it
Bound and control a GraphQL endpoint: operation cost budgets, cost-based rate limiting, pre-registered operations, alias and batch abuse on authentication paths, introspection, cache keying, and untyped scalar inputs. Use when generating schemas, resolvers, or server config, wiring limits or persisted operations, or reviewing a public /graphql endpoint.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
1,187 tokensWhen the skill is activated
Reference documents
1,878 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,832 bytesSKILL.mdcore5,832 bytesmetadata.jsonasset1,373 bytesreferences/graphql-limits.mddoc4,810 bytesreferences/verifying-findings.mddoc3,332 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/graphql-security/SKILL.md. -->
# GraphQL Security
Bound and control a GraphQL endpoint: operation cost budgets, cost-based rate limiting, pre-registered operations, alias and batch abuse on authentication paths, introspection, cache keying, and untyped scalar inputs. Use when generating schemas, resolvers, or server config, wiring limits or persisted operations, or reviewing a public /graphql endpoint.
## ALWAYS
- Enforce a **cost budget** on every operation: a maximum depth, plus a complexity score that weights list fields by the page size they can request. Derive the numbers from your own schema and measure them — a depth of 7 is generous for a flat schema and far too permissive for one with a many-to-many edge, where five levels of nesting can address billions of nodes. `references/graphql-limits.md` covers how to derive them and where each server configures them.
- Rate-limit by **cost consumed**, not by request count. Every operation arrives at the same URL, so the per-route limit `api-security` specifies cannot tell a trivial query from one costing a thousand times more. Charge the complexity score against the caller's budget.
- For a public or high-traffic API, restrict it to **pre-registered operations** — a build-time allowlist of the documents the client bundle actually contains, keyed by hash. Automatic Persisted Queries are **not** this: APQ lets a client register any operation it likes and then send its hash, which is a bandwidth optimization. Turning on APQ and believing the API is now allowlisted is a common and expensive mistake.
- Cap aliases per operation and operations per batch, and apply that counting to **authentication and other rate-limited paths**. One request carrying a hundred aliased `login` fields is a hundred attempts against any counter that increments once per request — this is the mechanism behind the account-takeover-by-batching incidents, not a bandwidth concern.
- Batch resolver fetches with a DataLoader or a join. An N+1 resolver turns one cheap-looking query into a database round trip per parent row — the same amplification the cost limit exists to bound, except it happens below the cost analysis where that limit cannot see it.View the complete source on GitHubiac-security
When your agent uses it
Terraform, CloudFormation, and Pulumi hardening: state as a secret store, pinned providers and modules, encryption and network defaults, drift, and the privilege of the pipeline that applies the plan. Use when generating infrastructure code, reviewing IaC changes in a pull request, configuring a state backend, or setting up a new cloud account or workspace.
What it loads into context
Frontmatter
79 tokensAlways available to the agent
SKILL.md
1,123 tokensWhen the skill is activated
Reference documents
1,918 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,287 bytesSKILL.mdcore5,287 bytesSKILL.mdcore5,287 bytesSKILL.mdcore5,287 bytesSKILL.mdcore5,287 bytesSKILL.mdcore5,287 bytesmetadata.jsonasset1,299 bytesreferences/backends-and-state.mddoc4,291 bytesreferences/verifying-findings.mddoc3,440 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/iac-security/SKILL.md. -->
# Infrastructure-as-Code Security
Terraform, CloudFormation, and Pulumi hardening: state as a secret store, pinned providers and modules, encryption and network defaults, drift, and the privilege of the pipeline that applies the plan. Use when generating infrastructure code, reviewing IaC changes in a pull request, configuring a state backend, or setting up a new cloud account or workspace.
## ALWAYS
- Treat the **state file as a secret store**. Every value that passes through Terraform — a generated password, an RDS master credential, a private key, the contents of a data source — is written to state in plaintext. `sensitive = true` only hides a value from CLI output; it changes nothing about what is stored. So read access to the backend is read access to those secrets, and the backend's access policy has to be written on that basis.
- Configure a **remote backend** with encryption at rest, state locking, and versioning. Prefer the backend's own locking where it exists — recent Terraform supports S3-native locking, so a separate DynamoDB lock table is no longer required for new stacks. `references/backends-and-state.md` has the per-backend form.
- Pin providers and modules to an exact version or a pessimistic constraint (`~> 5.42`), and pin a third-party module sourced from a git URL to a **commit SHA**, not a branch or tag. A module is code that runs with your apply credentials, and a registry or repository you do not control is a supply-chain input like any other.
- Give the **apply identity** the least privilege that the stack actually needs, and keep it separate from the plan identity. A pipeline role with account-wide admin turns any CI compromise into a full account compromise — `cicd-security` owns hardening the pipeline itself, `iam-best-practices` owns the role's shape.
- Encrypt persistent resources by default with a customer-managed key: object storage, block storage, managed databases, queues, log groups. Prefer a module or default that applies it, so a new resource is encrypted because of how the code is organised rather than because someone remembered.View the complete source on GitHubiam-best-practices
When your agent uses it
Least-privilege cloud IAM: policy scope, privilege-escalation paths, permissions boundaries, workload identity over static keys, MFA enforced by policy, cross-account trust, and separating deploy from runtime. Use when generating IAM policies, roles, or trust documents, wiring CI/CD service accounts or workload identities, delegating role creation, or designing cross-account access.
What it loads into context
Frontmatter
83 tokensAlways available to the agent
SKILL.md
1,382 tokensWhen the skill is activated
Reference documents
1,903 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,674 bytesSKILL.mdcore6,674 bytesmetadata.jsonasset1,480 bytesreferences/escalation-paths.mddoc4,769 bytesreferences/verifying-findings.mddoc3,174 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/iam-best-practices/SKILL.md. -->
# Identity & Access Management Best Practices
Least-privilege cloud IAM: policy scope, privilege-escalation paths, permissions boundaries, workload identity over static keys, MFA enforced by policy, cross-account trust, and separating deploy from runtime. Use when generating IAM policies, roles, or trust documents, wiring CI/CD service accounts or workload identities, delegating role creation, or designing cross-account access.
## ALWAYS
- Grant the minimum permissions the workload's stated job requires: deny by default, then add concrete actions against concrete resources. A wildcard action on a wildcard resource — in a custom policy, in `AdministratorAccess`, or in `iam:*` attached to something that runs continuously — is the same finding wearing three different names.
- Read a policy for the **privileges it can reach**, not only the ones it names. A principal that can write policy (`iam:PutRolePolicy`, `iam:AttachRolePolicy`, `iam:CreatePolicyVersion`) can grant itself anything, and a principal that can pass a role into a compute service it may also create (`iam:PassRole` with `lambda:CreateFunction`, `ec2:RunInstances`, `glue:CreateJob`) inherits that role's privileges. These read as narrow grants and are administrative ones. `references/escalation-paths.md` lists the combinations worth failing a review over.
- Bound delegated permissions with a **permissions boundary** or an organization-level policy (SCP, GCP org policy, Azure management-group policy) when teams may create their own roles. The boundary caps what any role they create can do, which is what makes self-service role creation safe rather than a privilege-escalation primitive.
- Prefer **workload identity** — IRSA on EKS, GKE Workload Identity, Azure Managed Identity, OIDC federation from CI — over a static key. The goal is that no long-lived credential exists to leak. Where one is genuinely unavoidable, give it a documented rotation cadence and automatic disablement on inactivity, and treat that as a temporary state rather than the steady state.
- Enforce MFA for human principals through a **policy condition** (`aws:MultiFactorAuthPresent`), not only a directory setting, so a credential that bypasses the directory still cannot act.View the complete source on GitHubllm-app-security
When your agent uses it
Securing a feature that calls an LLM: prompt injection as an unsolved input problem, bounding what model output is allowed to reach, tool authorization against the human rather than the model, approval gates on consequential actions, RAG context provenance, system-prompt leakage, and cost limits. Use when sending prompts to an LLM API, building a RAG pipeline, giving a model tools, rendering or executing model output, or exposing an LLM-backed endpoint.
What it loads into context
Frontmatter
103 tokensAlways available to the agent
SKILL.md
1,345 tokensWhen the skill is activated
Reference documents
775 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,645 bytesSKILL.mdcore6,645 bytesmetadata.jsonasset1,559 bytesreferences/verifying-findings.mddoc3,520 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/llm-app-security/SKILL.md. -->
# LLM Application Security
Securing a feature that calls an LLM: prompt injection as an unsolved input problem, bounding what model output is allowed to reach, tool authorization against the human rather than the model, approval gates on consequential actions, RAG context provenance, system-prompt leakage, and cost limits. Use when sending prompts to an LLM API, building a RAG pipeline, giving a model tools, rendering or executing model output, or exposing an LLM-backed endpoint.
## ALWAYS
- Start from the premise that **prompt injection is not solved at the prompt layer**. A model has no privileged channel: system text, user text, a retrieved document and a tool result all arrive as one context, and nothing in that context can be marked as instructions the model must obey over the rest. Message roles are a formatting convention, delimiters raise the cost of an attack, and an instruction such as "treat the following as data" is itself just more text in the same window. Design as though injection will sometimes succeed, and put the real controls after the model rather than in front of it.
- Bound what the model's output is **allowed to reach**. Every downstream sink — a query builder, a shell, a file writer, an HTTP client, a renderer — must validate model output exactly as it would validate a request body from the internet, because that is what it is once injection is assumed. `secure-code-review`, `database-security` and `frontend-security` own the individual sinks; what belongs here is that model output never arrives pre-trusted.
- Constrain the output's **shape** with structured generation — a JSON Schema, function-call mode, constrained decoding — whenever the next step consumes it programmatically, and reject anything that fails validation rather than repairing it. A schema bounds the form, not the intent: a well-formed field can still carry a hostile value, so validate the value too.
- Authorize each tool call against the **human user's** permissions, checked at call time, not against what the model was told it may do. The tool allowlist is a capability list, not an authorization decision — and the agent's own privileges are the attack surface, because injected content drives the agent that holds them. Keep the agent's identity narrow for the same reason `iam-best-practices` keeps a pipeline role narrow.
- Put a **human approval gate** in front of consequential and irreversible actions: moving money, deleting or overwriting data, sending messages on a user's behalf, publishing, changing permissions. Injection that reaches a read-only tool is an information problem; injection that reaches a write tool is an incident. The gate is what keeps a single injected instruction from being final.View the complete source on GitHublogging-security
When your agent uses it
Keep secrets and personal data out of logs at the call site rather than relying on redaction, neutralize log and field injection, record audit events that survive, and treat log read access as data access. Use when generating logger calls or structured-logging schemas, wiring log shippers, sinks, retention, and access controls, or specifying audit-logging requirements.
What it loads into context
Frontmatter
80 tokensAlways available to the agent
SKILL.md
1,137 tokensWhen the skill is activated
Reference documents
895 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,447 bytesSKILL.mdcore5,447 bytesmetadata.jsonasset1,273 bytesreferences/verifying-findings.mddoc3,877 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/logging-security/SKILL.md. -->
# Logging Security
Keep secrets and personal data out of logs at the call site rather than relying on redaction, neutralize log and field injection, record audit events that survive, and treat log read access as data access. Use when generating logger calls or structured-logging schemas, wiring log shippers, sinks, retention, and access controls, or specifying audit-logging requirements.
## ALWAYS
- Decide what is safe to log **at the call site**, and log a reference rather than a value: an id, a hash, a type, a count. A redactor is the last net, not the design — it matches field names and known patterns, so it cannot see personal data sitting inside an assembled string. A formatted notification body, a templated message, an exception with interpolated arguments: the name and the address are in the prose, in no named field, matching no pattern. Nothing downstream will catch that.
- Run a **redactor** at the sink anyway, for the cases the call site missed: credential-shaped values, `Authorization` and `Cookie` headers, query strings carrying tokens, and the personal-data patterns in `rules/redaction_patterns.json`. `secret-detection` owns which literals count as a credential; this rule is that the redactor exists and runs before anything leaves the process.
- Log in a **structured format** (JSON or logfmt) with stable field names — `timestamp`, `service`, `version`, `level`, `trace_id`, `span_id`, `request_id`, `event`, and `user_id` when there is an authenticated one. Structure is what makes redaction, retention, and access control expressible per field instead of per line.
- Neutralize user-controlled strings before they enter a log record. Line injection (CWE-117) is the classic case — a `\n` or `\r` lets an attacker forge a whole record — but structured logging moves the problem: a value that parses as JSON can inject *fields* into the ingested document, and ANSI escape sequences (`\x1b[`) are interpreted by the terminal of whoever reads the log. Encode the value; do not concatenate it into the line.
- Record security-relevant events as **immutable audit records**: authentication success and failure, MFA challenges, password and role changes, permission grants and revocations, data export, administrative action. These carry longer retention and stricter access than operational logs, and they are the reason failed logins must keep being written even when someone calls them noise.View the complete source on GitHubml-security
When your agent uses it
The model and data artifacts: checkpoint formats that execute code on load, provenance for a model you did not train, training-data poisoning and the ingestion controls that bound it, PII that survives into weights, and notebooks that commit their own output. Use when loading a model from disk, a Hub, or object storage, ingesting user content for training or fine-tuning, or writing training, evaluation, or notebook code.
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
1,313 tokensWhen the skill is activated
Reference documents
2,314 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,351 bytesSKILL.mdcore6,351 bytesSKILL.mdcore6,351 bytesSKILL.mdcore6,351 bytesSKILL.mdcore6,351 bytesmetadata.jsonasset1,417 bytesreferences/artifacts-and-provenance.mddoc6,384 bytesreferences/verifying-findings.mddoc3,592 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/ml-security/SKILL.md. -->
# ML Model Security
The model and data artifacts: checkpoint formats that execute code on load, provenance for a model you did not train, training-data poisoning and the ingestion controls that bound it, PII that survives into weights, and notebooks that commit their own output. Use when loading a model from disk, a Hub, or object storage, ingesting user content for training or fine-tuning, or writing training, evaluation, or notebook code.
## ALWAYS
- Prefer a **tensor-only format** — safetensors — for anything you load. It stores arrays and metadata and has no mechanism for executing code, which is the property that matters. A `.pt`, `.pkl`, `.bin`, `.ckpt` or `joblib` artifact is a pickle: loading it runs whatever the author put in it, before you see a single weight.
- Pass `weights_only=True` to `torch.load` **explicitly**, every time. The default has changed across PyTorch releases, so code that relies on it behaves differently depending on the pin — and the flag narrows the surface without removing it, so it is a mitigation rather than a reason to load an untrusted file. `deserialization-security` owns the pickle boundary itself and the per-language detail; `references/artifacts-and-provenance.md` has the format-by-format table.
- Establish provenance before loading: the artifact's **hash matches one you recorded** from a source you decided to trust, at a revision you pinned. A hash the artifact came with proves only that the file is the file. `supply-chain-security` owns what makes a source trustworthy, and its rule holds here — a checksum served next to the download is not authentication, and an author's name is not a signature.
- Pin the Hub revision to an **immutable commit**, not a branch or tag. `main` moves, and `from_pretrained(..., revision="<sha>")` is the difference between a model you reviewed and whatever is there today. Where the loader offers `trust_remote_code`, understand that enabling it executes repository Python at load time, which is the same exposure as the pickle it was meant to avoid.
- Bound what user-contributed data can do to a model. Attribute each training record to its source, keep contributed data in a separate pool from curated data, gate promotion between them on review, and cap how much any single contributor can influence one training run. Poisoning does not need many records — it needs enough of them near one behaviour.View the complete source on GitHubmobile-security
When your agent uses it
Android and iOS hardening on a device you do not control: hardware-backed credential storage, exported components and IPC, verified deep links, transport defaults and pinning rotation, server-side attestation over client-side root detection, screen capture, and release-build hygiene — including React Native and Flutter packaging. Use when generating Android or iOS app code, manifests, or native modules, wiring deep links or WebViews, or deciding what a mobile client is trusted to assert.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,556 tokensWhen the skill is activated
Reference documents
2,274 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,543 bytesSKILL.mdcore7,543 bytesmetadata.jsonasset1,657 bytesreferences/platform-specifics.mddoc5,691 bytesreferences/verifying-findings.mddoc4,191 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/mobile-security/SKILL.md. -->
# Mobile Application Security
Android and iOS hardening on a device you do not control: hardware-backed credential storage, exported components and IPC, verified deep links, transport defaults and pinning rotation, server-side attestation over client-side root detection, screen capture, and release-build hygiene — including React Native and Flutter packaging. Use when generating Android or iOS app code, manifests, or native modules, wiring deep links or WebViews, or deciding what a mobile client is trusted to assert.
## ALWAYS
- Start from the premise that **the device belongs to whoever is holding it**. The app runs on hardware an attacker can root or jailbreak, instrument at runtime, and read at rest. Everything shipped in the package is extractable, every client-side check is removable, and every local check can be made to return the answer the attacker wants. What you actually control is the backend's willingness to act — so any decision that matters is made server-side, on evidence the server verified.
- Issue short-lived, device-scoped tokens from a backend rather than shipping an API key, signing key, or backend credential in source, resources, `strings.xml`, `BuildConfig`, or `Info.plist`. Anyone can download the package and read it.
- Keep credentials in the platform's hardware-backed store: Android Keystore (`EncryptedSharedPreferences` with a `MasterKey`), iOS Keychain with a `…ThisDeviceOnly` accessibility class — `WhenUnlocked` where the value is never needed in the background, `AfterFirstUnlock` where it is. Never `SharedPreferences`, `UserDefaults`, a plist, or a file. The store protects a key at rest on an uncompromised device; it does not protect against code running inside your process, which is why the credential should be short-lived regardless.
- **Android**: give every `<activity>`, `<service>`, `<receiver>` and `<provider>` an explicit `android:exported`, defaulting to `false`. Since API 31 the attribute is mandatory when an intent filter is present — which forces the question to be asked, not answered. An exported component is a public API of your app that any installed application can call.
- Treat data crossing an app boundary as untrusted in both directions: validate every `Intent` extra and incoming activity payload, send sensitive data with an explicit component rather than an implicit intent any app can register for, and create every `PendingIntent` as `FLAG_IMMUTABLE` so the recipient cannot rewrite its contents.View the complete source on GitHubprotocol-security
When your agent uses it
Transport security where the client establishes trust: TLS version floor, certificate chain and hostname verification, the trust store, connecting by IP, mTLS and workload identity as authentication, gRPC channel credentials, and SMTP STARTTLS. Use when generating HTTP, gRPC, or SMTP clients and servers, configuring TLS in code or platform config, wiring service-to-service authentication, or when tempted to disable certificate verification.
What it loads into context
Frontmatter
88 tokensAlways available to the agent
SKILL.md
1,264 tokensWhen the skill is activated
Reference documents
3,213 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,032 bytesSKILL.mdcore6,032 bytesmetadata.jsonasset1,384 bytesreferences/tls-configuration.mddoc9,194 bytesreferences/verifying-findings.mddoc4,018 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/protocol-security/SKILL.md. -->
# Protocol Security
Transport security where the client establishes trust: TLS version floor, certificate chain and hostname verification, the trust store, connecting by IP, mTLS and workload identity as authentication, gRPC channel credentials, and SMTP STARTTLS. Use when generating HTTP, gRPC, or SMTP clients and servers, configuring TLS in code or platform config, wiring service-to-service authentication, or when tempted to disable certificate verification.
## ALWAYS
- Default to **TLS 1.3**, and permit TLS 1.2 only where a peer genuinely requires it. Disable TLS 1.0, 1.1, and every SSL version. Cipher-suite selection is a consequence of the version floor rather than a separate decision — `references/tls-configuration.md` carries the suite lists and the per-platform config keys.
- Verify the full certificate chain on every connection: a trusted issuer, an unexpired validity window, and a hostname that matches a **`subjectAltName` dNSName** entry. The hostname is checked *against* the SAN — SAN is not an alternative place to look, and a `CN` match is not a fallback, because current browsers and TLS libraries removed CN as a hostname source.
- When connecting to an **IP address** rather than a name, set the expected name explicitly (`ServerName` in Go's `tls.Config`, the equivalent SNI/verification hostname elsewhere) so verification has something to check, or require a certificate carrying an `iPAddress` SAN. Reaching an endpoint by IP is the single most common reason a developer disables verification — this is the fix that keeps it on.
- Resolve a self-signed or internal-CA endpoint by **adding that CA to the client's trust configuration**, not by turning verification off. Every language has a way to supply a custom root pool; using it keeps hostname and expiry checks intact, which is exactly what the shortcut discards.
- Use **mutual TLS** for service-to-service traffic inside a trust domain, and treat it as what it is: a cryptographic caller identity, which *is* authentication — unlike network position, which is not. A SPIFFE workload identity (`spiffe://trust-domain/...`) with short-lived certificates is the form of this worth reaching for over a long-lived shared API key.View the complete source on GitHubsaas-security
When your agent uses it
Wiring your application to a third-party SaaS platform: verifying an inbound webhook against the vendor's own scheme rather than a generalized one, why a valid signature identifies the sender and not the user in the payload, replay windows, one credential per integration and per environment, least-privilege scopes, and treating a bulk export as a data boundary. Use when writing a webhook receiver, an OAuth integration, a SCIM endpoint, or any code that authenticates to or from a SaaS vendor.
What it loads into context
Frontmatter
109 tokensAlways available to the agent
SKILL.md
1,426 tokensWhen the skill is activated
Reference documents
2,068 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,997 bytesSKILL.mdcore6,997 bytesmetadata.jsonasset1,439 bytesreferences/vendor-specifics.mddoc3,963 bytesreferences/verifying-findings.mddoc4,746 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/saas-security/SKILL.md. -->
# SaaS Integration Security
Wiring your application to a third-party SaaS platform: verifying an inbound webhook against the vendor's own scheme rather than a generalized one, why a valid signature identifies the sender and not the user in the payload, replay windows, one credential per integration and per environment, least-privilege scopes, and treating a bulk export as a data boundary. Use when writing a webhook receiver, an OAuth integration, a SCIM endpoint, or any code that authenticates to or from a SaaS vendor.
## ALWAYS
- Verify an inbound webhook against **that vendor's documented scheme**, and do not generalize from another one. Vendors differ in the header, in the secret, and — the part that breaks a generalized implementation — in the **canonical string** that gets signed. Some sign the raw body, some sign a version prefix plus a timestamp plus the body, some sign the HTTP method and path as well. Read the vendor's page for the vendor you are integrating; a signature routine copied from a different vendor produces a receiver that rejects every legitimate event, and the fix someone reaches for is to turn verification off.
- Verify against the **raw request body**, exactly as received, before any parsing or re-serialization. A framework that decodes JSON and re-encodes it changes whitespace and key order, and the HMAC no longer matches — which again ends with verification being disabled rather than fixed.
- Check the **timestamp** the vendor sends and reject requests outside a short window, then reject **replays** inside it by recording delivery or event ids. A signature is valid forever; the window narrows the replay opportunity and the id store closes it.
- Compare signatures in **constant time**. `crypto-misuse` owns the comparison API for each language.
- Treat the signature as proof of **who sent the payload, not who the payload is about**. This is the distinction that matters most in this domain: a verified Zoom or Calendly or HubSpot event genuinely came from that vendor, and the `email`, `from`, or custom fields inside it may still be attacker-chosen — anyone who can book a meeting or submit a form controls them. Resolve the subject to a canonical id server-side. `auth-security` owns the general rule for producer-asserted identity.View the complete source on GitHubsecret-detection
When your agent uses it
Keeping credentials out of source, and what to do once one is in: rotate before removing, because deleting the line does not un-leak it. Covers where a secret may live, safe .env templates, why a client-reachable config value is public, and running a scanner rather than eyeballing for patterns. Use when writing code that reads a credential, creating config or .env templates, before committing, or after discovering a secret in a repository.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
1,374 tokensWhen the skill is activated
Reference documents
607 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,760 bytesSKILL.mdcore5,760 bytesmetadata.jsonasset1,367 bytesreferences/verifying-findings.mddoc2,512 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/secret-detection/SKILL.md. -->
# Secret Detection
Keeping credentials out of source, and what to do once one is in: rotate before removing, because deleting the line does not un-leak it. Covers where a secret may live, safe .env templates, why a client-reachable config value is public, and running a scanner rather than eyeballing for patterns. Use when writing code that reads a credential, creating config or .env templates, before committing, or after discovering a secret in a repository.
## ALWAYS
- On finding a committed credential, **rotate or revoke it at the provider first**. Deleting the line does not remediate it, and neither does `git rm`, an amended commit, or a history rewrite: the value reached a remote, a clone, a fork, a CI log and a backup, and it is compromised from the moment it was pushed. Rotate, then clean the history, then add the guard that stops it recurring — in that order, because only the first one is time-critical.
- **Run a scanner**; do not scan by eye. `scan_secrets` and `check_secret_pattern` carry the full pattern set with per-pattern entropy floors and hotword proximity, and a person reading a diff matches none of that reliably. A working-tree scan and a history scan answer different questions — the first says what you are about to commit, the second says what is already public.
- Read the credential from the environment or a secret manager at the point of use — `os.environ`, `process.env`, `os.Getenv`, a Vault / AWS Secrets Manager / GCP Secret Manager / 1Password client. Nothing about the value should be reconstructible from the repository.
- Ship a **`.env.example`** that is committed and contains every key with an empty or obviously-fake value, alongside a `.env` that is ignored and never committed. The example file is documentation, so it must never be produced by copying a working `.env` and editing it — that is how a real value survives into the template.
- Ignore the file classes that carry key material, in one list: `.env`, `.env.*` (but not `.env.example`), `*.pem`, `*.key`, `*.p12`, `*.pfx`, `*.ppk`, `id_rsa*`, `id_dsa*`, `id_ecdsa*`, `id_ed25519*`, `*credentials*`, `*secret*`. A `.gitignore` entry is a guard against habit, not a control — it does nothing for a file already tracked, and `git add -f` overrides it.View the complete source on GitHubsecure-code-review
When your agent uses it
The sinks and boundaries that belong to no framework: passing input to a shell or an evaluator, letting input choose a filesystem path, validating at a boundary that is not an HTTP request, and handling regulated data (PII, PHI, cardholder data) so it does not spread into paths nobody reviews. Use when generating or reviewing code that shells out, touches the filesystem, reads a queue message, CLI argument, or parsed file, or when a change crosses a PII, PHI, or PCI boundary.
What it loads into context
Frontmatter
113 tokensAlways available to the agent
SKILL.md
1,177 tokensWhen the skill is activated
Reference documents
1,625 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,347 bytesSKILL.mdcore5,347 bytesmetadata.jsonasset1,437 bytesreferences/verifying-compliance-findings.mddoc3,971 bytesreferences/verifying-findings.mddoc3,310 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/secure-code-review/SKILL.md. -->
# Secure Code Review
The sinks and boundaries that belong to no framework: passing input to a shell or an evaluator, letting input choose a filesystem path, validating at a boundary that is not an HTTP request, and handling regulated data (PII, PHI, cardholder data) so it does not spread into paths nobody reviews. Use when generating or reviewing code that shells out, touches the filesystem, reads a queue message, CLI argument, or parsed file, or when a change crosses a PII, PHI, or PCI boundary.
## ALWAYS
- Validate input at **every** trust boundary, not only the HTTP one. A CLI argument, an environment variable, a queue message, a filename, a parsed config or spreadsheet cell all arrive from outside and none of them pass through the request-validation layer. Check type, length, allowed characters and allowed range, and reject before processing. `api-security` owns the HTTP request body and its schema; this rule is every other way input gets in.
- Build a command as an **argument vector**, never as a string a shell will parse: `subprocess.run([...])` without `shell=True`, `execFile`/`spawn` with an array, `exec.Command(name, args...)`. Passing an array is what removes the shell, and removing the shell is what removes the injection — quoting and escaping are the fallback for when you cannot.
- **Canonicalize then check** any path built from input: resolve it to an absolute real path, then confirm it is inside the intended directory. Checking the raw string first misses `..`, symlinks, absolute-path replacement, and encoded separators. `file-upload-security` owns stored uploads and archive extraction; this rule covers a static-file handler, a template loader, a log path, an export filename.
- Tag any function or module handling **PII, PHI or cardholder data** with an explicit classification comment (`// classification: PII`), and keep that handling in clearly-named modules rather than in general utility code. An untagged helper is how regulated data spreads into paths nobody reviews for it, and the tag is what makes the later review possible.
- Consult the owner for anything with one: `database-security` when code builds a query, `crypto-misuse` when it hashes, encrypts, signs or compares a secret, `frontend-security` for output encoding and response headers, `auth-security` for who the caller is, `iam-best-practices` for the privileges a process runs with. Each of those states its rule with the API names and the false positives this skill would have to leave out.View the complete source on GitHubsecurity-regression-tests
When your agent uses it
Turning a confirmed and fixed finding into a permanent guard: proving the test fails without the fix, asserting the effect and not only the status code, seeding the two principals an authorization test needs, making a timing or out-of-band proof deterministic enough for CI, and keeping the test in a job that can actually block. Use once a security finding has been confirmed and fixed, or when a security test is failing, skipped, or about to be deleted.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
1,333 tokensWhen the skill is activated
Reference documents
1,841 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,168 bytesSKILL.mdcore6,168 bytesmetadata.jsonasset1,233 bytesreferences/test-by-class.mddoc5,810 bytesreferences/where-verification-runs.mddoc2,175 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/security-regression-tests/SKILL.md. -->
# Security Regression Tests
Turning a confirmed and fixed finding into a permanent guard: proving the test fails without the fix, asserting the effect and not only the status code, seeding the two principals an authorization test needs, making a timing or out-of-band proof deterministic enough for CI, and keeping the test in a job that can actually block. Use once a security finding has been confirmed and fixed, or when a security test is failing, skipped, or about to be deleted.
## ALWAYS
- **Prove the test fails without the fix.** Revert the patch, or mutate the guard, and confirm the new test goes red — then restore. A test written after the fix can be vacuously green: wrong route, wrong fixture user, wrong assertion target, a typo in the payload. It will stay green forever and nobody will learn anything from it. This is the one step that distinguishes a guard from a decoration, and it is the one most often skipped.
- Assert **both directions**: the attack input now yields the secure outcome, *and* a legitimate input still succeeds. A deny-only test passes equally well against an endpoint that is broken for everyone, so it will hold the line and tell you nothing when someone disables the feature entirely.
- Assert the **effect**, not only the status code. A `403` proves the request was refused; it does not prove the write did not land somewhere else, that the record was not returned in a different shape, or that a queue message was not emitted. Check the state the attack was trying to reach.
- Seed the **fixtures the assertion depends on** before writing it. A cross-tenant test needs two principals and two owned resources, deterministically created — if both test users end up in the same tenant, the deny assertion is untestable and passes for the wrong reason.
- Make it **deterministic and offline**. Freeze the clock for expiry and TTL assertions, stub the HTTP client, dialer or resolver rather than reaching the network, fix random seeds, and avoid sleep-based timing assertions and state shared between tests. Note that a canonical SSRF payload such as `http://169.254.169.254/latest/meta-data/` is a *live, reachable* address on a cloud CI runner, so the naive test both leaves the sandbox and returns a different verdict on a laptop.View the complete source on GitHubserverless-security
When your agent uses it
What a function-as-a-service platform changes: an execution environment reused between invocations so /tmp and module globals outlive a request, an event envelope that is attacker-influenced whichever trigger delivered it, encrypted-at-rest configuration that the control-plane API still returns in cleartext, and concurrency as the boundary between an incident and a bill. Use when generating Lambda, Cloud Functions, or Azure Functions code, serverless.yml or SAM templates, or wiring API Gateway, EventBridge, SQS, or S3 triggers.
What it loads into context
Frontmatter
113 tokensAlways available to the agent
SKILL.md
1,427 tokensWhen the skill is activated
Reference documents
2,481 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,031 bytesSKILL.mdcore7,031 bytesSKILL.mdcore7,031 bytesmetadata.jsonasset1,542 bytesreferences/platform-settings.mddoc7,479 bytesreferences/verifying-findings.mddoc3,854 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/serverless-security/SKILL.md. -->
# Serverless Security
What a function-as-a-service platform changes: an execution environment reused between invocations so /tmp and module globals outlive a request, an event envelope that is attacker-influenced whichever trigger delivered it, encrypted-at-rest configuration that the control-plane API still returns in cleartext, and concurrency as the boundary between an incident and a bill. Use when generating Lambda, Cloud Functions, or Azure Functions code, serverless.yml or SAM templates, or wiring API Gateway, EventBridge, SQS, or S3 triggers.
## ALWAYS
- Treat the **execution environment as reused**. The platform freezes it when the handler returns and thaws it for the next invocation, which may serve a different tenant. So a module-level global holding per-request state — a decrypted payload, an authorization decision, a tenant id, a connection bound to one caller's credentials — is visible to the next request. Cache only what is safe to share, and reset or scope everything else inside the handler.
- Treat **`/tmp` as shared, persistent, and finite**. It is the only writable path, it survives across invocations in the same environment, and a fixed filename written for one user is readable by the next. Use a per-invocation subdirectory, delete it before returning, and never read back a path without having written it in the same invocation.
- Validate the **whole event, envelope included**. The trigger's identity is not authentication: an S3 object key is chosen by whoever can PUT to the bucket, SQS message attributes and EventBridge `detail` are producer-supplied, and an API Gateway authorizer context is only as trustworthy as the authorizer. Validate against an explicit schema before any code touches the payload, and where a function has more than one trigger, check the source discriminant and route by allowlist.
- Give each function its **own execution role** with only the permissions its stated job needs. `iam-best-practices` owns policy scope and the escalation paths; what is serverless-specific is one role per function, never shared, because a shared role gives every function the union of what any of them needs.
- Set concurrency deliberately, and know which control you are reaching for. **Reserved** concurrency caps a function's parallel executions and is the denial-of-wallet control; **provisioned** concurrency pre-initialises environments to remove cold starts and *bills for them whether or not they are used*. Reserved capacity is also drawn from a shared account pool, so setting it per function is a decision about the account, not just that function.View the complete source on GitHubssrf-prevention
When your agent uses it
Server-Side Request Forgery: allowlisting the destination of a server-side fetch, when re-resolution between check and connect matters, redirect and scheme bypasses, parsers that fetch on their own (XXE, SVG, HTML-to-PDF), cloud metadata, and keeping the response from becoming an oracle. Use when fetching a client-supplied URL, wiring webhooks, image proxies, PDF or preview renderers, or reviewing any HTTP-client wrapper.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,440 tokensWhen the skill is activated
Reference documents
2,318 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,518 bytesSKILL.mdcore6,518 bytesmetadata.jsonasset1,464 bytesreferences/metadata-and-egress.mddoc6,549 bytesreferences/verifying-findings.mddoc2,537 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/ssrf-prevention/SKILL.md. -->
# SSRF Prevention
Server-Side Request Forgery: allowlisting the destination of a server-side fetch, when re-resolution between check and connect matters, redirect and scheme bypasses, parsers that fetch on their own (XXE, SVG, HTML-to-PDF), cloud metadata, and keeping the response from becoming an oracle. Use when fetching a client-supplied URL, wiring webhooks, image proxies, PDF or preview renderers, or reviewing any HTTP-client wrapper.
## ALWAYS
- Constrain the destination with an **allowlist of hosts you intend to reach**, not a denylist of addresses you intend to avoid. A denylist has to enumerate every spelling of every internal address — decimal and octal IPv4, IPv6 and IPv4-mapped IPv6, a hostname whose A record is private, a public wildcard resolver like `nip.io` that encodes any address into a name — and it only has to be wrong once.
- Know which of the two controls you built, because it decides whether re-resolution matters. An **allowlist of hostnames** survives DNS rebinding: the attacker controls DNS only for names they own, and those names are not on the list. An **IP-range check** does not: the name resolves to a public address when you validate and a private one when you connect, and the two resolutions are independent. If your control is address-based, resolve once and **connect to that pinned address** — a custom dialer or transport, carrying the original hostname for SNI and `Host` — so no second lookup can occur.
- Re-validate **at every redirect hop**, or disable redirect-following entirely on fetchers that take user-supplied URLs. An allowed host answering `302` to `http://169.254.169.254/` is the single most common bypass, and it defeats a check performed only on the URL the user submitted.
- Restrict the scheme to `http` and `https` before anything else. `file://`, `gopher://`, `dict://`, `ldap://`, `jar://` and friends turn a fetcher into a file reader or a protocol-smuggling primitive.
- Keep the **user-URL fetcher and the internal fetcher as separate clients**, and make mixing them fail to compile rather than fail at runtime — distinct types in Go, Rust or TypeScript. A single client used for both eventually gets called with the wrong argument.View the complete source on GitHubsupply-chain-security
When your agent uses it
Vet dependencies before they enter the build: typosquats, dependency confusion, malicious packages, known vulnerabilities, unlocked resolution, risky install and build hooks, EOL embedded runtimes, and the authenticity and freshness of your own release channel. Use when adding or upgrading a dependency, reviewing package manifests or lockfiles, configuring package sources or internal namespaces, or publishing a package or application update.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
1,058 tokensWhen the skill is activated
Reference documents
2,884 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore5,455 bytesSKILL.mdcore5,455 bytesSKILL.mdcore5,455 bytesSKILL.mdcore5,455 bytesmetadata.jsonasset1,556 bytesreferences/ecosystem-controls.mddoc4,450 bytesreferences/verifying-findings.mddoc8,569 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/supply-chain-security/SKILL.md. -->
# Supply Chain Security
Vet dependencies before they enter the build: typosquats, dependency confusion, malicious packages, known vulnerabilities, unlocked resolution, risky install and build hooks, EOL embedded runtimes, and the authenticity and freshness of your own release channel. Use when adding or upgrading a dependency, reviewing package manifests or lockfiles, configuring package sources or internal namespaces, or publishing a package or application update.
## ALWAYS
- Verify the identity of a new dependency before adding it: registry metadata, repository URL, maintainer set, and provenance checked against the signer you *expect*. Name-similarity screening opens the question; it never answers it.
- Query the bundled malicious-package data before adding any dependency — `check_dependency`, `check_typosquat` and `lookup_vulnerability` read it, this file cannot. Match on ecosystem, normalized name **and affected version range**; an active match on the resolved version blocks.
- Treat package age, download volume, maintainer count and activity as risk signals, never as proof of trust. Defaults: a verified maintainer signal within 90 days of a package identity's first publication, plus a documented reason within 30 days.
- Lock the resolution graph for anything you deploy — commit the lockfile, install frozen in CI (`npm ci`, `--frozen-lockfile`, `pip --require-hashes`, `cargo --locked`). Lock what you deploy, range what you publish: a library's dependency metadata needs compatibility ranges.
- Restrict where packages resolve from, so an internal-only identifier cannot come from a public registry. Use the ecosystem's own mechanism — npm scope-to-registry, Gradle `exclusiveContent`, a single authoritative index for Python, which has no scope isolation at all.View the complete source on GitHubtemplate-injection
When your agent uses it
User input reaching a template compiler rather than its context: the source-versus-values distinction, double-render pipelines, template names chosen by the caller, why a template sandbox is a mitigation and not a boundary, minimizing what the render context exposes, and template-driven resource exhaustion. Use when rendering templates with user-influenced values, when a template string or template name is assembled from input, or when a product lets users author templates.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
1,322 tokensWhen the skill is activated
Reference documents
2,731 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,292 bytesSKILL.mdcore6,292 bytesSKILL.mdcore6,292 bytesSKILL.mdcore6,292 bytesmetadata.jsonasset1,630 bytesreferences/engines.mddoc7,782 bytesreferences/verifying-findings.mddoc3,579 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/template-injection/SKILL.md. -->
# Template Injection (SSTI)
User input reaching a template compiler rather than its context: the source-versus-values distinction, double-render pipelines, template names chosen by the caller, why a template sandbox is a mitigation and not a boundary, minimizing what the render context exposes, and template-driven resource exhaustion. Use when rendering templates with user-influenced values, when a template string or template name is assembled from input, or when a product lets users author templates.
## ALWAYS
- Pass user data as **bound values**, never into the template **source** string. This is the whole skill in one line: `render(tmpl, {"name": name})` is safe, `render("Hello " + name)` is SSTI. The compiler treats its source as code, and the context as data — so the only question that matters about any user value is which of the two it reaches.
- Keep the set of template sources **static and trusted**, loaded from files or constants. A template body read from a database column, an API response, or a request field is attacker-supplied code, whatever the column is called.
- Choose the template **by name from an allowlist**, never by a name the caller supplies. `render_template(user_value)` and `{% include user_value %}` are the same vulnerability as a user-supplied body: the caller picks which code runs, and on many engines the name resolves as a filesystem path, which makes it an arbitrary-file read as well.
- **Minimize the render context.** Pass the specific values the template needs, never the ambient objects — application config, settings, the request, `self`, a module, a live ORM instance. This is the control that still holds when a sandbox is escaped: an engine that cannot execute code can still print whatever it can reach, and configuration objects hold database URLs and signing keys.
- Treat a **second render pass** as compilation of whatever survived the first. If rendered output is parsed again, a user value that was inert data on pass one is `{{ }}` code on pass two. The fix is architectural — stop re-parsing rendered output. Neutralizing metacharacters before the second pass is a fallback that has to enumerate every delimiter of every engine, including ones a custom delimiter configuration introduces, and two adjacent fields can produce a delimiter that neither of them contains.View the complete source on GitHubthreat-modeling
When your agent uses it
Decide what a design must be true before code exists: naming assets and actors, locating trust boundaries, producing a written (asset, boundary, threat, control, owner) list, recording the assumptions the design rests on, and knowing when a change invalidates the model. Use when scaffolding a new feature, service, or endpoint, writing or reviewing a design doc, RFC, or ADR, or introducing a new trust boundary, integration, or data flow.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
1,553 tokensWhen the skill is activated
Reference documents
1,341 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore7,311 bytesSKILL.mdcore7,311 bytesmetadata.jsonasset1,276 bytesreferences/design-level-failures.mddoc6,232 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/threat-modeling/SKILL.md. -->
# Threat Modeling
Decide what a design must be true before code exists: naming assets and actors, locating trust boundaries, producing a written (asset, boundary, threat, control, owner) list, recording the assumptions the design rests on, and knowing when a change invalidates the model. Use when scaffolding a new feature, service, or endpoint, writing or reviewing a design doc, RFC, or ADR, or introducing a new trust boundary, integration, or data flow.
## ALWAYS
- Produce a **written list**, not an impression. One row per finding, in the design doc, the RFC, or the PR description: `(asset, boundary, threat, control, owner)` — what is worth taking, where it crosses, what could go wrong there, what stops it, and which component enforces it. A model that exists only in the reasoning that produced the code cannot be reviewed, disagreed with, or checked later.
- Name the **assets** and the **actors** first: data, funds, credentials, keys and compute on one side; users, tenants, services, admins and the attacker on the other. Every later row references one of each, which is what makes the list finite.
- Locate the **trust boundaries** — internet to application, tenant to shared store, service to service, user input to an interpreter, model output to anything that acts on it. A boundary is where data arrives from a party you do not control, and it is the unit the rest of the model is organised around.
- At each boundary, ask the six **STRIDE** questions and write down only the answers that matter: can the caller be **spoofed** (is there authentication), can the data be **tampered** with in flight, will there be a record if someone **repudiates** the action, what is **disclosed** if this crossing leaks, what happens under **denial of service**, and does anything here allow **elevation of privilege**. A category with no answer is not a gap; a category nobody asked about is.
- Write down the **assumptions the design depends on**: this gateway is the only ingress, this queue's producers are authenticated, this field is already validated upstream, this CDN strips that header. Assumptions are the part of a threat model that later becomes false without anyone noticing, and an unwritten one cannot be rechecked.View the complete source on GitHubwebsocket-security
When your agent uses it
Securing the WebSocket upgrade and the frames after it: Origin validation against Cross-Site WebSocket Hijacking, authenticating the handshake rather than the first message, the ticket pattern for browsers that cannot set headers, per-frame authorization, and resource limits on a connection that stays open. Use when generating a WebSocket, Socket.IO, SignalR, or Phoenix Channels server, wiring real-time messaging, presence, or collaborative editing, or reviewing a /ws endpoint.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
1,464 tokensWhen the skill is activated
Reference documents
2,193 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- ALWAYS
- NEVER
- KNOWN FALSE POSITIVES
- Reference files
Files
SKILL.mdcore6,932 bytesSKILL.mdcore6,932 bytesSKILL.mdcore6,932 bytesSKILL.mdcore6,932 bytesSKILL.mdcore6,932 bytesmetadata.jsonasset1,535 bytesreferences/limits-and-handshake.mddoc6,048 bytesreferences/verifying-findings.mddoc3,655 bytes
Read SKILL.md
<!-- Native skill bundle for Claude Code. Generated by `secure-vibe dev regenerate`. -->
<!-- Do not edit by hand; the source of truth is skills/websocket-security/SKILL.md. -->
# WebSocket Security
Securing the WebSocket upgrade and the frames after it: Origin validation against Cross-Site WebSocket Hijacking, authenticating the handshake rather than the first message, the ticket pattern for browsers that cannot set headers, per-frame authorization, and resource limits on a connection that stays open. Use when generating a WebSocket, Socket.IO, SignalR, or Phoenix Channels server, wiring real-time messaging, presence, or collaborative editing, or reviewing a /ws endpoint.
## ALWAYS
- Validate the **`Origin` header** on the upgrade handshake against an allowlist, and understand precisely what that buys: the browser sets `Origin` and script cannot forge it, so the check stops **Cross-Site WebSocket Hijacking** — a page on `attacker.com` opening `wss://api.example.com/ws` and inheriting the user's cookies. It buys nothing against a non-browser client, which sets any header it likes. Origin is a CSRF control, not authentication. The same-origin policy and CORS preflight do not apply to the upgrade at all, which is why this check must be written by hand.
- Authenticate the **handshake**, not the first frame. Once the upgrade completes the connection exists, has consumed the user's cookie context, and is already a resource the caller controls. A `subscribe` or `auth` message afterwards is too late.
- For a browser client, pick one of two mechanisms, because the browser `WebSocket` constructor **cannot set request headers** — there is no `Authorization` header available to you: 1. **Cookie on the upgrade** plus the `Origin` check above as the CSRF control, or 2. A **single-use ticket**: the authenticated page calls an ordinary HTTP endpoint, receives a short-lived opaque ticket bound to the user and to the intended resource, passes it in the URL, and the server **redeems and invalidates it at handshake time**. A ticket is safe in a URL precisely because replaying it fails.
- Re-authorize **every frame**, both the action and the subject it names. A frame like `{"action":"write","subjectId":"X"}` must be checked against the principal established at handshake — an authenticated socket must never be able to assert an arbitrary subject id per frame. That is per-frame BOLA, and the forged id reaches every consumer downstream of the socket that trusts it. Permissions also change while the connection is open: logout, role change, account lock, token expiry. A socket opened an hour ago carries an authorization decision an hour old.
- Bound the connection: maximum frame and message size, messages per second per connection, concurrent connections per user and per source address, and total connection lifetime after which the client must re-handshake. A WebSocket is an allocation that persists, so every limit HTTP gets per-request must be re-expressed per-connection. Concrete starting values, and the backpressure and heartbeat settings, are in `references/limits-and-handshake.md`.View the complete source on GitHubWhen your agent uses it
OWASP API Top 10 for HTTP, GraphQL, and gRPC endpoints: input validation, route rate limiting, mass assignment, response caching, and gateway-versus-service control placement. Use when generating or reviewing HTTP handlers, GraphQL resolvers, gRPC service methods, or any API endpoint change.
What it loads into context
Frontmatter
259 tokensAlways available to the agent
SKILL.md
1,406 tokensWhen the skill is activated
Reference documents
522 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore5,993 byteschecklists/auth_patterns.yamlasset4,344 byteschecklists/input_validation.yamlasset1,365 bytesreferences/verifying-findings.mddoc2,236 bytestests/corpus.jsonasset2,083 bytes
Read SKILL.md
# API Security
## Rules (for AI agents)
### ALWAYS
- Require authentication on every non-public endpoint. Default to authenticated; opt
out for genuinely public routes by explicit annotation.
- Consult `auth-security` for **who the caller is and what they may touch**. It owns
the credential (algorithm pinning, expiry, lifetime, session, CSRF) and the
permission (object-level BOLA/IDOR checks, multi-key routes, streaming subjects,
function-level role gating). Any endpoint that reads or writes a resource by id
needs it; this skill covers everything else about the endpoint.
- Validate all request inputs against an explicit schema (JSON Schema, Pydantic,
Zod, validator/v10 struct tags). Reject early; never propagate untrusted inputView the complete source on GitHubWhen your agent uses it
[Credential-related source omitted]
What it loads into context
Frontmatter
373 tokensAlways available to the agent
SKILL.md
2,029 tokensWhen the skill is activated
Reference documents
1,062 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,415 bytesSKILL.mdcore8,415 bytesreferences/verifying-findings.mddoc4,338 bytesrules/jwt_safe_config.jsonasset2,139 bytesrules/oauth_flows.jsonasset2,127 bytestests/corpus.jsonasset1,787 bytes
Read SKILL.md
# Authentication & Authorization Security
## Rules (for AI agents)
### ALWAYS
- Authorize at the **object level** — confirm the authenticated subject actually has
access to the requested resource ID, not just that they are logged in. Being signed
in is not permission to read record 4,182 (OWASP API1 — BOLA / IDOR).
- Bind object-level authorization to the **authenticated principal**, never to an
actor id echoed in the request: checking that a request-supplied
`senderId`/`ownerId`/`actedBy` is a valid member validates the *claimed* actor, not
the caller (looks like authorization, isn't).
- On `/{scopeId}/.../{subjectId}` routes, authorize the **relationship** — confirm the
subject belongs to that scope. A caller-vs-scope check alone does not authorize theView the complete source on GitHubWhen your agent uses it
Harden GitHub Actions, GitLab CI, and similar pipelines against supply-chain attacks, secret exfiltration, and pwn-request abuse. Use when authoring or reviewing workflow files, adding a third-party action, image, or script, wiring cloud or registry credentials into CI, or triaging a suspected pipeline compromise.
What it loads into context
Frontmatter
343 tokensAlways available to the agent
SKILL.md
2,126 tokensWhen the skill is activated
Reference documents
927 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,698 bytesSKILL.mdcore8,698 bytesSKILL.mdcore8,698 byteschecklists/gitlab_ci_hardening.yamlasset3,391 bytesreferences/verifying-findings.mddoc3,879 bytestests/corpus.jsonasset2,265 bytes
Read SKILL.md
# CI/CD Pipeline Security
## Rules (for AI agents)
### ALWAYS
- Pin every third-party GitHub Action by **commit SHA** (full 40-char), never by
a floating tag (`@v1`, `@main`, `@latest`) — tags can be re-pushed. The
tj-actions/changed-files March 2025 incident exfiltrated secrets from 23,000+
repositories specifically because consumers used floating tags. Same applies to
GitLab CI `include:` references and reusable workflows. Renovate / Dependabot
can keep the SHA pins fresh.
<!-- pattern: { id: gha-pin-actions-by-sha, severity: high, check: deterministic } -->
- Declare `permissions:` at the workflow or job level and default to
[Credential-related source omitted]View the complete source on GitHubWhen your agent uses it
Hardening for Dockerfiles, OCI images, Kubernetes manifests, and Helm charts. Use when generating a Dockerfile or image build, writing Kubernetes, Helm, or Kustomize manifests, or reviewing container changes in a pull request.
What it loads into context
Frontmatter
334 tokensAlways available to the agent
SKILL.md
3,659 tokensWhen the skill is activated
Reference documents
1,397 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore14,360 bytesSKILL.mdcore14,360 bytesSKILL.mdcore14,360 byteschecklists/k8s_pod_security.yamlasset2,606 bytesreferences/eol-base-images.mddoc1,644 bytesreferences/verifying-findings.mddoc3,962 bytestests/corpus.jsonasset2,631 bytes
Read SKILL.md
# Container Security
## Rules (for AI agents)
### ALWAYS
- Use **multi-stage builds**: separate builder/test stages from the final runtime
image so build toolchains and source aren't shipped. The last stage should be a
minimal base — `gcr.io/distroless/<variant>`, `scratch`, or a versioned `-slim` /
`-alpine` variant — pinned by SHA256 digest, not just tag. Two bases have nothing
to pin: `scratch`, and a reference to an earlier stage in the same file
(`FROM base`), which is pinned on that stage's own `FROM` line.
<!-- pattern: { id: dkr-multi-stage, severity: high, check: llm } -->
<!-- pattern: { id: dkr-pinned-base-digest, severity: high, cwe: 1357, check: deterministic } -->
- Run as a non-root user: set `USER` explicitly on the **final stage**, as a **number**View the complete source on GitHubWhen your agent uses it
Strict CORS: no wildcard with credentials, exact-match origin allowlists, sane preflight cache, minimal exposed headers. Use when generating CORS middleware or framework config, setting CORS headers in API Gateway, CloudFront, or Nginx, or reviewing a cross-origin browser-facing endpoint.
What it loads into context
Frontmatter
240 tokensAlways available to the agent
SKILL.md
1,436 tokensWhen the skill is activated
Reference documents
871 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore6,187 bytesreferences/verifying-findings.mddoc3,778 bytesrules/cors_safe_config.jsonasset1,863 bytestests/corpus.jsonasset2,601 bytes
Read SKILL.md
# CORS Security
## Rules (for AI agents)
### ALWAYS
- For any non-public endpoint, allow origins from an explicit allowlist. `*` is
correct only when the resource is intentionally public *and* cross-origin access
never carries credentials.
- When a cross-origin request carries credentials — the browser's credentials mode is
`include`, meaning cookies, TLS client certificates, or browser-managed HTTP auth —
respond with `Access-Control-Allow-Credentials: true` and a **single explicit
origin**. On a credentialed request every CORS header loses its wildcard meaning:
`*` in `Allow-Origin`, `Allow-Methods`, `Allow-Headers`, or `Expose-Headers` is read
as the literal string `"*"` and the browser blocks the response. That is whyView the complete source on GitHubWhen your agent uses it
Block weak ciphers, predictable RNG, undersized keys, fast-hash password storage, nonce reuse, and non-constant-time comparison. Use when generating code that hashes, encrypts, or signs, code that compares secrets, MACs, or tokens, or config for key sizes and randomness.
What it loads into context
Frontmatter
280 tokensAlways available to the agent
SKILL.md
2,253 tokensWhen the skill is activated
Reference documents
1,110 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,185 bytesSKILL.mdcore9,185 bytesreferences/verifying-findings.mddoc4,833 bytesrules/algorithm_blocklist.jsonasset2,614 bytesrules/key_size_minimums.jsonasset1,440 bytestests/corpus.jsonasset2,396 bytes
Read SKILL.md
# Cryptographic Misuse
## Rules (for AI agents)
### ALWAYS
- Use a maintained, widely reviewed cryptographic API — the platform's own (Node
`crypto`, Java JCE, .NET `System.Security.Cryptography`, Go `crypto/*`) or a
reputable third-party one (PyCA `cryptography`, `golang.org/x/crypto`, Bouncy
Castle). Prefer high-level, misuse-resistant APIs over assembling low-level
primitives yourself. In Python, `from Crypto…` resolves to either the abandoned
`pycrypto` or its maintained fork `pycryptodome` depending on what is installed —
the import line is identical, so depend on `pycryptodome` explicitly.
- Use a cryptographically secure RNG for anything security-relevant: Python
`secrets.token_bytes` / `secrets.token_urlsafe`, JS `crypto.getRandomValues` /View the complete source on GitHubWhen your agent uses it
Prevent SQL and NoSQL injection, unsafe ORM and raw-query use, over-privileged database identities, weak tenant isolation, and unauthenticated database transport. Use when generating SQL or raw query strings, NoSQL filters, ORM models or queries, database migration files, or connection strings.
What it loads into context
Frontmatter
314 tokensAlways available to the agent
SKILL.md
1,985 tokensWhen the skill is activated
Reference documents
1,775 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,995 bytesreferences/orm-safe-query-examples.mddoc4,806 bytesreferences/verifying-findings.mddoc2,331 bytesrules/orm_safe_patterns.jsonasset2,618 bytesrules/sql_injection_sinks.jsonasset2,511 bytestests/corpus.jsonasset3,793 bytes
Read SKILL.md
# Database Security
## Rules (for AI agents)
### ALWAYS
- Bind every untrusted data value through the driver or ORM parameter API. Never place
it into SQL with language-level interpolation or concatenation — `+`, f-strings, `%`
formatting, `.format()`, JavaScript template interpolation. Driver placeholders
(`%s`, `?`, `$1`, `:name`, `@name`) are the binding *mechanism*, not string
formatting; confusing the two is how this rule is most often misread. The same
applies to values read back out of the database and used to build a later query:
stored input is still input, and second-order injection is this bug with a delay.
- Prefer the ORM's structured query-expression API over textual SQL. Where raw SQL is
genuinely needed, use that framework's documented parameter-binding mechanism andView the complete source on GitHubWhen your agent uses it
Block unsafe deserialization and unsafe XML parsing in Java, Python, .NET, PHP, and Ruby: gadget chains, unrestricted type resolution, external entity expansion, and safer formats. Use when parsing or deserializing data from an untrusted source, wiring cookies, sessions, queues, or RPC payloads, or reviewing pickle, unserialize, Marshal, ObjectInputStream, BinaryFormatter, or XML parser configuration.
What it loads into context
Frontmatter
329 tokensAlways available to the agent
SKILL.md
1,559 tokensWhen the skill is activated
Reference documents
4,121 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore6,993 bytesreferences/dotnet.mddoc1,945 bytesreferences/java.mddoc3,581 bytesreferences/php-ruby.mddoc2,481 bytesreferences/python.mddoc2,670 bytesreferences/verifying-findings.mddoc3,764 bytesreferences/xml.mddoc3,409 bytesrules/unsafe_deserializers.jsonasset5,730 bytestests/corpus.jsonasset2,501 bytes
Read SKILL.md
# Deserialization Security
## Rules (for AI agents)
### ALWAYS
- Prefer data-only serialization formats — JSON, Protobuf, MessagePack with an
explicit type map — over formats that reconstruct arbitrary runtime objects. What
makes a format safe here is not schema validation; it is whether the parser can
instantiate a class the payload names.
- Constrain polymorphic type resolution to an explicit set of expected application
types. Never let payload data choose the runtime class — that is the mechanism
behind every gadget chain, whichever serializer is involved.
- Treat an object-reconstructing deserializer crossing a trust boundary as high risk:
`pickle`, `ObjectInputStream`, `BinaryFormatter`, `unserialize`, `Marshal.load` andView the complete source on GitHubWhen your agent uses it
Confirm or refute a vulnerability candidate against a live target with a deterministic probe, respecting authorization and scope. Use when a SAST or LLM review flags a possible injection or SSRF, when triaging a finding before filing a bug or shipping a fix, or when a verification result turns out wrong.
What it loads into context
Frontmatter
270 tokensAlways available to the agent
SKILL.md
2,787 tokensWhen the skill is activated
Reference documents
1,141 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore11,266 bytesreferences/oracles-by-class.mddoc4,524 bytes
Read SKILL.md
# Verify Findings
## Rules (for AI agents)
### ALWAYS
- Treat a static-analysis or LLM-review hit as a *candidate*, not a vulnerability,
until a probe with a deterministic oracle confirms it against a live target.
- Prefer an oracle that proves server-side behaviour over one that inspects the
response text: out-of-band callbacks (SSRF, blind command injection, XXE) and
timing deltas (blind SQLi, command injection) catch *blind* bugs that leave no
trace in the body.
- Re-confirm any timing-based result a second time before trusting it — one slow
response is noise, a repeatable delay over baseline is signal.
- For reflected oracles (XSS, SSTI), require the dangerous form: XSS confirms onlyView the complete source on GitHubWhen your agent uses it
Harden Electron: renderer trust boundary (nodeIntegration, contextIsolation, sandbox), build-time fuses, contextBridge and IPC allowlists, shell.openExternal, navigation guards, deep-link auth, safeStorage. Use when generating main-process code, a preload script, or custom-protocol handlers, when packaging a release, or when storing tokens in an Electron app.
What it loads into context
Frontmatter
381 tokensAlways available to the agent
SKILL.md
2,515 tokensWhen the skill is activated
Reference documents
2,117 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore10,641 bytesSKILL.mdcore10,641 byteschecklists/electron_hardening.yamlasset2,827 bytesreferences/electron-hardening.mddoc4,627 bytesreferences/verifying-findings.mddoc4,345 bytestests/corpus.jsonasset4,393 bytes
Read SKILL.md
# Electron Desktop Security
## Rules (for AI agents)
### ALWAYS
- **Treat the renderer as untrusted.** Any renderer-side code execution — XSS in
rendered content, a redirect, a deep link — must not be able to reach Node, the
shell, the filesystem, or session tokens. Every other rule here follows from this
one, and every IPC sink you expose is reachable from a compromised renderer.
- Keep the renderer's process isolation at its defaults rather than restoring them:
`nodeIntegration: false`, `contextIsolation: true` and `sandbox: true` have been
Electron's defaults for several major versions, so the finding is the line that
**turns one off**. Note the coupling: under `sandbox: true` a preload gets a
polyfilled module subset, so a preload needing `fs` fails — move that work behindView the complete source on GitHubWhen your agent uses it
Decide what an error tells the client and what stays server-side: no stack traces, SQL, or paths in responses, no silent suppression, and no distinction between outcomes that would reveal protected state. Use when generating HTTP, GraphQL, or RPC error handlers, exception, panic, or rescue blocks, or configuring production error pages.
What it loads into context
Frontmatter
265 tokensAlways available to the agent
SKILL.md
1,436 tokensWhen the skill is activated
Reference documents
1,588 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore6,403 bytesreferences/framework-error-pages.mddoc3,863 bytesreferences/verifying-findings.mddoc3,206 bytesrules/error_response_template.jsonasset1,330 bytestests/corpus.jsonasset4,094 bytes
Read SKILL.md
# Error-Handling Security
## Rules (for AI agents)
### ALWAYS
- Catch exceptions at the boundary — HTTP handler, RPC method, message consumer —
and decide *there* what crosses to the client and what stays server-side. Record
the failure with a correlation ID under `logging-security`'s policy; do not bypass
its redaction rules to attach "full context", which is how request bodies, cookies
and tokens end up in logs.
- Put only client-actionable information in an external error: a stable error code, a
short human-readable message, and the correlation ID. Anything the caller cannot
act on belongs in the log entry that shares that ID.
- Keep responses **consistent within an error class**, and make security-equivalentView the complete source on GitHubWhen your agent uses it
Accept, store, process, and serve user uploads safely: type-appropriate content validation, decompression limits, generated storage keys, quarantine before publication, isolated media processing, and scoped direct-to-storage credentials. Use when generating a file-upload endpoint, wiring presigned or SAS uploads to S3, GCS, or Azure Blob, processing user-supplied images or documents, or serving user-generated content.
What it loads into context
Frontmatter
342 tokensAlways available to the agent
SKILL.md
2,044 tokensWhen the skill is activated
Reference documents
2,545 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,724 bytesreferences/direct-upload.mddoc3,112 bytesreferences/format-handling.mddoc4,597 bytesreferences/verifying-findings.mddoc3,517 bytesrules/upload_validation.jsonasset4,391 bytestests/corpus.jsonasset5,130 bytes
Read SKILL.md
# File Upload Security
## Rules (for AI agents)
### ALWAYS
- Put every new upload in a **non-public quarantine** location, and do not expose it,
link it, index it, or hand it to a downstream workflow until validation has
succeeded. Quarantine → validate → process → publish, in that order. This is the
invariant the rest of these rules hang from, and the one direct-to-storage uploads
most often skip.
- Validate content **server-side with checks appropriate to the format**. Where a
format has a reliable signature, verify it; for container and document formats —
DOCX, XLSX and ZIP are all ZIP at the container level — also validate structure
against the format you expect. Text-based formats such as SVG and CSV have noView the complete source on GitHubWhen your agent uses it
Browser-side hardening: XSS and safe text binding, per-sink URL policy, DOM clobbering, nonce-based CSP, Trusted Types, subresource integrity, iframe capability minimization, postMessage validation, and where client state may live. Use when generating HTML, JSX, Vue, or Svelte templates, setting response headers in a web app, embedding third-party scripts or frames, or storing anything client-side.
What it loads into context
Frontmatter
360 tokensAlways available to the agent
SKILL.md
2,364 tokensWhen the skill is activated
Reference documents
2,268 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,899 bytesSKILL.mdcore9,899 bytesreferences/browser-controls.mddoc6,071 bytesreferences/verifying-findings.mddoc3,363 bytesrules/csp_defaults.jsonasset1,426 bytesrules/xss_sinks.jsonasset3,184 bytestests/corpus.jsonasset4,256 bytes
Read SKILL.md
# Frontend Security
## Rules (for AI agents)
### ALWAYS
- Render untrusted data through the framework's ordinary text interpolation, which
escapes for the output context. Do not reach for a raw-HTML API merely to display
user data. Where rich HTML genuinely must be rendered, put it through a maintained
sanitizer (DOMPurify) with an explicit allowlist first.
- Validate URL-bearing attributes **per sink**, not against one global scheme list. A
navigation target (`href`, `action`, `formaction`, an `<iframe src>`) and an image
source do not share a trust model: `javascript:` is never acceptable anywhere, while
a narrowly constrained `data:image/…` or `blob:` may be exactly what an image sink
requires. Decide the permitted schemes for each sink and check against that list.View the complete source on GitHubWhen your agent uses it
Bound and control a GraphQL endpoint: operation cost budgets, cost-based rate limiting, pre-registered operations, alias and batch abuse on authentication paths, introspection, cache keying, and untyped scalar inputs. Use when generating schemas, resolvers, or server config, wiring limits or persisted operations, or reviewing a public /graphql endpoint.
What it loads into context
Frontmatter
299 tokensAlways available to the agent
SKILL.md
1,763 tokensWhen the skill is activated
Reference documents
1,878 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore7,825 bytesreferences/graphql-limits.mddoc4,810 bytesreferences/verifying-findings.mddoc3,332 bytesrules/graphql_safe_config.jsonasset2,914 bytestests/corpus.jsonasset3,998 bytes
Read SKILL.md
# GraphQL Security
## Rules (for AI agents)
### ALWAYS
- Enforce a **cost budget** on every operation: a maximum depth, plus a complexity
score that weights list fields by the page size they can request. Derive the numbers
from your own schema and measure them — a depth of 7 is generous for a flat schema
and far too permissive for one with a many-to-many edge, where five levels of
nesting can address billions of nodes. `references/graphql-limits.md` covers how to
derive them and where each server configures them.
- Rate-limit by **cost consumed**, not by request count. Every operation arrives at
the same URL, so the per-route limit `api-security` specifies cannot tell a trivial
query from one costing a thousand times more. Charge the complexity score againstView the complete source on GitHubWhen your agent uses it
Terraform, CloudFormation, and Pulumi hardening: state as a secret store, pinned providers and modules, encryption and network defaults, drift, and the privilege of the pipeline that applies the plan. Use when generating infrastructure code, reviewing IaC changes in a pull request, configuring a state backend, or setting up a new cloud account or workspace.
What it loads into context
Frontmatter
382 tokensAlways available to the agent
SKILL.md
1,697 tokensWhen the skill is activated
Reference documents
1,918 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore7,143 bytesSKILL.mdcore7,143 bytesSKILL.mdcore7,143 bytesSKILL.mdcore7,143 bytesSKILL.mdcore7,143 byteschecklists/cloudformation_hardening.yamlasset1,625 byteschecklists/terraform_hardening.yamlasset3,354 bytesreferences/backends-and-state.mddoc4,291 bytesreferences/verifying-findings.mddoc3,440 bytestests/corpus.jsonasset5,089 bytes
Read SKILL.md
# Infrastructure-as-Code Security
## Rules (for AI agents)
### ALWAYS
- Treat the **state file as a secret store**. Every value that passes through
Terraform — a generated password, an RDS master credential, a private key, the
contents of a data source — is written to state in plaintext. `sensitive = true`
only hides a value from CLI output; it changes nothing about what is stored. So
read access to the backend is read access to those secrets, and the backend's
access policy has to be written on that basis.
- Configure a **remote backend** with encryption at rest, state locking, and
versioning. Prefer the backend's own locking where it exists — recent Terraform
supports S3-native locking, so a separate DynamoDB lock table is no longer requiredView the complete source on GitHubWhen your agent uses it
Least-privilege cloud IAM: policy scope, privilege-escalation paths, permissions boundaries, workload identity over static keys, MFA enforced by policy, cross-account trust, and separating deploy from runtime. Use when generating IAM policies, roles, or trust documents, wiring CI/CD service accounts or workload identities, delegating role creation, or designing cross-account access.
What it loads into context
Frontmatter
390 tokensAlways available to the agent
SKILL.md
2,071 tokensWhen the skill is activated
Reference documents
1,903 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,061 bytesreferences/escalation-paths.mddoc4,769 bytesreferences/verifying-findings.mddoc3,174 bytesrules/iam_policy_invariants.jsonasset3,391 bytesrules/key_rotation_policy.jsonasset2,561 bytestests/corpus.jsonasset4,765 bytes
Read SKILL.md
# Identity & Access Management Best Practices
## Rules (for AI agents)
### ALWAYS
- Grant the minimum permissions the workload's stated job requires: deny by default,
then add concrete actions against concrete resources. A wildcard action on a
wildcard resource — in a custom policy, in `AdministratorAccess`, or in `iam:*`
attached to something that runs continuously — is the same finding wearing three
different names.
- Read a policy for the **privileges it can reach**, not only the ones it names. A
principal that can write policy (`iam:PutRolePolicy`, `iam:AttachRolePolicy`,
`iam:CreatePolicyVersion`) can grant itself anything, and a principal that can pass
a role into a compute service it may also create (`iam:PassRole` withView the complete source on GitHubWhen your agent uses it
Securing a feature that calls an LLM: prompt injection as an unsolved input problem, bounding what model output is allowed to reach, tool authorization against the human rather than the model, approval gates on consequential actions, RAG context provenance, system-prompt leakage, and cost limits. Use when sending prompts to an LLM API, building a RAG pipeline, giving a model tools, rendering or executing model output, or exposing an LLM-backed endpoint.
What it loads into context
Frontmatter
366 tokensAlways available to the agent
SKILL.md
1,940 tokensWhen the skill is activated
Reference documents
775 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,635 bytesreferences/verifying-findings.mddoc3,520 bytesrules/prompt_injection_patterns.jsonasset2,167 bytestests/corpus.jsonasset2,140 bytes
Read SKILL.md
# LLM Application Security
## Rules (for AI agents)
### ALWAYS
- Start from the premise that **prompt injection is not solved at the prompt layer**.
A model has no privileged channel: system text, user text, a retrieved document and
a tool result all arrive as one context, and nothing in that context can be marked
as instructions the model must obey over the rest. Message roles are a formatting
convention, delimiters raise the cost of an attack, and an instruction such as
"treat the following as data" is itself just more text in the same window. Design
as though injection will sometimes succeed, and put the real controls after the
model rather than in front of it.
- Bound what the model's output is **allowed to reach**. Every downstream sink — aView the complete source on GitHubWhen your agent uses it
Keep secrets and personal data out of logs at the call site rather than relying on redaction, neutralize log and field injection, record audit events that survive, and treat log read access as data access. Use when generating logger calls or structured-logging schemas, wiring log shippers, sinks, retention, and access controls, or specifying audit-logging requirements.
What it loads into context
Frontmatter
285 tokensAlways available to the agent
SKILL.md
1,693 tokensWhen the skill is activated
Reference documents
895 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore7,394 bytesreferences/verifying-findings.mddoc3,877 bytesrules/audit_event_schema.jsonasset1,339 bytesrules/redaction_patterns.jsonasset2,517 bytestests/corpus.jsonasset6,259 bytes
Read SKILL.md
# Logging Security
## Rules (for AI agents)
### ALWAYS
- Decide what is safe to log **at the call site**, and log a reference rather than a
value: an id, a hash, a type, a count. A redactor is the last net, not the design —
it matches field names and known patterns, so it cannot see personal data sitting
inside an assembled string. A formatted notification body, a templated message, an
exception with interpolated arguments: the name and the address are in the prose,
in no named field, matching no pattern. Nothing downstream will catch that.
- Run a **redactor** at the sink anyway, for the cases the call site missed:
credential-shaped values, `Authorization` and `Cookie` headers, query strings
carrying tokens, and the personal-data patterns in `rules/redaction_patterns.json`.View the complete source on GitHubWhen your agent uses it
The model and data artifacts: checkpoint formats that execute code on load, provenance for a model you did not train, training-data poisoning and the ingestion controls that bound it, PII that survives into weights, and notebooks that commit their own output. Use when loading a model from disk, a Hub, or object storage, ingesting user content for training or fine-tuning, or writing training, evaluation, or notebook code.
What it loads into context
Frontmatter
308 tokensAlways available to the agent
SKILL.md
1,915 tokensWhen the skill is activated
Reference documents
2,314 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,427 bytesSKILL.mdcore8,427 bytesSKILL.mdcore8,427 bytesSKILL.mdcore8,427 bytesreferences/artifacts-and-provenance.mddoc6,384 bytesreferences/verifying-findings.mddoc3,592 bytestests/corpus.jsonasset3,636 bytes
Read SKILL.md
# ML Model Security
## Rules (for AI agents)
### ALWAYS
- Prefer a **tensor-only format** — safetensors — for anything you load. It stores
arrays and metadata and has no mechanism for executing code, which is the property
that matters. A `.pt`, `.pkl`, `.bin`, `.ckpt` or `joblib` artifact is a pickle:
loading it runs whatever the author put in it, before you see a single weight.
- Pass `weights_only=True` to `torch.load` **explicitly**, every time. The default has
changed across PyTorch releases, so code that relies on it behaves differently
depending on the pin — and the flag narrows the surface without removing it, so it
is a mitigation rather than a reason to load an untrusted file.
`deserialization-security` owns the pickle boundary itself and the per-languageView the complete source on GitHubWhen your agent uses it
Android and iOS hardening on a device you do not control: hardware-backed credential storage, exported components and IPC, verified deep links, transport defaults and pinning rotation, server-side attestation over client-side root detection, screen capture, and release-build hygiene — including React Native and Flutter packaging. Use when generating Android or iOS app code, manifests, or native modules, wiring deep links or WebViews, or deciding what a mobile client is trusted to assert.
What it loads into context
Frontmatter
378 tokensAlways available to the agent
SKILL.md
2,232 tokensWhen the skill is activated
Reference documents
2,274 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,815 byteschecklists/android_manifest.yamlasset1,811 byteschecklists/ios_keychain_ats.yamlasset1,932 bytesreferences/platform-specifics.mddoc5,691 bytesreferences/verifying-findings.mddoc4,191 bytestests/corpus.jsonasset4,141 bytes
Read SKILL.md
# Mobile Application Security
## Rules (for AI agents)
### ALWAYS
- Start from the premise that **the device belongs to whoever is holding it**. The
app runs on hardware an attacker can root or jailbreak, instrument at runtime, and
read at rest. Everything shipped in the package is extractable, every client-side
check is removable, and every local check can be made to return the answer the
attacker wants. What you actually control is the backend's willingness to act — so
any decision that matters is made server-side, on evidence the server verified.
- Issue short-lived, device-scoped tokens from a backend rather than shipping an API
key, signing key, or backend credential in source, resources, `strings.xml`,
`BuildConfig`, or `Info.plist`. Anyone can download the package and read it.View the complete source on GitHubWhen your agent uses it
Transport security where the client establishes trust: TLS version floor, certificate chain and hostname verification, the trust store, connecting by IP, mTLS and workload identity as authentication, gRPC channel credentials, and SMTP STARTTLS. Use when generating HTTP, gRPC, or SMTP clients and servers, configuring TLS in code or platform config, wiring service-to-service authentication, or when tempted to disable certificate verification.
What it loads into context
Frontmatter
362 tokensAlways available to the agent
SKILL.md
1,905 tokensWhen the skill is activated
Reference documents
3,213 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,118 bytesSKILL.mdcore8,118 bytesreferences/tls-configuration.mddoc9,194 bytesreferences/verifying-findings.mddoc4,018 bytesrules/cert_validation_sinks.jsonasset2,302 bytesrules/tls_defaults.jsonasset1,276 bytestests/corpus.jsonasset3,821 bytes
Read SKILL.md
# Protocol Security
## Rules (for AI agents)
### ALWAYS
- Default to **TLS 1.3**, and permit TLS 1.2 only where a peer genuinely requires it.
Disable TLS 1.0, 1.1, and every SSL version. Cipher-suite selection is a
consequence of the version floor rather than a separate decision —
`references/tls-configuration.md` carries the suite lists and the per-platform
config keys.
- Verify the full certificate chain on every connection: a trusted issuer, an
unexpired validity window, and a hostname that matches a **`subjectAltName`
dNSName** entry. The hostname is checked *against* the SAN — SAN is not an
alternative place to look, and a `CN` match is not a fallback, because currentView the complete source on GitHubWhen your agent uses it
Wiring your application to a third-party SaaS platform: verifying an inbound webhook against the vendor's own scheme rather than a generalized one, why a valid signature identifies the sender and not the user in the payload, replay windows, one credential per integration and per environment, least-privilege scopes, and treating a bulk export as a data boundary. Use when writing a webhook receiver, an OAuth integration, a SCIM endpoint, or any code that authenticates to or from a SaaS vendor.
What it loads into context
Frontmatter
328 tokensAlways available to the agent
SKILL.md
2,020 tokensWhen the skill is activated
Reference documents
1,063 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,019 bytesreferences/verifying-findings.mddoc4,746 bytesrules/atlassian.jsonasset6,398 bytesrules/bamboohr.jsonasset3,772 bytesrules/calendly.jsonasset4,547 bytesrules/google_chat.jsonasset3,146 bytesrules/google_workspace.jsonasset7,226 bytesrules/hubspot.jsonasset4,508 bytesrules/larksuite.jsonasset4,904 bytesrules/microsoft_teams.jsonasset4,907 bytesrules/netsuite.jsonasset5,974 bytesrules/notion.jsonasset4,180 bytesrules/odoo.jsonasset4,703 bytesrules/salesforce.jsonasset6,184 bytesrules/slack.jsonasset6,132 bytesrules/workday.jsonasset5,028 bytesrules/zoom.jsonasset5,414 bytestests/corpus.jsonasset4,271 bytes
Read SKILL.md
# SaaS Integration Security
## Rules (for AI agents)
### ALWAYS
- Verify an inbound webhook against **that vendor's documented scheme**, and do not
generalize from another one. Vendors differ in the header, in the secret, and — the
part that breaks a generalized implementation — in the **canonical string** that gets
signed. Some sign the raw body, some sign a version prefix plus a timestamp plus the
body, some sign the HTTP method and path as well. Read the vendor's page for the
vendor you are integrating; a signature routine copied from a different vendor
produces a receiver that rejects every legitimate event, and the fix someone reaches
for is to turn verification off.
- Verify against the **raw request body**, exactly as received, before any parsing orView the complete source on GitHubWhen your agent uses it
Keeping credentials out of source, and what to do once one is in: rotate before removing, because deleting the line does not un-leak it. Covers where a secret may live, safe .env templates, why a client-reachable config value is public, and running a scanner rather than eyeballing for patterns. Use when writing code that reads a credential, creating config or .env templates, before committing, or after discovering a secret in a repository.
What it loads into context
Frontmatter
393 tokensAlways available to the agent
SKILL.md
2,028 tokensWhen the skill is activated
Reference documents
607 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,065 byteschecklists/secret_detection.yamlasset31,092 bytesreferences/verifying-findings.mddoc2,512 bytestests/corpus.jsonasset58,412 bytes
Read SKILL.md
# Secret Detection
## Rules (for AI agents)
### ALWAYS
- On finding a committed credential, **rotate or revoke it at the provider first**.
Deleting the line does not remediate it, and neither does `git rm`, an amended
commit, or a history rewrite: the value reached a remote, a clone, a fork, a CI log
and a backup, and it is compromised from the moment it was pushed. Rotate, then
clean the history, then add the guard that stops it recurring — in that order,
because only the first one is time-critical.
- **Run a scanner**; do not scan by eye. `scan_secrets` and `check_secret_pattern`
carry the full pattern set with per-pattern entropy floors and hotword proximity,
and a person reading a diff matches none of that reliably. A working-tree scan and aView the complete source on GitHubWhen your agent uses it
The sinks and boundaries that belong to no framework: passing input to a shell or an evaluator, letting input choose a filesystem path, validating at a boundary that is not an HTTP request, and handling regulated data (PII, PHI, cardholder data) so it does not spread into paths nobody reviews. Use when generating or reviewing code that shells out, touches the filesystem, reads a queue message, CLI argument, or parsed file, or when a change crosses a PII, PHI, or PCI boundary.
What it loads into context
Frontmatter
382 tokensAlways available to the agent
SKILL.md
1,778 tokensWhen the skill is activated
Reference documents
1,625 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore7,379 byteschecklists/injection_patterns.yamlasset1,941 byteschecklists/owasp_top10.yamlasset2,653 bytesreferences/verifying-compliance-findings.mddoc3,971 bytesreferences/verifying-findings.mddoc3,310 bytestests/corpus.jsonasset4,230 bytes
Read SKILL.md
# Secure Code Review
## Rules (for AI agents)
### ALWAYS
- Validate input at **every** trust boundary, not only the HTTP one. A CLI argument, an
environment variable, a queue message, a filename, a parsed config or spreadsheet
cell all arrive from outside and none of them pass through the request-validation
layer. Check type, length, allowed characters and allowed range, and reject before
processing. `api-security` owns the HTTP request body and its schema; this rule is
every other way input gets in.
- Build a command as an **argument vector**, never as a string a shell will parse:
`subprocess.run([...])` without `shell=True`, `execFile`/`spawn` with an array,
`exec.Command(name, args...)`. Passing an array is what removes the shell, andView the complete source on GitHubWhen your agent uses it
Turning a confirmed and fixed finding into a permanent guard: proving the test fails without the fix, asserting the effect and not only the status code, seeding the two principals an authorization test needs, making a timing or out-of-band proof deterministic enough for CI, and keeping the test in a job that can actually block. Use once a security finding has been confirmed and fixed, or when a security test is failing, skipped, or about to be deleted.
What it loads into context
Frontmatter
270 tokensAlways available to the agent
SKILL.md
1,760 tokensWhen the skill is activated
Reference documents
1,841 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore7,616 bytesreferences/test-by-class.mddoc5,810 bytesreferences/where-verification-runs.mddoc2,175 bytes
Read SKILL.md
# Security Regression Tests
## Rules (for AI agents)
### ALWAYS
- **Prove the test fails without the fix.** Revert the patch, or mutate the guard, and
confirm the new test goes red — then restore. A test written after the fix can be
vacuously green: wrong route, wrong fixture user, wrong assertion target, a typo in
the payload. It will stay green forever and nobody will learn anything from it. This
is the one step that distinguishes a guard from a decoration, and it is the one
most often skipped.
- Assert **both directions**: the attack input now yields the secure outcome, *and* a
legitimate input still succeeds. A deny-only test passes equally well against an
endpoint that is broken for everyone, so it will hold the line and tell you nothingView the complete source on GitHubWhen your agent uses it
What a function-as-a-service platform changes: an execution environment reused between invocations so /tmp and module globals outlive a request, an event envelope that is attacker-influenced whichever trigger delivered it, encrypted-at-rest configuration that the control-plane API still returns in cleartext, and concurrency as the boundary between an incident and a bill. Use when generating Lambda, Cloud Functions, or Azure Functions code, serverless.yml or SAM templates, or wiring API Gateway, EventBridge, SQS, or S3 triggers.
What it loads into context
Frontmatter
347 tokensAlways available to the agent
SKILL.md
2,028 tokensWhen the skill is activated
Reference documents
2,481 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,132 bytesSKILL.mdcore9,132 byteschecklists/event_validation.yamlasset1,286 byteschecklists/lambda_hardening.yamlasset2,420 bytesreferences/platform-settings.mddoc7,479 bytesreferences/verifying-findings.mddoc3,854 bytestests/corpus.jsonasset4,608 bytes
Read SKILL.md
# Serverless Security
## Rules (for AI agents)
### ALWAYS
- Treat the **execution environment as reused**. The platform freezes it when the
handler returns and thaws it for the next invocation, which may serve a different
tenant. So a module-level global holding per-request state — a decrypted payload, an
authorization decision, a tenant id, a connection bound to one caller's credentials
— is visible to the next request. Cache only what is safe to share, and reset or
scope everything else inside the handler.
- Treat **`/tmp` as shared, persistent, and finite**. It is the only writable path, it
survives across invocations in the same environment, and a fixed filename written
for one user is readable by the next. Use a per-invocation subdirectory, delete itView the complete source on GitHubWhen your agent uses it
Server-Side Request Forgery: allowlisting the destination of a server-side fetch, when re-resolution between check and connect matters, redirect and scheme bypasses, parsers that fetch on their own (XXE, SVG, HTML-to-PDF), cloud metadata, and keeping the response from becoming an oracle. Use when fetching a client-supplied URL, wiring webhooks, image proxies, PDF or preview renderers, or reviewing any HTTP-client wrapper.
What it loads into context
Frontmatter
343 tokensAlways available to the agent
SKILL.md
2,070 tokensWhen the skill is activated
Reference documents
2,318 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,783 bytesreferences/metadata-and-egress.mddoc6,549 bytesreferences/verifying-findings.mddoc2,537 bytesrules/cloud_metadata_endpoints.jsonasset2,342 bytesrules/ssrf_sinks.jsonasset4,914 bytestests/corpus.jsonasset3,982 bytes
Read SKILL.md
# SSRF Prevention
## Rules (for AI agents)
### ALWAYS
- Constrain the destination with an **allowlist of hosts you intend to reach**, not a
denylist of addresses you intend to avoid. A denylist has to enumerate every spelling
of every internal address — decimal and octal IPv4, IPv6 and IPv4-mapped IPv6, a
hostname whose A record is private, a public wildcard resolver like `nip.io` that
encodes any address into a name — and it only has to be wrong once.
- Know which of the two controls you built, because it decides whether re-resolution
matters. An **allowlist of hostnames** survives DNS rebinding: the attacker controls
DNS only for names they own, and those names are not on the list. An **IP-range
check** does not: the name resolves to a public address when you validate and aView the complete source on GitHubWhen your agent uses it
Vet dependencies before they enter the build: typosquats, dependency confusion, malicious packages, known vulnerabilities, unlocked resolution, risky install and build hooks, EOL embedded runtimes, and the authenticity and freshness of your own release channel. Use when adding or upgrading a dependency, reviewing package manifests or lockfiles, configuring package sources or internal namespaces, or publishing a package or application update.
What it loads into context
Frontmatter
356 tokensAlways available to the agent
SKILL.md
1,713 tokensWhen the skill is activated
Reference documents
2,884 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore7,793 bytesSKILL.mdcore7,793 bytesSKILL.mdcore7,793 bytesSKILL.mdcore7,793 bytesreferences/ecosystem-controls.mddoc4,450 bytesreferences/verifying-findings.mddoc8,569 bytesrules/dependency_confusion.jsonasset5,133 bytesrules/known_malicious.jsonasset925 bytesrules/typosquat_patterns.jsonasset8,763 bytestests/corpus.jsonasset5,486 bytes
Read SKILL.md
# Supply Chain Security
## Rules (for AI agents)
### ALWAYS
- Verify the identity of a new dependency before adding it: registry metadata,
repository URL, maintainer set, and provenance checked against the signer you
*expect*. Name-similarity screening opens the question; it never answers it.
- Query the bundled malicious-package data before adding any dependency —
`check_dependency`, `check_typosquat` and `lookup_vulnerability` read it, this file
cannot. Match on ecosystem, normalized name **and affected version range**; an
active match on the resolved version blocks.
- Treat package age, download volume, maintainer count and activity as risk signals,
never as proof of trust. Defaults: a verified maintainer signal within 90 days of aView the complete source on GitHubWhen your agent uses it
User input reaching a template compiler rather than its context: the source-versus-values distinction, double-render pipelines, template names chosen by the caller, why a template sandbox is a mitigation and not a boundary, minimizing what the render context exposes, and template-driven resource exhaustion. Use when rendering templates with user-influenced values, when a template string or template name is assembled from input, or when a product lets users author templates.
What it loads into context
Frontmatter
371 tokensAlways available to the agent
SKILL.md
2,035 tokensWhen the skill is activated
Reference documents
2,731 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore8,779 bytesSKILL.mdcore8,779 bytesSKILL.mdcore8,779 bytesSKILL.mdcore8,779 bytesSKILL.mdcore8,779 bytesSKILL.mdcore8,779 bytesSKILL.mdcore8,779 bytesreferences/engines.mddoc7,782 bytesreferences/verifying-findings.mddoc3,579 bytesrules/template_injection.jsonasset2,434 bytestests/corpus.jsonasset1,965 bytes
Read SKILL.md
# Template Injection (SSTI)
## Rules (for AI agents)
### ALWAYS
- Pass user data as **bound values**, never into the template **source** string. This
is the whole skill in one line: `render(tmpl, {"name": name})` is safe,
`render("Hello " + name)` is SSTI. The compiler treats its source as code, and the
context as data — so the only question that matters about any user value is which of
the two it reaches.
- Keep the set of template sources **static and trusted**, loaded from files or
constants. A template body read from a database column, an API response, or a
request field is attacker-supplied code, whatever the column is called.
- Choose the template **by name from an allowlist**, never by a name the callerView the complete source on GitHubWhen your agent uses it
Decide what a design must be true before code exists: naming assets and actors, locating trust boundaries, producing a written (asset, boundary, threat, control, owner) list, recording the assumptions the design rests on, and knowing when a change invalidates the model. Use when scaffolding a new feature, service, or endpoint, writing or reviewing a design doc, RFC, or ADR, or introducing a new trust boundary, integration, or data flow.
What it loads into context
Frontmatter
284 tokensAlways available to the agent
SKILL.md
2,089 tokensWhen the skill is activated
Reference documents
1,341 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,232 bytesreferences/design-level-failures.mddoc6,232 bytes
Read SKILL.md
# Threat Modeling
## Rules (for AI agents)
### ALWAYS
- Produce a **written list**, not an impression. One row per finding, in the design
doc, the RFC, or the PR description: `(asset, boundary, threat, control, owner)` —
what is worth taking, where it crosses, what could go wrong there, what stops it,
and which component enforces it. A model that exists only in the reasoning that
produced the code cannot be reviewed, disagreed with, or checked later.
- Name the **assets** and the **actors** first: data, funds, credentials, keys and
compute on one side; users, tenants, services, admins and the attacker on the other.
Every later row references one of each, which is what makes the list finite.
- Locate the **trust boundaries** — internet to application, tenant to shared store,View the complete source on GitHubWhen your agent uses it
Securing the WebSocket upgrade and the frames after it: Origin validation against Cross-Site WebSocket Hijacking, authenticating the handshake rather than the first message, the ticket pattern for browsers that cannot set headers, per-frame authorization, and resource limits on a connection that stays open. Use when generating a WebSocket, Socket.IO, SignalR, or Phoenix Channels server, wiring real-time messaging, presence, or collaborative editing, or reviewing a /ws endpoint.
What it loads into context
Frontmatter
340 tokensAlways available to the agent
SKILL.md
2,091 tokensWhen the skill is activated
Reference documents
2,193 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Rules (for AI agents)
- Context (for humans)
- References
Files
SKILL.mdcore9,051 bytesSKILL.mdcore9,051 bytesSKILL.mdcore9,051 bytesSKILL.mdcore9,051 bytesSKILL.mdcore9,051 bytesreferences/limits-and-handshake.mddoc6,048 bytesreferences/verifying-findings.mddoc3,655 bytesrules/websocket_hardening.jsonasset3,521 bytestests/corpus.jsonasset5,626 bytes
Read SKILL.md
# WebSocket Security
## Rules (for AI agents)
### ALWAYS
- Validate the **`Origin` header** on the upgrade handshake against an allowlist, and
understand precisely what that buys: the browser sets `Origin` and script cannot
forge it, so the check stops **Cross-Site WebSocket Hijacking** — a page on
`attacker.com` opening `wss://api.example.com/ws` and inheriting the user's cookies.
It buys nothing against a non-browser client, which sets any header it likes. Origin
is a CSRF control, not authentication. The same-origin policy and CORS preflight do
not apply to the upgrade at all, which is why this check must be written by hand.
- Authenticate the **handshake**, not the first frame. Once the upgrade completes the
connection exists, has consumed the user's cookie context, and is already a resourceView the complete source on GitHubSkills included
- api-security
- auth-security
- cicd-security
- container-security
- cors-security
- crypto-misuse
- database-security
- deserialization-security
- dynamic-verification
- electron-security
- error-handling-security
- file-upload-security
- frontend-security
- graphql-security
- iac-security
- iam-best-practices
- llm-app-security
- logging-security
- ml-security
- mobile-security
- protocol-security
- saas-security
- secret-detection
- secure-code-review
- security-regression-tests
- serverless-security
- ssrf-prevention
- supply-chain-security
- template-injection
- threat-modeling
- websocket-security
- api-security
- auth-security
- cicd-security
- container-security
- cors-security
- crypto-misuse
- database-security
- deserialization-security
- dynamic-verification
- electron-security
- error-handling-security
- file-upload-security
- frontend-security
- graphql-security
- iac-security
- iam-best-practices
- llm-app-security
- logging-security
- ml-security
- mobile-security
- protocol-security
- saas-security
- secret-detection
- secure-code-review
- security-regression-tests
- serverless-security
- ssrf-prevention
- supply-chain-security
- template-injection
- threat-modeling
- websocket-security
Repository facts
- License
- MIT
- Created
- Jul 1, 2026
- Last pushed
- Aug 14, 2026
- Forks
- 0
- Open issues
- 0
- Project activity
- Slowing
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 132 notes
dist/agent-skills/.agents/skills/api-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/auth-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/cicd-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/cicd-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/cicd-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/container-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/container-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/container-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/cors-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/crypto-misuse/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/database-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/deserialization-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/dynamic-verification/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/electron-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/error-handling-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/file-upload-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/frontend-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/frontend-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/graphql-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/agent-skills/.agents/skills/iac-security/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 33 dangerous shell commandsin 21 files: secure-code-review/tests/corpus.json:7 cicd-security/references/verifying-findings.md:31 container-security/SKILL.md:21 and 18 more
- 701 network referencesin 125 files: secret-detection/checklists/secret_detection.yaml:5 ssrf-prevention/rules/ssrf_sinks.json:4 supply-chain-security/rules/dependency_confusion.json:8 and 122 more
- No hidden or obfuscated text
- No instruction overrides
- No executable scripts
- 147 references to secretsin 49 files: secret-detection/tests/corpus.json:37 secret-detection/checklists/secret_detection.yaml:207 mobile-security/tests/corpus.json:3 and 46 more
- No requests to vote in Hot
Show all 881 signals by file
dist/agent-skills/.agents/skills/cicd-security/SKILL.md
- Dangerous shell operationline 27
- `curl | bash` (or `wget -O- | sh`) any installer script in CI. The 2021 Codecov bash-uploader compromise exfiltrated env vars to an attacker for ~10 weeks because thousands of pipelines ran `bash <(curl https://codecov.io/bash)`. Always d - Network accessline 27
- `curl | bash` (or `wget -O- | sh`) any installer script in CI. The 2021 Codecov bash-uploader compromise exfiltrated env vars to an attacker for ~10 weeks because thousands of pipelines ran `bash <(curl https://codecov.io/bash)`. Always d
dist/agent-skills/.agents/skills/cicd-security/references/verifying-findings.md
- Network accessline 29
| **Script injection** | Trace a `${{ github.event.* }}` value into a `run:` body and echo a marker to prove it executes | The marker executes | The value is passed through an environment variable first | | **Default-write permissions** | I - Network accessline 30
| **Default-write permissions** | Inspect the run's `GITHUB_TOKEN` scopes | `write-all` | A top-level `permissions:` block scoped to `contents: read` | | **curl \| bash** | Read the installer step | A remote script piped straight to a shell - Dangerous shell operationline 31
| **curl \| bash** | Read the installer step | A remote script piped straight to a shell | Downloaded, checksummed, then executed | - Network accessline 31
| **curl \| bash** | Read the installer step | A remote script piped straight to a shell | Downloaded, checksummed, then executed | - Network accessline 53
| A workflow using a floating tag (`@v1`, `@main`, `@latest`) | Gate fails | | A workflow with no top-level `permissions: contents: read` | Gate fails | | `curl \| bash` in a `run:` step | Gate fails | - Network accessline 54
| A workflow with no top-level `permissions: contents: read` | Gate fails | | `curl \| bash` in a `run:` step | Gate fails | | A `pull_request_target` job that checks out the PR head with secrets in scope | Gate fails | - Dangerous shell operationline 55
| `curl \| bash` in a `run:` step | Gate fails | - Network accessline 55
| `curl \| bash` in a `run:` step | Gate fails |
dist/agent-skills/.agents/skills/container-security/SKILL.md
- Dangerous shell operationline 21
- Pin **apt** packages and clean lists in the same layer: `apt-get update && apt-get install -y --no-install-recommends pkg=1.2.3 && rm -rf /var/lib/apt/lists/*`. The `update` must be in that same `RUN` — without it there are no package lis - Network accessline 39
- Run a tenant's container `privileged` on a host shared with other tenants, or attach tenant containers to a **shared external bridge network** — the first gives container-escape → co-tenant takeover, the second gives cross-tenant L3 reach - Network accessline 40
- Embed secrets in image layers via `ENV`, `ARG`, `COPY`, or by `echo`-ing them to a file. Even if `--squash`'d, BuildKit cache and registry layers leak. - Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote scri - Dangerous shell operationline 41
- Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote script to a shell is arbitrary remote code at build time. Download, verify a pinned SHA-256, then execute. - Network accessline 41
- Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote script to a shell is arbitrary remote code at build time. Download, verify a pinned SHA-256, then execute. - Network accessline 42
- Use an **unversioned** tag as the final image base — `latest`, `stable`, or a bare variant like `python:slim` / `node:alpine`. Builds become non-reproducible and quietly pick up CVEs. The *versioned* variants (`python:3.12-slim`, `node:20 - Network accessline 43
- Use `ADD <url>` to fetch a remote resource **unverified**. Either `ADD --checksum=sha256:<hash> <url>` (Dockerfile frontend 1.6+), or `RUN curl --fail` plus an explicit checksum step, or vendor the artifact.
dist/agent-skills/.agents/skills/container-security/references/eol-base-images.md
- Network accessline 40
https://endoflife.date/api/<product>.json
dist/agent-skills/.agents/skills/container-security/references/verifying-findings.md
- Network accessline 28
| **Unpinned or EOL base** | Resolve the final `FROM` | A mutable tag (`latest`, `stable`, `slim`) or an end-of-life runtime | A `@sha256:` digest on a maintained runtime | | **Secrets in layers** | `docker history --no-trunc img`, or `dive - Network accessline 29
| **Secrets in layers** | `docker history --no-trunc img`, or `dive` | A token visible in `ENV`, `ARG` or `COPY` | No credential in any layer | | **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote scr - Dangerous shell operationline 30
| **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote script piped to a shell | Downloaded, verified against a pinned SHA-256, then executed | - Network accessline 30
| **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote script piped to a shell | Downloaded, verified against a pinned SHA-256, then executed |
dist/agent-skills/.agents/skills/cors-security/SKILL.md
- Network accessline 15
- For any non-public endpoint, allow origins from an explicit allowlist. `*` is correct only when the resource is intentionally public *and* cross-origin access never carries credentials. - When a cross-origin request carries credentials — - Network accessline 16
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Network accessline 17
- Compare origins by exact match on the **serialized** origin — scheme, host, and port, all three. Never substring, prefix, or suffix matching: `endsWith("example.com")` accepts `https://example.com.evil.com`, and an unescaped `.` in `^http
dist/agent-skills/.agents/skills/cors-security/references/verifying-findings.md
- Network accessline 20
| Class | Probe | Real hit | False positive | |---|---|---|---| | **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Creden - Network accessline 21
|---|---|---|---| | **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Credentials: true` | No ACAO header, or a fixed trus - Network accessline 22
| **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Credentials: true` | No ACAO header, or a fixed trusted origin returne - Network accessline 47
| Input | Expected | |---|---| | `Origin: https://evil.example` with credentials | No reflected ACAO | - Network accessline 48
|---|---| | `Origin: https://evil.example` with credentials | No reflected ACAO | | `Origin: null` with credentials | No reflected ACAO | - Network accessline 49
| `Origin: https://evil.example` with credentials | No reflected ACAO |
dist/agent-skills/.agents/skills/crypto-misuse/SKILL.md
- Network accessline 15
- Use a maintained, widely reviewed cryptographic API — the platform's own (Node `crypto`, Java JCE, .NET `System.Security.Cryptography`, Go `crypto/*`) or a reputable third-party one (PyCA `cryptography`, `golang.org/x/crypto`, Bouncy Cast - Network accessline 16
- Use a cryptographically secure RNG for anything security-relevant: Python `secrets.token_bytes` / `secrets.token_urlsafe`, JS `crypto.getRandomValues` / `crypto.randomBytes`, Go `crypto/rand.Read`, Java `SecureRandom`. - Hash passwords wi - Network accessline 17
- Hash passwords with a password-specific KDF and a unique random salt per password. Prefer Argon2id; scrypt where appropriate; bcrypt for legacy compatibility; PBKDF2-HMAC-SHA-256 where FIPS-140 compliance is required. Take minimum paramet
dist/agent-skills/.agents/skills/deserialization-security/references/xml.md
- Network accessline 18
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 19
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 20
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 21
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 22
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dist/agent-skills/.agents/skills/electron-security/SKILL.md
- Network accessline 42
- Dev builds that load `http://localhost:<port>` with relaxed settings — these rules govern **release** builds; the finding is dev config that ships. - Network accessline 43
- A custom protocol (`myapp://`) for OAuth callbacks is expected. The control is `state` / PKCE validation, not the scheme's existence. - `contextBridge`-exposed functions are intentional capabilities. Review what each one does and whether - Network accessline 44
- `contextBridge`-exposed functions are intentional capabilities. Review what each one does and whether it validates input, not the fact that a bridge exists. - `shell.openExternal` on a hard-coded `https://` constant, not user input. - A f - Network accessline 45
- `shell.openExternal` on a hard-coded `https://` constant, not user input.
dist/agent-skills/.agents/skills/electron-security/references/electron-hardening.md
- Access to secretsline 56
[Credential-related source omitted]
dist/agent-skills/.agents/skills/electron-security/references/verifying-findings.md
dist/agent-skills/.agents/skills/frontend-security/references/browser-controls.md
dist/agent-skills/.agents/skills/iac-security/SKILL.md
- Access to secretsline 26
[Credential-related source omitted]
dist/agent-skills/.agents/skills/iac-security/references/backends-and-state.md
- Network accessline 83
# pinned to an immutable commit — the module cannot change under you module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" - Network accessline 84
module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" } - Network accessline 85
source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" - Network accessline 88
# a tag can be moved; a branch changes on every push module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker - Network accessline 89
module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker source = "git::https://github.com/org/modules.git//vpc?ref=main" # unpinned - Network accessline 90
source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker - Network accessline 91
source = "git::https://github.com/org/modules.git//vpc?ref=main" # unpinned
dist/agent-skills/.agents/skills/mobile-security/SKILL.md
dist/agent-skills/.agents/skills/mobile-security/references/platform-specifics.md
- Access to secretsline 123
[Credential-related source omitted]
dist/agent-skills/.agents/skills/mobile-security/references/verifying-findings.md
dist/agent-skills/.agents/skills/protocol-security/references/tls-configuration.md
dist/agent-skills/.agents/skills/protocol-security/references/verifying-findings.md
- Network accessline 24
| **Downgrade / weak cipher** | `testssl.sh host:port`, or force a sub-1.2 handshake: `openssl s_client -connect host:port -tls1_1`, or `-cipher 'DES-CBC3-SHA'` | The weak handshake succeeds | A documented legacy-peer exception, isolated be - Network accessline 25
| **Certificate validation** | Present an invalid, self-signed, or wrong-hostname certificate to the client | The client completes the connection | The client refuses it | | **Plaintext fallback / HSTS** | Request the `http://` scheme | `20 - Network accessline 26
| **Plaintext fallback / HSTS** | Request the `http://` scheme | `200` with no redirect, or no `Strict-Transport-Security` header on the HTTPS response | A public read-only endpoint, such as a status page, served over HTTP by design |
dist/agent-skills/.agents/skills/saas-security/references/vendor-specifics.md
- Network accessline 49
| Slack bot tokens | Requesting the full scope catalogue | Only the scopes you actually call | | Google Workspace OAuth | `admin.directory.user` when you do not write | `.../auth/admin.directory.user.readonly` | | Google Workspace OAuth | ` - Network accessline 50
| Google Workspace OAuth | `admin.directory.user` when you do not write | `.../auth/admin.directory.user.readonly` | | Google Workspace OAuth | `https://www.googleapis.com/auth/admin` (super admin) outside a tightly-controlled IT-owned auto - Network accessline 51
| Google Workspace OAuth | `https://www.googleapis.com/auth/admin` (super admin) outside a tightly-controlled IT-owned automation | `admin.directory.*.readonly` |
dist/agent-skills/.agents/skills/secret-detection/SKILL.md
dist/agent-skills/.agents/skills/secret-detection/metadata.json
- Access to secretsline 5
[Credential-related source omitted]
dist/agent-skills/.agents/skills/security-regression-tests/SKILL.md
- Network accessline 17
- Assert the **effect**, not only the status code. A `403` proves the request was refused; it does not prove the write did not land somewhere else, that the record was not returned in a different shape, or that a queue message was not emitt - Network accessline 18
- Seed the **fixtures the assertion depends on** before writing it. A cross-tenant test needs two principals and two owned resources, deterministically created — if both test users end up in the same tenant, the deny assertion is untestable - Network accessline 19
- Make it **deterministic and offline**. Freeze the clock for expiry and TTL assertions, stub the HTTP client, dialer or resolver rather than reaching the network, fix random seeds, and avoid sleep-based timing assertions and state shared b
dist/agent-skills/.agents/skills/security-regression-tests/references/test-by-class.md
- Network accessline 22
| **Path traversal** | `../../etc/passwd`, an encoded separator, an absolute path | `400` / `404` | No read outside the base directory — assert on the resolved path, or stub the filesystem | | **Command injection** | `; id`, `$(id)`, `` `id - Network accessline 23
| **Command injection** | `; id`, `$(id)`, `` `id` ``, a newline | Normal or rejected | Assert the subprocess was invoked with an **argv array** and the metacharacters arrived as one literal argument | | **SSRF** | `http://169.254.169.254/l - Network accessline 24
| **SSRF** | `http://169.254.169.254/latest/meta-data/`, `http://127.0.0.1:6379/` | `400` | Stub the dialer or transport and assert **no outbound connection was attempted**. A `4xx` alone does not tell you the fetch was never made | - Network accessline 25
| **XXE** | A document declaring an external entity or external DTD | Parse error or entity ignored | The entity's content is absent from the parsed result, and no outbound fetch was attempted | | **Open redirect** | `?next=https://evil.exa - Network accessline 26
| **Open redirect** | `?next=https://evil.example`, `//evil.example`, `/\evil.example` | Redirect refused or rewritten | The `Location` header points at your own origin |
dist/agent-skills/.agents/skills/ssrf-prevention/SKILL.md
- Network accessline 15
- Constrain the destination with an **allowlist of hosts you intend to reach**, not a denylist of addresses you intend to avoid. A denylist has to enumerate every spelling of every internal address — decimal and octal IPv4, IPv6 and IPv4-ma - Network accessline 16
- Know which of the two controls you built, because it decides whether re-resolution matters. An **allowlist of hostnames** survives DNS rebinding: the attacker controls DNS only for names they own, and those names are not on the list. An * - Network accessline 17
- Re-validate **at every redirect hop**, or disable redirect-following entirely on fetchers that take user-supplied URLs. An allowed host answering `302` to `http://169.254.169.254/` is the single most common bypass, and it defeats a check - Network accessline 27
- Ship a forwarder that switches on the shape of its input — `path.startsWith('http') ? path : base + path`. It is a latent SSRF that activates the day any caller passes user-influenced input. - Rely on an egress proxy or metadata-blocking - Network accessline 28
- Rely on an egress proxy or metadata-blocking sidecar as the **only** control. It constrains where traffic goes, not what the application asks for, and it is bypassed by any request path that does not traverse it. - Compare a URL as a **st - Network accessline 29
- Compare a URL as a **string** — prefix match, `contains`, a regex over the raw text. Parse it, then compare the parsed host. `https://allowed.example.com@evil.com/`, `https://evil.com/?x=allowed.example.com` and `https://allowed.example.c
dist/agent-skills/.agents/skills/ssrf-prevention/references/verifying-findings.md
- Network accessline 27
| Target | Probe | Real hit | |---|---|---| | **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | - Network accessline 28
|---|---|---| | **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | | **Internal service** | `http://127.0.0.1:6379`, `http://localhost:22` | Service banner or data returns | - Network accessline 29
| **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | - Network accessline 30
| **Internal service** | `http://127.0.0.1:6379`, `http://localhost:22` | Service banner or data returns | | **Redirect bypass** | A URL that `302`s to an internal IP | The server follows it | | **DNS rebinding** | A host that resolves publ
dist/agent-skills/.agents/skills/supply-chain-security/references/ecosystem-controls.md
- Network accessline 16
| Ecosystem | Mechanism | Isolation strength | |---|---|---| | **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only | - Network accessline 17
|---|---|---| | **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only | | **Gradle / Maven** | `exclusiveContent { forRepository { … } f - Network accessline 18
| **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only |
dist/agent-skills/.agents/skills/threat-modeling/references/design-level-failures.md
- Access to secretsline 9
[Credential-related source omitted]
dist/agent-skills/.agents/skills/websocket-security/references/verifying-findings.md
- Network accessline 25
| Class | Probe | Real hit | False positive | |---|---|---|---| | **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and - Network accessline 26
|---|---|---|---| | **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and starts streaming the user's data | The upgrade - Network accessline 27
| **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and starts streaming the user's data | The upgrade is refused — `4xx
dist/claude-skills/.claude/skills/cicd-security/SKILL.md
- Dangerous shell operationline 27
- `curl | bash` (or `wget -O- | sh`) any installer script in CI. The 2021 Codecov bash-uploader compromise exfiltrated env vars to an attacker for ~10 weeks because thousands of pipelines ran `bash <(curl https://codecov.io/bash)`. Always d - Network accessline 27
- `curl | bash` (or `wget -O- | sh`) any installer script in CI. The 2021 Codecov bash-uploader compromise exfiltrated env vars to an attacker for ~10 weeks because thousands of pipelines ran `bash <(curl https://codecov.io/bash)`. Always d
dist/claude-skills/.claude/skills/cicd-security/references/verifying-findings.md
- Network accessline 29
| **Script injection** | Trace a `${{ github.event.* }}` value into a `run:` body and echo a marker to prove it executes | The marker executes | The value is passed through an environment variable first | | **Default-write permissions** | I - Network accessline 30
| **Default-write permissions** | Inspect the run's `GITHUB_TOKEN` scopes | `write-all` | A top-level `permissions:` block scoped to `contents: read` | | **curl \| bash** | Read the installer step | A remote script piped straight to a shell - Dangerous shell operationline 31
| **curl \| bash** | Read the installer step | A remote script piped straight to a shell | Downloaded, checksummed, then executed | - Network accessline 31
| **curl \| bash** | Read the installer step | A remote script piped straight to a shell | Downloaded, checksummed, then executed | - Network accessline 53
| A workflow using a floating tag (`@v1`, `@main`, `@latest`) | Gate fails | | A workflow with no top-level `permissions: contents: read` | Gate fails | | `curl \| bash` in a `run:` step | Gate fails | - Network accessline 54
| A workflow with no top-level `permissions: contents: read` | Gate fails | | `curl \| bash` in a `run:` step | Gate fails | | A `pull_request_target` job that checks out the PR head with secrets in scope | Gate fails | - Dangerous shell operationline 55
| `curl \| bash` in a `run:` step | Gate fails | - Network accessline 55
| `curl \| bash` in a `run:` step | Gate fails |
dist/claude-skills/.claude/skills/container-security/SKILL.md
- Dangerous shell operationline 21
- Pin **apt** packages and clean lists in the same layer: `apt-get update && apt-get install -y --no-install-recommends pkg=1.2.3 && rm -rf /var/lib/apt/lists/*`. The `update` must be in that same `RUN` — without it there are no package lis - Network accessline 39
- Run a tenant's container `privileged` on a host shared with other tenants, or attach tenant containers to a **shared external bridge network** — the first gives container-escape → co-tenant takeover, the second gives cross-tenant L3 reach - Network accessline 40
- Embed secrets in image layers via `ENV`, `ARG`, `COPY`, or by `echo`-ing them to a file. Even if `--squash`'d, BuildKit cache and registry layers leak. - Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote scri - Dangerous shell operationline 41
- Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote script to a shell is arbitrary remote code at build time. Download, verify a pinned SHA-256, then execute. - Network accessline 41
- Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote script to a shell is arbitrary remote code at build time. Download, verify a pinned SHA-256, then execute. - Network accessline 42
- Use an **unversioned** tag as the final image base — `latest`, `stable`, or a bare variant like `python:slim` / `node:alpine`. Builds become non-reproducible and quietly pick up CVEs. The *versioned* variants (`python:3.12-slim`, `node:20 - Network accessline 43
- Use `ADD <url>` to fetch a remote resource **unverified**. Either `ADD --checksum=sha256:<hash> <url>` (Dockerfile frontend 1.6+), or `RUN curl --fail` plus an explicit checksum step, or vendor the artifact.
dist/claude-skills/.claude/skills/container-security/references/eol-base-images.md
- Network accessline 40
https://endoflife.date/api/<product>.json
dist/claude-skills/.claude/skills/container-security/references/verifying-findings.md
- Network accessline 28
| **Unpinned or EOL base** | Resolve the final `FROM` | A mutable tag (`latest`, `stable`, `slim`) or an end-of-life runtime | A `@sha256:` digest on a maintained runtime | | **Secrets in layers** | `docker history --no-trunc img`, or `dive - Network accessline 29
| **Secrets in layers** | `docker history --no-trunc img`, or `dive` | A token visible in `ENV`, `ARG` or `COPY` | No credential in any layer | | **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote scr - Dangerous shell operationline 30
| **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote script piped to a shell | Downloaded, verified against a pinned SHA-256, then executed | - Network accessline 30
| **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote script piped to a shell | Downloaded, verified against a pinned SHA-256, then executed |
dist/claude-skills/.claude/skills/cors-security/SKILL.md
- Network accessline 15
- For any non-public endpoint, allow origins from an explicit allowlist. `*` is correct only when the resource is intentionally public *and* cross-origin access never carries credentials. - When a cross-origin request carries credentials — - Network accessline 16
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Network accessline 17
- Compare origins by exact match on the **serialized** origin — scheme, host, and port, all three. Never substring, prefix, or suffix matching: `endsWith("example.com")` accepts `https://example.com.evil.com`, and an unescaped `.` in `^http
dist/claude-skills/.claude/skills/cors-security/references/verifying-findings.md
- Network accessline 20
| Class | Probe | Real hit | False positive | |---|---|---|---| | **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Creden - Network accessline 21
|---|---|---|---| | **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Credentials: true` | No ACAO header, or a fixed trus - Network accessline 22
| **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Credentials: true` | No ACAO header, or a fixed trusted origin returne - Network accessline 47
| Input | Expected | |---|---| | `Origin: https://evil.example` with credentials | No reflected ACAO | - Network accessline 48
|---|---| | `Origin: https://evil.example` with credentials | No reflected ACAO | | `Origin: null` with credentials | No reflected ACAO | - Network accessline 49
| `Origin: https://evil.example` with credentials | No reflected ACAO |
dist/claude-skills/.claude/skills/crypto-misuse/SKILL.md
- Network accessline 15
- Use a maintained, widely reviewed cryptographic API — the platform's own (Node `crypto`, Java JCE, .NET `System.Security.Cryptography`, Go `crypto/*`) or a reputable third-party one (PyCA `cryptography`, `golang.org/x/crypto`, Bouncy Cast - Network accessline 16
- Use a cryptographically secure RNG for anything security-relevant: Python `secrets.token_bytes` / `secrets.token_urlsafe`, JS `crypto.getRandomValues` / `crypto.randomBytes`, Go `crypto/rand.Read`, Java `SecureRandom`. - Hash passwords wi - Network accessline 17
- Hash passwords with a password-specific KDF and a unique random salt per password. Prefer Argon2id; scrypt where appropriate; bcrypt for legacy compatibility; PBKDF2-HMAC-SHA-256 where FIPS-140 compliance is required. Take minimum paramet
dist/claude-skills/.claude/skills/deserialization-security/references/xml.md
- Network accessline 18
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 19
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 20
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 21
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 22
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dist/claude-skills/.claude/skills/electron-security/SKILL.md
- Network accessline 42
- Dev builds that load `http://localhost:<port>` with relaxed settings — these rules govern **release** builds; the finding is dev config that ships. - Network accessline 43
- A custom protocol (`myapp://`) for OAuth callbacks is expected. The control is `state` / PKCE validation, not the scheme's existence. - `contextBridge`-exposed functions are intentional capabilities. Review what each one does and whether - Network accessline 44
- `contextBridge`-exposed functions are intentional capabilities. Review what each one does and whether it validates input, not the fact that a bridge exists. - `shell.openExternal` on a hard-coded `https://` constant, not user input. - A f - Network accessline 45
- `shell.openExternal` on a hard-coded `https://` constant, not user input.
dist/claude-skills/.claude/skills/electron-security/references/electron-hardening.md
- Access to secretsline 56
[Credential-related source omitted]
dist/claude-skills/.claude/skills/electron-security/references/verifying-findings.md
dist/claude-skills/.claude/skills/frontend-security/references/browser-controls.md
dist/claude-skills/.claude/skills/iac-security/SKILL.md
- Access to secretsline 26
[Credential-related source omitted]
dist/claude-skills/.claude/skills/iac-security/references/backends-and-state.md
- Network accessline 83
# pinned to an immutable commit — the module cannot change under you module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" - Network accessline 84
module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" } - Network accessline 85
source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" - Network accessline 88
# a tag can be moved; a branch changes on every push module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker - Network accessline 89
module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker source = "git::https://github.com/org/modules.git//vpc?ref=main" # unpinned - Network accessline 90
source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker - Network accessline 91
source = "git::https://github.com/org/modules.git//vpc?ref=main" # unpinned
dist/claude-skills/.claude/skills/mobile-security/SKILL.md
dist/claude-skills/.claude/skills/mobile-security/references/platform-specifics.md
- Access to secretsline 123
[Credential-related source omitted]
dist/claude-skills/.claude/skills/mobile-security/references/verifying-findings.md
dist/claude-skills/.claude/skills/protocol-security/references/tls-configuration.md
dist/claude-skills/.claude/skills/protocol-security/references/verifying-findings.md
- Network accessline 24
| **Downgrade / weak cipher** | `testssl.sh host:port`, or force a sub-1.2 handshake: `openssl s_client -connect host:port -tls1_1`, or `-cipher 'DES-CBC3-SHA'` | The weak handshake succeeds | A documented legacy-peer exception, isolated be - Network accessline 25
| **Certificate validation** | Present an invalid, self-signed, or wrong-hostname certificate to the client | The client completes the connection | The client refuses it | | **Plaintext fallback / HSTS** | Request the `http://` scheme | `20 - Network accessline 26
| **Plaintext fallback / HSTS** | Request the `http://` scheme | `200` with no redirect, or no `Strict-Transport-Security` header on the HTTPS response | A public read-only endpoint, such as a status page, served over HTTP by design |
dist/claude-skills/.claude/skills/saas-security/references/vendor-specifics.md
- Network accessline 49
| Slack bot tokens | Requesting the full scope catalogue | Only the scopes you actually call | | Google Workspace OAuth | `admin.directory.user` when you do not write | `.../auth/admin.directory.user.readonly` | | Google Workspace OAuth | ` - Network accessline 50
| Google Workspace OAuth | `admin.directory.user` when you do not write | `.../auth/admin.directory.user.readonly` | | Google Workspace OAuth | `https://www.googleapis.com/auth/admin` (super admin) outside a tightly-controlled IT-owned auto - Network accessline 51
| Google Workspace OAuth | `https://www.googleapis.com/auth/admin` (super admin) outside a tightly-controlled IT-owned automation | `admin.directory.*.readonly` |
dist/claude-skills/.claude/skills/secret-detection/SKILL.md
dist/claude-skills/.claude/skills/secret-detection/metadata.json
- Access to secretsline 5
[Credential-related source omitted]
dist/claude-skills/.claude/skills/security-regression-tests/SKILL.md
- Network accessline 17
- Assert the **effect**, not only the status code. A `403` proves the request was refused; it does not prove the write did not land somewhere else, that the record was not returned in a different shape, or that a queue message was not emitt - Network accessline 18
- Seed the **fixtures the assertion depends on** before writing it. A cross-tenant test needs two principals and two owned resources, deterministically created — if both test users end up in the same tenant, the deny assertion is untestable - Network accessline 19
- Make it **deterministic and offline**. Freeze the clock for expiry and TTL assertions, stub the HTTP client, dialer or resolver rather than reaching the network, fix random seeds, and avoid sleep-based timing assertions and state shared b
dist/claude-skills/.claude/skills/security-regression-tests/references/test-by-class.md
- Network accessline 22
| **Path traversal** | `../../etc/passwd`, an encoded separator, an absolute path | `400` / `404` | No read outside the base directory — assert on the resolved path, or stub the filesystem | | **Command injection** | `; id`, `$(id)`, `` `id - Network accessline 23
| **Command injection** | `; id`, `$(id)`, `` `id` ``, a newline | Normal or rejected | Assert the subprocess was invoked with an **argv array** and the metacharacters arrived as one literal argument | | **SSRF** | `http://169.254.169.254/l - Network accessline 24
| **SSRF** | `http://169.254.169.254/latest/meta-data/`, `http://127.0.0.1:6379/` | `400` | Stub the dialer or transport and assert **no outbound connection was attempted**. A `4xx` alone does not tell you the fetch was never made | - Network accessline 25
| **XXE** | A document declaring an external entity or external DTD | Parse error or entity ignored | The entity's content is absent from the parsed result, and no outbound fetch was attempted | | **Open redirect** | `?next=https://evil.exa - Network accessline 26
| **Open redirect** | `?next=https://evil.example`, `//evil.example`, `/\evil.example` | Redirect refused or rewritten | The `Location` header points at your own origin |
dist/claude-skills/.claude/skills/ssrf-prevention/SKILL.md
- Network accessline 15
- Constrain the destination with an **allowlist of hosts you intend to reach**, not a denylist of addresses you intend to avoid. A denylist has to enumerate every spelling of every internal address — decimal and octal IPv4, IPv6 and IPv4-ma - Network accessline 16
- Know which of the two controls you built, because it decides whether re-resolution matters. An **allowlist of hostnames** survives DNS rebinding: the attacker controls DNS only for names they own, and those names are not on the list. An * - Network accessline 17
- Re-validate **at every redirect hop**, or disable redirect-following entirely on fetchers that take user-supplied URLs. An allowed host answering `302` to `http://169.254.169.254/` is the single most common bypass, and it defeats a check - Network accessline 27
- Ship a forwarder that switches on the shape of its input — `path.startsWith('http') ? path : base + path`. It is a latent SSRF that activates the day any caller passes user-influenced input. - Rely on an egress proxy or metadata-blocking - Network accessline 28
- Rely on an egress proxy or metadata-blocking sidecar as the **only** control. It constrains where traffic goes, not what the application asks for, and it is bypassed by any request path that does not traverse it. - Compare a URL as a **st - Network accessline 29
- Compare a URL as a **string** — prefix match, `contains`, a regex over the raw text. Parse it, then compare the parsed host. `https://allowed.example.com@evil.com/`, `https://evil.com/?x=allowed.example.com` and `https://allowed.example.c
dist/claude-skills/.claude/skills/ssrf-prevention/references/verifying-findings.md
- Network accessline 27
| Target | Probe | Real hit | |---|---|---| | **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | - Network accessline 28
|---|---|---| | **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | | **Internal service** | `http://127.0.0.1:6379`, `http://localhost:22` | Service banner or data returns | - Network accessline 29
| **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | - Network accessline 30
| **Internal service** | `http://127.0.0.1:6379`, `http://localhost:22` | Service banner or data returns | | **Redirect bypass** | A URL that `302`s to an internal IP | The server follows it | | **DNS rebinding** | A host that resolves publ
dist/claude-skills/.claude/skills/supply-chain-security/references/ecosystem-controls.md
- Network accessline 16
| Ecosystem | Mechanism | Isolation strength | |---|---|---| | **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only | - Network accessline 17
|---|---|---| | **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only | | **Gradle / Maven** | `exclusiveContent { forRepository { … } f - Network accessline 18
| **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only |
dist/claude-skills/.claude/skills/threat-modeling/references/design-level-failures.md
- Access to secretsline 9
[Credential-related source omitted]
dist/claude-skills/.claude/skills/websocket-security/references/verifying-findings.md
- Network accessline 25
| Class | Probe | Real hit | False positive | |---|---|---|---| | **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and - Network accessline 26
|---|---|---|---| | **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and starts streaming the user's data | The upgrade - Network accessline 27
| **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and starts streaming the user's data | The upgrade is refused — `4xx
skills/api-security/SKILL.md
- Network accessline 108
- `checklists/auth_patterns.yaml` - `checklists/input_validation.yaml` - [OWASP API Security Top 10 2023](https://owasp.org/API-Security/editions/2023/en/0x00-introduction/). - Network accessline 109
- `checklists/input_validation.yaml` - [OWASP API Security Top 10 2023](https://owasp.org/API-Security/editions/2023/en/0x00-introduction/). - [RFC 9700 — OAuth 2.0 Security BCP](https://datatracker.ietf.org/doc/html/rfc9700). - Network accessline 110
- [OWASP API Security Top 10 2023](https://owasp.org/API-Security/editions/2023/en/0x00-introduction/). - Network accessline 111
- [RFC 9700 — OAuth 2.0 Security BCP](https://datatracker.ietf.org/doc/html/rfc9700).
skills/auth-security/SKILL.md
- Network accessline 136
- `rules/jwt_safe_config.json` - `rules/oauth_flows.json` - [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) — the source of record for work factors; read it, do not reca - Network accessline 137
- `rules/oauth_flows.json` - [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) — the source of record for work factors; read it, do not recall it. - [OWASP Authentication - Network accessline 138
- [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) — the source of record for work factors; read it, do not recall it. - Network accessline 139
- [OWASP Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html). - Network accessline 140
- [RFC 9700 — OAuth 2.0 Security BCP](https://datatracker.ietf.org/doc/html/rfc9700). - Network accessline 141
- [NIST SP 800-63B](https://pages.nist.gov/800-63-3/sp800-63b.html).
skills/auth-security/rules/oauth_flows.json
skills/cicd-security/SKILL.md
- Network accessline 89
### NEVER - `curl | bash` (or `wget -O- | sh`) any installer script in CI. - Dangerous shell operationline 90
- `curl | bash` (or `wget -O- | sh`) any installer script in CI. - Network accessline 90
- `curl | bash` (or `wget -O- | sh`) any installer script in CI. - Network accessline 91
The 2021 Codecov bash-uploader compromise exfiltrated env vars to an attacker for ~10 weeks because thousands of pipelines ran `bash <(curl https://codecov.io/bash)`. Always download, checksum, - Network accessline 92
attacker for ~10 weeks because thousands of pipelines ran `bash <(curl https://codecov.io/bash)`. Always download, checksum, then execute. - Dangerous shell operationline 93
`bash <(curl https://codecov.io/bash)`. Always download, checksum, - Network accessline 93
`bash <(curl https://codecov.io/bash)`. Always download, checksum, - Network accessline 145
- `references/verifying-findings.md` — confirm or refute a finding, then lock it - `checklists/gitlab_ci_hardening.yaml` - [OpenSSF Scorecard](https://github.com/ossf/scorecard). - Network accessline 146
- `checklists/gitlab_ci_hardening.yaml` - [OpenSSF Scorecard](https://github.com/ossf/scorecard). - [SLSA v1.0 Build Track](https://slsa.dev/spec/v1.0/levels). - Network accessline 147
- [OpenSSF Scorecard](https://github.com/ossf/scorecard). - [SLSA v1.0 Build Track](https://slsa.dev/spec/v1.0/levels). - [GitHub Security Lab — Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn- - Network accessline 148
- [SLSA v1.0 Build Track](https://slsa.dev/spec/v1.0/levels). - [GitHub Security Lab — Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). - [StepSecurity — tj-actions/changed-files att - Network accessline 149
- [GitHub Security Lab — Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). - Network accessline 150
- [StepSecurity — tj-actions/changed-files attack analysis](https://www.stepsecurity.io/blog/tj-actions-changed-files-attack-analysis). - Network accessline 151
- [CWE-1395](https://cwe.mitre.org/data/definitions/1395.html).
skills/cicd-security/checklists/gitlab_ci_hardening.yaml
- Network accessline 7
and class-of-attack mitigations parallel to GitHub Actions guidance. references: - "https://docs.gitlab.com/ee/ci/pipelines/pipeline_security.html" - Network accessline 8
references: - "https://docs.gitlab.com/ee/ci/pipelines/pipeline_security.html" - "https://docs.gitlab.com/ee/ci/yaml/#workflowrules" - Network accessline 9
- "https://docs.gitlab.com/ee/ci/pipelines/pipeline_security.html" - Network accessline 10
- "https://docs.gitlab.com/ee/ci/yaml/#workflowrules" - Network accessline 11
- "https://docs.gitlab.com/ee/ci/runners/configure_runners.html"
skills/cicd-security/references/verifying-findings.md
- Network accessline 29
| **Script injection** | Trace a `${{ github.event.* }}` value into a `run:` body and echo a marker to prove it executes | The marker executes | The value is passed through an environment variable first | | **Default-write permissions** | I - Network accessline 30
| **Default-write permissions** | Inspect the run's `GITHUB_TOKEN` scopes | `write-all` | A top-level `permissions:` block scoped to `contents: read` | | **curl \| bash** | Read the installer step | A remote script piped straight to a shell - Dangerous shell operationline 31
| **curl \| bash** | Read the installer step | A remote script piped straight to a shell | Downloaded, checksummed, then executed | - Network accessline 31
| **curl \| bash** | Read the installer step | A remote script piped straight to a shell | Downloaded, checksummed, then executed | - Network accessline 53
| A workflow using a floating tag (`@v1`, `@main`, `@latest`) | Gate fails | | A workflow with no top-level `permissions: contents: read` | Gate fails | | `curl \| bash` in a `run:` step | Gate fails | - Network accessline 54
| A workflow with no top-level `permissions: contents: read` | Gate fails | | `curl \| bash` in a `run:` step | Gate fails | | A `pull_request_target` job that checks out the PR head with secrets in scope | Gate fails | - Dangerous shell operationline 55
| `curl \| bash` in a `run:` step | Gate fails | - Network accessline 55
| `curl \| bash` in a `run:` step | Gate fails |
skills/container-security/SKILL.md
- Dangerous shell operationline 71
apt-get install -y --no-install-recommends pkg=1.2.3 && rm -rf - Network accessline 145
<!-- pattern: { id: dkr-no-secrets-in-build-args, severity: critical, cwe: 798, check: llm } --> <!-- pattern: { id: dkr-no-secret-leak-in-layers, severity: critical, check: llm } --> - Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — - Network accessline 146
<!-- pattern: { id: dkr-no-secret-leak-in-layers, severity: critical, check: llm } --> - Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified remote script to a shell is arbitrary remote code at build time. Download, - Dangerous shell operationline 147
- Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified - Network accessline 147
- Run `curl … | sh` or `wget -O- … | sh` in a `RUN` — piping an unverified - Network accessline 157
- Use `ADD <url>` to fetch a remote resource **unverified**. Either `ADD --checksum=sha256:<hash> <url>` (Dockerfile frontend 1.6+), or `RUN curl --fail` plus an explicit checksum step, or vendor the artifact. - Network accessline 158
`ADD --checksum=sha256:<hash> <url>` (Dockerfile frontend 1.6+), or `RUN curl --fail` plus an explicit checksum step, or vendor the artifact. <!-- pattern: { id: dkr-no-add-remote, severity: medium, check: deterministic } --> - Network accessline 221
(`internal/tools/library_scanners.go`), not in a checklist file — run them with `secure-vibe scan` or the `scan_dockerfile` tool. - [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker). - Network accessline 222
`secure-vibe scan` or the `scan_dockerfile` tool. - [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker). - [CIS Kubernetes Benchmark](https://www.cisecurity.org/benchmark/kubernetes). - Network accessline 223
- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker). - Network accessline 224
- [CIS Kubernetes Benchmark](https://www.cisecurity.org/benchmark/kubernetes). - Network accessline 225
- [NIST SP 800-190](https://csrc.nist.gov/publications/detail/sp/800-190/final).
skills/container-security/references/eol-base-images.md
- Network accessline 40
https://endoflife.date/api/<product>.json
skills/container-security/references/verifying-findings.md
- Network accessline 28
| **Unpinned or EOL base** | Resolve the final `FROM` | A mutable tag (`latest`, `stable`, `slim`) or an end-of-life runtime | A `@sha256:` digest on a maintained runtime | | **Secrets in layers** | `docker history --no-trunc img`, or `dive - Network accessline 29
| **Secrets in layers** | `docker history --no-trunc img`, or `dive` | A token visible in `ENV`, `ARG` or `COPY` | No credential in any layer | | **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote scr - Dangerous shell operationline 30
| **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote script piped to a shell | Downloaded, verified against a pinned SHA-256, then executed | - Network accessline 30
| **Remote script execution** | Read the `RUN` steps | `curl … \| sh` — an unverified remote script piped to a shell | Downloaded, verified against a pinned SHA-256, then executed |
skills/container-security/tests/corpus.json
- Network accessline 8
"id": "latest-tag-root-curl-sh", "filename": "Dockerfile", "text": "FROM node:latest\nUSER root\nRUN curl http://example.com/install.sh | sh\n", - Dangerous shell operationline 10
"text": "FROM node:latest\nUSER root\nRUN curl http://example.com/install.sh | sh\n", - Network accessline 10
"text": "FROM node:latest\nUSER root\nRUN curl http://example.com/install.sh | sh\n", - Network accessline 32
"id": "add-remote-url", "filename": "Dockerfile", "text": "FROM node:18@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\nADD https://example.com/app.tar.gz /opt/app.tar.gz\nUSER 10001\nHEALTHCHECK CMD tru - Network accessline 34
"text": "FROM node:18@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\nADD https://example.com/app.tar.gz /opt/app.tar.gz\nUSER 10001\nHEALTHCHECK CMD true\nCMD [\"node\", \"server.js\"]\n", - Dangerous shell operationline 50
"text": "FROM node:18@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\nUSER 10001\nRUN echo \"no remote fetch, no curl|sh\"\nHEALTHCHECK CMD true\nCMD [\"node\", \"server.js\"]\n",
skills/cors-security/SKILL.md
- Access to secretsline 35
[Credential-related source omitted] - Network accessline 41
- Compare origins by exact match on the **serialized** origin — scheme, host, and port, all three. Never substring, prefix, or suffix matching: `endsWith("example.com")` accepts `https://example.com.evil.com`, and an unescaped `.` in - Network accessline 42
all three. Never substring, prefix, or suffix matching: `endsWith("example.com")` accepts `https://example.com.evil.com`, and an unescaped `.` in `^https://api.example.com$` accepts `https://apiXexample.com`. - Network accessline 43
accepts `https://example.com.evil.com`, and an unescaped `.` in - Network accessline 44
`^https://api.example.com$` accepts `https://apiXexample.com`. - Network accessline 106
- `references/verifying-findings.md` — confirm or refute a finding, then lock it - `rules/cors_safe_config.json` - [OWASP CORS Origin Header Scrutiny](https://owasp.org/www-community/attacks/CORS_OriginHeaderScrutiny). - Network accessline 107
- `rules/cors_safe_config.json` - [OWASP CORS Origin Header Scrutiny](https://owasp.org/www-community/attacks/CORS_OriginHeaderScrutiny). - [CWE-942](https://cwe.mitre.org/data/definitions/942.html). - Network accessline 108
- [OWASP CORS Origin Header Scrutiny](https://owasp.org/www-community/attacks/CORS_OriginHeaderScrutiny). - [CWE-942](https://cwe.mitre.org/data/definitions/942.html). - [Fetch — CORS protocol](https://fetch.spec.whatwg.org/#http-cors-proto - Network accessline 109
- [CWE-942](https://cwe.mitre.org/data/definitions/942.html). - Network accessline 110
- [Fetch — CORS protocol](https://fetch.spec.whatwg.org/#http-cors-protocol).
skills/cors-security/references/verifying-findings.md
- Network accessline 20
| Class | Probe | Real hit | False positive | |---|---|---|---| | **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Creden - Network accessline 21
|---|---|---|---| | **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Credentials: true` | No ACAO header, or a fixed trus - Network accessline 22
| **Reflected origin** | `Origin: https://evil.example` | The response echoes `Access-Control-Allow-Origin: https://evil.example` **together with** `Access-Control-Allow-Credentials: true` | No ACAO header, or a fixed trusted origin returne - Network accessline 47
| Input | Expected | |---|---| | `Origin: https://evil.example` with credentials | No reflected ACAO | - Network accessline 48
|---|---| | `Origin: https://evil.example` with credentials | No reflected ACAO | | `Origin: null` with credentials | No reflected ACAO | - Network accessline 49
| `Origin: https://evil.example` with credentials | No reflected ACAO |
skills/cors-security/tests/corpus.json
- Network accessline 11
{ "id": "allowlist-with-credentials", "text": "const ALLOWED = new Set(['https://app.example.com']); app.use((req, res, next) => { const origin = req.headers.origin; if (ALLOWED.has(origin)) { res.setHeader('Access-Control-Allow - Network accessline 13
"text": "const ALLOWED = new Set(['https://app.example.com']); app.use((req, res, next) => { const origin = req.headers.origin; if (ALLOWED.has(origin)) { res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader('Access-Control-A - Network accessline 23
{ "id": "reflect-allowlisted-origin", "text": "const ALLOWED = new Set(['https://app.example.com']); app.use((req, res, next) => { const origin = req.headers.origin; if (ALLOWED.has(origin)) { res.setHeader('Access-Control-Allow - Network accessline 25
"text": "const ALLOWED = new Set(['https://app.example.com']); app.use((req, res, next) => { const origin = req.headers.origin; if (ALLOWED.has(origin)) { res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader('Vary', 'Origin') - Network accessline 35
{ "id": "cors-middleware-allowlist", "text": "const cors = require('cors'); const ALLOWED = ['https://app.example.com']; app.use(cors({ origin: ALLOWED, credentials: true }));", - Network accessline 37
"text": "const cors = require('cors'); const ALLOWED = ['https://app.example.com']; app.use(cors({ origin: ALLOWED, credentials: true }));",
skills/crypto-misuse/SKILL.md
- Network accessline 45
PBKDF2-HMAC-SHA-256 where FIPS-140 compliance is required. Take minimum parameters from the current [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html), - Network accessline 46
from the current [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html), then benchmark on production hardware and choose the highest cost that still meets - Network accessline 47
Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html), - Network accessline 138
- `rules/algorithm_blocklist.json` - `rules/key_size_minimums.json` - [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) — the source of record for KDF work factors. - Network accessline 139
- `rules/key_size_minimums.json` - [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) — the source of record for KDF work factors. - [OWASP Cryptographic Storage Cheat Shee - Network accessline 140
- [OWASP Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) — the source of record for KDF work factors. - Network accessline 141
- [OWASP Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html). - Network accessline 142
- [NIST SP 800-131A](https://csrc.nist.gov/publications/detail/sp/800-131a/rev-2/final) and [SP 800-57 Part 1](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final) — check the CSRC page for a newer revision before citing - Network accessline 143
- [CWE-327](https://cwe.mitre.org/data/definitions/327.html) — Broken or risky crypto. - Network accessline 144
- [CWE-916](https://cwe.mitre.org/data/definitions/916.html) — Insufficient computational effort for password hash.
skills/database-security/SKILL.md
- Network accessline 139
- `rules/sql_injection_sinks.json` - `rules/orm_safe_patterns.json` - [OWASP SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html). - Network accessline 140
- `rules/orm_safe_patterns.json` - [OWASP SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html). - [OWASP NoSQL Security Cheat Sheet](https://cheatsheetseries.owasp.o - Network accessline 141
- [OWASP SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html). - Network accessline 142
- [OWASP NoSQL Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/NoSQL_Security_Cheat_Sheet.html). - Network accessline 143
- [CWE-89](https://cwe.mitre.org/data/definitions/89.html) — SQL Injection. - Network accessline 144
- [CWE-943](https://cwe.mitre.org/data/definitions/943.html) — Data query logic injection. - Network accessline 145
- [PostgreSQL Row-Level Security](https://www.postgresql.org/docs/current/ddl-rowsecurity.html).
skills/deserialization-security/SKILL.md
- Network accessline 112
- `references/xml.md` — per-platform flags to disable DTD and external entities - `rules/unsafe_deserializers.json` — build-time catalogue, not shipped to the agent - [OWASP Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/ch - Network accessline 113
- `rules/unsafe_deserializers.json` — build-time catalogue, not shipped to the agent - [OWASP Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html). - [OWASP XXE Prevention Cheat Sheet - Network accessline 114
- [OWASP Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html). - Network accessline 115
- [OWASP XXE Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html). - Network accessline 116
- [CWE-502](https://cwe.mitre.org/data/definitions/502.html) · [CWE-611](https://cwe.mitre.org/data/definitions/611.html).
skills/deserialization-security/references/xml.md
- Network accessline 18
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 19
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 20
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 21
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 22
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
skills/deserialization-security/rules/unsafe_deserializers.json
- Network accessline 4
"description": "Catalogue of deserialization primitives that constitute RCE when fed untrusted bytes, with per-language safe alternatives and references to historical CVEs they have appeared in.", "references": [ "https://cheatsheetse - Network accessline 5
"references": [ "https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html", "https://cwe.mitre.org/data/definitions/502.html" - Network accessline 6
"https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html", - Network accessline 7
"https://cwe.mitre.org/data/definitions/502.html"
skills/dynamic-verification/SKILL.md
- Network accessline 187
- `references/oracles-by-class.md` — which probe proves each vulnerability class, and the three signals that look like proof but are not - [OWASP Web Security Testing Guide](https://owasp.org/www-project-web-security-testing-guide/). - Network accessline 188
- [OWASP Web Security Testing Guide](https://owasp.org/www-project-web-security-testing-guide/). - Network accessline 189
- [OWASP Top 10 2021](https://owasp.org/Top10/). - Network accessline 190
- [PortSwigger Web Security Academy](https://portswigger.net/web-security).
skills/electron-security/SKILL.md
- Network accessline 123
### KNOWN FALSE POSITIVES - Dev builds that load `http://localhost:<port>` with relaxed settings — these rules - Network accessline 124
- Dev builds that load `http://localhost:<port>` with relaxed settings — these rules - Network accessline 128
- `contextBridge`-exposed functions are intentional capabilities. Review what each one does and whether it validates input, not the fact that a bridge exists. - `shell.openExternal` on a hard-coded `https://` constant, not user input. - Network accessline 129
one does and whether it validates input, not the fact that a bridge exists. - `shell.openExternal` on a hard-coded `https://` constant, not user input. - A frameless window loading **only** local first-party content behind a - Network accessline 130
- `shell.openExternal` on a hard-coded `https://` constant, not user input. - Network accessline 166
- `checklists/electron_hardening.yaml` — machine-readable hardening checks (window config, IPC sinks, navigation, deep-link, token storage) - [Electron Security Checklist](https://www.electronjs.org/docs/latest/tutorial/security). - Network accessline 167
(window config, IPC sinks, navigation, deep-link, token storage) - [Electron Security Checklist](https://www.electronjs.org/docs/latest/tutorial/security). - [Electron Fuses](https://www.electronjs.org/docs/latest/tutorial/fuses). - Network accessline 168
- [Electron Security Checklist](https://www.electronjs.org/docs/latest/tutorial/security). - Network accessline 169
- [Electron Fuses](https://www.electronjs.org/docs/latest/tutorial/fuses). - Network accessline 170
- [CWE-78 — OS Command Injection](https://cwe.mitre.org/data/definitions/78.html). - Network accessline 171
- [CWE-22 — Path Traversal](https://cwe.mitre.org/data/definitions/22.html). - Network accessline 172
- [CWE-250 — Execution with Unnecessary Privileges](https://cwe.mitre.org/data/definitions/250.html).
skills/electron-security/checklists/electron_hardening.yaml
- Access to secretsline 55
[Credential-related source omitted]
skills/electron-security/references/electron-hardening.md
- Access to secretsline 56
[Credential-related source omitted]
skills/electron-security/references/verifying-findings.md
skills/electron-security/tests/corpus.json
- Network accessline 5
{ "id": "nodeintegration-window-detect", "text": "const win = new BrowserWindow({\n width: 1200,\n height: 800,\n webPreferences: {\n nodeIntegration: true,\n contextIsolation: false,\n },\n});\nwin.loadURL('https://re - Network accessline 7
"text": "const win = new BrowserWindow({\n width: 1200,\n height: 800,\n webPreferences: {\n nodeIntegration: true,\n contextIsolation: false,\n },\n});\nwin.loadURL('https://reports.example.com/dashboard');", - Network accessline 11
{ "id": "nodeintegration-window-ignore", "text": "const win = new BrowserWindow({\n width: 1200,\n height: 800,\n webPreferences: {\n nodeIntegration: false,\n contextIsolation: true,\n sandbox: true,\n preload: p - Network accessline 13
"text": "const win = new BrowserWindow({\n width: 1200,\n height: 800,\n webPreferences: {\n nodeIntegration: false,\n contextIsolation: true,\n sandbox: true,\n preload: path.join(__dirname, 'preload.js'),\n },\n});\nwin.lo - Dangerous shell operationline 19
"text": "ipcMain.handle('open-container-logs', (event, name) => {\n // name comes from the renderer\n return new Promise((resolve, reject) => {\n exec(`docker logs ${name}`, (err, stdout) => {\n if (err) return reject(err);\n - Dangerous shell operationline 21
"reason": "Concatenates renderer-supplied input into a shell string for child_process.exec, violating NEVER 'Concatenate renderer input into a shell string'. CWE-78 (OS Command Injection); a name of \"x; rm -rf ~\" runs arbitrary commands."
skills/error-handling-security/SKILL.md
- Network accessline 107
framework, and why the environment variable is not the switch - `rules/error_response_template.json` - [OWASP Error Handling Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html). - Network accessline 108
- `rules/error_response_template.json` - [OWASP Error Handling Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html). - [RFC 9457 — Problem Details for HTTP APIs](https://www.rfc-editor.org/rfc/rfc9457 - Network accessline 109
- [OWASP Error Handling Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html). - Network accessline 110
- [RFC 9457 — Problem Details for HTTP APIs](https://www.rfc-editor.org/rfc/rfc9457.html). - Network accessline 111
- [CWE-209](https://cwe.mitre.org/data/definitions/209.html) · [CWE-755](https://cwe.mitre.org/data/definitions/755.html).
skills/file-upload-security/SKILL.md
- Network accessline 137
choice, archive limits, and hardening the media processors - `rules/upload_validation.json` - [OWASP File Upload Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html). - Network accessline 138
- `rules/upload_validation.json` - [OWASP File Upload Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html). - [CWE-434](https://cwe.mitre.org/data/definitions/434.html) · [CWE-409](https://cwe.mitre.org/ - Network accessline 139
- [OWASP File Upload Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html). - Network accessline 140
- [CWE-434](https://cwe.mitre.org/data/definitions/434.html) · [CWE-409](https://cwe.mitre.org/data/definitions/409.html) · [CWE-22](https://cwe.mitre.org/data/definitions/22.html). - Network accessline 141
- [Snyk Zip Slip](https://snyk.io/research/zip-slip-vulnerability) · [ImageTragick](https://imagetragick.com/).
skills/file-upload-security/rules/upload_validation.json
- Network accessline 4
"description": "Validation rules and anti-patterns for HTTP / object-storage file upload endpoints. Combine magic-byte allowlist, filename sanitization, size/timeout limits, separate serving domain, and out-of-band virus scanning.", "refe - Network accessline 5
"references": [ "https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html", "https://cwe.mitre.org/data/definitions/434.html" - Network accessline 6
"https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html", - Network accessline 7
"https://cwe.mitre.org/data/definitions/434.html"
skills/file-upload-security/tests/corpus.json
- Network accessline 11
{ "id": "magic-bytes-allowlist-random-name-ignore", "text": "import { fileTypeFromBuffer } from 'file-type';\nconst ALLOWED = new Set(['image/png', 'image/jpeg']);\napp.post('/upload', upload.single('file'), async (req, res) => - Network accessline 13
"text": "import { fileTypeFromBuffer } from 'file-type';\nconst ALLOWED = new Set(['image/png', 'image/jpeg']);\napp.post('/upload', upload.single('file'), async (req, res) => {\n if (req.file.size > 5 * 1024 * 1024) return res.status(413)
skills/frontend-security/SKILL.md
- Network accessline 150
- `rules/csp_defaults.json` - `rules/xss_sinks.json` - [OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html). - Network accessline 151
- `rules/xss_sinks.json` - [OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html). - [OWASP CSP Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Content - Network accessline 152
- [OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html). - Network accessline 153
- [OWASP CSP Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html). - Network accessline 154
- [OWASP DOM Clobbering Prevention](https://cheatsheetseries.owasp.org/cheatsheets/DOM_Clobbering_Prevention_Cheat_Sheet.html). - Network accessline 155
- [Trusted Types specification (W3C)](https://www.w3.org/TR/trusted-types/). - Network accessline 156
- [CWE-79](https://cwe.mitre.org/data/definitions/79.html) · [CWE-346](https://cwe.mitre.org/data/definitions/346.html).
skills/frontend-security/references/browser-controls.md
skills/frontend-security/tests/corpus.json
- Dangerous shell operationline 31
"text": "function compute(req, res) {\n const expr = req.query.expr;\n const result = eval(expr);\n res.json({ result });\n}",
skills/graphql-security/SKILL.md
- Network accessline 126
where each server configures limits, and APQ versus trusted documents - `rules/graphql_safe_config.json` - [OWASP GraphQL Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html). - Network accessline 127
- `rules/graphql_safe_config.json` - [OWASP GraphQL Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html). - [GraphQL specification — validation](https://spec.graphql.org/). - Network accessline 128
- [OWASP GraphQL Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html). - Network accessline 129
- [GraphQL specification — validation](https://spec.graphql.org/). - Network accessline 130
- [CWE-400](https://cwe.mitre.org/data/definitions/400.html). - Network accessline 131
- [graphql-armor](https://escape.tech/graphql-armor/).
skills/graphql-security/rules/graphql_safe_config.json
- Network accessline 4
"description": "Safe-default configuration for production GraphQL servers, applicable across Apollo Server, graphql-yoga, graphene, gqlgen, Hot Chocolate, etc.", "references": [ "https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_ - Network accessline 5
"references": [ "https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html", "https://www.apollographql.com/docs/apollo-server/security/production-checklist/", - Network accessline 6
"https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html", - Network accessline 7
"https://www.apollographql.com/docs/apollo-server/security/production-checklist/", - Network accessline 8
"https://escape.tech/graphql-armor/"
skills/iac-security/SKILL.md
- Access to secretsline 77
[Credential-related source omitted] - Network accessline 120
- `checklists/terraform_hardening.yaml` - `checklists/cloudformation_hardening.yaml` - [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services). - Network accessline 121
- `checklists/cloudformation_hardening.yaml` - [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services). - [Terraform recommended practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-p - Network accessline 122
- [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services). - Network accessline 123
- [Terraform recommended practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices). - Network accessline 124
- [NIST SP 800-53 Rev. 5](https://csrc.nist.gov/publications/detail/sp/800-53/rev-5/final).
skills/iac-security/references/backends-and-state.md
- Network accessline 83
# pinned to an immutable commit — the module cannot change under you module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" - Network accessline 84
module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" } - Network accessline 85
source = "git::https://github.com/org/modules.git//vpc?ref=a1b2c3d4e5f6…" - Network accessline 88
# a tag can be moved; a branch changes on every push module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker - Network accessline 89
module "vpc" { source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker source = "git::https://github.com/org/modules.git//vpc?ref=main" # unpinned - Network accessline 90
source = "git::https://github.com/org/modules.git//vpc?ref=v1.4.0" # weaker - Network accessline 91
source = "git::https://github.com/org/modules.git//vpc?ref=main" # unpinned
skills/iam-best-practices/SKILL.md
- Network accessline 143
- `rules/iam_policy_invariants.json` - `rules/key_rotation_policy.json` - [AWS IAM best practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html). - Network accessline 144
- `rules/key_rotation_policy.json` - [AWS IAM best practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html). - [Google Cloud IAM recommender](https://cloud.google.com/iam/docs/recommender-overview). - Network accessline 145
- [AWS IAM best practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html). - Network accessline 146
- [Google Cloud IAM recommender](https://cloud.google.com/iam/docs/recommender-overview). - Network accessline 147
- [CNCF Kubernetes RBAC good practices](https://kubernetes.io/docs/concepts/security/rbac-good-practices/). - Network accessline 148
- [NIST SP 800-53 Rev. 5](https://csrc.nist.gov/publications/detail/sp/800-53/rev-5/final).
skills/iam-best-practices/rules/key_rotation_policy.json
skills/llm-app-security/SKILL.md
- Network accessline 133
- `references/verifying-findings.md` — confirm or refute a finding, then lock it - `rules/prompt_injection_patterns.json` - [OWASP Top 10 for LLM Applications 2025](https://genai.owasp.org/llm-top-10/). - Network accessline 134
- `rules/prompt_injection_patterns.json` - [OWASP Top 10 for LLM Applications 2025](https://genai.owasp.org/llm-top-10/). - [OWASP GenAI Security Project](https://genai.owasp.org/) — including the Agentic Applications work. - Network accessline 135
- [OWASP Top 10 for LLM Applications 2025](https://genai.owasp.org/llm-top-10/). - Network accessline 136
- [OWASP GenAI Security Project](https://genai.owasp.org/) — including the Agentic Applications work. - Network accessline 137
- [MITRE ATLAS](https://atlas.mitre.org/). - Network accessline 138
- [CWE-1426](https://cwe.mitre.org/data/definitions/1426.html) — Improper Validation of Generative AI Output.
skills/llm-app-security/tests/corpus.json
- Dangerous shell operationline 19
"text": "const code = await llm.complete(prompt); eval(code);",
skills/logging-security/SKILL.md
- Network accessline 120
`error-handling-security` hands off to it rather than carrying its own - `rules/audit_event_schema.json` - [OWASP Logging Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html). - Network accessline 121
- `rules/audit_event_schema.json` - [OWASP Logging Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html). - [CWE-532](https://cwe.mitre.org/data/definitions/532.html) · [CWE-117](https://cwe.mitre.org/data/de - Network accessline 122
- [OWASP Logging Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html). - Network accessline 123
- [CWE-532](https://cwe.mitre.org/data/definitions/532.html) · [CWE-117](https://cwe.mitre.org/data/definitions/117.html). - Network accessline 124
- [NIST SP 800-92](https://csrc.nist.gov/publications/detail/sp/800-92/final).
skills/logging-security/rules/redaction_patterns.json
skills/ml-security/SKILL.md
- Network accessline 130
pinned PyTorch does by default, Hub loading with pinned revisions, and sandbox settings for inspecting an untrusted artifact - [NIST AI 100-2](https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2023.pdf). - Network accessline 131
settings for inspecting an untrusted artifact - [NIST AI 100-2](https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2023.pdf). - [MITRE ATLAS](https://atlas.mitre.org/). - Network accessline 132
- [NIST AI 100-2](https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2023.pdf). - Network accessline 133
- [MITRE ATLAS](https://atlas.mitre.org/). - Network accessline 134
- [CWE-502](https://cwe.mitre.org/data/definitions/502.html) — Deserialization of Untrusted Data.
skills/ml-security/tests/corpus.json
- Network accessline 5
{ "id": "torch-load-untrusted-url", "text": "import torch, requests, io\n\nurl = 'http://random-models.example.com/community/checkpoint.pt'\nblob = requests.get(url).content\nmodel = torch.load(io.BytesIO(blob)) # default weigh - Network accessline 7
"text": "import torch, requests, io\n\nurl = 'http://random-models.example.com/community/checkpoint.pt'\nblob = requests.get(url).content\nmodel = torch.load(io.BytesIO(blob)) # default weights_only=False\nmodel.eval()", - Network accessline 11
{ "id": "pickle-loads-model", "text": "import pickle, urllib.request\n\nraw = urllib.request.urlopen('https://hub.example.net/uploads/model.pkl').read()\nclf = pickle.loads(raw)\nprediction = clf.predict(features)", - Network accessline 13
"text": "import pickle, urllib.request\n\nraw = urllib.request.urlopen('https://hub.example.net/uploads/model.pkl').read()\nclf = pickle.loads(raw)\nprediction = clf.predict(features)", - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted]
skills/mobile-security/SKILL.md
- Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Network accessline 150
- `checklists/android_manifest.yaml` - `checklists/ios_keychain_ats.yaml` - [OWASP MASVS v2.0](https://mas.owasp.org/MASVS/) · [MASTG](https://mas.owasp.org/MASTG/). - Network accessline 151
- `checklists/ios_keychain_ats.yaml` - [OWASP MASVS v2.0](https://mas.owasp.org/MASVS/) · [MASTG](https://mas.owasp.org/MASTG/). - [CWE-919](https://cwe.mitre.org/data/definitions/919.html) — Weaknesses in Mobile Applications. - Network accessline 152
- [OWASP MASVS v2.0](https://mas.owasp.org/MASVS/) · [MASTG](https://mas.owasp.org/MASTG/). - Network accessline 153
- [CWE-919](https://cwe.mitre.org/data/definitions/919.html) — Weaknesses in Mobile Applications.
skills/mobile-security/checklists/ios_keychain_ats.yaml
skills/mobile-security/references/platform-specifics.md
- Access to secretsline 123
[Credential-related source omitted]
skills/mobile-security/references/verifying-findings.md
skills/mobile-security/tests/corpus.json
skills/protocol-security/SKILL.md
- Network accessline 134
- `rules/tls_defaults.json` - `rules/cert_validation_sinks.json` - [NIST SP 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final). - Network accessline 135
- `rules/cert_validation_sinks.json` - [NIST SP 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final). - [RFC 8446 — TLS 1.3](https://datatracker.ietf.org/doc/html/rfc8446). - Network accessline 136
- [NIST SP 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final). - Network accessline 137
- [RFC 8446 — TLS 1.3](https://datatracker.ietf.org/doc/html/rfc8446). - Network accessline 138
- [CWE-295](https://cwe.mitre.org/data/definitions/295.html) · [CWE-319](https://cwe.mitre.org/data/definitions/319.html).
skills/protocol-security/references/tls-configuration.md
skills/protocol-security/references/verifying-findings.md
- Network accessline 24
| **Downgrade / weak cipher** | `testssl.sh host:port`, or force a sub-1.2 handshake: `openssl s_client -connect host:port -tls1_1`, or `-cipher 'DES-CBC3-SHA'` | The weak handshake succeeds | A documented legacy-peer exception, isolated be - Network accessline 25
| **Certificate validation** | Present an invalid, self-signed, or wrong-hostname certificate to the client | The client completes the connection | The client refuses it | | **Plaintext fallback / HSTS** | Request the `http://` scheme | `20 - Network accessline 26
| **Plaintext fallback / HSTS** | Request the `http://` scheme | `200` with no redirect, or no `Strict-Transport-Security` header on the HTTPS response | A public read-only endpoint, such as a status page, served over HTTP by design |
skills/protocol-security/tests/corpus.json
- Network accessline 11
{ "id": "python-requests-verify-false", "text": "import requests\n\ndef post_credentials(url, username, password):\n return requests.post(url, json={'user': username, 'pass': password}, verify=False)", - Network accessline 13
"text": "import requests\n\ndef post_credentials(url, username, password):\n return requests.post(url, json={'user': username, 'pass': password}, verify=False)", - Network accessline 17
{ "id": "go-tls-min-version-ssl30", "text": "package main\n\nimport (\n\t\"crypto/tls\"\n\t\"net/http\"\n)\n\nfunc client() *http.Client {\n\tcfg := &tls.Config{\n\t\tMinVersion: tls.VersionSSL30,\n\t\tMaxVersion: tls.VersionTLS - Network accessline 19
"text": "package main\n\nimport (\n\t\"crypto/tls\"\n\t\"net/http\"\n)\n\nfunc client() *http.Client {\n\tcfg := &tls.Config{\n\t\tMinVersion: tls.VersionSSL30,\n\t\tMaxVersion: tls.VersionTLS11,\n\t}\n\treturn &http.Client{Transport: &http - Network accessline 29
{ "id": "python-requests-verified", "text": "import requests\n\nsession = requests.Session()\n\ndef post_credentials(url, username, password):\n # verify defaults to True -> full CA chain + hostname validation\n return ses - Network accessline 31
"text": "import requests\n\nsession = requests.Session()\n\ndef post_credentials(url, username, password):\n # verify defaults to True -> full CA chain + hostname validation\n return session.post(url, json={'user': username, 'pass': p - Network accessline 35
{ "id": "go-tls12-min-verified", "text": "package main\n\nimport (\n\t\"crypto/tls\"\n\t\"net/http\"\n)\n\nfunc client() *http.Client {\n\tcfg := &tls.Config{\n\t\tMinVersion: tls.VersionTLS12,\n\t\tRenegotiation: tls.Renegotiat - Network accessline 37
"text": "package main\n\nimport (\n\t\"crypto/tls\"\n\t\"net/http\"\n)\n\nfunc client() *http.Client {\n\tcfg := &tls.Config{\n\t\tMinVersion: tls.VersionTLS12,\n\t\tRenegotiation: tls.RenegotiateNever,\n\t}\n\treturn &http.Client{Transport
skills/saas-security/SKILL.md
- Network accessline 137
- `references/verifying-findings.md` — confirm or refute a finding, then lock it - `rules/` — per-vendor rule files used by the scanners at build time - [OWASP API Security Top 10](https://owasp.org/API-Security/editions/2023/en/0x11-t10/). - Network accessline 138
- `rules/` — per-vendor rule files used by the scanners at build time - [OWASP API Security Top 10](https://owasp.org/API-Security/editions/2023/en/0x11-t10/). - [CWE-345](https://cwe.mitre.org/data/definitions/345.html) · [CWE-294](https:/ - Network accessline 139
- [OWASP API Security Top 10](https://owasp.org/API-Security/editions/2023/en/0x11-t10/). - Network accessline 140
- [CWE-345](https://cwe.mitre.org/data/definitions/345.html) · [CWE-294](https://cwe.mitre.org/data/definitions/294.html).
skills/saas-security/rules/atlassian.json
- Network accessline 144
], "references": [ "https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/", - Network accessline 145
"references": [ "https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/", "https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/", - Network accessline 146
"https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/", - Network accessline 147
"https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/", - Network accessline 148
"https://support.atlassian.com/security-and-access-policies/", - Network accessline 149
"https://www.atlassian.com/trust"
skills/saas-security/rules/bamboohr.json
- Access to secretsline 13
[Credential-related source omitted] - Network accessline 22
{ "name": "BambooHR API URL with embedded key", "regex": "https://api\\.bamboohr\\.com/api/gateway\\.php/[A-Za-z0-9_\\-]+/[^\\\"' ]+:[a-zA-Z0-9]{20,}@", - Network accessline 23
"name": "BambooHR API URL with embedded key", "regex": "https://api\\.bamboohr\\.com/api/gateway\\.php/[A-Za-z0-9_\\-]+/[^\\\"' ]+:[a-zA-Z0-9]{20,}@", "severity": "critical", - Network accessline 24
"regex": "https://api\\.bamboohr\\.com/api/gateway\\.php/[A-Za-z0-9_\\-]+/[^\\\"' ]+:[a-zA-Z0-9]{20,}@", - Network accessline 88
], "references": [ "https://documentation.bamboohr.com/docs/getting-started", - Network accessline 89
"references": [ "https://documentation.bamboohr.com/docs/getting-started", "https://www.bamboohr.com/security/", - Network accessline 90
"https://documentation.bamboohr.com/docs/getting-started", - Network accessline 91
"https://www.bamboohr.com/security/", - Network accessline 92
"https://documentation.bamboohr.com/reference/webhooks"
skills/saas-security/rules/calendly.json
- Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Network accessline 99
], "references": [ "https://developer.calendly.com/api-docs/2kgmebsui9oc1-webhook-signatures", - Network accessline 100
"references": [ "https://developer.calendly.com/api-docs/2kgmebsui9oc1-webhook-signatures", "https://developer.calendly.com/api-docs/r4LjEYTQjklRk-getting-started", - Network accessline 101
"https://developer.calendly.com/api-docs/2kgmebsui9oc1-webhook-signatures", - Network accessline 102
"https://developer.calendly.com/api-docs/r4LjEYTQjklRk-getting-started", - Network accessline 103
"https://help.calendly.com/hc/en-us/articles/360045366834-Security-overview"
skills/saas-security/rules/google_chat.json
- Network accessline 7
[Credential-related source omitted] - Network accessline 8
[Credential-related source omitted] - Network accessline 9
[Credential-related source omitted] - Network accessline 62
], "references": [ "https://developers.google.com/chat/api/guides/quickstart/incoming-bots-python", - Network accessline 63
"references": [ "https://developers.google.com/chat/api/guides/quickstart/incoming-bots-python", "https://developers.google.com/chat/concepts/auth", - Network accessline 64
"https://developers.google.com/chat/api/guides/quickstart/incoming-bots-python", - Network accessline 65
"https://developers.google.com/chat/concepts/auth", - Network accessline 66
"https://support.google.com/a/answer/9540647"
skills/saas-security/rules/google_workspace.json
- Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 102
[Credential-related source omitted] - Network accessline 162
[Credential-related source omitted] - Network accessline 163
[Credential-related source omitted] - Network accessline 164
[Credential-related source omitted] - Network accessline 165
[Credential-related source omitted] - Network accessline 166
[Credential-related source omitted] - Network accessline 167
[Credential-related source omitted]
skills/saas-security/rules/hubspot.json
- Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Network accessline 102
], "references": [ "https://developers.hubspot.com/docs/api/private-apps", - Network accessline 103
"references": [ "https://developers.hubspot.com/docs/api/private-apps", "https://developers.hubspot.com/docs/api/webhooks/validating-requests", - Network accessline 104
"https://developers.hubspot.com/docs/api/private-apps", "https://developers.hubspot.com/docs/api/webhooks/validating-requests", "https://knowledge.hubspot.com/account/set-up-two-factor-authentication-2fa" - Network accessline 105
"https://developers.hubspot.com/docs/api/webhooks/validating-requests", - Network accessline 106
"https://knowledge.hubspot.com/account/set-up-two-factor-authentication-2fa"
skills/saas-security/rules/larksuite.json
- Network accessline 7
{ "name": "Lark / Feishu Bot Webhook URL", "regex": "https://open\\.(?:larksuite\\.com|feishu\\.cn)/open-apis/bot/v2/hook/[a-f0-9\\-]{16,}", - Network accessline 8
"name": "Lark / Feishu Bot Webhook URL", "regex": "https://open\\.(?:larksuite\\.com|feishu\\.cn)/open-apis/bot/v2/hook/[a-f0-9\\-]{16,}", "severity": "high", - Network accessline 9
"regex": "https://open\\.(?:larksuite\\.com|feishu\\.cn)/open-apis/bot/v2/hook/[a-f0-9\\-]{16,}", - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Network accessline 129
], "references": [ "https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/authen-v1/authen/access_token", - Network accessline 130
"references": [ "https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/authen-v1/authen/access_token", "https://open.feishu.cn/document/server-docs/im-v1/message-card/send-messages-using-webhooks", - Network accessline 131
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Network accessline 132
"https://open.feishu.cn/document/server-docs/im-v1/message-card/send-messages-using-webhooks", - Network accessline 133
"https://www.larksuite.com/hc/en-us/categories/360000146496-Security"
skills/saas-security/rules/microsoft_teams.json
- Network accessline 7
{ "name": "Microsoft Teams Incoming Webhook URL", "regex": "https://[A-Za-z0-9\\-]+\\.webhook\\.office\\.com/webhookb2/[a-f0-9\\-]{36}@[a-f0-9\\-]{36}/IncomingWebhook/[a-f0-9]{32}/[a-f0-9\\-]{36}(?:/V2)?", - Network accessline 8
"name": "Microsoft Teams Incoming Webhook URL", "regex": "https://[A-Za-z0-9\\-]+\\.webhook\\.office\\.com/webhookb2/[a-f0-9\\-]{36}@[a-f0-9\\-]{36}/IncomingWebhook/[a-f0-9]{32}/[a-f0-9\\-]{36}(?:/V2)?", "severity": "high", - Network accessline 9
"regex": "https://[A-Za-z0-9\\-]+\\.webhook\\.office\\.com/webhookb2/[a-f0-9\\-]{36}@[a-f0-9\\-]{36}/IncomingWebhook/[a-f0-9]{32}/[a-f0-9\\-]{36}(?:/V2)?", - Access to secretsline 42
[Credential-related source omitted] - Network accessline 104
], "references": [ "https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook", - Network accessline 105
"references": [ "https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook", "https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-outgoing- - Network accessline 106
"https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook", - Network accessline 107
"https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-outgoing-webhook", - Network accessline 108
"https://learn.microsoft.com/en-us/microsoftteams/security-compliance-overview", - Network accessline 109
"https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-authentication"
skills/saas-security/rules/netsuite.json
- Access to secretsline 30
[Credential-related source omitted] - Dangerous shell operationline 110
"title": "SuiteScript code that `eval()`s a Custom Record string field", - Network accessline 145
], "references": [ "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4247337262.html", - Network accessline 146
"references": [ "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4247337262.html", "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/article_158132338057.html", - Network accessline 147
"https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4247337262.html", - Network accessline 148
"https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/article_158132338057.html", - Network accessline 149
"https://www.netsuite.com/portal/services/security.shtml"
skills/saas-security/rules/notion.json
- Network accessline 103
], "references": [ "https://developers.notion.com/docs/authorization", - Network accessline 104
"references": [ "https://developers.notion.com/docs/authorization", "https://www.notion.so/help/data-security-and-compliance", - Network accessline 105
"https://developers.notion.com/docs/authorization", - Network accessline 106
"https://www.notion.so/help/data-security-and-compliance", - Network accessline 107
"https://www.notion.so/help/audit-log"
skills/saas-security/rules/odoo.json
- Access to secretsline 28
[Credential-related source omitted] - Network accessline 110
], "references": [ "https://www.odoo.com/documentation/master/administration/on_premise/deploy.html", - Network accessline 111
"references": [ "https://www.odoo.com/documentation/master/administration/on_premise/deploy.html", "https://www.odoo.com/documentation/master/developer/reference/external_api.html", - Network accessline 112
"https://www.odoo.com/documentation/master/administration/on_premise/deploy.html", - Network accessline 113
"https://www.odoo.com/documentation/master/developer/reference/external_api.html", - Network accessline 114
"https://www.odoo.com/security"
skills/saas-security/rules/salesforce.json
- Access to secretsline 43
[Credential-related source omitted] - Network accessline 50
{ "name": "Salesforce Login URL with embedded session", "regex": "https://[A-Za-z0-9.\\-]+\\.(my\\.salesforce|salesforce|force)\\.com/secur/frontdoor\\.jsp\\?sid=[A-Za-z0-9._\\-!]+", - Network accessline 51
"name": "Salesforce Login URL with embedded session", "regex": "https://[A-Za-z0-9.\\-]+\\.(my\\.salesforce|salesforce|force)\\.com/secur/frontdoor\\.jsp\\?sid=[A-Za-z0-9._\\-!]+", "severity": "critical", - Network accessline 52
"regex": "https://[A-Za-z0-9.\\-]+\\.(my\\.salesforce|salesforce|force)\\.com/secur/frontdoor\\.jsp\\?sid=[A-Za-z0-9._\\-!]+", - Network accessline 138
], "references": [ "https://help.salesforce.com/s/articleView?id=sf.security_overview.htm", - Network accessline 139
"references": [ "https://help.salesforce.com/s/articleView?id=sf.security_overview.htm", "https://help.salesforce.com/s/articleView?id=sf.connected_app_create.htm", - Network accessline 140
"https://help.salesforce.com/s/articleView?id=sf.security_overview.htm", - Network accessline 141
"https://help.salesforce.com/s/articleView?id=sf.connected_app_create.htm", - Network accessline 142
"https://help.salesforce.com/s/articleView?id=sf.security_guest_user_sharing.htm", - Network accessline 143
"https://help.salesforce.com/s/articleView?id=sf.event_monitoring.htm"
skills/saas-security/rules/slack.json
- Network accessline 81
{ "name": "Slack Incoming Webhook URL", "regex": "https://hooks\\.slack\\.com/services/T[A-Z0-9]{8,}/B[A-Z0-9]{8,}/[A-Za-z0-9]{20,}", - Network accessline 82
"name": "Slack Incoming Webhook URL", "regex": "https://hooks\\.slack\\.com/services/T[A-Z0-9]{8,}/B[A-Z0-9]{8,}/[A-Za-z0-9]{20,}", "severity": "high", - Network accessline 83
"regex": "https://hooks\\.slack\\.com/services/T[A-Z0-9]{8,}/B[A-Z0-9]{8,}/[A-Za-z0-9]{20,}", - Network accessline 160
], "references": [ "https://api.slack.com/authentication/token-types", - Network accessline 161
"references": [ "https://api.slack.com/authentication/token-types", "https://api.slack.com/authentication/verifying-requests-from-slack", - Network accessline 162
"https://api.slack.com/authentication/token-types", "https://api.slack.com/authentication/verifying-requests-from-slack", "https://slack.com/help/articles/360002360574-Slack-Connect-Channel-shared-with-an-external-organization", - Network accessline 163
"https://api.slack.com/authentication/verifying-requests-from-slack", - Network accessline 164
"https://slack.com/help/articles/360002360574-Slack-Connect-Channel-shared-with-an-external-organization", - Network accessline 165
"https://slack.com/security"
skills/saas-security/rules/workday.json
- Network accessline 33
{ "name": "Workday Report-as-a-Service URL (often with embedded creds)", "regex": "https://wd[0-9]+(?:-services|-impl-services)?\\.myworkday\\.com/ccx/service/customreport2/[A-Za-z0-9_\\-]+/[A-Za-z0-9_\\-/]+\\?format=(json|xml|c - Network accessline 34
"name": "Workday Report-as-a-Service URL (often with embedded creds)", "regex": "https://wd[0-9]+(?:-services|-impl-services)?\\.myworkday\\.com/ccx/service/customreport2/[A-Za-z0-9_\\-]+/[A-Za-z0-9_\\-/]+\\?format=(json|xml|csv)", - Network accessline 35
"regex": "https://wd[0-9]+(?:-services|-impl-services)?\\.myworkday\\.com/ccx/service/customreport2/[A-Za-z0-9_\\-]+/[A-Za-z0-9_\\-/]+\\?format=(json|xml|csv)", - Network accessline 120
], "references": [ "https://community.workday.com/sites/default/files/file-hosting/restapi/index.html", - Network accessline 121
"references": [ "https://community.workday.com/sites/default/files/file-hosting/restapi/index.html", "https://doc.workday.com/admin-guide/en-us/security.html", - Network accessline 122
"https://community.workday.com/sites/default/files/file-hosting/restapi/index.html", - Network accessline 123
"https://doc.workday.com/admin-guide/en-us/security.html", - Network accessline 124
"https://www.workday.com/en-us/products/platform-product-extensions/integrations.html"
skills/saas-security/rules/zoom.json
- Access to secretsline 14
[Credential-related source omitted] - Network accessline 48
{ "name": "Zoom Meeting Join URL with embedded password (pwd=)", "regex": "https://[A-Za-z0-9\\-]+\\.zoom\\.us/j/[0-9]+\\?pwd=[A-Za-z0-9.]+", - Network accessline 49
"name": "Zoom Meeting Join URL with embedded password (pwd=)", "regex": "https://[A-Za-z0-9\\-]+\\.zoom\\.us/j/[0-9]+\\?pwd=[A-Za-z0-9.]+", "severity": "medium", - Network accessline 50
"regex": "https://[A-Za-z0-9\\-]+\\.zoom\\.us/j/[0-9]+\\?pwd=[A-Za-z0-9.]+", - Network accessline 128
], "references": [ "https://developers.zoom.us/docs/internal-apps/s2s-oauth/", - Network accessline 129
"references": [ "https://developers.zoom.us/docs/internal-apps/s2s-oauth/", "https://developers.zoom.us/docs/api/webhooks/", - Network accessline 130
"https://developers.zoom.us/docs/internal-apps/s2s-oauth/", - Network accessline 131
"https://developers.zoom.us/docs/api/webhooks/", - Network accessline 132
"https://developers.zoom.us/docs/integrations/security/", - Network accessline 133
"https://www.zoom.com/en/trust/security/"
skills/saas-security/tests/corpus.json
skills/secret-detection/SKILL.md
- Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Network accessline 135
prefixes, hotwords, entropy floors, and the `exclusions:` block - `tests/corpus.json` — fixtures for validation - [OWASP Secrets Management Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html) - Network accessline 136
- `tests/corpus.json` — fixtures for validation - [OWASP Secrets Management Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html) - [CWE-798](https://cwe.mitre.org/data/definitions/798.html) — Use - Network accessline 137
- [OWASP Secrets Management Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html) - Network accessline 138
- [CWE-798](https://cwe.mitre.org/data/definitions/798.html) — Use of Hard-coded Credentials. - Network accessline 139
- [CWE-259](https://cwe.mitre.org/data/definitions/259.html) — Use of Hard-coded Password.
skills/secret-detection/checklists/secret_detection.yaml
- Network accessline 5
Unified secret-detection rules for the secret-detection skill — regex patterns and false-positive exclusions. Migrated from rules/dlp_patterns.json + rules/dlp_exclusions.json in PR-B1. The legacy i18n hotword sidecar (dlp_patterns.locales. - Network accessline 6
references: - https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html - https://cwe.mitre.org/data/definitions/798.html - Network accessline 7
- https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html - Network accessline 8
- https://cwe.mitre.org/data/definitions/798.html - Network accessline 9
- https://cwe.mitre.org/data/definitions/259.html - Access to secretsline 207
[Credential-related source omitted] - Access to secretsline 240
[Credential-related source omitted] - Access to secretsline 320
[Credential-related source omitted] - Network accessline 777
[Credential-related source omitted] - Network accessline 778
[Credential-related source omitted] - Network accessline 779
[Credential-related source omitted] - Network accessline 780
[Credential-related source omitted] - Network accessline 792
[Credential-related source omitted] - Network accessline 793
[Credential-related source omitted] - Network accessline 794
[Credential-related source omitted] - Access to secretsline 861
[Credential-related source omitted] - Network accessline 908
[Credential-related source omitted] - Network accessline 909
[Credential-related source omitted] - Network accessline 910
[Credential-related source omitted] - Network accessline 1005
[Credential-related source omitted] - Network accessline 1006
[Credential-related source omitted] - Network accessline 1007
[Credential-related source omitted] - Access to secretsline 1025
[Credential-related source omitted] - Network accessline 1035
[Credential-related source omitted] - Network accessline 1036
[Credential-related source omitted] - Network accessline 1037
[Credential-related source omitted] - Network accessline 1050
[Credential-related source omitted] - Network accessline 1051
[Credential-related source omitted] - Network accessline 1052
[Credential-related source omitted] - Network accessline 1096
[Credential-related source omitted] - Network accessline 1097
[Credential-related source omitted] - Network accessline 1098
[Credential-related source omitted] - Network accessline 1126
[Credential-related source omitted] - Network accessline 1127
[Credential-related source omitted] - Network accessline 1128
[Credential-related source omitted] - Access to secretsline 1147
[Credential-related source omitted] - Network accessline 1198
[Credential-related source omitted] - Network accessline 1199
[Credential-related source omitted] - Network accessline 1200
[Credential-related source omitted] - Network accessline 1215
[Credential-related source omitted] - Network accessline 1216
[Credential-related source omitted] - Network accessline 1217
[Credential-related source omitted] - Network accessline 1233
[Credential-related source omitted] - Network accessline 1234
[Credential-related source omitted] - Network accessline 1235
[Credential-related source omitted] - Network accessline 1250
[Credential-related source omitted] - Network accessline 1251
[Credential-related source omitted] - Network accessline 1252
[Credential-related source omitted] - Network accessline 1271
[Credential-related source omitted] - Network accessline 1272
[Credential-related source omitted] - Network accessline 1273
[Credential-related source omitted] - Network accessline 1287
[Credential-related source omitted] - Network accessline 1288
[Credential-related source omitted] - Network accessline 1289
[Credential-related source omitted] - Network accessline 1302
[Credential-related source omitted] - Network accessline 1303
[Credential-related source omitted] - Network accessline 1304
[Credential-related source omitted] - Access to secretsline 1314
[Credential-related source omitted] - Network accessline 1318
[Credential-related source omitted] - Network accessline 1319
[Credential-related source omitted] - Network accessline 1320
[Credential-related source omitted] - Network accessline 1334
[Credential-related source omitted] - Network accessline 1335
[Credential-related source omitted] - Network accessline 1336
[Credential-related source omitted]
skills/secret-detection/tests/corpus.json
- Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 437
[Credential-related source omitted] - Access to secretsline 444
[Credential-related source omitted] - Access to secretsline 451
[Credential-related source omitted] - Access to secretsline 458
[Credential-related source omitted] - Access to secretsline 465
[Credential-related source omitted] - Access to secretsline 472
[Credential-related source omitted] - Access to secretsline 479
[Credential-related source omitted] - Access to secretsline 486
[Credential-related source omitted] - Access to secretsline 493
[Credential-related source omitted] - Access to secretsline 499
[Credential-related source omitted] - Access to secretsline 500
[Credential-related source omitted] - Network accessline 547
{ "id": "tn-prose-06", "text": "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'/>", - Network accessline 549
"text": "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'/>", - Network accessline 568
{ "id": "tn-pubid-01", "text": "https://cdn.example.com/static/dist/main.0123456789abcdef.js", - Network accessline 570
"text": "https://cdn.example.com/static/dist/main.0123456789abcdef.js", - Network accessline 589
{ "id": "tn-pubid-04", "text": "https://i.imgur.com/AbCdEfG.png", - Network accessline 591
"text": "https://i.imgur.com/AbCdEfG.png", - Access to secretsline 829
[Credential-related source omitted] - Access to secretsline 836
[Credential-related source omitted] - Access to secretsline 843
[Credential-related source omitted] - Access to secretsline 850
[Credential-related source omitted] - Access to secretsline 857
[Credential-related source omitted] - Access to secretsline 864
[Credential-related source omitted] - Access to secretsline 871
[Credential-related source omitted] - Access to secretsline 878
[Credential-related source omitted] - Access to secretsline 990
[Credential-related source omitted] - Access to secretsline 997
[Credential-related source omitted] - Access to secretsline 1004
[Credential-related source omitted] - Access to secretsline 1011
[Credential-related source omitted] - Access to secretsline 1018
[Credential-related source omitted] - Access to secretsline 1025
[Credential-related source omitted] - Access to secretsline 1032
[Credential-related source omitted] - Access to secretsline 1039
[Credential-related source omitted] - Access to secretsline 1207
[Credential-related source omitted] - Access to secretsline 1214
[Credential-related source omitted] - Access to secretsline 1221
[Credential-related source omitted] - Access to secretsline 1228
[Credential-related source omitted] - Access to secretsline 1235
[Credential-related source omitted] - Access to secretsline 1242
[Credential-related source omitted] - Access to secretsline 1249
[Credential-related source omitted] - Access to secretsline 1256
[Credential-related source omitted] - Access to secretsline 1291
[Credential-related source omitted] - Access to secretsline 1298
[Credential-related source omitted] - Access to secretsline 1305
[Credential-related source omitted] - Access to secretsline 1312
[Credential-related source omitted] - Access to secretsline 1319
[Credential-related source omitted] - Access to secretsline 1326
[Credential-related source omitted] - Access to secretsline 1333
[Credential-related source omitted] - Access to secretsline 1340
[Credential-related source omitted] - Access to secretsline 1550
[Credential-related source omitted] - Access to secretsline 1557
[Credential-related source omitted] - Access to secretsline 1564
[Credential-related source omitted] - Access to secretsline 1571
[Credential-related source omitted] - Access to secretsline 1578
[Credential-related source omitted] - Access to secretsline 1585
[Credential-related source omitted] - Access to secretsline 1592
[Credential-related source omitted] - Access to secretsline 1599
[Credential-related source omitted]
skills/secure-code-review/SKILL.md
- Network accessline 123
- `checklists/owasp_top10.yaml` - `checklists/injection_patterns.yaml` - [CWE-78](https://cwe.mitre.org/data/definitions/78.html) · [CWE-22](https://cwe.mitre.org/data/definitions/22.html) · [CWE-20](https://cwe.mitre.org/data/definitions/2 - Network accessline 124
- `checklists/injection_patterns.yaml` - [CWE-78](https://cwe.mitre.org/data/definitions/78.html) · [CWE-22](https://cwe.mitre.org/data/definitions/22.html) · [CWE-20](https://cwe.mitre.org/data/definitions/20.html). - [OWASP Top 10 2021](h - Network accessline 125
- [CWE-78](https://cwe.mitre.org/data/definitions/78.html) · [CWE-22](https://cwe.mitre.org/data/definitions/22.html) · [CWE-20](https://cwe.mitre.org/data/definitions/20.html). - Network accessline 126
- [OWASP Top 10 2021](https://owasp.org/Top10/).
skills/secure-code-review/checklists/owasp_top10.yaml
- Dangerous shell operationline 16
ai_check: "Parameterized queries only. No shell=True. No eval()."
skills/secure-code-review/tests/corpus.json
- Dangerous shell operationline 7
"text": "from flask import request\n\n@app.route('/calc')\ndef calc():\n expr = request.args.get('expr')\n result = eval(expr) # attacker controls expr\n return str(result)", - Dangerous shell operationline 9
"reason": "User-controlled input is passed straight to eval(), allowing arbitrary code execution. Violates the NEVER 'Pass user input directly to eval'. CWE-95 / CWE-94 Code Injection." - Dangerous shell operationline 13
"text": "const { exec } = require('child_process');\n\napp.get('/ping', (req, res) => {\n const host = req.query.host;\n exec('ping -c 1 ' + host, (err, stdout) => res.send(stdout));\n});", - Dangerous shell operationline 15
"reason": "User input is concatenated into a shell command run by child_process.exec; 'host=8.8.8.8; rm -rf /' executes attacker commands. Violates the NEVER 'Pass user input directly to child_process'. CWE-78 OS Command Injection."
skills/security-regression-tests/SKILL.md
- Network accessline 49
network, fix random seeds, and avoid sleep-based timing assertions and state shared between tests. Note that a canonical SSRF payload such as `http://169.254.169.254/latest/meta-data/` is a *live, reachable* address on a cloud - Network accessline 50
between tests. Note that a canonical SSRF payload such as `http://169.254.169.254/latest/meta-data/` is a *live, reachable* address on a cloud CI runner, so the naive test both leaves the sandbox and returns a different verdict - Network accessline 51
`http://169.254.169.254/latest/meta-data/` is a *live, reachable* address on a cloud - Network accessline 122
- `references/test-by-class.md` — attack input, secure outcome, the effect to assert and the paired control case, per finding class - [OWASP Web Security Testing Guide](https://owasp.org/www-project-web-security-testing-guide/). - Network accessline 124
- [OWASP Web Security Testing Guide](https://owasp.org/www-project-web-security-testing-guide/).
skills/security-regression-tests/references/test-by-class.md
- Network accessline 22
| **Path traversal** | `../../etc/passwd`, an encoded separator, an absolute path | `400` / `404` | No read outside the base directory — assert on the resolved path, or stub the filesystem | | **Command injection** | `; id`, `$(id)`, `` `id - Network accessline 23
| **Command injection** | `; id`, `$(id)`, `` `id` ``, a newline | Normal or rejected | Assert the subprocess was invoked with an **argv array** and the metacharacters arrived as one literal argument | | **SSRF** | `http://169.254.169.254/l - Network accessline 24
| **SSRF** | `http://169.254.169.254/latest/meta-data/`, `http://127.0.0.1:6379/` | `400` | Stub the dialer or transport and assert **no outbound connection was attempted**. A `4xx` alone does not tell you the fetch was never made | - Network accessline 25
| **XXE** | A document declaring an external entity or external DTD | Parse error or entity ignored | The entity's content is absent from the parsed result, and no outbound fetch was attempted | | **Open redirect** | `?next=https://evil.exa - Network accessline 26
| **Open redirect** | `?next=https://evil.example`, `//evil.example`, `/\evil.example` | Redirect refused or rewritten | The `Location` header points at your own origin |
skills/serverless-security/SKILL.md
- Network accessline 140
- `checklists/lambda_hardening.yaml` - `checklists/event_validation.yaml` - [OWASP Serverless Top 10](https://owasp.org/www-project-serverless-top-10/). - Network accessline 141
- `checklists/event_validation.yaml` - [OWASP Serverless Top 10](https://owasp.org/www-project-serverless-top-10/). - [CWE-770](https://cwe.mitre.org/data/definitions/770.html). - Network accessline 142
- [OWASP Serverless Top 10](https://owasp.org/www-project-serverless-top-10/). - Network accessline 143
- [CWE-770](https://cwe.mitre.org/data/definitions/770.html).
skills/serverless-security/checklists/event_validation.yaml
- Dangerous shell operationline 21
rule: "Function does not dynamically import modules / require() / eval() / Function() based on event content"
skills/serverless-security/tests/corpus.json
- Access to secretsline 19
[Credential-related source omitted] - Dangerous shell operationline 33
"reason": "Untrusted S3 object key concatenated into os.system with no schema validation, allowing command injection (e.g. key 'a;rm -rf /'). Violates NEVER 'Skip validation of S3/SQS/EventBridge event payloads' and 'Pass user-controlled st
skills/ssrf-prevention/SKILL.md
- Network accessline 47
- Re-validate **at every redirect hop**, or disable redirect-following entirely on fetchers that take user-supplied URLs. An allowed host answering `302` to `http://169.254.169.254/` is the single most common bypass, and it defeats a ch - Network accessline 48
fetchers that take user-supplied URLs. An allowed host answering `302` to `http://169.254.169.254/` is the single most common bypass, and it defeats a check performed only on the URL the user submitted. - Network accessline 49
`http://169.254.169.254/` is the single most common bypass, and it defeats a check - Network accessline 83
by any request path that does not traverse it. - Compare a URL as a **string** — prefix match, `contains`, a regex over the raw text. Parse it, then compare the parsed host. `https://allowed.example.com@evil.com/`, - Network accessline 84
- Compare a URL as a **string** — prefix match, `contains`, a regex over the raw text. Parse it, then compare the parsed host. `https://allowed.example.com@evil.com/`, `https://evil.com/?x=allowed.example.com` and `https://allowed.examp - Network accessline 85
Parse it, then compare the parsed host. `https://allowed.example.com@evil.com/`, - Network accessline 86
`https://evil.com/?x=allowed.example.com` and `https://allowed.example.com.evil.com/` - Network accessline 135
- `rules/ssrf_sinks.json` - `rules/cloud_metadata_endpoints.json` - [OWASP SSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html). - Network accessline 136
- `rules/cloud_metadata_endpoints.json` - [OWASP SSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html). - [CWE-918](https://cwe.mitre.org/data/definitions/918.ht - Network accessline 137
- [OWASP SSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html). - Network accessline 138
- [CWE-918](https://cwe.mitre.org/data/definitions/918.html). - Network accessline 139
- [AWS IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html). - Network accessline 140
- [PortSwigger SSRF](https://portswigger.net/web-security/ssrf).
skills/ssrf-prevention/references/verifying-findings.md
- Network accessline 27
| Target | Probe | Real hit | |---|---|---| | **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | - Network accessline 28
|---|---|---| | **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | | **Internal service** | `http://127.0.0.1:6379`, `http://localhost:22` | Service banner or data returns | - Network accessline 29
| **Cloud metadata** | `http://169.254.169.254/latest/meta-data/` | Metadata comes back | - Network accessline 30
| **Internal service** | `http://127.0.0.1:6379`, `http://localhost:22` | Service banner or data returns | | **Redirect bypass** | A URL that `302`s to an internal IP | The server follows it | | **DNS rebinding** | A host that resolves publ
skills/ssrf-prevention/rules/cloud_metadata_endpoints.json
- Network accessline 4
"description": "Cloud-provider instance metadata service endpoints and equivalents that must be blocked from user-fetchable URLs.", "references": [ "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-ser - Network accessline 5
"references": [ "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html", "https://cloud.google.com/compute/docs/metadata/overview", - Network accessline 6
"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html", - Network accessline 7
"https://cloud.google.com/compute/docs/metadata/overview", - Network accessline 8
"https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service", - Network accessline 9
"https://www.alibabacloud.com/help/en/elastic-compute-service/latest/access-instance-metadata"
skills/ssrf-prevention/rules/ssrf_sinks.json
- Network accessline 4
"description": "Per-language HTTP / URL-fetching sinks that, when reached with user-controlled input, constitute SSRF. Group by language family; pair each sink with the wrapped, allowlist-enforcing alternative.", "references": [ "http - Network accessline 5
"references": [ "https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html", "https://cwe.mitre.org/data/definitions/918.html" - Network accessline 6
"https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html", - Network accessline 7
"https://cwe.mitre.org/data/definitions/918.html" - Network accessline 11
"language": "python", "examples": [ "requests.get(url)", - Network accessline 12
"examples": [ "requests.get(url)", "urllib.request.urlopen(url)", - Network accessline 13
"requests.get(url)", - Network accessline 14
"urllib.request.urlopen(url)", - Network accessline 15
"httpx.get(url)", - Network accessline 16
"aiohttp.ClientSession().get(url)", - Network accessline 17
"Image.open(BytesIO(requests.get(url).content))", - Network accessline 18
"PyPDF2.PdfReader(io.BytesIO(requests.get(url).content))" - Network accessline 19
], "safer": "Wrap with a fetch_external(url) helper that calls socket.getaddrinfo, validates the resolved IP against a denylist (RFC1918, 169.254/16, ::/128, fc00::/7, IPv4-mapped IPv6), and connects to the pinned IP with `requests.ge - Network accessline 20
"safer": "Wrap with a fetch_external(url) helper that calls socket.getaddrinfo, validates the resolved IP against a denylist (RFC1918, 169.254/16, ::/128, fc00::/7, IPv4-mapped IPv6), and connects to the pinned IP with `requests.get('https: - Network accessline 23
"language": "javascript", "examples": [ "fetch(url)", - Network accessline 24
"examples": [ "fetch(url)", "axios.get(url)", - Network accessline 25
"fetch(url)", - Network accessline 26
"axios.get(url)", "node-fetch(url)", "got(url)", - Network accessline 27
"node-fetch(url)", - Network accessline 49
"http.NewRequestWithContext(ctx, ...)" ], "safer": "Use a *http.Client with a custom DialContext that calls net.Resolver.LookupIPAddr, checks every IP against the deny list, then dials the first allowed one. Set CheckRedirect to - Network accessline 50
], "safer": "Use a *http.Client with a custom DialContext that calls net.Resolver.LookupIPAddr, checks every IP against the deny list, then dials the first allowed one. Set CheckRedirect to re-run validation per hop and CheckRedirect - Network accessline 51
"safer": "Use a *http.Client with a custom DialContext that calls net.Resolver.LookupIPAddr, checks every IP against the deny list, then dials the first allowed one. Set CheckRedirect to re-run validation per hop and CheckRedirect = ErrUseL
skills/ssrf-prevention/tests/corpus.json
- Network accessline 5
{ "id": "image-proxy-raw-fetch", "text": "app.get('/proxy', async (req, res) => { const resp = await fetch(req.query.url); res.type(resp.headers.get('content-type')).send(Buffer.from(await resp.arrayBuffer())); });", - Network accessline 7
"text": "app.get('/proxy', async (req, res) => { const resp = await fetch(req.query.url); res.type(resp.headers.get('content-type')).send(Buffer.from(await resp.arrayBuffer())); });", - Network accessline 11
{ "id": "image-proxy-guarded", "text": "const ALLOWED = new Set(['images.example.com', 'cdn.example.com']); app.get('/proxy', async (req, res) => { const u = new URL(req.query.url); if (u.protocol !== 'https:' || !ALLOWED.has(u. - Network accessline 13
"text": "const ALLOWED = new Set(['images.example.com', 'cdn.example.com']); app.get('/proxy', async (req, res) => { const u = new URL(req.query.url); if (u.protocol !== 'https:' || !ALLOWED.has(u.hostname)) return res.status(400).end(); co - Network accessline 23
{ "id": "webhook-guarded", "text": "const { pinnedAgent } = require('./ssrf-guard'); app.post('/webhook-test', async (req, res) => { const u = new URL(req.body.callback); if (u.protocol !== 'https:') return res.status(400).end() - Network accessline 25
"text": "const { pinnedAgent } = require('./ssrf-guard'); app.post('/webhook-test', async (req, res) => { const u = new URL(req.body.callback); if (u.protocol !== 'https:') return res.status(400).end(); const agent = await pinnedAgent(u.hos - Network accessline 29
{ "id": "link-preview-raw-fetch", "text": "app.get('/preview', async (req, res) => { const resp = await fetch(req.query.target); res.json({ title: extractTitle(await resp.text()) }); });", - Network accessline 31
"text": "app.get('/preview', async (req, res) => { const resp = await fetch(req.query.target); res.json({ title: extractTitle(await resp.text()) }); });", - Network accessline 35
{ "id": "link-preview-guarded", "text": "const ALLOWED = new Set(['youtube.com', 'vimeo.com', 'twitter.com']); app.get('/preview', async (req, res) => { const u = new URL(req.query.target); if (!ALLOWED.has(u.hostname.replace(/^ - Network accessline 37
"text": "const ALLOWED = new Set(['youtube.com', 'vimeo.com', 'twitter.com']); app.get('/preview', async (req, res) => { const u = new URL(req.query.target); if (!ALLOWED.has(u.hostname.replace(/^www\\./, ''))) return res.status(400).end(); - Network accessline 44
"text": "app.get('/proxy', async (req, res) => { const u = new URL(req.query.url); const { address } = await dns.promises.lookup(u.hostname); if (isPrivate(address)) return res.status(400).end(); const resp = await fetch(u); res.send(Buffer - Network accessline 45
"reason": "Address-based check, then fetch(u) resolves the hostname a second time. An attacker-controlled name answers with a public address for the check and a private one for the connect (DNS rebinding, CWE-918). The check must pin the va
skills/supply-chain-security/SKILL.md
- Network accessline 126
- `rules/known_malicious.json` — pointer to the relevant `vulnerabilities/supply-chain/malicious-packages/*.json` data - [Alex Birsan's original dependency confusion writeup](https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec6 - Network accessline 127
`vulnerabilities/supply-chain/malicious-packages/*.json` data - [Alex Birsan's original dependency confusion writeup](https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610). - [SLSA](https://slsa.dev/). - Network accessline 128
- [Alex Birsan's original dependency confusion writeup](https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610). - Network accessline 129
- [SLSA](https://slsa.dev/). - Network accessline 130
- [The Update Framework](https://theupdateframework.io/docs/metadata/) — signed metadata, rollback and freshness protection. - Network accessline 131
- [OWASP Top 10 A06](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/).
skills/supply-chain-security/references/ecosystem-controls.md
- Network accessline 16
| Ecosystem | Mechanism | Isolation strength | |---|---|---| | **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only | - Network accessline 17
|---|---|---| | **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only | | **Gradle / Maven** | `exclusiveContent { forRepository { … } f - Network accessline 18
| **npm / yarn / pnpm** | Scope-to-registry mapping in `.npmrc`: `@yourco:registry=https://npm.internal/` | Strong — the scope resolves from that registry only |
skills/supply-chain-security/rules/dependency_confusion.json
- Network accessline 8
"ecosystem": "npm", "description": "Replace 'yourco' with your organization's npm scope; ensure .npmrc routes the scope to the internal registry via `@yourco:registry=https://npm.internal.example.com/`." - Network accessline 9
"description": "Replace 'yourco' with your organization's npm scope; ensure .npmrc routes the scope to the internal registry via `@yourco:registry=https://npm.internal.example.com/`." - Network accessline 45
"config_file": ".npmrc", "required_lines": [ "@yourco:registry=https://npm.internal.example.com/", - Network accessline 46
"required_lines": [ "@yourco:registry=https://npm.internal.example.com/", "//npm.internal.example.com/:_authToken=${INTERNAL_NPM_TOKEN}" - Network accessline 47
"@yourco:registry=https://npm.internal.example.com/", - Access to secretsline 48
[Credential-related source omitted] - Network accessline 54
"required_lines": [ "[global]", "index-url = https://pypi.internal.example.com/simple/", - Network accessline 55
"[global]", "index-url = https://pypi.internal.example.com/simple/", "extra-index-url = https://pypi.org/simple/" - Network accessline 56
"index-url = https://pypi.internal.example.com/simple/", - Network accessline 57
"extra-index-url = https://pypi.org/simple/" - Network accessline 63
"GOPRIVATE": "github.com/yourco/*", "GONOSUMCHECK": "false", "GOPROXY": "https://proxy.internal.example.com,direct" - Network accessline 64
"GONOSUMCHECK": "false", "GOPROXY": "https://proxy.internal.example.com,direct" } - Network accessline 65
"GOPROXY": "https://proxy.internal.example.com,direct" - Network accessline 122
"name": "Birsan dependency confusion (2021)", "summary": "Researcher Alex Birsan published lookalike packages for internal namespaces of Apple, Microsoft, Tesla, Yelp and 35+ other companies; received code execution callbacks from cor - Network accessline 123
"summary": "Researcher Alex Birsan published lookalike packages for internal namespaces of Apple, Microsoft, Tesla, Yelp and 35+ other companies; received code execution callbacks from corporate networks.", "references": ["https://med - Network accessline 124
"references": ["https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610"], - Network accessline 131
} ], "mitigation_guide": "https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610" - Network accessline 132
], "mitigation_guide": "https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610" } - Network accessline 133
"mitigation_guide": "https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610"
skills/supply-chain-security/rules/typosquat_patterns.json
- Network accessline 181
"discovered": "2017-08-01", "attack_type": "credential_harvest", "references": ["https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry"] - Network accessline 182
"attack_type": "credential_harvest", "references": ["https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry"] }, - Network accessline 183
"references": ["https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry"] - Network accessline 245
"discovered": "2022-05-10", "attack_type": "data_exfiltration", "references": ["https://blog.rust-lang.org/2022/05/10/cve-2022-36113.html"] - Network accessline 246
"attack_type": "data_exfiltration", "references": ["https://blog.rust-lang.org/2022/05/10/cve-2022-36113.html"] } - Network accessline 247
"references": ["https://blog.rust-lang.org/2022/05/10/cve-2022-36113.html"]
skills/template-injection/SKILL.md
- Network accessline 131
escalate to RCE versus disclosure - `rules/template_injection.json` - [OWASP WSTG — SSTI](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-s - Network accessline 132
- `rules/template_injection.json` - [OWASP WSTG — SSTI](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-side_Template_Injection). - [PortSw - Network accessline 133
- [OWASP WSTG — SSTI](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-side_Template_Injection). - Network accessline 134
- [PortSwigger — Server-Side Template Injection](https://portswigger.net/web-security/server-side-template-injection). - Network accessline 135
- [CWE-1336](https://cwe.mitre.org/data/definitions/1336.html) · [CWE-94](https://cwe.mitre.org/data/definitions/94.html) · [CWE-917](https://cwe.mitre.org/data/definitions/917.html) · [CWE-770](https://cwe.mitre.org/data/definitions/770.ht
skills/template-injection/rules/template_injection.json
- Network accessline 4
"description": "Server-side template injection (SSTI) anti-patterns: user input reaching a template compiler, double-render pipelines, sandbox escapes, and template-driven resource exhaustion.", "references": [ "https://owasp.org/www- - Network accessline 5
"references": [ "https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-side_Template_Injection", "https://portswigger.net/web-security/se - Network accessline 6
"https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-side_Template_Injection", - Network accessline 7
"https://portswigger.net/web-security/server-side-template-injection", - Network accessline 8
"https://cwe.mitre.org/data/definitions/1336.html"
skills/threat-modeling/SKILL.md
- Network accessline 141
cannot flag, a filled-in `(asset, boundary, threat, control, owner)` list for one realistic feature, and the division of labour with the code-level skills - [OWASP Threat Modeling Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheet - Network accessline 142
realistic feature, and the division of labour with the code-level skills - [OWASP Threat Modeling Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html). - [Microsoft STRIDE threat model](https://learn - Network accessline 143
- [OWASP Threat Modeling Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html). - Network accessline 144
- [Microsoft STRIDE threat model](https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats).
skills/threat-modeling/references/design-level-failures.md
- Access to secretsline 9
[Credential-related source omitted]
skills/websocket-security/SKILL.md
- Network accessline 135
per-framework notes for Socket.IO, SignalR and Phoenix Channels - `rules/websocket_hardening.json` - [OWASP WebSocket Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/WebSocket_Cheat_Sheet.html). - Network accessline 136
- `rules/websocket_hardening.json` - [OWASP WebSocket Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/WebSocket_Cheat_Sheet.html). - [CWE-1385](https://cwe.mitre.org/data/definitions/1385.html) · [CWE-770](https://cwe.m - Network accessline 137
- [OWASP WebSocket Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/WebSocket_Cheat_Sheet.html). - Network accessline 138
- [CWE-1385](https://cwe.mitre.org/data/definitions/1385.html) · [CWE-770](https://cwe.mitre.org/data/definitions/770.html). - Network accessline 139
- [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455).
skills/websocket-security/references/verifying-findings.md
- Network accessline 25
| Class | Probe | Real hit | False positive | |---|---|---|---| | **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and - Network accessline 26
|---|---|---|---| | **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and starts streaming the user's data | The upgrade - Network accessline 27
| **CSWSH / Origin** | Replay the upgrade with `Origin: https://attacker.example`, carrying the victim's session cookie if cookie auth is in play | The socket reaches OPEN and starts streaming the user's data | The upgrade is refused — `4xx
skills/websocket-security/rules/websocket_hardening.json
- Network accessline 4
"description": "Hardening defaults for WebSocket / Socket.IO / SignalR / Phoenix Channels endpoints. CORS does not apply to WebSockets — Origin validation must be done explicitly at upgrade time.", "references": [ "https://cheatsheets - Network accessline 5
"references": [ "https://cheatsheetseries.owasp.org/cheatsheets/WebSocket_Cheat_Sheet.html", "https://cwe.mitre.org/data/definitions/1385.html", - Network accessline 6
"https://cheatsheetseries.owasp.org/cheatsheets/WebSocket_Cheat_Sheet.html", - Network accessline 7
"https://cwe.mitre.org/data/definitions/1385.html", - Network accessline 8
"https://datatracker.ietf.org/doc/html/rfc6455"
skills/websocket-security/tests/corpus.json
- Network accessline 11
{ "id": "origin-allowlist-enforced", "text": "const { WebSocketServer } = require('ws');\nconst http = require('http');\nconst ALLOWED = new Set(['https://app.example.com']);\nconst server = http.createServer();\nconst wss = new - Network accessline 13
"text": "const { WebSocketServer } = require('ws');\nconst http = require('http');\nconst ALLOWED = new Set(['https://app.example.com']);\nconst server = http.createServer();\nconst wss = new WebSocketServer({\n server,\n verifyClient: (i - Access to secretsline 25
[Credential-related source omitted]
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 469 facts
- Dangerous shell operation in prose of the SKILL.mdcicd-security/SKILL.md:27Low confidence
- Network access in prose of the SKILL.mdcicd-security/SKILL.md:27Low confidence
- Network access in prose of documentationcicd-security/references/verifying-findings.md:29Low confidence
- Network access in prose of documentationcicd-security/references/verifying-findings.md:30Low confidence
- Dangerous shell operation in prose of documentationcicd-security/references/verifying-findings.md:31Low confidence
- Network access in prose of documentationcicd-security/references/verifying-findings.md:31Low confidence
- Network access in prose of documentationcicd-security/references/verifying-findings.md:53Low confidence
- Network access in prose of documentationcicd-security/references/verifying-findings.md:54Low confidence
- Dangerous shell operation in prose of documentationcicd-security/references/verifying-findings.md:55Low confidence
- Network access in prose of documentationcicd-security/references/verifying-findings.md:55Low confidence
- Dangerous shell operation in prose of the SKILL.mdcontainer-security/SKILL.md:21Low confidence
- Network access in prose of the SKILL.mdcontainer-security/SKILL.md:39Low confidence
- Network access in prose of the SKILL.mdcontainer-security/SKILL.md:40Low confidence
- Dangerous shell operation in prose of the SKILL.mdcontainer-security/SKILL.md:41Low confidence
- Network access in prose of the SKILL.mdcontainer-security/SKILL.md:41Low confidence
- Network access in prose of the SKILL.mdcontainer-security/SKILL.md:42Low confidence
- Network access in prose of the SKILL.mdcontainer-security/SKILL.md:43Low confidence
- Network access in code of documentationcontainer-security/references/eol-base-images.md:40Low confidence
- Network access in prose of documentationcontainer-security/references/verifying-findings.md:28Low confidence
- Network access in prose of documentationcontainer-security/references/verifying-findings.md:29Low confidence
- Dangerous shell operation in prose of documentationcontainer-security/references/verifying-findings.md:30Low confidence
- Network access in prose of documentationcontainer-security/references/verifying-findings.md:30Low confidence
- Network access in prose of the SKILL.mdcors-security/SKILL.md:15Low confidence
- Network access in prose of the SKILL.mdcors-security/SKILL.md:16Low confidence
- Access to secrets in prose of the SKILL.mdcors-security/SKILL.md:16Low confidence
- Network access in prose of the SKILL.mdcors-security/SKILL.md:17Low confidence
- Network access in prose of documentationcors-security/references/verifying-findings.md:20Low confidence
- Network access in prose of documentationcors-security/references/verifying-findings.md:21Low confidence
- Network access in prose of documentationcors-security/references/verifying-findings.md:22Low confidence
- Network access in prose of documentationcors-security/references/verifying-findings.md:47Low confidence
- Network access in prose of documentationcors-security/references/verifying-findings.md:48Low confidence
- Network access in prose of documentationcors-security/references/verifying-findings.md:49Low confidence
- Network access in prose of the SKILL.mdcrypto-misuse/SKILL.md:15Low confidence
- Network access in prose of the SKILL.mdcrypto-misuse/SKILL.md:16Low confidence
- Network access in prose of the SKILL.mdcrypto-misuse/SKILL.md:17Low confidence
- Network access in code of documentationdeserialization-security/references/xml.md:18Low confidence
- Network access in code of documentationdeserialization-security/references/xml.md:19Low confidence
- Network access in code of documentationdeserialization-security/references/xml.md:20Low confidence
- Network access in code of documentationdeserialization-security/references/xml.md:21Low confidence
- Network access in code of documentationdeserialization-security/references/xml.md:22Low confidence
- Network access in prose of the SKILL.mdelectron-security/SKILL.md:42Low confidence
- Network access in prose of the SKILL.mdelectron-security/SKILL.md:43Low confidence
- Network access in prose of the SKILL.mdelectron-security/SKILL.md:44Low confidence
- Network access in prose of the SKILL.mdelectron-security/SKILL.md:45Low confidence
- Access to secrets in prose of documentationelectron-security/references/electron-hardening.md:56Low confidence
- Network access in prose of documentationelectron-security/references/verifying-findings.md:41Low confidence
- Network access in prose of documentationelectron-security/references/verifying-findings.md:42Low confidence
- Network access in code of documentationfrontend-security/references/browser-controls.md:24Low confidence
- Network access in code of documentationfrontend-security/references/browser-controls.md:25Low confidence
- Network access in prose of documentationfrontend-security/references/browser-controls.md:43Low confidence
and 419 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Path .claude/workflows/secure-vibe-audit.js | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Native | Path dist/cursor-rules/.cursor/rules/api-security.mdc | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md dist/agent-skills/.agents/skills/api-security/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md dist/agent-skills/.agents/skills/api-security/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md dist/agent-skills/.agents/skills/api-security/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.