33800 Docs

← Retour

Confrontation Audit -- dashboard-33800

Date : 15/02/2026 Status : IMPLEMENTEE Auditeur senior : Claude Opus 4.6 Methode : Lecture integrale des 3 rapports d'audit independants, verification croisee sur le code source pour arbitrage des contradictions.


Resume executif

Metrique Valeur
Findings confirmes (2-3 passes concordantes) 18
Findings uniques (1 seule passe) 18
Faux positifs elimines 5
Contradictions resolues 4
Total findings definitifs 36 (sur 90 bruts cumules)

Les 3 passes avaient des angles differents :

La convergence la plus forte concerne l'exposition de credentials en clair (unanime, 3 passes), la fragmentation de la navigation (2 passes), l'absence de set -e / gestion d'erreurs (2 passes), les IPs hardcodees (2 passes), et StrictHostKeyChecking=no (2 passes).


Findings CONFIRMES (2-3 passes concordantes)

C-01 : Credentials en clair dans le HTML deploye sur O2switch (public)


C-02 : 4+ systemes de navigation desynchronises


C-03 : Variables CSS non definies cassent le rendu visuel

Note : Seule la Pass 1 a fait l'inventaire exhaustif des variables manquantes. La Pass 2 et Pass 3 ne les ont pas verifiees (hors scope). Ce finding est neanmoins confirme comme BUG CERTAIN car l'evidence technique est sans ambiguite.


C-04 : IPs hardcodees dans le code des scripts


C-05 : StrictHostKeyChecking=no dans toutes les connexions SSH


C-06 : Absence de set -e / gestion d'erreurs silencieuse


C-07 : Echappement HTML incomplet (< et > seulement)


C-08 : Deux fichiers CSS (dashboard.css = obsolete)


C-09 : 25-services.sh a un design systeme completement autonome


C-10 : nav.js present mais quasi-mort


C-11 : data-loader.js jamais utilise


C-12 : gen_footer_full() et gen_html_head() de _common.sh non utilisees


C-13 : Polling 15s sans visibilitychange dans 19-ai-orchestrator.sh


C-14 : Variables non quotees dans heredocs non-quotes (injection HTML)


C-15 : Mots de passe Redis hardcodes dans collect.sh (versionne)

Note : Seule la Pass 3 a lu collect.sh en profondeur (les passes 1 et 2 se concentraient sur generate.d/). Confirme comme BUG CERTAIN car l'evidence est factuelle (code lu et cite).


C-16 : Token GitLab hardcode dans collect-gitlab.sh


C-17 : git add -A pousse tout sans filtrage vers O2switch


C-18 : services-registry.json owned par root avec permissions 600


Findings UNIQUES (1 seule passe)

U-01 : Token GitLab dans l'URL du remote git origin (.git/config)

U-02 : JWT Supabase anon keys hardcodes dans collect.sh

U-03 : Injection jq dans get_config (parametre query)

U-04 : sed -i avec regex sur contenu genere (25-services.sh)

U-05 : inject_json() sans echappement </script>

U-06 : SSH sans timeout uniforme dans 08-crons.sh

U-07 : Arithmetic comparison sans validation numerique (12-raidz.sh)

U-08 : Variable non quotee dans echo/tr (12-raidz.sh)

U-09 : XSS dans JavaScript client (20-ai-jobs.sh innerHTML)

U-10 : Pas de nettoyage de /tmp/dashboard-33800

U-11 : IP PVE inconsistante dans config.json (ip vs ip_main)

U-12 : Port browser-connector inconsistant (5401 vs 5404)

U-13 : Port connectors-api inconsistant (5400 vs 5403)

U-14 : Race condition git push en background

U-15 : Pas de nettoyage de /tmp/monitoring-buffer

U-16 : Notification JSON cassee par newline dans generate.sh

U-17 : Lockfile PID vulnerable au PID reuse

U-18 : Globbing non protege dans les boucles for (26-claude.sh)


Contradictions resolues

Contradiction 1 : nav.js est-il "mort" ou "utilise" ?

Contradiction 2 : Severite de StrictHostKeyChecking=no

Contradiction 3 : Nombre de systemes de navigation

Contradiction 4 : 20-ai-jobs.sh - polling JS present ou absent ?


Faux positifs elimines

FP-01 : UUOC (Useless Use of Cat) -- Pass 2 (F18)

