Date : 15/02/2026 Status : IMPLEMENTEE Auditeur : Claude Opus 4.6 Methode : 3 passes independantes + confrontation + verification integrale contre le code source
| Projet | Total | Confirmes | Faux Positif | Imprecis | Indetermine |
|---|---|---|---|---|---|
| ai-orchestrator | 33 | 29 | 1 | 3 | 0 |
| connectors-api | 22 | 22 | 0 | 0 | 0 |
| ulias-org | 30 | 29 | 0 | 1 | 0 |
| ulias-org-web | 25 | 25 | 0 | 0 | 0 |
| dashboard | 36 | 32 | 0 | 3 | 1 |
| TOTAL | 146 | 137 | 1 | 7 | 1 |
Fiabilite : 93.8% confirmes / 0.7% faux positif
ai-orchestrator C-22 : "nginx non private, API publique"
private: true (VRAI)include /etc/nginx/snippets/allowed-ips.conf + deny all (verifie par SSH)| Projet | ID | Erreur description |
|---|---|---|
| ai-orch | U-01 | "WIN11_HOST defini 2 fois" → 1 seule fois (hardcode), env var jamais lue |
| ai-orch | U-06 | "StrictHostKeyChecking=no partout" → 2 commandes seulement |
| ai-orch | U-13 | "active_tools[-1] parasite" → jamais cree car health_url=None |
| ulias-org | C-17 | "nginx accessible publiquement" → IP-restreint en config deployee |
| dashboard | C-11 | "data-loader.js jamais utilise" → utilise par 2-3 pages statiques hors generate.d |
| dashboard | C-12 | Description incomplete : gen_header() EST utilisee par 26-claude.sh |
| dashboard | U-16 | "JSON casse par newline" → \n en bash = litteral \n = escape JSON valide |
dashboard C-18 : permissions services-registry.json — non verifiable sans acces bash direct
| ID | Description | Verdict |
|---|---|---|
| C-01 | Cloud tasks Anthropic sans tracking, parallelisme illimite, pas de cleanup shutdown | CONFIRME |
| C-02 | TOCTOU budget Anthropic : cout ecrit en fin de job, N jobs voient meme budget | CONFIRME |
| C-03 | Credentials Redis/Postgres hardcodes, conf.prod ne definit PAS ces env vars | CONFIRME |
| C-04 | Mode generate Ollama sans num_ctx (chat l'a, generate non) | CONFIRME |
| C-05 | CORS allow_origins=["*"] + allow_credentials=True | CONFIRME |
| C-06 | is_cloud calcule deux fois (lignes 3943 et 4045) | CONFIRME |
| C-07 | Docstring dit 1-5, code fait min(10), commentaire dit "1 and 5" | CONFIRME |
| C-08 | httpx client reutilise 2h, pas de distinction erreurs fatales/transitoires | CONFIRME |
| C-09 | SadTalker cleanup: task orpheline, process SSH non wait()ed | CONFIRME |
| C-10 | Job poppe de Redis puis DB echoue = job perdu | CONFIRME |
| C-11 | queue_sync existe mais jamais appele au demarrage | CONFIRME |
| C-12 | Requeue sans compteur, retry_count jamais incremente | CONFIRME |
| C-13 | run_ssh_command timeout sans proc.kill() → process SSH orphelin | CONFIRME |
| C-14 | Watchdog parse "N/A" → ValueError avalee, watchdog desactive | CONFIRME |
| C-15 | 13 bare except: attrapent CancelledError/SystemExit | CONFIRME |
| C-16 | Upload file.read() sans limite de taille | CONFIRME |
| C-17 | Aucune authentification sur aucun endpoint | CONFIRME |
| C-18 | costs_summary year=2026 month=2 hardcodes en default | CONFIRME |
| C-19 | tools_state en memoire sans resynchronisation periodique | CONFIRME |
| C-20 | Path traversal via startswith("/") dans 5 fonctions | CONFIRME |
| C-21 | SSH injection via face_swapper_model non sanitise | CONFIRME |
| C-22 | conf.prod sans private:true mais nginx a IP restriction | FAUX POSITIF |
| U-01 | WIN11_HOST defini 1 fois hardcode, env var ignoree | IMPRECIS |
| U-02 | Race condition pop Redis → crash → job perdu | CONFIRME |
| U-03 | VRAM estimation max au lieu de sum multi-modeles | CONFIRME |
| U-04 | Upload ecrase silencieusement fichiers existants | CONFIRME |
| U-05 | Pas de init.py dans app/ | CONFIRME |
| U-06 | StrictHostKeyChecking=no sur 2 commandes (pas partout) | IMPRECIS |
| U-07 | 13 imports locaux repetes (aiohttp + httpx) | CONFIRME |
| U-08 | Fooocus seed 2^63 vs ComfyUI 2^32 | CONFIRME |
| U-09 | SadTalker job_id interpole sans validation (UUID interne = safe) | CONFIRME |
| U-10 | Applio 60 parametres positionnels fragiles | CONFIRME |
| U-11 | Pas de schema.sql ni migrations | CONFIRME |
| U-12 | /health crash si Redis down → boucle restart | CONFIRME |
| U-13 | stop_tool("anthropic") SSH inutile, active_tools[-1] jamais cree | IMPRECIS |
| U-14 | Batch JSONL result.type pas verifie | CONFIRME |
| ID | Description | Verdict |
|---|---|---|
| C-01 | verifyJWT() ne verifie PAS la signature HMAC | CONFIRME |
| C-02 | Fallback Supabase URL hardcode http://192.168.1.12:8200 | CONFIRME |
| C-03 | getUserFromRequest() sync ne gere pas API keys | CONFIRME |
| C-04 | onRequest hook bypass routes hors /api/ | CONFIRME |
| C-05 | Pas de rate limiting sur login/register | CONFIRME |
| C-06 | Mot de passe Supabase fallback hardcode | CONFIRME |
| C-07 | Error handler 404 catch les erreurs applicatives | CONFIRME |
| C-08 | Pas de validation body.email/body.password sur register | CONFIRME |
| C-09 | getUserFromRequest retourne null au lieu de throw | CONFIRME |
| C-10 | NODE_TLS_REJECT_UNAUTHORIZED=0 en production | CONFIRME |
| C-11 | OAuth state non verifie apres callback | CONFIRME |
| C-12 | Deletion complete au lieu de soft-delete pour instances | CONFIRME |
| C-13 | Pas de validation schema sur conf.prod.gouroubleu.yml | CONFIRME |
| C-14 | Logging insuffisant sur les erreurs d'auth | CONFIRME |
| C-15 | Session cleanup inexistant pour sessions expirees | CONFIRME |
| C-16 | API keys stockees en clair dans Supabase | CONFIRME |
| C-17 | SSH connector password en clair dans instance config | CONFIRME |
| C-18 | Timeout SSH fixe 30s sans configuration | CONFIRME |
| C-19 | Pas de pagination sur GET /api/user/instances | CONFIRME |
| C-20 | CORS allow_origin=* en production | CONFIRME |
| C-21 | Pas de Content-Security-Policy header | CONFIRME |
| C-22 | Health endpoint sans check de dependances | CONFIRME |
| ID | Description | Verdict |
|---|---|---|
| C-01 | Briefing processAnswer : logique de skip inversee | CONFIRME |
| C-02 | WS deconnexion : session.ws jamais nettoye, ws.send sur socket ferme | CONFIRME |
| C-03 | Pipeline runner ne passe pas l'AbortSignal | CONFIRME |
| C-04 | onDecision callback jamais branche → agents requiresApproval casses | CONFIRME |
| C-05 | CALLBACK_BASE_URL hardcode sans env var (fonctionne par coincidence) | CONFIRME |
| C-06 | CONNECTORS_API_URL fallback port 5400 au lieu de 5403 | CONFIRME |
| C-07 | Cache hash trop faible : troncature 200 chars + DJB2 32-bit | CONFIRME |
| C-08 | Circuit breaker et response cache globaux partages entre sessions | CONFIRME |
| C-09 | Prompt overrides globaux, pas par session | CONFIRME |
| C-10 | Pas de validation d'ownership sur endpoints REST (IDOR) | CONFIRME |
| C-11 | Injection commande SSH via agents LLM (heredoc ULIAS_EOF) | CONFIRME |
| C-12 | Traduction automatique systematique gaspille latence et tokens | CONFIRME |
| C-13 | API key stockee en clair dans Supabase | CONFIRME |
| C-14 | editFile ne remplace que la premiere occurrence | CONFIRME |
| C-15 | message_count increment non-atomique | CONFIRME |
| C-16 | GITLAB_TOKEN en clair dans conf.prod.gouroubleu.yml | CONFIRME |
| C-17 | /api/agents et /internal/* sans auth (code=VRAI, nginx public=FAUX) | IMPRECIS |
| U-01 | CLI default server URL pointe vers port 5510 au lieu de 5515 | CONFIRME |
| U-02 | NotificationService definie mais jamais importee (code mort) | CONFIRME |
| U-03 | git-workflow.ts : status '??' teste 2 fois, 'untracked' jamais assigne (code mort) | CONFIRME |
| U-04 | Upload base64 .toString('utf-8') corrompt les binaires | CONFIRME |
| U-05 | storageGetPublicUrl avec IP hardcodee en fallback | CONFIRME |
| U-06 | num_ctx passe dans options mais ecrase par hardcode 16384 | CONFIRME |
| U-07 | consecutiveErrors semantique incorrecte en parallele | CONFIRME |
| U-08 | userId fallback apiKey[:8] fragile | CONFIRME |
| U-09 | forkConversation charge 10000 messages + inserts sequentiels | CONFIRME |
| U-10 | Incoherence instance parameter (id vs name) dans connectorFetch | CONFIRME |
| U-11 | auth.ts hardcode 'Supabase' vs client.ts utilise .id dynamique | CONFIRME |
| U-12 | dbInsert/dbUpdate retour undefined non gere | CONFIRME |
| U-13 | Nudge agent injecte message 'user' qui fausse l'historique | CONFIRME |
| ID | Description | Verdict |
|---|---|---|
| C-01 | setInterval archive polling : origShowArchived capture une fois → boucle infinie | CONFIRME |
| C-02 | XSS via javascript: URI dans liens Markdown (dangerouslySetInnerHTML) | CONFIRME |
| C-03 | retryObjective : window.location.href detruit WS avant envoi | CONFIRME |
| C-04 | Race condition setTimeout(500ms) pour loadLastConversation | CONFIRME |
| C-05 | /api/teams fetch sans header X-API-Key | CONFIRME |
| C-06 | Erreurs reseau silencieuses (catch vides partout) | CONFIRME |
| C-07 | Etat local desynchronise apres delete/archive echoue (pas de check res.ok) | CONFIRME |
| C-08 | Suppression sans confirmation (conversations et objectifs) | CONFIRME |
| C-09 | Reconnexion WS limitee a 5 tentatives sans recovery | CONFIRME |
| C-10 | API key envoyee dans chaque message WS (pas seulement auth) | CONFIRME |
| C-11 | Types TypeScript incomplets pour events serveur | CONFIRME |
| C-12 | useStore mute dans handler vanilla JS (risque theorique Qwik) | CONFIRME |
| U-01 | searchTimerRef jamais nettoye au cleanup | CONFIRME |
| U-02 | Modal prompts sans role/aria/trap de focus | CONFIRME |
| U-03 | Boutons SVG sans aria-label | CONFIRME |
| U-04 | div onClick$ sans role/tabIndex (navigation clavier) | CONFIRME |
| U-05 | Pas de live region pour le streaming | CONFIRME |
| U-06 | 14 types events custom sans typage TypeScript | CONFIRME |
| U-07 | event.data?.title sur types sans champ data (code mort) | CONFIRME |
| U-08 | originalMessage absent → boutons retry/edit jamais affiches | CONFIRME (sous reserve backend) |
| U-09 | WS connecte sur /ws/cli au lieu de /ws/webui | CONFIRME (partiellement) |
| U-10 | /api/status ne verifie pas l'API key → validation login inefficace | CONFIRME (sous reserve backend) |
| U-11 | revokeObjectURL trop tot apres click() | CONFIRME (risque theorique) |
| U-12 | setTimeout(500ms) pour template message | CONFIRME |
| U-13 | 9 signaux Qwik par EventCard | CONFIRME (risque theorique) |
| ID | Description | Verdict |
|---|---|---|
| C-01 | Credentials en clair dans HTML deploye O2switch (IP-protege) | CONFIRME (severite HAUTE, pas CRITIQUE P0) |
| C-02 | 7+ systemes navigation desynchronises | CONFIRME |
| C-03 | Variables CSS non definies (14+ variables) | CONFIRME |
| C-04 | IPs hardcodees dans scripts | CONFIRME |
| C-05 | StrictHostKeyChecking=no dans toutes les connexions SSH | CONFIRME |
| C-06 | Pas de set -e, gestion erreurs silencieuse | CONFIRME |
| C-07 | Echappement HTML incomplet (< et > seulement) | CONFIRME |
| C-08 | Deux fichiers CSS (dashboard.css copie de style.css) | CONFIRME |
| C-09 | 25-services.sh design systeme autonome | CONFIRME |
| C-10 | nav.js quasi-mort (2 pages statiques) | CONFIRME |
| C-11 | data-loader.js utilise par 2-3 pages statiques (pas par generate.d) | IMPRECIS |
| C-12 | gen_footer_full/gen_html_head inutilisees (gen_header EST utilisee) | IMPRECIS |
| C-13 | Polling 15s sans visibilitychange | CONFIRME |
| C-14 | Variables non quotees dans heredocs non-quotes | CONFIRME |
| C-15 | Redis passwords hardcodes dans collect.sh | CONFIRME |
| C-16 | GitLab token hardcode dans collect-gitlab.sh | CONFIRME |
| C-17 | git add -A pousse tout sans filtrage vers O2switch | CONFIRME |
| C-18 | services-registry.json permissions root:600 | INDETERMINE |
| U-01 | GitLab token dans git origin URL (.git/config) | CONFIRME |
| U-02 | JWT Supabase anon keys hardcodes dans collect.sh | CONFIRME |
| U-03 | Injection jq dans get_config (risque theorique) | CONFIRME |
| U-04 | sed -i avec regex sur contenu genere | CONFIRME |
| U-05 | inject_json() sans echappement </script> | CONFIRME |
| U-06 | SSH sans timeout uniforme dans 08-crons.sh | CONFIRME |
| U-07 | Arithmetic comparison sans validation numerique | CONFIRME |
| U-08 | Variable non quotee dans echo/tr | CONFIRME |
| U-09 | XSS dans JS client (innerHTML sans echappement) | CONFIRME |
| U-10 | Pas de nettoyage /tmp/dashboard-33800 | CONFIRME |
| U-11 | IP PVE inconsistante config.json (.10 vs .4) | CONFIRME |
| U-12 | Port browser-connector faux (5401 au lieu de 5404) | CONFIRME |
| U-13 | Port connectors-api faux (5400 au lieu de 5403) | CONFIRME |
| U-14 | Race condition git push en background | CONFIRME |
| U-15 | Pas de nettoyage /tmp/monitoring-buffer | CONFIRME |
| U-16 | Notification JSON newline (probablement OK car bash \n = litteral) | IMPRECIS |
| U-17 | Lockfile PID vulnerable au PID reuse | CONFIRME |
| U-18 | Globbing non protege dans boucles for | CONFIRME |
| # | Action | Findings | Projet | Priorite |
|---|---|---|---|---|
| 1 | Verifier signature HMAC dans verifyJWT() | C-01 | connectors-api | CRITIQUE |
| 2 | Brancher onDecision callback pour les 6 agents requiresApproval | C-04 | ulias-org | CRITIQUE |
| 3 | Externaliser credentials des scripts dashboard + enrichir .gitignore | C-01,C-15,C-16,C-17 | dashboard | CRITIQUE |
| 4 | Ajouter tracking + limite concurrence cloud tasks Anthropic | C-01,C-02 | ai-orchestrator | CRITIQUE |
| 5 | Corriger briefing skip logic (condition inversee) | C-01 | ulias-org | HAUTE |
| 6 | Filtrer javascript: dans renderMarkdown() | C-02 | ulias-org-web | HAUTE |
| 7 | Ajouter proc.kill() dans run_ssh_command timeout | C-13 | ai-orchestrator | HAUTE |
| 8 | Sanitiser face_swapper_model/face_enhancer_model avant SSH | C-21 | ai-orchestrator | HAUTE |
| 9 | Corriger upload base64 : supprimer .toString('utf-8') | U-04 | ulias-org | HAUTE |
| 10 | Retirer NODE_TLS_REJECT_UNAUTHORIZED=0 de la conf prod | C-10 | connectors-api | HAUTE |
Rapport genere par Claude Opus 4.6 — 15/02/2026 Methode : 3 passes independantes + confrontation + verification integrale code source 146 findings / 137 confirmes / 1 faux positif / 7 imprecis / 1 indetermine