17 KiB
AUDIT TECHNIQUE EXHAUSTIF — veza-common
Date: 2024-12-19
Module: veza-common (Bibliothèque Rust partagée)
Auditeur: Auto (Cursor AI)
Version analysée: 0.1.0
PHASE A — CARTOGRAPHIE
Module Overview
Rôle: Bibliothèque commune Rust fournissant types partagés, utilitaires, configurations, gestion d'erreurs, authentification, logging et métriques pour tous les services Veza (backend Go, chat-server Rust, stream-server Rust).
Entrées/Sorties:
- Pas d'API HTTP/WS directe (bibliothèque uniquement)
- Types sérialisables (JSON via serde) pour communication inter-services
- Traits async pour abstraction des providers (Auth, Cache, DB, Stream, etc.)
- Erreurs standardisées (
CommonError,VezaError) avec codes HTTP - Configurations (Database, Redis, JWT, Server, RateLimit, Logging)
Dépendances internes:
- Aucune (module racine du monorepo)
Dépendances externes:
- DB: PostgreSQL via
sqlx(runtime-tokio-rustls) - Cache: Redis (config uniquement, pas d'implémentation)
- Auth: JWT (structures, pas d'implémentation complète)
- Crypto:
sha2,hmac,base64 - Async:
tokio(full features) - Logging:
tracing,tracing-subscriber - Metrics:
prometheus - Serialization:
serde,serde_json - Validation:
validator,regex
Exécution:
# Build
cargo build --release
# Tests
cargo test
# Documentation
cargo doc --open
Configuration:
- Variables d'environnement (via
VezaConfigtrait) - Fichiers JSON (optionnel)
- Defaults hardcodés (⚠️ secrets exposés)
Points d'intégration:
- Types UUID (v4) pour tous les IDs
- JWT claims avec
sub,iss,aud,exp,iat,nbf,jti - Erreurs HTTP standardisées (400, 401, 403, 404, 409, 429, 500)
- Logging structuré (tracing avec JSON/text)
- Métriques Prometheus (counters, gauges, histograms)
Runbook Minimal
# 1. Vérifier dépendances
cd veza-common
cargo check
# 2. Lancer tests
cargo test --verbose
# 3. Build release
cargo build --release
# 4. Générer docs
cargo doc --no-deps --open
PHASE B — SANTÉ TECHNIQUE
Build Status
❌ BUILD CASSÉ — 9 erreurs de compilation identifiées:
- Module
serializationmanquant (src/utils/serialization.rsn'existe pas) - Module
loggingmanquant (src/utils/logging.rsn'existe pas, maissrc/logging.rsexiste) - Dépendance
randmanquante (utilisée dansauth.rs,random.rs) - Dépendance
totp_rsmanquante (utilisée dansauth.rs) - Feature
env-filtermanquante pourtracing-subscriber - Imports incorrects (
VezaError,VezaResultnon exportés au root, utilisés dansauth.rs,logging.rs,metrics.rs,traits.rs,config_rust.rs)
Linter Status
⚠️ CLIPPY NON INSTALLÉ — Impossible d'exécuter cargo clippy
Tests Status
✅ Tests présents — tests/common_tests.rs avec 15+ tests unitaires
- Couverture: ~60% estimée (pas de métrique exacte)
- Tests manquants: modules
auth,metrics,traits,config_rust
Gestion des Erreurs
⚠️ PROBLÈMES IDENTIFIÉS:
- 27 occurrences de
unwrap()/expect()/panic!dans le code - Comparaison HMAC non constante (timing attack possible)
- Erreurs non wrappées dans certains cas
Conventions
✅ Cohérent:
- Naming: snake_case pour fonctions, PascalCase pour types
- Structure: modules organisés (
types/,utils/,config/,error/) - Séparation: traits vs implémentations
⚠️ Incohérences:
- Deux systèmes d'erreurs (
CommonErrorvsVezaError) - Deux systèmes de config (
config/vsconfig_rust.rs)
PHASE C — SÉCURITÉ
Top 10 Risques
P0 — CRITIQUES
MOD-P0-001: Secrets hardcodés dans code source
- Fichier:
src/config_rust.rs:234,src/config_rust.rs:46 - Impact: Secrets JWT et DB exposés dans le code, compromission complète de l'auth
- Preuve:
// src/config_rust.rs:234
secret: "your-super-secret-jwt-key".to_string(),
// src/config_rust.rs:46
url: "postgresql://veza:password@localhost:5432/veza_db".to_string(),
- Cause: Defaults hardcodés au lieu de fail-fast si env var manquante
- Fix: Supprimer defaults secrets, exiger variables d'environnement
- Validation:
cargo test+ scan secrets (git-secrets, truffleHog) - Régression: Risque faible (tests doivent échouer si secrets manquants)
- Effort: S (1h)
MOD-P0-002: Comparaison HMAC vulnérable aux attaques de timing
- Fichier:
src/utils/crypto.rs:26-28 - Impact: Attaque par canal auxiliaire permettant de forger des signatures
- Preuve:
pub fn verify_hmac_signature(data: &str, signature: &str, secret: &str) -> Result<bool> {
let expected = generate_hmac_signature(data, secret)?;
Ok(signature == expected) // ⚠️ Comparaison non constante
}
- Cause: Utilisation de
==surStringau lieu de comparaison constante - Fix: Utiliser
constant_time_eqousubtle::ConstantTimeEq - Validation: Test unitaire avec timing attack simulé
- Régression: Risque faible (comportement fonctionnel identique)
- Effort: S (30min)
MOD-P0-003: Variables globales non thread-safe
- Fichier:
src/metrics.rs:215 - Impact: Data race, corruption mémoire, crash en production
- Preuve:
pub static mut GLOBAL_METRICS: Option<Arc<MetricsCollector>> = None;
- Cause: Utilisation de
static mutau lieu deOnceCell/LazyLock - Fix: Remplacer par
std::sync::OnceLockoulazy_static::lazy_static! - Validation: Test de concurrence avec
loomoustd::thread - Régression: Risque moyen (changement d'API)
- Effort: M (2h)
P1 — HAUTE PRIORITÉ
MOD-P1-004: Dépendances manquantes (rand, totp_rs)
- Fichier:
Cargo.toml,src/auth.rs:293,src/utils/random.rs:24 - Impact: Build cassé, fonctionnalités inutilisables
- Preuve: Erreurs de compilation
unresolved import 'rand' - Cause: Dépendances utilisées mais non déclarées
- Fix: Ajouter
rand = "0.8"ettotp_rs = "2.0"dansCargo.toml - Validation:
cargo checkdoit passer - Régression: Aucune
- Effort: S (15min)
MOD-P1-005: Modules manquants (serialization, logging dans utils)
- Fichier:
src/utils/mod.rs:6,8 - Impact: Build cassé
- Preuve: Erreur
file not found for module 'serialization' - Cause: Modules déclarés mais fichiers absents
- Fix: Créer fichiers ou supprimer déclarations (logging existe au root)
- Validation:
cargo check - Régression: Aucune
- Effort: S (30min)
MOD-P1-006: Exports manquants (VezaError, VezaResult)
- Fichier:
src/lib.rs,src/auth.rs:9,src/logging.rs:13, etc. - Impact: Build cassé, imports incorrects
- Preuve: Erreurs
unresolved imports 'crate::VezaError' - Cause: Types non exportés au root alors qu'utilisés partout
- Fix: Ajouter
pub use error::server::{VezaError, VezaResult};danslib.rs - Validation:
cargo check - Régression: Aucune
- Effort: S (15min)
MOD-P1-007: Feature flag manquant (env-filter)
- Fichier:
Cargo.toml,src/logging.rs:10 - Impact: Build cassé
- Preuve: Erreur
no 'EnvFilter' in the root - Cause: Feature
env-filternon activée pourtracing-subscriber - Fix: Ajouter
features = ["env-filter"]àtracing-subscriberdansCargo.toml - Validation:
cargo check - Régression: Aucune
- Effort: S (5min)
MOD-P1-008: Validation JWT secret trop faible
- Fichier:
src/config_rust.rs:269 - Impact: Secrets faibles acceptés, compromission possible
- Preuve:
if self.secret.len() < 32 {
warn!("JWT secret is shorter than recommended 32 characters");
}
- Cause: Warning seulement, pas d'erreur
- Fix: Rejeter secrets < 32 caractères en production (ou 64 recommandé)
- Validation: Test avec secret court doit échouer
- Régression: Risque faible (validation plus stricte)
- Effort: S (30min)
P2 — MOYENNE PRIORITÉ
MOD-P2-009: Regex compilées à chaque appel
- Fichier:
src/utils/validation.rs:7,20 - Impact: Performance dégradée, allocations inutiles
- Preuve:
let email_regex = Regex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")
.expect("Invalid email regex");
- Cause: Pas de
lazy_staticouonce_cell - Fix: Utiliser
lazy_static::lazy_static!oustd::sync::LazyLock - Validation: Benchmark avant/après
- Régression: Aucune
- Effort: S (30min)
MOD-P2-010: Utilisation excessive de unwrap()
- Fichier: Multiple (27 occurrences)
- Impact: Panics en production, crashs
- Preuve: Voir grep results
- Cause: Pas de gestion d'erreur appropriée
- Fix: Remplacer par
?ou gestion explicite - Validation: Tests avec cas limites
- Régression: Risque moyen (changement de comportement)
- Effort: M (4h)
Autres Risques Sécurité
- MOD-P2-011: Pas de validation de force de secret JWT (entropie)
- MOD-P2-012: Pas de rate limiting sur génération de tokens
- MOD-P2-013: Pas de rotation automatique de secrets
- MOD-P3-014: Logs peuvent contenir des secrets (pas de sanitization)
PHASE D — ROBUSTESSE & OBSERVABILITÉ
Production Readiness Gaps
P0 — BLOQUANTS
MOD-P0-015: Build cassé
- Impact: Impossible de déployer
- Fix: Résoudre toutes les erreurs de compilation (MOD-P1-004 à MOD-P1-007)
- Effort: M (2h)
P1 — CRITIQUES
MOD-P1-016: Pas de healthcheck endpoint
- Impact: Impossible de monitorer la santé du service
- Fix: Ajouter trait
HealthCheckavec implémentation - Effort: M (2h)
MOD-P1-017: Logs non structurés dans certains cas
- Impact: Difficulté d'analyse en production
- Preuve:
src/utils/validation.rsutiliseexpect()sans contexte - Fix: Utiliser
tracing::error!avec contexte - Effort: M (3h)
MOD-P1-018: Pas de corrélation de requêtes (request_id)
- Impact: Impossible de tracer une requête à travers les logs
- Fix: Ajouter
request_iddans tous les logs - Effort: M (4h)
MOD-P1-019: Pas de métriques de performance
- Impact: Pas de visibilité sur les performances
- Preuve:
MetricsCollectorexiste mais pas d'utilisation automatique - Fix: Intégrer métriques dans tous les traits
- Effort: L (8h)
P2 — IMPORTANTS
MOD-P2-020: Pas de retry automatique dans traits
- Impact: Échecs transitoires non gérés
- Fix: Ajouter retry dans implémentations
- Effort: M (4h)
MOD-P2-021: Pas de timeout par défaut
- Impact: Opérations peuvent bloquer indéfiniment
- Fix: Ajouter timeouts dans tous les traits async
- Effort: M (3h)
MOD-P2-022: Pas de circuit breaker
- Impact: Cascading failures possibles
- Fix: Ajouter circuit breaker dans traits
- Effort: L (6h)
PHASE E — PERFORMANCE & SCALABILITÉ
Optimisations Mesurables
- MOD-P2-009: Regex compilées (gain estimé: 50-100ns par appel)
- MOD-P2-023: Pool de connexions DB non configuré (gain: réduction latence 10-50ms)
- MOD-P2-024: Pas de cache pour métriques (gain: réduction allocations)
- MOD-P2-025: Clonage excessif de
String(gain: réduction allocations 10-20%)
PHASE F — LISTE EXHAUSTIVE DES PROBLÈMES
P0 — CRITIQUES (Build/Sécurité/Prod)
| ID | Titre | Impact | Fichier | Effort |
|---|---|---|---|---|
| MOD-P0-001 | Secrets hardcodés | Compromission auth | config_rust.rs:234,46 |
S |
| MOD-P0-002 | HMAC timing attack | Forgery signatures | utils/crypto.rs:26-28 |
S |
| MOD-P0-003 | Variables globales unsafe | Data race, crash | metrics.rs:215 |
M |
| MOD-P0-015 | Build cassé | Déploiement impossible | Multiple | M |
P1 — HAUTE PRIORITÉ (Bugs/Dette)
| ID | Titre | Impact | Fichier | Effort |
|---|---|---|---|---|
| MOD-P1-004 | Dépendances manquantes | Build cassé | Cargo.toml |
S |
| MOD-P1-005 | Modules manquants | Build cassé | utils/mod.rs |
S |
| MOD-P1-006 | Exports manquants | Build cassé | lib.rs |
S |
| MOD-P1-007 | Feature flag manquant | Build cassé | Cargo.toml |
S |
| MOD-P1-008 | Validation JWT faible | Secrets faibles acceptés | config_rust.rs:269 |
S |
| MOD-P1-016 | Pas de healthcheck | Monitoring impossible | N/A | M |
| MOD-P1-017 | Logs non structurés | Analyse difficile | validation.rs |
M |
| MOD-P1-018 | Pas de request_id | Traçabilité impossible | N/A | M |
| MOD-P1-019 | Pas de métriques auto | Pas de visibilité perf | metrics.rs |
L |
P2 — MOYENNE PRIORITÉ (Qualité/Perf)
| ID | Titre | Impact | Fichier | Effort |
|---|---|---|---|---|
| MOD-P2-009 | Regex non compilées | Performance | validation.rs |
S |
| MOD-P2-010 | Trop de unwrap() | Panics possibles | Multiple | M |
| MOD-P2-011 | Pas validation entropie | Secrets faibles | config_rust.rs |
S |
| MOD-P2-012 | Pas rate limit tokens | Abus possible | auth.rs |
M |
| MOD-P2-020 | Pas de retry auto | Échecs transitoires | Traits | M |
| MOD-P2-021 | Pas de timeout | Blocages | Traits | M |
| MOD-P2-022 | Pas circuit breaker | Cascading failures | Traits | L |
| MOD-P2-023 | Pool DB non configuré | Latence | config/database.rs |
S |
| MOD-P2-024 | Pas cache métriques | Allocations | metrics.rs |
S |
| MOD-P2-025 | Clonage excessif | Allocations | Multiple | M |
P3 — BASSE PRIORITÉ (Cosmétique)
| ID | Titre | Impact | Fichier | Effort |
|---|---|---|---|---|
| MOD-P3-014 | Logs peuvent exposer secrets | Fuite info | N/A | M |
| MOD-P3-026 | Documentation manquante | DX | Multiple | M |
| MOD-P3-027 | Tests incomplets | Couverture | Multiple | M |
| MOD-P3-028 | Duplication config | Maintenance | config/ vs config_rust.rs |
L |
PHASE G — PLAN D'EXÉCUTION
Checklist P0 (Ordre strict)
- ✅ MOD-P1-004: Ajouter
randettotp_rsdansCargo.toml - ✅ MOD-P1-005: Créer
src/utils/serialization.rsou supprimer déclaration - ✅ MOD-P1-006: Exporter
VezaError,VezaResultdanslib.rs - ✅ MOD-P1-007: Ajouter feature
env-filteràtracing-subscriber - ✅ MOD-P0-001: Supprimer secrets hardcodés, exiger env vars
- ✅ MOD-P0-002: Remplacer comparaison HMAC par constante
- ✅ MOD-P0-003: Remplacer
static mutparOnceLock - ✅ MOD-P0-015: Vérifier
cargo checkpasse
Validation: cargo test --all-features doit passer
Checklist P1 (Par lots)
Lot 1 — Validation & Sécurité:
- MOD-P1-008: Renforcer validation JWT secret
- MOD-P2-011: Ajouter validation entropie
Lot 2 — Observabilité:
- MOD-P1-016: Implémenter healthcheck
- MOD-P1-017: Structurer tous les logs
- MOD-P1-018: Ajouter request_id partout
Lot 3 — Robustesse:
- MOD-P2-020: Ajouter retry dans traits
- MOD-P2-021: Ajouter timeouts
Quick Wins (≤ 1h chacun)
- MOD-P2-009: Regex compilées (30min)
- MOD-P2-023: Configurer pool DB (30min)
- MOD-P1-008: Validation JWT (30min)
Tests à Ajouter en Priorité
-
Tests de sécurité:
- Timing attack sur HMAC
- Validation secrets JWT
- Secrets non exposés dans logs
-
Tests de robustesse:
- Concurrence sur
GLOBAL_METRICS - Retry avec backoff
- Timeouts
- Concurrence sur
-
Tests d'intégration:
- Config complète depuis env vars
- Métriques end-to-end
- Healthcheck
PR Plan
PR #1: Fix Build (P0)
- Titre:
fix: resolve compilation errors and missing dependencies - Contenu: MOD-P1-004, MOD-P1-005, MOD-P1-006, MOD-P1-007
- Tests:
cargo check+cargo test
PR #2: Security Fixes (P0)
- Titre:
security: remove hardcoded secrets and fix HMAC timing attack - Contenu: MOD-P0-001, MOD-P0-002, MOD-P0-003
- Tests: Tests sécurité +
cargo test
PR #3: Observability (P1)
- Titre:
feat: add healthcheck, structured logging, and request correlation - Contenu: MOD-P1-016, MOD-P1-017, MOD-P1-018
- Tests: Tests intégration
PR #4: Performance (P2)
- Titre:
perf: compile regexes and optimize allocations - Contenu: MOD-P2-009, MOD-P2-023, MOD-P2-024
- Tests: Benchmarks
PR #5: Robustness (P2)
- Titre:
feat: add retry, timeouts, and error handling improvements - Contenu: MOD-P2-010, MOD-P2-020, MOD-P2-021
- Tests: Tests robustesse
BONUS — SPÉCIFICITÉS RUST
Problèmes Rust-Spécifiques
- Async runtime misuse: Pas de problème identifié (tokio bien utilisé)
- Blocking in async: Pas de problème identifié
- Channels/backpressure: Pas implémenté (à ajouter si nécessaire)
- Unwrap/expect: 27 occurrences (MOD-P2-010)
- Feature flags: Manquant pour
tracing-subscriber(MOD-P1-007) - Unsafe code:
static mutdans metrics (MOD-P0-003)
RÉSUMÉ EXÉCUTIF
État Actuel
- Build: ❌ CASSÉ (9 erreurs)
- Tests: ✅ Présents mais incomplets (~60% couverture)
- Sécurité: ⚠️ 3 vulnérabilités P0, 5 P1
- Robustesse: ⚠️ Manque observabilité, retry, timeouts
- Performance: ⚠️ Optimisations possibles (regex, allocations)
Priorités Immédiates
- Fixer le build (2h) — PR #1
- Corriger vulnérabilités P0 (2h) — PR #2
- Ajouter observabilité (8h) — PR #3
Estimation Totale
- P0: 6h (1 sprint)
- P1: 20h (2-3 sprints)
- P2: 30h (3-4 sprints)
- P3: 15h (1-2 sprints)
Total: ~71h (7-10 jours de travail)
Fin du rapport