33800 Docs

← Retour

Verification des 36 Findings du Rapport d'Audit Dashboard-33800

Date : 15/02/2026 Status : IMPLEMENTEE Verificateur : Claude Opus 4.6 Methode : Lecture du code source reel pour chaque finding, confrontation avec la description du rapport

Contexte important : Le dashboard O2switch (https://dashboard.nowhere84.com) est protege par restriction IP via .htaccess (82.65.119.221 et 82.67.42.47 uniquement). Il n'est donc PAS public. Cela reduit la severite des findings lies a l'exposition de credentials sur le "site public".


FINDINGS CONFIRMES (C-01 a C-18)

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

Verdict : CONFIRME, severite REDUITE (P1, pas P0)

Verification dans le code source :

Le bug est REEL : credentials en clair dans du code versionne et pousse vers O2switch. MAIS la severite CRITIQUE (P0) est FAUSSE car le dashboard est protege par restriction IP, donc PAS public. Severite reelle : HAUTE (P1) - mauvaise pratique (credentials dans git history) mais pas d'exposition publique.


C-02 : 4+ systemes de navigation desynchronises

Verdict : CONFIRME

Verification dans le code source - J'ai identifie ces systemes de navigation distincts :

  1. generate.d/_common.sh gen_header() (ligne 88-113) : 15 liens (Dashboard, Alertes, Liens, Montages, Nginx, API, Archi, Doc, Modeles, Secrets, Crons, RAIDZ, Services, AI Jobs, Claude)
  2. generate.d/01-index.sh _gen_header() (ligne 17-57) : 17 liens (Dashboard, Alertes, Liens, Montages, Nginx, API, Doc, Modeles, IA Tools, Orchestrator, Secrets, Crons, RAIDZ, Services, Syncthing, LinkedIn, Schema, O2switch)
  3. assets/nav.js (ligne 3-23) : 19 liens (Dashboard, Alertes, Liens, Montages, Nginx, API, Doc, Modeles, IA Tools, Orchestrator, AI Jobs, Secrets, Crons, RAIDZ, Services, Syncthing, LinkedIn, Schema, O2switch)
  4. templates.sh html_header() (ligne 35-79) : 12 liens (Dashboard, Alertes, Liens, Montages, Nginx, API, Doc, Modeles, Secrets, Crons, RAIDZ, Services) - PAS de IA Tools, Orchestrator, AI Jobs, Claude, Schema, O2switch
  5. generate.sh generate_header() (ligne 72-116) : 14 liens (Dashboard, Alertes, Liens, Montages, Nginx, API, Doc, Modeles, Secrets, Crons, RAIDZ, Services, Schema, O2switch, Claude)
  6. Navigations inline dans 04-secrets.sh, 05-endpoints.sh, etc. : Listes differentes encore

Les listes DIVERGENT clairement. Pages absentes selon la source : claude.html n'est pas dans templates.sh ; architecture.html est dans _common.sh mais nulle part ailleurs ; ai-tools.html, ai-orchestrator.html, ai-jobs.html sont dans nav.js et 01-index.sh mais pas dans _common.sh ni templates.sh.


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

Verdict : CONFIRME

Verification :

Le navigateur ignore les proprietes CSS avec des variables non definies. Le rendu est effectivement degrade.


C-04 : IPs hardcodees dans le code des scripts

Verdict : CONFIRME

Verification :

Cependant : collect.sh tourne localement, les IPs dans les footers HTML sont des liens d'acces local. La regle CLAUDE.md "JAMAIS d'IP:port dans le code" concerne le code applicatif, pas forcement les scripts de monitoring internes. Neanmoins, l'inconsistance (certains modules utilisent get_host_ip, d'autres pas) est reelle.


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

Verdict : CONFIRME

Verification :

Toutes les connexions SSH utilisent StrictHostKeyChecking=no. C'est une mauvaise pratique meme en reseau local controle. StrictHostKeyChecking=accept-new serait preferable.


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

Verdict : CONFIRME

Verification :


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

Verdict : CONFIRME

Verification :


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

Verdict : CONFIRME

Verification :


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

Verdict : CONFIRME

Verification :

12-raidz.sh a le meme probleme (lignes 49-80 : son propre CSS complet, fond linear-gradient, pas de style.css).


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

Verdict : CONFIRME

Verification :

Le rapport est correct : nav.js est quasi-orphelin, pas totalement mort.


C-11 : data-loader.js jamais utilise

Verdict : CONFIRME

Verification :


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

Verdict : CONFIRME

Verification :


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

Verdict : CONFIRME

Verification :

Note : 20-ai-jobs.sh a le meme probleme avec setInterval a 5000ms (ligne 2153) et 10000ms (ligne 2235), sans visibilitychange.


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

Verdict : CONFIRME

Verification :

Finding reel mais risque essentiellement theorique car les sources sont des APIs internes.


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

Verdict : CONFIRME, severite REDUITE

Verification :

Bug REEL. Meme logique que C-01 : les credentials sont dans le git history pousse vers O2switch, mais le repo O2switch est aussi protege par IP. La severite CRITIQUE (meme niveau que C-01) est disproportionnee si le site n'est pas public. Severite reelle : HAUTE (P1).


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

Verdict : CONFIRME, severite REDUITE

Verification :

Bug REEL. Meme logique : severite reelle HAUTE (P1), pas CRITIQUE.


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

Verdict : CONFIRME

Verification :

Tout fichier non dans .gitignore est pousse vers O2switch, y compris les fichiers sensibles.


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

Verdict : IMPOSSIBLE A VERIFIER EN LECTURE SEULE

Le rapport dit que services-registry.json est owned par root avec permissions 600. Je n'ai pas acces a ls -la pour verifier (bash non disponible). Cependant :

Le finding est PLAUSIBLE base sur le code, mais je ne peux pas confirmer les permissions exactes sans acces systeme.


FINDINGS UNIQUES (U-01 a U-18)

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

Verdict : CONFIRME

Verification :


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

Verdict : CONFIRME, severite correctement reduite

Verification :


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Risque purement theorique.


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Risque purement theorique.


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

C'est du code mort donc le risque est nul en pratique. Doublement theorique.


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

Verdict : CONFIRME

Verification :

Les appels SSH dans 08-crons.sh utilisent ConnectTimeout=5 mais PAS timeout (pas de timeout global sur la commande). Les appels dans collect.sh utilisent timeout 10. L'inconsistance est reelle mais mineure.

Note : l'absence de StrictHostKeyChecking=no dans 08-crons.sh (vs les autres scripts qui l'ont) est aussi une inconsistance - les connexions SSH de 08-crons.sh peuvent echouer si les host keys ne sont pas en known_hosts.


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Risque theorique tres faible grace au default jq.


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Risque nul en pratique.


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Risque theorique. Non exploitable en pratique sauf compromission de l'API interne.


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

