SecuAAS Docs
SecuScan / ScanyzeModules

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 :

FournisseurAuthentification
GitHubOAuth ou Personal Access Token (PAT)
GitLabOAuth ou PAT
BitbucketApp Password
Forgejo / GiteaPAT
Azure DevOpsPAT

Procédure

  1. Naviguez vers Code → Comptes Git (/code/accounts).
  2. Cliquez sur Connecter un compte.
  3. Choisissez le fournisseur. Pour GitHub/GitLab, vous pouvez utiliser OAuth (clic-clic) ou un PAT manuel.
  4. Pour les PAT, scopes minimaux requis :
    • GitHub : repo (lecture privée) ou public_repo (publics seulement)
    • GitLab : read_api, read_repository
    • Bitbucket : Repositories:Read
    • Forgejo : read:repository
    • Azure DevOps : Code (read)
  5. Une fois le compte ajouté, naviguez vers Code → Repositories.
  6. Cliquez sur Importer un repository — Scanyze liste vos repos accessibles.
  7. 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

  1. Sur la page d'un repo, cliquez sur Lancer un scan.
  2. Choisissez la branche à scanner (par défaut : main / master).
  3. 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)
  4. 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égorieOutilCouverture
SAST multi-langageSemgrep50+ langages, règles communautaires + custom
SAST GogosecVulnérabilités spécifiques Go (SQL injection, weak crypto, etc.)
SAST PythonBanditVulnérabilités Python (eval, pickle, weak hash, etc.)
SAST JavaScriptESLint SecurityPlugin sécurité ESLint
SecretsGitleaksDétection de secrets dans le code et l'historique Git
SecretsTruffleHogDétection de secrets avec validation (vérifie qu'une clé AWS est active, par exemple)
SecretsSensitive FilesDétection de fichiers sensibles (.env, id_rsa, *.pem, etc.)
Dépendances GogovulncheckVulnérabilités utilisées effectivement dans le code Go
Dépendances Pythonpip-auditVulnérabilités des packages PyPI
Dépendances Node.jsnpm auditVulnérabilités des packages npm
DépendancesOutdatedDétection de dépendances obsolètes
Dépendances multiTrivy SCAScan SBOM cross-langage
Conteneurs / IaCTrivy ConfigAudit Dockerfile, Kubernetes, Terraform
ConteneursHadolintLint des Dockerfiles
CI/CDactionlintAudit des workflows GitHub Actions (.github/workflows/)
TestsTest runnerExécute les tests unitaires si demandé
QualitéConfig AuditAudit des fichiers de configuration (yaml, ini, toml)
IntakeIntake ToolPré-traitement et inventaire du repo
NormalisationSARIF ImporterNormalisation 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és

Suppression 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 :

ColonneStatut
📥 À triernew
À faireconfirmed, to_review
🛠️ En coursin_progress
👀 En revuereview_pending
Faitfixed
🚫 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 :

ProviderModèleLatenceContexteCoût (crédits)Cas d'usage
GPU souverainQwen3-Coder-35B (OVH BHS)~5-10s16K tokens1 crédit / findingDéfaut. Souverain (Québec). Bon sur petits findings.
Premium ClaudeClaude Sonnet 4.6 ou Opus 4.6~30-90s200K tokens5 crédits / findingRepos 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é :

FormatAudienceTaille typiqueContenu
Executive PDFDirection, board, RSSI5-10 pagesSynthèse business, top 5 risques, recommandations stratégiques, posture comparée. Bilingue FR/EN.
Technical PDFÉquipe DevSecOps30-100 pagesTous les findings détaillés avec code snippets, current_code, expected_fix, patch_strategy, dependencies, acceptance_criteria, méthodologie
Machine MDPipelines / LLM20-200 KBMarkdown 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 :

  1. Dans GitHub/GitLab/Bitbucket, configurez un webhook vers https://api.scanyze.com/v1/webhooks/git/{provider}.
  2. Type d'événement : push (et optionnellement pull_request)
  3. Secret : généré dans Code → Settings → Webhooks (HMAC-SHA256)
  4. Sur chaque push sur une branche listée dans watched_branches du 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

PlanRepos maxScans manuels/moisAuto-scan webhookCode Reviews
Pro10100OuiOui
Business50500OuiOui
Enterprise-1-1OuiOui

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.

On this page