# 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**: ```bash # Build cargo build --release # Tests cargo test # Documentation cargo doc --open ``` **Configuration**: - Variables d'environnement (via `VezaConfig` trait) - 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 ```bash # 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: 1. **Module `serialization` manquant** (`src/utils/serialization.rs` n'existe pas) 2. **Module `logging` manquant** (`src/utils/logging.rs` n'existe pas, mais `src/logging.rs` existe) 3. **Dépendance `rand` manquante** (utilisée dans `auth.rs`, `random.rs`) 4. **Dépendance `totp_rs` manquante** (utilisée dans `auth.rs`) 5. **Feature `env-filter` manquante** pour `tracing-subscriber` 6. **Imports incorrects** (`VezaError`, `VezaResult` non exportés au root, utilisés dans `auth.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 (`CommonError` vs `VezaError`) - Deux systèmes de config (`config/` vs `config_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**: ```rust // 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**: ```rust pub fn verify_hmac_signature(data: &str, signature: &str, secret: &str) -> Result { let expected = generate_hmac_signature(data, secret)?; Ok(signature == expected) // ⚠️ Comparaison non constante } ``` - **Cause**: Utilisation de `==` sur `String` au lieu de comparaison constante - **Fix**: Utiliser `constant_time_eq` ou `subtle::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**: ```rust pub static mut GLOBAL_METRICS: Option> = None; ``` - **Cause**: Utilisation de `static mut` au lieu de `OnceCell`/`LazyLock` - **Fix**: Remplacer par `std::sync::OnceLock` ou `lazy_static::lazy_static!` - **Validation**: Test de concurrence avec `loom` ou `std::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"` et `totp_rs = "2.0"` dans `Cargo.toml` - **Validation**: `cargo check` doit 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};` dans `lib.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-filter` non activée pour `tracing-subscriber` - **Fix**: Ajouter `features = ["env-filter"]` à `tracing-subscriber` dans `Cargo.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**: ```rust 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**: ```rust 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_static` ou `once_cell` - **Fix**: Utiliser `lazy_static::lazy_static!` ou `std::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 `HealthCheck` avec 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.rs` utilise `expect()` 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_id` dans tous les logs - **Effort**: M (4h) **MOD-P1-019: Pas de métriques de performance** - **Impact**: Pas de visibilité sur les performances - **Preuve**: `MetricsCollector` existe 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 1. **MOD-P2-009**: Regex compilées (gain estimé: 50-100ns par appel) 2. **MOD-P2-023**: Pool de connexions DB non configuré (gain: réduction latence 10-50ms) 3. **MOD-P2-024**: Pas de cache pour métriques (gain: réduction allocations) 4. **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) 1. ✅ **MOD-P1-004**: Ajouter `rand` et `totp_rs` dans `Cargo.toml` 2. ✅ **MOD-P1-005**: Créer `src/utils/serialization.rs` ou supprimer déclaration 3. ✅ **MOD-P1-006**: Exporter `VezaError`, `VezaResult` dans `lib.rs` 4. ✅ **MOD-P1-007**: Ajouter feature `env-filter` à `tracing-subscriber` 5. ✅ **MOD-P0-001**: Supprimer secrets hardcodés, exiger env vars 6. ✅ **MOD-P0-002**: Remplacer comparaison HMAC par constante 7. ✅ **MOD-P0-003**: Remplacer `static mut` par `OnceLock` 8. ✅ **MOD-P0-015**: Vérifier `cargo check` passe **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) 1. **MOD-P2-009**: Regex compilées (30min) 2. **MOD-P2-023**: Configurer pool DB (30min) 3. **MOD-P1-008**: Validation JWT (30min) ### Tests à Ajouter en Priorité 1. **Tests de sécurité**: - Timing attack sur HMAC - Validation secrets JWT - Secrets non exposés dans logs 2. **Tests de robustesse**: - Concurrence sur `GLOBAL_METRICS` - Retry avec backoff - Timeouts 3. **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 1. **Async runtime misuse**: Pas de problème identifié (tokio bien utilisé) 2. **Blocking in async**: Pas de problème identifié 3. **Channels/backpressure**: Pas implémenté (à ajouter si nécessaire) 4. **Unwrap/expect**: 27 occurrences (MOD-P2-010) 5. **Feature flags**: Manquant pour `tracing-subscriber` (MOD-P1-007) 6. **Unsafe code**: `static mut` dans 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 1. **Fixer le build** (2h) — PR #1 2. **Corriger vulnérabilités P0** (2h) — PR #2 3. **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**