Verdict : CONFIRME

Verification :

Impact mineur : /tmp est nettoye au reboot, et le serveur a un seul utilisateur.


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

Verdict : CONFIRME

Verification :

L'ambiguite est reelle : 192.168.1.4 est l'IP de l'hote physique Proxmox, 192.168.1.10 est probablement une autre interface. Les scripts utilisent .10 pour SSH vers PVE, ce qui peut etre correct ou pas selon le contexte.


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

Verdict : CONFIRME

Verification :

La contradiction est reelle entre config.json et la documentation. CLAUDE.md est la source de verite basee sur l'experience reelle. config.json est probablement faux.


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

Verdict : CONFIRME

Verification :

Meme pattern que U-12. Le port dans config.json (5400) est probablement le port interne du container, tandis que 5403 est le port expose derriere le sidecar WireGuard. Les deux sont "corrects" dans des contextes differents, mais la confusion est reelle.


U-14 : Race condition git push en background

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Le push est lance en & (background). Si une autre execution de generate.sh demarre avant que le push ne finisse, le prochain git add -A et git commit pourraient entrer en conflit avec le push en cours.

En pratique, generate.sh est lance par cron (1x/heure) et le push est rapide, donc le risque est tres faible.


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

Verdict : CONFIRME

Verification :

Les fichiers .json et .log s'accumulent dans /tmp/monitoring-buffer/. Impact mineur.


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