Justification : Style shell sous-optimal mais zero impact sur la securite ou le fonctionnement. Pas un finding d'audit pertinent.

FP-02 : deploy_page ne verifie pas le resultat du cp -- Pass 2 (F19)

Justification : Pass 2 a elle-meme reclassifie cela comme faux positif apres analyse. Le code de retour de cp est bien propage.

FP-03 : $title non echappe dans generate.sh -- Pass 2 (F20)

Justification : Pass 2 a elle-meme reclassifie cela. Toutes les valeurs sont des chaines fixes codees en dur.

FP-04 : base64 decode dans 25-services.sh -- Pass 2 (F23)

Justification : Pass 2 a elle-meme reclassifie cela. Le pattern @base64 + base64 -d est un idiome robuste pour jq-dans-while.

FP-05 : Execution directe au source dans 09-architecture.sh -- Pass 2 (F21)

Justification : C'est le pattern standard du projet (certains modules appellent la fonction au chargement, d'autres non). Ce n'est pas un bug, c'est une inconsistance de convention qui n'a aucun impact fonctionnel.


Top 10 actions prioritaires

# Action Findings Priorite Effort estime
1 Externaliser TOUS les credentials des scripts et du HTML genere. Charger depuis un fichier .env ou un vault, exclus du git. Enrichir .gitignore pour exclure secrets.html, endpoints.html, collect.sh, collect-gitlab.sh du push O2switch. C-01, C-15, C-16, C-17, U-01, U-02 CRITIQUE 2-3h
2 Unifier la navigation en un seul systeme. Supprimer les 4 systemes redondants. Choisir une seule fonction (ex: gen_header dans _common.sh) et l'appeler depuis tous les modules. Mettre a jour la liste de liens. C-02, C-10, C-12 CRITIQUE 3-4h
3 Definir les variables CSS manquantes dans style.css (ajouter les aliases : --bg-secondary, --text-primary, --accent-blue, etc. mappes vers les variables existantes). C-03 HAUTE 30 min
4 Corriger les permissions de services-registry.json (sudo chown gouroubleu:gouroubleu). Ajouter un check dans generate.sh pour detecter et signaler les fichiers non lisibles. C-18 HAUTE 15 min
5 Aligner 25-services.sh sur le design commun (charger style.css, utiliser les classes standard). C-09 HAUTE 1-2h
6 Remplacer les IPs hardcodees par les fonctions get_host_ip() / get_config() dans 18-ai-tools.sh, 19-ai-orchestrator.sh, 20-ai-jobs.sh, collect.sh. C-04 HAUTE 1h
7 Creer une fonction html_escape() dans _common.sh qui echappe &, <, >, ", '. L'appliquer a toutes les injections de donnees SSH/API dans le HTML. C-07, C-14 MOYENNE 1h
8 Remplacer StrictHostKeyChecking=no par StrictHostKeyChecking=accept-new dans tous les scripts. C-05 MOYENNE 15 min
9 Supprimer le code mort : dashboard.css (apres migration de templates.sh et yolo.html vers style.css), data-loader.js. Evaluer si nav.js est encore necessaire. C-08, C-11, C-10 BASSE 30 min
10 Corriger la notification JSON dans generate.sh : utiliser jq pour construire le JSON au lieu d'interpoler des variables avec newlines. U-16 BASSE 15 min

Annexe : Couverture des passes

Fichier/zone Pass 1 Pass 2 Pass 3
generate.d/*.sh OUI (partiel pour certains) OUI (integrale) NON
generate.sh partiel partiel OUI
collect.sh NON NON OUI
collect.d/*.sh NON NON OUI
collect-gitlab.sh NON NON OUI
templates.sh NON NON OUI
assets/*.css OUI NON NON
assets/*.js OUI NON partiel
config.json OUI OUI OUI
.git/config NON NON OUI
.gitignore NON NON OUI
Permissions fichiers NON NON OUI

Cette matrice montre que les 3 passes etaient complementaires : la Pass 1 couvrait le frontend (CSS/JS/navigation), la Pass 2 la securite bash des scripts de generation, et la Pass 3 la collecte, le deploiement et l'integration. Les findings critiques sur les credentials beneficient de la convergence des 3 angles.


Rapport de confrontation genere par Claude Opus 4.6 -- 15/02/2026