| name | security-testing |
| description | Tests de sécurité automatisés — SAST, DAST, SCA, dependency scanning, ZAP, Nuclei, Trivy, secret detection, et intégration CI/CD DevSecOps. |
| version | 1.0.0 |
| author | EVA |
| license | MIT |
| metadata | {"hermes":{"tags":["security-testing","sast","dast","sca","devsecops","zap","nuclei","trivy","pentest"],"related_skills":["integration-testing","e2e-testing","performance-testing"]}} |
Tests de Sécurité — SAST, DAST, SCA et DevSecOps
Overview
Les tests de sécurité automatisés s'intègrent dans le pipeline CI/CD pour détecter les vulnérabilités tôt dans le cycle de développement (Shift Left). Quatre grandes catégories : SAST (statique), DAST (dynamique), SCA (dépendances), Secret Detection.
When to Use
- Shift Left — détecter les failles avant le merge, pas après la mise en prod
- DevSecOps — gate de sécurité obligatoire dans le pipeline CI/CD
- Audit de sécurité — analyse complète avant release
- OWASP Top 10 — couvrir les classes de vulnérabilités web les plus critiques
- Ne pas utiliser pour : remplacer un audit de sécurité manuel complet (complémentaire)
Chaîne d'Outils de Sécurité
Code (repo) Build Prod
SAST ──────────→ SCA ──────────→ Secret ──────→ DAST
Semgrep Trivy / Dependabot Gitleaks / ZAP / Nuclei
SonarQube Grype / Snyk TruffleHog
CodeQL
1. SAST — Analyse Statique de Code
Semgrep
pip install semgrep
semgrep scan --config=auto --config=p/r2c-ci .
semgrep scan --config=auto --output=semgrep-report.sarif
semgrep scan --config=rules/my-rules.yaml
semgrep scan --config=p/owasp-top-ten
semgrep scan --config=auto --error .
Exemple de règle personnalisée :
rules:
- id: python-sql-injection
patterns:
- pattern: |
cursor.execute(f"...{...}...")
- pattern-not: |
cursor.execute(..., (...,))
message: "❌ SQL Injection détectée : ne pas utiliser f-strings dans execute()"
languages: [python]
severity: ERROR
metadata:
cwe: "CWE-89"
owasp: "A1: Injection"
CodeQL (GitHub)
name: CodeQL
on: [push, pull_request]
jobs:
analyze:
runs-on: ubuntu-latest
language: [python, javascript, java]
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-and-quality
- uses: github/codeql-action/analyze@v3
SonarQube / SonarCloud
sonar-scanner \
-Dsonar.projectKey=myproject \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=$SONAR_TOKEN
sonarcloud.github.action
2. SCA — Analyse des Dépendances
Trivy
sudo apt install trivy
docker pull aquasec/trivy
trivy fs . --severity CRITICAL,HIGH
trivy image myapp:latest --severity CRITICAL,HIGH
trivy fs --format cyclonedx --output sbom.json .
trivy fs --exit-code 1 --severity CRITICAL,HIGH .
name: Trivy SCA
on: [push]
jobs:
trivy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
scan-ref: '.'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
Grype
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
grype . --fail-on high
syft . -o json > sbom.json
grype sbom:sbom.json
Dependabot (GitHub natif)
version: 2
updates:
- package-ecosystem: 'pip'
directory: '/'
schedule:
interval: 'weekly'
day: 'monday'
open-pull-requests-limit: 10
labels:
- 'dependencies'
- 'security'
- package-ecosystem: 'npm'
directory: '/'
schedule:
interval: 'weekly'
3. Secret Detection
Gitleaks
brew install gitleaks
docker pull zricethezav/gitleaks
gitleaks detect --source . --verbose
gitleaks detect --source . --report-path gitleaks-report.json --exit-code 1
gitleaks detect --source . --log-opts="--all"
name: Secret Detection
on: [push, pull_request]
jobs:
gitleaks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TruffleHog
pip install trufflehog
trufflehog git https://github.com/user/repo --only-verified
trufflehog filesystem . --only-verified
trufflehog docker myimage:latest --only-verified
4. DAST — Analyse Dynamique (OWASP ZAP)
Installation et Scan de Base
docker pull ghcr.io/zaproxy/zaproxy:stable
docker run -v $(pwd):/zap/wrk/:rw -t \
ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py -t https://target.com \
-r report.html
docker run -v $(pwd):/zap/wrk/:rw -t \
ghcr.io/zaproxy/zaproxy:stable \
zap-api-scan.py -t https://target.com/api/openapi.json \
-f openapi -r report.html
docker run -v $(pwd):/zap/wrk/:rw -t \
ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py -t https://target.com \
-r report.html \
--hook=/zap/wrk/auth_hook.py
Context et Authentification (ZAP)
def zap_started(zap, target):
"""Prépare le contexte d'authentification pour ZAP."""
context_id = zap.context.new_context('myapp')
zap.context.include_in_context(context_id, 'https://target.com/.*')
session_id = zap.replacer.add_rule(
description='Auth session',
match_type='REQ_HEADER',
match_string='Authorization',
replacement='Bearer mock-token',
)
user_id = zap.users.new_user(context_id, 'testuser')
zap.users.set_authentication_credentials(
context_id, user_id,
{'username': 'admin@test.com', 'password': 'test123'}
)
zap.users.set_user_enabled(context_id, user_id, True)
5. Nuclei — Scan de Vulnérabilités Automatisé
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
brew install nuclei
nuclei -u https://target.com
nuclei -u https://target.com -t cves/ -t exposures/
nuclei -u https://target.com -t ~/nuclei-templates/http/misconfiguration/
nuclei -u https://target.com -o nuclei-report.json -json
name: Nuclei DAST
on:
schedule:
- cron: '0 8 * * 1'
jobs:
nuclei:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Nuclei
uses: projectdiscovery/nuclei-action@main
with:
target: https://staging.example.com
templates: cves,misconfiguration
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: nuclei-report
path: nuclei-report.json
Pipelines DevSecOps Complets
CI/CD — Multi-Étapes
name: DevSecOps Pipeline
on: [push, pull_request]
jobs:
security-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Semgrep SAST
uses: semgrep/semgrep-action@v1
with:
config: auto
- name: Gitleaks
uses: gitleaks/gitleaks-action@v2
- name: Trivy
uses: aquasecurity/trivy-action@master
with:
scan-type: fs
scan-ref: .
severity: CRITICAL,HIGH
- name: Trivy Image
uses: aquasecurity/trivy-action@master
with:
Ce que Chaque Outil Détecte
| Outil | Classe | Détecte |
|---|
| Semgrep/CodeQL | SAST | Injections, XSS, path traversal, hardcoded secrets, mauvaises pratiques crypto |
| Trivy/Grype | SCA | CVE dans les dépendances, packages obsolètes, licenses |
| Gitleaks/TruffleHog | Secrets | API keys, tokens, mots de passe, clés SSH committés |
| ZAP | DAST | XSS, SQLi, CSRF, mauvaises configs headers, cookie flaws |
| Nuclei | DAST | CVEs connues, misconfigurations cloud, expositions |
| Dependabot/Renovate | SCA | Alertes et PRs automatiques pour dépendances vulnérables |
OWASP Top 10 — Couverture par Outil
| # | Vulnérabilité | SAST | DAST | SCA |
|---|
| A1 | Injection (SQL, NoSQL, OS) | ✅ Semgrep/CodeQL | ✅ ZAP | ❌ |
| A2 | Broken Authentication | ⚠️ Partiel | ✅ ZAP | ❌ |
| A3 | Sensitive Data Exposure | ⚠️ Partiel | ✅ ZAP/Nuclei | ❌ |
| A4 | XXE (XML External Entities) | ✅ Semgrep | ✅ ZAP | ❌ |
| A5 | Broken Access Control | ⚠️ Partiel | ✅ ZAP/Nuclei | ❌ |
| A6 | Security Misconfiguration | ❌ | ✅ Nuclei/ZAP | ❌ |
| A7 | XSS (Cross-Site Scripting) | ✅ Semgrep/CodeQL | ✅ ZAP | ❌ |
| A8 | Insecure Deserialization | ✅ Semgrep | ✅ ZAP | ⚠️ (lib vulnérables) |
| A9 | Known Vulnerabilities | ❌ | ❌ | ✅ Trivy/Grype |
| A10 | Logging & Monitoring | ❌ | ❌ | ❌ (ops) |
Bonnes Pratiques
- Shift Left — plus tôt on détecte, moins cher à corriger
- Faux positifs — configurer des ignores documentés, ne pas tout bloquer
- Gate progressif — bloquer CRITICAL/HIGH en CI, warnings pour MEDIUM
- Scan régulier — pas seulement au commit mais aussi en cron (CVE découvertes après)
- SBOM — générer le Software Bill of Materials pour chaque release
- Ne pas confondre scan et audit — l'automatisation ne remplace pas un test d'intrusion manuel
Common Pitfalls
- Trop de faux positifs — temps perdu à trier, risque d'ignorer les vrais alertes
- Bloquer tout — 100% des PR sont bloqués, les devs contournent la sécurité
- Pas de SBOM — impossible de savoir quelles dépendances sont vulnérables après build
- Scanner sans authentification — ZAP/nuclei voient la page de login seulement
- Dépendances non scannées — package.json seul ne suffit pas (scanner le lockfile)
- Scanner trop tard — attendre le déploiement pour DAST au lieu de le faire en staging
Verification Checklist