321 lines
11 KiB
Markdown
321 lines
11 KiB
Markdown
|
|
# Plan d'audit sécurité — Veza
|
||
|
|
|
||
|
|
> Checklist OWASP, plan pentest, calendrier d'audits pour la plateforme Veza.
|
||
|
|
> À exécuter avant chaque phase de lancement (beta, publique, shop).
|
||
|
|
> Dernière mise à jour : avril 2026.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Périmètre
|
||
|
|
|
||
|
|
### 1.1 Composants audités
|
||
|
|
|
||
|
|
| Composant | Stack | Criticité |
|
||
|
|
|-----------|-------|:---------:|
|
||
|
|
| Backend API | Go/Gin | **Critique** |
|
||
|
|
| Stream Server | Rust/Axum | Haute |
|
||
|
|
| Frontend Web | React/Vite | Moyenne |
|
||
|
|
| Base de données | PostgreSQL 16 | **Critique** |
|
||
|
|
| Cache/sessions | Redis 7 | Haute |
|
||
|
|
| Storage | MinIO S3 | Haute |
|
||
|
|
| Messaging | RabbitMQ 3 | Moyenne |
|
||
|
|
| Reverse proxy | HAProxy | Haute |
|
||
|
|
| WAF | Coraza | Haute |
|
||
|
|
| VPN | WireGuard | Haute |
|
||
|
|
| OS / infra | Debian, Docker | Haute |
|
||
|
|
|
||
|
|
### 1.2 Hors périmètre V1
|
||
|
|
|
||
|
|
- Applications desktop (Electron) — pas encore déployé
|
||
|
|
- AudioGridder — feature V2
|
||
|
|
- Applications mobiles — pas encore développé
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Checklist OWASP Top 10 (2021)
|
||
|
|
|
||
|
|
### A01:2021 — Broken Access Control
|
||
|
|
|
||
|
|
| # | Vérification | Comment tester | Statut |
|
||
|
|
|---|-------------|----------------|:------:|
|
||
|
|
| 1 | Accès horizontal : user A ne peut pas voir les données de user B | Tester GET/PUT/DELETE avec ID d'un autre user | ☐ |
|
||
|
|
| 2 | Accès vertical : user normal ne peut pas accéder aux endpoints admin | Tester sans rôle admin | ☐ |
|
||
|
|
| 3 | IDOR sur tous les endpoints à paramètre :id | Fuzzer les IDs (UUID valides d'autres users) | ☐ |
|
||
|
|
| 4 | Force browsing : pages admin non accessibles sans auth | Scanner /admin/*, /internal/* | ☐ |
|
||
|
|
| 5 | CORS : origins autorisées uniquement les domaines Talas | Vérifier Access-Control-Allow-Origin | ☐ |
|
||
|
|
| 6 | Méthodes HTTP : seules GET/POST/PUT/DELETE autorisées | Tester OPTIONS, TRACE, PATCH | ☐ |
|
||
|
|
|
||
|
|
### A02:2021 — Cryptographic Failures
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 7 | TLS 1.2+ obligatoire, pas de TLS 1.0/1.1 | ☐ |
|
||
|
|
| 8 | Certificats Let's Encrypt valides, auto-renew | ☐ |
|
||
|
|
| 9 | Pas de secrets en clair dans le code ou les logs | ☐ |
|
||
|
|
| 10 | Passwords hashés bcrypt cost ≥12 | ☐ |
|
||
|
|
| 11 | Tokens TOTP chiffrés AES-256-GCM en DB | ☐ |
|
||
|
|
| 12 | JWT signés RS256, pas HS256 en prod | ☐ |
|
||
|
|
| 13 | Pas de données sensibles dans les JWT (payload minimal) | ☐ |
|
||
|
|
|
||
|
|
### A03:2021 — Injection
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 14 | SQL injection : GORM paramétré, pas de raw queries non-escaped | ☐ |
|
||
|
|
| 15 | NoSQL injection : N/A (pas de NoSQL) | ✓ |
|
||
|
|
| 16 | OS command injection : pas de exec() avec user input | ☐ |
|
||
|
|
| 17 | LDAP injection : N/A | ✓ |
|
||
|
|
| 18 | XSS : sanitisation de tous les inputs rendus HTML | ☐ |
|
||
|
|
| 19 | SSRF : pas de fetch d'URL arbitraire fournie par l'utilisateur | ☐ |
|
||
|
|
|
||
|
|
### A04:2021 — Insecure Design
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 20 | Rate limiting sur login, register, reset password | ☐ |
|
||
|
|
| 21 | Verrouillage de compte après N échecs | ☐ |
|
||
|
|
| 22 | Pas de réponse différente "email existe" vs "email inconnu" | ☐ |
|
||
|
|
| 23 | Captcha ou proof-of-work sur formulaires publics (V1.5) | ☐ |
|
||
|
|
|
||
|
|
### A05:2021 — Security Misconfiguration
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 24 | Headers sécurité : HSTS, CSP, X-Content-Type, X-Frame | ☐ |
|
||
|
|
| 25 | Pas de stack traces exposées en production | ☐ |
|
||
|
|
| 26 | Pas de debug mode en production | ☐ |
|
||
|
|
| 27 | Docker : pas de containers root, images signées | ☐ |
|
||
|
|
| 28 | Ports exposés : uniquement 80/443 vers l'extérieur | ☐ |
|
||
|
|
| 29 | MinIO : pas de bucket public sauf previews | ☐ |
|
||
|
|
| 30 | Redis : auth activée, pas d'accès externe | ☐ |
|
||
|
|
| 31 | PostgreSQL : auth MD5/scram, pas d'accès externe | ☐ |
|
||
|
|
|
||
|
|
### A06:2021 — Vulnerable and Outdated Components
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 32 | Go : `govulncheck` sans vulnérabilité critique | ☐ |
|
||
|
|
| 33 | Rust : `cargo audit` sans vulnérabilité critique | ☐ |
|
||
|
|
| 34 | NPM : `npm audit` sans critical/high | ☐ |
|
||
|
|
| 35 | Docker images : `trivy image scan` clean | ☐ |
|
||
|
|
| 36 | OS packages : mise à jour sécurité < 7 jours | ☐ |
|
||
|
|
|
||
|
|
### A07:2021 — Identification and Authentication Failures
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 37 | Password policy appliquée (12 car, complexité) | ☐ |
|
||
|
|
| 38 | Sessions expirent (access 15min, refresh 30j) | ☐ |
|
||
|
|
| 39 | Logout invalide le refresh token | ☐ |
|
||
|
|
| 40 | Cookies HTTP-only + Secure + SameSite=Lax | ☐ |
|
||
|
|
| 41 | OAuth state parameter vérifié | ☐ |
|
||
|
|
| 42 | 2FA fonctionne et bloque sans code | ☐ |
|
||
|
|
|
||
|
|
### A08:2021 — Software and Data Integrity Failures
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 43 | Uploads scannés ClamAV avant stockage | ☐ |
|
||
|
|
| 44 | Checksums vérifiés après upload MinIO | ☐ |
|
||
|
|
| 45 | Webhooks Mollie vérifiés (re-call API) | ☐ |
|
||
|
|
| 46 | Dépendances : lockfiles commités, pas de floating versions | ☐ |
|
||
|
|
|
||
|
|
### A09:2021 — Security Logging and Monitoring Failures
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 47 | Audit log sur login, logout, password change, admin actions | ☐ |
|
||
|
|
| 48 | Logs structurés (JSON) en production | ☐ |
|
||
|
|
| 49 | Alertes Sentry sur erreurs 500 | ☐ |
|
||
|
|
| 50 | Fail2ban actif sur SSH et HTTP brute-force | ☐ |
|
||
|
|
| 51 | Métriques Prometheus exportées et dashboardées | ☐ |
|
||
|
|
|
||
|
|
### A10:2021 — Server-Side Request Forgery (SSRF)
|
||
|
|
|
||
|
|
| # | Vérification | Statut |
|
||
|
|
|---|-------------|:------:|
|
||
|
|
| 52 | Pas de proxy/fetch d'URL arbitraire | ☐ |
|
||
|
|
| 53 | Callbacks OAuth limités aux domaines autorisés | ☐ |
|
||
|
|
| 54 | Webhooks Mollie : vérification IP source (optionnel) | ☐ |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Tests de pénétration
|
||
|
|
|
||
|
|
### 3.1 Scope pentest V1
|
||
|
|
|
||
|
|
| Cible | Type de test |
|
||
|
|
|-------|-------------|
|
||
|
|
| API REST (tout `/api/v1/*`) | Blackbox + greybox (avec un compte user) |
|
||
|
|
| Auth (login, register, 2FA, OAuth) | Blackbox |
|
||
|
|
| Upload fichiers (tracks, samples, cloud) | Greybox |
|
||
|
|
| WebSocket streaming | Blackbox |
|
||
|
|
| Infra réseau (ports, services) | Blackbox depuis extérieur |
|
||
|
|
|
||
|
|
### 3.2 Outils
|
||
|
|
|
||
|
|
| Outil | Usage | Self-hosted ? |
|
||
|
|
|-------|-------|:-------------:|
|
||
|
|
| **Nmap** | Scan ports + services | ✓ |
|
||
|
|
| **OWASP ZAP** | Proxy scanner web, fuzzer | ✓ |
|
||
|
|
| **Nuclei** | Scan vulnérabilités templates | ✓ |
|
||
|
|
| **SQLMap** | Injection SQL (validation) | ✓ |
|
||
|
|
| **ffuf** | Fuzzer endpoints / dirs | ✓ |
|
||
|
|
| **Burp Suite Community** | Proxy manuel | ✓ |
|
||
|
|
| **Trivy** | Scan containers Docker | ✓ |
|
||
|
|
| **govulncheck** | Vulns Go | ✓ |
|
||
|
|
| **cargo audit** | Vulns Rust | ✓ |
|
||
|
|
| **npm audit** | Vulns JS | ✓ |
|
||
|
|
|
||
|
|
### 3.3 Déroulement d'un pentest
|
||
|
|
|
||
|
|
```
|
||
|
|
Phase 1 — Reconnaissance (2h)
|
||
|
|
→ Nmap scan réseau externe
|
||
|
|
→ ffuf directory brute-force
|
||
|
|
→ Nuclei templates scan
|
||
|
|
|
||
|
|
Phase 2 — Authentication (2h)
|
||
|
|
→ Brute-force login (rate limit test)
|
||
|
|
→ Password reset flow (token enum)
|
||
|
|
→ Session hijacking attempt
|
||
|
|
→ 2FA bypass attempts
|
||
|
|
→ OAuth redirect manipulation
|
||
|
|
|
||
|
|
Phase 3 — Authorization (3h)
|
||
|
|
→ IDOR sur chaque endpoint avec :id
|
||
|
|
→ Escalation user → admin
|
||
|
|
→ Cross-user data access
|
||
|
|
→ File access cross-tenant (cloud, uploads)
|
||
|
|
|
||
|
|
Phase 4 — Input validation (2h)
|
||
|
|
→ XSS sur tous les champs affichables
|
||
|
|
→ SQL injection sur search + filtres
|
||
|
|
→ File upload : extensions interdites, LFI, path traversal
|
||
|
|
→ Payload size limits
|
||
|
|
|
||
|
|
Phase 5 — Business logic (2h)
|
||
|
|
→ Stock manipulation (réservation concurrente)
|
||
|
|
→ Payment flow bypass
|
||
|
|
→ Double-submit paiement
|
||
|
|
→ Rate limit contournement
|
||
|
|
|
||
|
|
Phase 6 — Infrastructure (1h)
|
||
|
|
→ Docker escape (container → host)
|
||
|
|
→ Redis accès sans auth
|
||
|
|
→ PostgreSQL accès direct
|
||
|
|
→ MinIO bucket listing
|
||
|
|
|
||
|
|
Phase 7 — Rapport (2h)
|
||
|
|
→ Rédaction des findings
|
||
|
|
→ Classification CVSS
|
||
|
|
→ Recommandations de remediation
|
||
|
|
```
|
||
|
|
|
||
|
|
**Durée totale** : ~14 heures (2 jours de travail intensif).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Calendrier d'audit
|
||
|
|
|
||
|
|
### 4.1 Audits obligatoires
|
||
|
|
|
||
|
|
| Quand | Type | Scope |
|
||
|
|
|-------|------|-------|
|
||
|
|
| **Avant beta** (mai 2026) | OWASP checklist complète | Tout |
|
||
|
|
| **Avant ouverture publique** (juin 2026) | Pentest léger (phases 1-4) | API + auth |
|
||
|
|
| **Avant lancement shop** (août 2026) | Pentest complet + focus paiement | Shop + payment |
|
||
|
|
| **Trimestriel** | Scan vulnérabilités (Trivy, govulncheck, npm audit) | Dépendances |
|
||
|
|
| **Après chaque release majeure** | Revue OWASP ciblée | Code modifié |
|
||
|
|
|
||
|
|
### 4.2 Audits continus (automatisés en CI)
|
||
|
|
|
||
|
|
| Check | Outil | Fréquence |
|
||
|
|
|-------|-------|-----------|
|
||
|
|
| Vulnérabilités Go | `govulncheck` | Chaque PR |
|
||
|
|
| Vulnérabilités Rust | `cargo audit` | Chaque PR |
|
||
|
|
| Vulnérabilités NPM | `npm audit --audit-level=high` | Chaque PR |
|
||
|
|
| Docker images | `trivy image` | Chaque build |
|
||
|
|
| Secrets dans le code | `gitleaks` | Chaque PR |
|
||
|
|
| Headers sécurité | Script custom (curl + check) | Daily cron |
|
||
|
|
| Certificat TLS expiration | `openssl s_client` | Weekly cron |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. Classification des vulnérabilités
|
||
|
|
|
||
|
|
| Niveau | CVSS | Délai de correction | Exemples |
|
||
|
|
|--------|:----:|:-------------------:|----------|
|
||
|
|
| **Critique** | 9.0-10.0 | **24h** | RCE, SQLi, auth bypass, données exposées |
|
||
|
|
| **Haute** | 7.0-8.9 | **72h** | XSS stocké, IDOR critique, CSRF paiement |
|
||
|
|
| **Moyenne** | 4.0-6.9 | **2 semaines** | XSS réfléchi, info leak mineur, rate limit faible |
|
||
|
|
| **Basse** | 0.1-3.9 | **1 mois** | Headers manquants, verbose errors, enumeration |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. Reporting
|
||
|
|
|
||
|
|
### 6.1 Format de rapport pentest
|
||
|
|
|
||
|
|
```markdown
|
||
|
|
## Finding: [Titre]
|
||
|
|
|
||
|
|
**Sévérité**: Critique / Haute / Moyenne / Basse
|
||
|
|
**CVSS**: X.X
|
||
|
|
**Composant**: Backend API / Frontend / Infra
|
||
|
|
**Endpoint**: POST /api/v1/...
|
||
|
|
**CWE**: CWE-XXX
|
||
|
|
|
||
|
|
### Description
|
||
|
|
[Ce qui a été trouvé]
|
||
|
|
|
||
|
|
### Preuve
|
||
|
|
[Commande/screenshot/payload]
|
||
|
|
|
||
|
|
### Impact
|
||
|
|
[Ce qu'un attaquant pourrait faire]
|
||
|
|
|
||
|
|
### Remédiation
|
||
|
|
[Comment corriger]
|
||
|
|
|
||
|
|
### Statut
|
||
|
|
☐ À corriger / ☐ Corrigé / ☐ Accepté (risque mitigé)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6.2 Suivi
|
||
|
|
|
||
|
|
Un fichier `FINDINGS_LOG.md` dans ce dossier trace toutes les vulnérabilités trouvées :
|
||
|
|
|
||
|
|
```markdown
|
||
|
|
| # | Date | Sévérité | Titre | Statut | Corrigé le |
|
||
|
|
|---|------|----------|-------|--------|-----------|
|
||
|
|
| 001 | 2026-05-15 | Haute | IDOR sur /tracks/:id | Corrigé | 2026-05-16 |
|
||
|
|
| 002 | ... | ... | ... | ... | ... |
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. Règles de Coraza WAF à valider
|
||
|
|
|
||
|
|
| Règle | Vérifie |
|
||
|
|
|-------|---------|
|
||
|
|
| OWASP CRS 4.x activé | ☐ |
|
||
|
|
| Anomaly scoring threshold = 5 | ☐ |
|
||
|
|
| SQL injection rules actives | ☐ |
|
||
|
|
| XSS rules actives | ☐ |
|
||
|
|
| Path traversal rules actives | ☐ |
|
||
|
|
| File upload rules actives | ☐ |
|
||
|
|
| Rate limiting intégré (ou HAProxy) | ☐ |
|
||
|
|
| Logging des blocked requests | ☐ |
|
||
|
|
| False positives identifiés et whitelistés | ☐ |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Voir aussi
|
||
|
|
|
||
|
|
- [[Auth_&_Core/SPEC_AUTH_CORE]] — implémentation auth
|
||
|
|
- [[04_INFRA_DEPLOIEMENT/Sécurité]] — hardening infra
|
||
|
|
- [[04_INFRA_DEPLOIEMENT/Sécurité_WAF_Coraza]] — config WAF
|
||
|
|
- [[08_CONFORMITE_JURIDIQUE/RGPD]] — obligations données personnelles
|
||
|
|
- [[ARCHITECTURE_VEZA]] — composants à auditer
|