Module Code Scanning
Analyse SAST, secrets, dépendances et IaC sur vos repositories — 19 outils intégrés (Semgrep, Trivy, Gitleaks, gosec, Bandit, etc.)
Module Code Scanning
Le module Code Scanning permet d'auditer la sécurité de vos repositories de code source. Il combine 19 outils open-source pour couvrir SAST (Static Application Security Testing), détection de secrets, analyse de dépendances vulnérables, audit de fichiers de configuration et IaC.
Disponible à partir du plan Pro.
Connecter un repository
Scanyze supporte 5 fournisseurs Git :
| Fournisseur | Authentification |
|---|---|
| GitHub | OAuth ou Personal Access Token (PAT) |
| GitLab | OAuth ou PAT |
| Bitbucket | App Password |
| Forgejo / Gitea | PAT |
| Azure DevOps | PAT |
Procédure
- Naviguez vers Code → Comptes Git (
/code/accounts). - Cliquez sur Connecter un compte.
- Choisissez le fournisseur. Pour GitHub/GitLab, vous pouvez utiliser OAuth (clic-clic) ou un PAT manuel.
- Pour les PAT, scopes minimaux requis :
- GitHub :
repo(lecture privée) oupublic_repo(publics seulement) - GitLab :
read_api,read_repository - Bitbucket :
Repositories:Read - Forgejo :
read:repository - Azure DevOps :
Code (read)
- GitHub :
- Une fois le compte ajouté, naviguez vers Code → Repositories.
- Cliquez sur Importer un repository — Scanyze liste vos repos accessibles.
- Sélectionnez les repos à intégrer. Pour chaque repo, vous pouvez configurer une liste de branches surveillées (
watched_branches— multi-select) qui détermineront quelles branches sont scannées automatiquement à chaque push.
Lancer un scan de code
- Sur la page d'un repo, cliquez sur Lancer un scan.
- Choisissez la branche à scanner (par défaut :
main/master). - Choisissez le profil de scan :
- Rapide : Semgrep + Gitleaks + Trivy SCA seulement (~2-5 min)
- Standard : 12 outils (~10-20 min) — défaut
- Approfondi : tous les 19 outils (~20-40 min)
- Cliquez sur Lancer.
Le codeworker clone le repo dans un répertoire temporaire isolé (jamais persisté), exécute les outils en parallèle, normalise les résultats SARIF, puis nettoie le filesystem.
Les 19 outils intégrés
Source de vérité : secuscan-api/internal/services/codescan/tools/.
| Catégorie | Outil | Couverture |
|---|---|---|
| SAST multi-langage | Semgrep | 50+ langages, règles communautaires + custom |
| SAST Go | gosec | Vulnérabilités spécifiques Go (SQL injection, weak crypto, etc.) |
| SAST Python | Bandit | Vulnérabilités Python (eval, pickle, weak hash, etc.) |
| SAST JavaScript | ESLint Security | Plugin sécurité ESLint |
| Secrets | Gitleaks | Détection de secrets dans le code et l'historique Git |
| Secrets | TruffleHog | Détection de secrets avec validation (vérifie qu'une clé AWS est active, par exemple) |
| Secrets | Sensitive Files | Détection de fichiers sensibles (.env, id_rsa, *.pem, etc.) |
| Dépendances Go | govulncheck | Vulnérabilités utilisées effectivement dans le code Go |
| Dépendances Python | pip-audit | Vulnérabilités des packages PyPI |
| Dépendances Node.js | npm audit | Vulnérabilités des packages npm |
| Dépendances | Outdated | Détection de dépendances obsolètes |
| Dépendances multi | Trivy SCA | Scan SBOM cross-langage |
| Conteneurs / IaC | Trivy Config | Audit Dockerfile, Kubernetes, Terraform |
| Conteneurs | Hadolint | Lint des Dockerfiles |
| CI/CD | actionlint | Audit des workflows GitHub Actions (.github/workflows/) |
| Tests | Test runner | Exécute les tests unitaires si demandé |
| Qualité | Config Audit | Audit des fichiers de configuration (yaml, ini, toml) |
| Intake | Intake Tool | Pré-traitement et inventaire du repo |
| Normalisation | SARIF Importer | Normalisation des outputs en format SARIF 2.1.0 |
Lifecycle d'un scan
[1] /code/repositories : repository créé / synchronisé
↓
[2] Lancement du scan (manuel ou via webhook push)
↓
[3] code_scans.status = pending
↓
[4] codeworker prend le job
↓
[5] Clone du repo dans /tmp/secuscan-{scan_id}/
↓
[6] Phase 1 : Intake (langues détectées, taille, fichiers)
↓
[7] Phase 2 : Secrets (Gitleaks + TruffleHog + Sensitive Files)
↓
[8] Phase 3 : SAST (Semgrep + outils par langage)
↓
[9] Phase 4 : Dépendances (npm audit, pip-audit, govulncheck, Trivy SCA)
↓
[10] Phase 5 : IaC (Trivy Config, Hadolint)
↓
[11] Phase 6 : CI/CD (actionlint)
↓
[12] Phase 7 : Normalisation SARIF + déduplication
↓
[13] Phase 8 : Calcul score + posture
↓
[14] Cleanup filesystem
↓
[15] code_scans.status = completed, code_issues persistésSuppression de faux positifs
Sur la page d'un finding, cliquez sur Marquer comme :
- Confirmé : finding réel, à corriger
- Faux positif : retire le finding du décompte de posture, conserve trace pour audit
- Risque accepté : risque connu et accepté par la direction (avec commentaire obligatoire)
- Corrigé : finding résolu (lien vers commit/PR optionnel)
- Won't fix : pas de fix prévu (ex. dépendance d'un sous-projet déprécié)
Vous pouvez aussi créer des règles de suppression globales depuis Code → Settings :
- Par chemin glob (ex.
tests/**,vendor/**) - Par règle Semgrep (ex. ignorer
python.lang.maintainability.use-defaultdict.use-defaultdict) - Par tag (ex. ignorer tous les findings tagués
dev-only)
Kanban des findings
L'onglet Code Issues → Kanban offre une vue style Trello pour gérer la remédiation :
| Colonne | Statut |
|---|---|
| 📥 À trier | new |
| ✋ À faire | confirmed, to_review |
| 🛠️ En cours | in_progress |
| 👀 En revue | review_pending |
| ✅ Fait | fixed |
| 🚫 Ignoré | false_positive, accepted_risk, wont_fix |
Drag-and-drop pour changer de statut. Filtres par sévérité, fichier, outil, assigné.
Différence GPU vs Premium pour l'analyse IA
À la fin d'un scan, vous pouvez demander une analyse IA sur les findings, qui produit :
- Une explication contextualisée du finding
- Une recommandation de fix avec snippet de code
- Une stratégie de patch (architectural ou local)
- Des critères d'acceptation (acceptance criteria) pour valider le fix
Deux fournisseurs IA disponibles :
| Provider | Modèle | Latence | Contexte | Coût (crédits) | Cas d'usage |
|---|---|---|---|---|---|
| GPU souverain | Qwen3-Coder-35B (OVH BHS) | ~5-10s | 16K tokens | 1 crédit / finding | Défaut. Souverain (Québec). Bon sur petits findings. |
| Premium Claude | Claude Sonnet 4.6 ou Opus 4.6 | ~30-90s | 200K tokens | 5 crédits / finding | Repos complexes, repos > 300 issues, exigences de qualité maximale |
Voir GPU vs Premium pour la matrice décisionnelle complète.
Rapports IA — 3 formats (depuis v0.127.0)
Le publisher de rapports (secuscan-api/internal/services/codescan/ai_report_publisher.go) génère trois formats à chaque rapport AI demandé :
| Format | Audience | Taille typique | Contenu |
|---|---|---|---|
| Executive PDF | Direction, board, RSSI | 5-10 pages | Synthèse business, top 5 risques, recommandations stratégiques, posture comparée. Bilingue FR/EN. |
| Technical PDF | Équipe DevSecOps | 30-100 pages | Tous les findings détaillés avec code snippets, current_code, expected_fix, patch_strategy, dependencies, acceptance_criteria, méthodologie |
| Machine MD | Pipelines / LLM | 20-200 KB | Markdown structuré (YAML front-matter + FINDING-NNN), toujours en anglais, conçu pour ingestion par un LLM en aval ou un script |
Tous les artefacts sont uploadés sur S3 (MinIO) sous code-scans/{scan_id}/ai-reports/{timestamp}/ avec hash SHA-256 et trackés dans la table code_scan_ai_report_artifacts (RLS multi-tenant). Téléchargeables depuis la page du scan, onglet Reports.
Cache incrémental d'analyses (v0.127.0)
Pour optimiser les coûts IA, Scanyze met en cache les analyses par finding indexées par (issue_id, content_hash) dans la table code_issue_ai_analyses.
À chaque nouveau scan :
- Si un finding est inchangé (même
content_hash), l'analyse précédente est réutilisée → 0 crédit consommé - Si un finding est nouveau ou modifié, une nouvelle analyse est lancée
Sur un repo de 500 findings dont seulement 20 changent entre deux scans, le coût de l'analyse IA passe de 500 crédits à 20 crédits Premium ou de 500 GPU à 20 GPU.
Voir secuscan-api/internal/repository/postgres/code_issue_ai_analyses_repo.go pour les détails (BatchGet via UNNEST + JOIN PostgreSQL).
Webhook auto-scan sur push
Pour déclencher un scan automatique à chaque push sur les branches surveillées :
- Dans GitHub/GitLab/Bitbucket, configurez un webhook vers
https://api.scanyze.com/v1/webhooks/git/{provider}. - Type d'événement :
push(et optionnellementpull_request) - Secret : généré dans Code → Settings → Webhooks (HMAC-SHA256)
- Sur chaque push sur une branche listée dans
watched_branchesdu repo, un scan est déclenché.
Pour les pull requests, Scanyze peut commenter automatiquement les nouveaux findings introduits par la PR (feature Code Reviews, voir /code-reviews).
Quotas par plan
| Plan | Repos max | Scans manuels/mois | Auto-scan webhook | Code Reviews |
|---|---|---|---|---|
| Pro | 10 | 100 | Oui | Oui |
| Business | 50 | 500 | Oui | Oui |
| Enterprise | -1 | -1 | Oui | Oui |
Le module Code Scanning n'est pas inclus dans les plans Essentiel et Starter.
Sources de cette page
- Backend :
secuscan-api/internal/services/codescan/,secuscan-api/cmd/codeworker/ - Outils : 19 fichiers dans
secuscan-api/internal/services/codescan/tools/ - Migration v0.127.0 :
secuscan-api/internal/migrations/000172_ai_report_artifacts.up.sql
À jour pour Scanyze v0.130.x.