Verdict : CONFIRME

Verification :

Bug REEL et affecte chaque execution de generate.sh.


U-17 : Lockfile PID vulnerable au PID reuse

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :


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

Verdict : CONFIRME - RISQUE THEORIQUE

Verification :

Risque theorique protege par la convention de nommage.


RESUME FINAL

ID Finding Verdict Commentaire
C-01 Credentials en clair dans HTML CONFIRME - severite P1 pas P0 Dashboard protege par IP, pas public
C-02 4+ navigations desynchronisees CONFIRME Au moins 6 systemes distincts identifies
C-03 Variables CSS non definies CONFIRME 14+ variables absentes de style.css
C-04 IPs hardcodees CONFIRME Inconsistance get_host_ip vs hardcode
C-05 StrictHostKeyChecking=no CONFIRME Toutes les connexions SSH
C-06 Absence de set -e CONFIRME Aucun module generate.d n'a set -e
C-07 Echappement HTML incomplet CONFIRME & non echappe nulle part
C-08 dashboard.css obsolete CONFIRME Utilise par 2 fichiers seulement
C-09 25-services.sh autonome CONFIRME CSS/nav completement independants
C-10 nav.js quasi-mort CONFIRME 2 pages statiques seulement
C-11 data-loader.js jamais utilise CONFIRME Code mort
C-12 gen_footer_full/gen_html_head inutilisees CONFIRME Jamais appelees
C-13 Polling sans visibilitychange CONFIRME 15s interval sans pause
C-14 Variables non quotees heredocs CONFIRME Risque theorique (valeurs = entiers)
C-15 Redis passwords hardcodes CONFIRME - severite P1 pas P0 Dashboard protege par IP
C-16 Token GitLab hardcode CONFIRME - severite P1 pas P0 Dashboard protege par IP
C-17 git add -A sans filtrage CONFIRME .gitignore incomplet
C-18 services-registry.json root:600 NON VERIFIABLE Plausible base sur le code (chown
U-01 Token dans .git/config URL CONFIRME Token en clair dans remote origin
U-02 JWT Supabase anon keys CONFIRME - severite faible Cles anon = publiques par design
U-03 Injection jq get_config CONFIRME - theorique Appels fixes uniquement
U-04 sed -i regex content CONFIRME - theorique Valeurs = entiers
U-05 inject_json sans escape CONFIRME - theorique Fonction jamais appelee (code mort)
U-06 SSH timeout inconsistant CONFIRME ConnectTimeout sans timeout global
U-07 Arithmetic sans validation CONFIRME - theorique Default jq protege
U-08 Variable non quotee echo/tr CONFIRME - theorique Etats ZFS = mots simples
U-09 XSS innerHTML CONFIRME - theorique APIs internes controlees
U-10 /tmp non nettoye CONFIRME Impact mineur
U-11 IP PVE ip vs ip_main CONFIRME Ambiguite .4 vs .10
U-12 Port browser-connector 5401/5404 CONFIRME config.json probablement faux
U-13 Port connectors-api 5400/5403 CONFIRME Port interne vs expose
U-14 Race condition git push & CONFIRME - theorique Cron 1x/h, push rapide
U-15 /tmp/monitoring-buffer non nettoye CONFIRME Trap ne nettoie que lockfile
U-16 Notification JSON cassee newline CONFIRME Bug reel affectant chaque execution
U-17 Lockfile PID reuse CONFIRME - theorique flock serait mieux
U-18 Globbing non protege for loop CONFIRME - theorique Convention nommage protege

Statistique finale

Corrections prioritaires reelles (non theoriques)

  1. U-16 : Notification JSON cassee - affecte CHAQUE execution - fix trivial
  2. C-01/C-15/C-16/C-17 : Credentials dans git - mauvaise pratique meme si protege par IP - externaliser dans .env
  3. C-02 : Navigation fragmentee - UX cassee reellement
  4. C-03 : Variables CSS manquantes - rendu degrade sur plusieurs pages
  5. C-09 : 25-services.sh et 12-raidz.sh hors design system - rupture visuelle