Que fait sast-skills ?
Transformez votre assistant de codage LLM en un scanner SAST complet. Compétences prêtes à l'emploi pour Claude Code, Codex, Opencode, Cursor, et tout assistant capable de charger les dossiers de compétences CLAUDE.md / AGENTS.md.
Claude Code avec Opus est recommandé pour la qualité ; tout modèle capable fonctionne.
Points forts
- 31 compétences couvrant 28 classes de vulnérabilités — injection, contrôle d'accès défaillant, crypto faible, gestion des fichiers, chaîne d'approvisionnement, logique métier et risques spécifiques aux LLM (injection de prompts, traitement non sécurisé des sorties).
- Orchestration en quatre phases — reconnaissance → détection parallèle → rapport consolidé → triage avec preuves, entièrement pilotée depuis
CLAUDE.md/AGENTS.md. - Idempotent et reprenable — chaque phase ignore le travail dont la sortie existe déjà ; réexécutez après avoir corrigé des problèmes pour rafraîchir uniquement ce qui est obsolète.
- Sortie lisible par machine — chaque compétence émet du JSON canonique ;
sast-skills exportagrège en JSON, SARIF 2.1.0 ou HTML pour GitHub Code Scanning et CI. - Multi-assistant — des compétences identiques sont fournies pour Claude Code (
.claude/skills) et pour chaque assistantAGENTS.md(.agents/skills). - CLI zéro configuration —
install/update/uninstall/doctor/export, publié depuis GitHub Actions avec provenance npm (attestation SLSA).
Flux
L'orchestrateur exécute quatre phases — reconnaissance, détection parallèle, synthèse et triage :
flowchart TD
U(["Utilisateur : Lancer scan de vulnérabilités"]) --> R{"Orchestrateur CLAUDE.md / AGENTS.md"}
R --> S1["Étape 1 — sast-analysis<br/>Carte du code source et de l'architecture"]
S1 -->|sast/architecture.md| S2["Étape 2 — Scan parallèle de vulnérabilités<br/>28 compétences : reconnaissance, vérification par lots, fusion"]
S2 -->|sast/*-results.md et *-results.json| S3["Étape 3 — sast-report<br/>Consolider et classer"]
S3 -->|sast/final-report.md| S4["Étape 4 — sast-triage<br/>Élimination des faux positifs,<br/>ajustement de la sévérité avec preuves"]
S4 -->|sast/final-report-triaged.md et triaged.json| EXP["npx sast-skills export<br/>JSON, SARIF, HTML"]
EXP --> CS(["GitHub Code Scanning, CI, tableaux de bord"])
Chaque étape est idempotente : si son fichier de sortie existe déjà, l'orchestrateur l'ignore. Réexécutez le scan après avoir corrigé des problèmes pour rafraîchir uniquement ce qui est obsolète.
Ce qu'il détecte
Toutes les compétences suivent le même schéma en trois phases : reconnaissance → vérification par lots (sous-agents parallèles, 3 par lot) → fusion. Chacune écrit un rapport Markdown lisible par l'humain et un fichier JSON canonique des résultats que sast-skills export agrège.
Reconnaissance et Synthèse
| Compétence | Rôle |
|---|---|
sast-analysis | Reconnaissance du code source, cartographie de l'architecture, modèle de menace |
sast-report | Consolider les résultats par classe en un rapport classé |
sast-triage | Supprimer les faux positifs et ajuster les sévérités avec des preuves du code source |
Injection
| Compétence | Classe de vulnérabilité |
|---|---|
sast-sqli | Injection SQL |
sast-nosql | Injection NoSQL (Mongo, Firestore, DynamoDB) |
sast-ldap | Injection de filtre LDAP / DN |
sast-graphql | Construction non sécurisée de documents GraphQL |
sast-xss | Cross-Site Scripting |
sast-ssti | Injection de templates côté serveur |
sast-rce | Exécution de code à distance (injection de commandes, eval, désérialisation non sécurisée) |
sast-xxe | Entité externe XML |
sast-ssrf | Server-Side Request Forgery |
sast-openredirect | Redirection ouverte (phishing / vol de jetons OAuth) |
Contrôle d'accès et Auth
| Compétence | Classe de vulnérabilité |
|---|---|
sast-idor | Référence directe non sécurisée à un objet |
sast-missingauth | Authentification manquante / autorisation au niveau des fonctions défaillante |
sast-jwt | Implémentations JWT non sécurisées |
sast-csrf | Cross-Site Request Forgery |
sast-cors | Mauvaise configuration CORS |
Fichiers, crypto et runtime
| Compétence | Classe de vulnérabilité |
|---|---|
sast-pathtraversal | Traversée de chemin / répertoire |
sast-fileupload | Téléchargement de fichier non sécurisé |
sast-crypto | Primitives faibles, mauvais modes, réutilisation de IV, PRNG faible |
sast-prototype | Pollution de prototype JavaScript |
sast-redos | Déni de service par expression régulière à retour arrière catastrophique |
sast-race | Conditions de concurrence et TOCTOU |
Exposition des données et chaîne d'approvisionnement
| Compétence | Classe de vulnérabilité |
|---|---|
sast-hardcodedsecrets | Clés API / jetons / identifiants dans le code exposé au client |
sast-pii | Fuite de PII et d'identifiants vers les logs / télémétrie / pages d'erreur |
sast-deps | Dépendances avec des vulnérabilités connues (CVE dans les lockfiles) |
sast-iac | IaC non sécurisé (Dockerfile / Terraform / Kubernetes / GitHub Actions) |
Logique métier et spécifique aux LLM
| Compétence | Classe de vulnérabilité |
|---|---|
sast-businesslogic | Manipulation de prix, contournement de flux, abus de récompenses |
sast-promptinjection | Texte non fiable atteignant un prompt LLM (OWASP LLM #1) |
sast-llmoutput | Sortie LLM non validée atteignant des terminaux code / HTML / SQL / shell (OWASP LLM #2) |
Installation
npx sast-skills install
L'installateur demande quel assistant cibler (claude / agents / all) et s'il faut installer dans le projet actuel ou votre répertoire personnel (project / global). Pour ignorer les invites :
npx sast-skills install --yes --assistant claude --scope project
Si votre projet contient déjà un
CLAUDE.mdouAGENTS.md, l'installateur refuse de l'écraser par défaut — sauvegardez-le ou passez--force.
Installation manuelle (sans npx / npm)
Utilisez ce chemin si vous ne pouvez pas exécuter npx (proxy d'entreprise, registre npm inaccessible, environnement hors ligne) ou si vous souhaitez vous épingler à la source de ce fork plutôt qu'au package npm publié. L'installateur CLI ne fait que deux choses — déposer le fichier d'entrée de l'orchestrateur à la racine du projet et copier chaque SKILL.md de compétence dans le bon répertoire caché — donc un simple cp -R le reproduit exactement.
1. Obtenir les fichiers groupés
git clone https://github.com/mstfknn/sast-skills.git
Tout ce dont vous avez besoin se trouve sous sast-skills/sast-files/ :
sast-files/
├── CLAUDE.md # Point d'entrée de l'orchestrateur pour Claude Code
├── AGENTS.md # Point d'entrée de l'orchestrateur pour Gemini CLI / Codex / OpenCode / Cursor
├── .claude/skills/sast-*/SKILL.md # 31 compétences au format Claude Code
└── .agents/skills/sast-*/SKILL.md # Mêmes 31 compétences reflétées pour les assistants AGENTS.md
Les deux arbres de compétences sont synchronisés par npm run sync — le contenu est identique, seul le nom du répertoire diffère.
2a. Installer pour Claude Code
Définissez SAST_SRC sur le chemin du clone pour que les commandes ci-dessous restent copiables :
export SAST_SRC=/chemin/absolu/vers/sast-skills
cd /chemin/vers/votre-projet
Portée projet (recommandée — versionnée avec votre dépôt) :
cp "$SAST_SRC/sast-files/CLAUDE.md" ./CLAUDE.md
cp -R "$SAST_SRC/sast-files/.claude" ./
Si vous utilisez déjà un
CLAUDE.mdau niveau du projet, ne l'écrasez pas — Claude Code ne lit qu'un seulCLAUDE.mdpar projet. Fusionnez plutôt le contenu de l'orchestrateur (le flux en quatre phases) dans votre fichier existant.
Portée globale (compétences disponibles dans chaque projet ; l'orchestrateur est toujours copié par projet) :
mkdir -p ~/.claude/skills
cp -R "$SAST_SRC/sast-files/.claude/skills/." ~/.claude/skills/
# Ensuite, dans tout projet où vous souhaitez le flux de scan :
cp "$SAST_SRC/sast-files/CLAUDE.md" /chemin/vers/votre-projet/CLAUDE.md
2b. Installer pour Gemini CLI (et autres assistants AGENTS.md)
export SAST_SRC=/chemin/absolu/vers/sast-skills
cd /chemin/vers/votre-projet
cp "$SAST_SRC/sast-files/AGENTS.md" ./AGENTS.md
cp -R "$SAST_SRC/sast-files/.agents" ./
AGENTS.md est la convention multi-assistant suivie par Gemini CLI, Codex CLI, OpenCode et Cursor. Si votre version de Gemini CLI cherche GEMINI.md à la place, renommez-le — le contenu est inchangé :
mv AGENTS.md GEMINI.md
3. Vérifier l'installation
# Portée projet (Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head
# Portée projet (Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head
# Portée globale (Claude Code)
ls ~/.claude/skills/ | head
Vous devriez voir les 31 répertoires de compétences sast-*. Ouvrez le projet dans votre assistant et demandez "Lancer un scan de vulnérabilités" — l'orchestrateur dans CLAUDE.md / AGENTS.md pilotera les quatre phases à partir de là.
4. Maintenir une installation manuelle à jour
cd "$SAST_SRC" && git pull
# Réexécutez les commandes cp de l'Étape 2a / 2b pour rafraîchir — elles sont idempotentes.
Si vous conservez le clone, cd "$SAST_SRC" && git pull && <réexécuter cp> est l'équivalent manuel de npx sast-skills update.
Commandes CLI
| Commande | Ce qu'elle fait |
|---|---|
npx sast-skills install | Copie CLAUDE.md / AGENTS.md et l'arbre de compétences dans votre projet ou $HOME |
npx sast-skills update | Rafraîchit une installation existante avec les fichiers de compétences actuellement groupés |
npx sast-skills uninstall | Supprime les compétences installées ; refuse de supprimer un CLAUDE.md modifié sans --force |
npx sast-skills doctor | Vérifie une installation et rapporte OK / MANQUANT / MODIFIÉ par fichier ; sort avec un code non nul en cas de problème |
npx sast-skills export --input sast/ --format sarif --output report.sarif | Agrège les sast/*-results.json en JSON, SARIF 2.1.0 ou HTML |
npx sast-skills export --input sast/ --triaged --format sarif | Préfère le sast/triaged.json trié aux résultats bruts par compétence |
npx sast-skills --version | Affiche la version CLI installée |
Options d'installation
| Option | Objectif |
|---|---|
--yes | Non interactif ; requis lorsque stdin n'est pas un TTY |
--assistant <claude|agents|all> | Quel arbre de compétences installer |
--scope <project|global> | Installer dans ./.claude/skills/ ou $HOME/.claude/skills/ |
--target <chemin> | Cible d'installation explicite (remplace --scope) |
--force | Écraser un CLAUDE.md / AGENTS.md préexistant |
--dry-run | Affiche le plan de fichiers sans écrire |
Exécuter un scan
Après l'installation, ouvrez le projet dans votre assistant IA et demandez :
Lancer un scan de vulnérabilités
ou
Trouver des vulnérabilités dans ce code source
L'orchestrateur prend le relais. Il exécute automatiquement les quatre phases, respecte l'idempotence (les réexécutions ne prennent que ce qui manque) et écrit tout dans sast/ à la racine de votre projet.
Fichiers de sortie
| Fichier | Description |
|---|---|
sast/architecture.md | Pile technologique, architecture, points d'entrée, flux de données |
sast/*-results.md | Résultats par classe de vulnérabilité (lisibles par l'humain) |
sast/*-results.json | Résultats canoniques lisibles par machine (fournis à sast-skills export) |
sast/final-report.md | Rapport brut consolidé classé par sévérité |
sast/final-report-triaged.md | Rapport trié — faux positifs supprimés, sévérités ajustées avec preuves |
sast/triaged.json | Résultats triés canoniques (préférés par sast-skills export --triaged) |
Schéma des résultats
Chaque compétence écrit sast/<skill>-results.json comme une liste brute de résultats :
{
"findings": [
{
"id": "sast-sqli-0001",
"skill": "sast-sqli",
"severity": "critical|high|medium|low|info",
"title": "Injection SQL dans /api/user",
"description": "…",
"location": { "file": "src/api/user.js", "line": 42, "column": 10 },
"remediation": "…"
}
]
}
sast-skills export agrège ces fichiers en un seul document enveloppé dans un objet run — { "run": { "tool": "sast-skills", "version": "<version-cli>" }, "findings": [...] } — en estampillant la version de la CLI qui a produit le rapport. L'étape de triage écrit sast/triaged.json dans cette même forme enveloppée.
Les résultats triés ajoutent triage_status (confirmed|upgraded|downgraded|false_positive), triage_original_severity (lorsque la sévérité a changé) et triage_evidence avec des citations concrètes du code source.
Intégrations CI
GitHub Code Scanning (SARIF)
Action composite dans .github/actions/scan/action.yml :
- uses: mstfknn/sast-skills/.github/actions/scan@main
with:
input: sast/
output: sast-skills.sarif
Ceci exécute sast-skills export --format sarif et télécharge le résultat vers Code Scanning via github/codeql-action/upload-sarif@v3.
Hook Pre-commit
Copiez hooks/pre-commit dans .git/hooks/pre-commit pour que sast-skills doctor protège chaque commit.
Docker
docker build -t sast-skills .
docker run --rm -v "$PWD:/work" sast-skills export --input sast/ --format sarif --output report.sarif
Le Dockerfile fourni est basé sur node:20-alpine avec sast-skills comme point d'entrée.
Vérifier et dépanner
# L'installation est-elle dans la forme attendue ?
npx sast-skills doctor --target . --assistant claude
# Vérification de version
npx sast-skills --version
npm view sast-skills version # dernière version sur le registre
# Mise à niveau
npx sast-skills update
doctor se termine avec 0 si chaque fichier groupé dans la cible correspond à la copie de la version installée, et 1 si un fichier est MANQUANT ou MODIFIÉ. MODIFIÉ signifie que le fichier a divergé de la copie groupée — attendu si vous modifiez le fichier d'entrée, sinon un signal pour exécuter update.
Contribuer
Voir CONTRIBUTING.md. Boucle de développement :
npm install
npm test # suite vitest (protection TDD activée)
npm run sync # synchronise .claude/skills → .agents/skills
node scripts/scaffold-skill.js sast-foo # crée une nouvelle compétence dans les deux arbres
node scripts/register-skill.js sast-foo foo "Foo" "Description de l'injection Foo"
npm run lint:md # markdownlint
(contenu tronqué pour la traduction)