Audit de sécurité avec veto

VérifiéPrudence

Audite la sécurité du code selon OWASP Top 10. Vérifie l'ID utilisateur depuis la session, détecte les fuites de données, valide Zod et bloque le code non sécurisé.

Spar Skills Guide Bot
SecuriteIntermédiaire
23/07/2026
Claude Code
#owasp-top-10#access-control#input-validation#code-audit#data-leak-prevention

Recommandé pour

Synthèse automatique

Audite le code TypeScript/tRPC par rapport à l'OWASP Top 10 et bloque la validation en cas de vulnérabilité critique grâce à un droit de veto.

Points forts

  • Fournit des motifs de détection concrets (grep) pour l'ID utilisateur issu de la requête, les mots de passe renvoyés et les routes sans validation Zod
  • Décrit un workflow de veto explicite : arrêt, rapport de la vulnérabilité avec fichier et ligne, correctif exigé
  • Checklist structurée couvrant contrôle d'accès, échecs cryptographiques, injection et authentification
  • Impose deux règles fortes et vérifiables : ID utilisateur toujours issu de la session, validation Zod sur chaque route

Limites

  • Les règles et exemples sont très liés à une stack tRPC + Zod + Mongoose, peu transposables telles quelles
  • La détection repose sur des motifs grep, donc sujette aux faux positifs comme aux angles morts (flux dynamiques, obfuscation)
  • Ne couvre explicitement que quelques catégories OWASP (A01, A02, A03, A07) et ne propose pas de correction automatique
Quand l'utiliser

À lancer avant un commit ou une merge request sur du code serveur manipulant authentification, données utilisateur ou nouvelles routes tRPC.

Quand l'éviter

À ne pas utiliser comme unique audit de sécurité sur une stack non-TypeScript, ni en remplacement d'un pentest ou d'un scan de dépendances.

Analyse de sécurité

Prudence
Score qualité85/100

The skill is primarily an instruction/reference document for auditing code. No destructive commands, no curl|sh, no base64 payloads, no requests to send secrets or tokens anywhere, and no attempts to disable safety controls. The only execution surfaces are read-only grep commands and an invoked Python scanner that is not bundled, so risk is low but not zero — hence caution rather than safe.

Points d'attention
  • •Declares the Bash tool; all documented commands are read-only `grep` scans, which limits risk, but gives the agent shell access for whatever it decides to run.
  • •Instructs executing `python .claude/skills/security-scan/scripts/scan.py server/`, but that script is not included in the provided bundle, so its actual behavior (file reads, network calls, writes) cannot be verified.
  • •The grep detection patterns are broad (`grep -r "{ userId }"`, `grep -r "passwordHash\|password:"`) and read source files only — no exfiltration, deletion, or obfuscation is present.
Comment cette analyse est faite

Exemples

Pre-commit scan of a router
Run a security scan on server/routers/user.ts before I commit. Check that user IDs come from the session, every route has Zod input validation, and no passwordHash is returned.
OWASP review of new endpoints
Audit the new tRPC procedures I just added against the OWASP Top 10 checklist — access control, injection, and auth. Veto the change if you find a critical vulnerability.
Detect data leaks in responses
Grep the server directory for anything leaking sensitive data to the frontend (passwords, API tokens, stack traces) and report each hit with file and line.

name: security-scan description: Audits code security against OWASP Top 10. Validates user ID from session, detects sensitive data leaks, verifies Zod validation. HAS VETO POWER - blocks insecure code. allowed-tools: Read, Grep, Glob, Bash

Security Scan - Security Audit System

VETO POWER

WARNING: This skill HAS VETO POWER. If critical vulnerability detected, MUST:

  1. STOP implementation
  2. REPORT vulnerability
  3. REQUIRE fix before proceeding

Purpose

This skill audits code security:

  • Validates user ID comes from session (NEVER from request)
  • Detects sensitive data being sent to frontend
  • Verifies Zod validation on all routes
  • Audits against OWASP Top 10
  • Blocks commits with critical vulnerabilities

Critical Security Rules

1. USER ID ALWAYS FROM SESSION

NEVER trust user ID from frontend. ALWAYS extract from ctx.session.userId or ctx.user._id.

// WRONG - VULNERABLE (IMMEDIATE VETO)
async function getData({ userId }: { userId: string }) {
	return db.find({ userId }); // userId can be manipulated!
}

// CORRECT
async function getData({ ctx }: { ctx: Context }) {
	const userId = ctx.user._id; // Always from session
	return db.find({ userId });
}

2. SENSITIVE DATA NEVER TO FRONTEND

NEVER send to frontend:

  • Passwords (even hashed)
  • API tokens
  • Secret keys
  • Other users' data
  • Stack traces in production
// WRONG - DATA LEAK (IMMEDIATE VETO)
return {
	user: await UserModel.findById(id), // Includes passwordHash!
};

// CORRECT
return {
	user: user.toPublic(), // Sanitization method
};

3. ZOD VALIDATION REQUIRED

EVERY tRPC route MUST have .input(z.object({...})). Unvalidated inputs are attack vectors.

// WRONG - NO VALIDATION (IMMEDIATE VETO)
.mutation(async ({ input }) => {
  await db.create(input); // input can have anything!
})

// CORRECT
.input(createSchema) // Zod schema
.mutation(async ({ input }) => {
  await db.create(input); // input is validated
})

OWASP Top 10 Checklist

A01: Broken Access Control

  • [ ] All protected routes use protectedProcedure?
  • [ ] User ID from session, not input?
  • [ ] Resources filtered by user/tenant?

A02: Cryptographic Failures

  • [ ] Passwords hashed with bcrypt (salt >= 10)?
  • [ ] Tokens generated with crypto.randomBytes?
  • [ ] Cookies with HttpOnly, Secure, SameSite?
  • [ ] No secrets in code (use env vars)?

A03: Injection

  • [ ] Queries use Mongoose (prevents NoSQL injection)?
  • [ ] Inputs validated with Zod?
  • [ ] No string concatenation in queries?

A07: Authentication Failures

  • [ ] Passwords with minimum requirements?
  • [ ] Brute force protection?
  • [ ] Sessions invalidated on logout?
  • [ ] Tokens with expiration?

Detection Patterns

Detect User ID from Input (VETO)

grep -r "input\.userId\|input\.user_id\|{ userId }" server/ --include="*.ts"

Detect Password Return (VETO)

grep -r "passwordHash\|password:" server/ --include="*.ts"

Detect Route Without Validation (VETO)

grep -A5 "Procedure\." server/ --include="*.ts" | grep -v ".input("

Output Format

Approved

## SECURITY SCAN - APPROVED

### Scope

- **Files:** X
- **Routes:** Y

### Checks

- [x] User ID always from session
- [x] No sensitive data in response
- [x] All routes with Zod validation
- [x] OWASP Top 10 OK

**STATUS: APPROVED**

Vetoed

## SECURITY SCAN - VETOED

### CRITICAL VULNERABILITY

**Type:** User ID from Input
**File:** `server/routers/example.ts:45`
**Risk:** Any user can access other users' data

**Fix:** Use `ctx.user._id` instead of `input.userId`

**STATUS: VETOED** - Fix before proceeding

VETO Rules

IMMEDIATE VETO

  1. User ID from input/request body
  2. Password returned in response
  3. API tokens exposed
  4. Protected route without protectedProcedure
  5. Query without user/tenant filter

VETO BEFORE MERGE

  1. Route without Zod validation
  2. Unsanitized sensitive data
  3. bun audit (or npm audit) with critical vulnerabilities

Progressive Disclosure

For detailed information, see:

Quick Scan

python .claude/skills/security-scan/scripts/scan.py server/

Version

  • v2.1.0 - Added progressive disclosure with reference files and scan script
  • v2.0.0 - Generic template

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/security-audit-system-mrx3xxf2/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/security-audit-system-mrx3xxf2' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/security-audit-system-mrx3xxf2/download' --output '.skill-downloads/security-audit-system-mrx3xxf2/SKILL.md.part' && mv '.skill-downloads/security-audit-system-mrx3xxf2/SKILL.md.part' '.skill-downloads/security-audit-system-mrx3xxf2/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Outils déclarés par l’auteur (à vérifier dans votre agent) : Read, Grep, Glob, Bash

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/security-audit-system-mrx3xxf2/SKILL.md' && test -s '.skill-downloads/security-audit-system-mrx3xxf2/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/security-scan' && cp -R '.skill-downloads/security-audit-system-mrx3xxf2' '.claude/skills/security-scan'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/security-audit-system-mrx3xxf2'

openskills read 'security-audit-system-mrx3xxf2'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/security-audit-system-mrx3xxf2/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires