33800 Docs

← Retour

Audit Pass 3 - Dashboard 33800

Status : IMPLEMENTEE

Angle : INTEGRATION & CONTRATS INTER-SERVICES

Date : 15-02-2026 04:00

Auditeur : Claude Opus 4.6 (pass independante)


Resume executif

Severite Nombre
BUG CERTAIN 7
BUG PROBABLE 8
RISQUE THEORIQUE 9
Total findings 24

Les problemes les plus graves concernent l'exposition massive de credentials en clair dans le HTML genere (secrets.html, endpoints.html) qui est pousse vers O2switch (serveur public), des mots de passe Redis et des JWT Supabase hardcodes dans collect.sh, et l'absence d'echappement des donnees SSH avant injection dans le JSON et le HTML.


Findings

F-01 : Credentials en clair dans HTML pousse vers O2switch (public)


F-02 : Token GitLab dans l'URL du remote git origin


F-03 : Mots de passe Redis hardcodes dans collect.sh


F-04 : JWT Supabase (anon keys) hardcodes dans collect.sh


F-05 : Token GitLab hardcode dans collect-gitlab.sh


F-06 : StrictHostKeyChecking=no dans toutes les connexions SSH


F-07 : Absence d'echappement des donnees SSH dans la generation JSON

sites_to_json() {

name, target, restrict, auth ne sont PAS echappes

result+="{\"name\":\"$name\",\"target\":\"$target\",\"access\":\"$restrict\",\"auth\":\"$auth\"}"

}

- **Impact** : Si un nom de container Docker ou un nom de site nginx contient un guillemet ou un backslash, le fichier current.json devient du JSON invalide, ce qui casse tout le dashboard. Ce cas peut se produire si un container est deploye avec un nom atypique.
- **Fix suggere** : Utiliser `jq` pour construire le JSON au lieu de la concatenation manuelle, ou echapper tous les champs avec une fonction dediee.

---

### F-08 : IP PVE inconsistante dans config.json vs code reel
- **Severite** : BUG PROBABLE
- **Fichier** : `/stock_8to/33800-stack/monitoring/config.json:4-5`
- **Description** : config.json declare `"ip": "192.168.1.10"` pour PVE, avec un champ additionnel `"ip_main": "192.168.1.4"`. Or, dans CLAUDE.md la machine PVE est referencee a `192.168.1.4`. Tous les scripts de collecte (collect.sh, collect.d/01-pve.sh) utilisent `192.168.1.10` en dur. Si PVE a deux IPs (une principale 192.168.1.4 et une autre 192.168.1.10), la distinction `ip` vs `ip_main` dans config.json pretent a confusion. De plus, `get_host_ip("pve")` retournerait `192.168.1.10` alors que la "vraie" IP principale est .4.
- **Code concerne** :
```json
"pve": {
    "ip": "192.168.1.10",
    "ip_main": "192.168.1.4",

F-09 : Port browser-connector incorrect dans config.json


F-10 : Port connectors-api potentiellement incorrect dans config.json


F-11 : collect.sh n'a pas de set -e et masque les erreurs avec 2>/dev/null


F-12 : Variables non quotees dans ssh_cmd et check_ping


F-13 : git add -A dans generate.sh pousse tout vers O2switch


F-14 : services-registry.json est owned par root avec permissions 600


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


F-16 : SSH PROD Redis utilise ssh directe au lieu de ssh_cmd


F-17 : data-loader.js - innerHTML avec donnees non echappees


F-18 : Duplication massive de code entre generate.sh et generate.d/


F-19 : Race condition lors du push O2switch en background


F-20 : collect.sh - Injection de commandes via noms de containers


F-21 : Notification JSON non echappee dans generate.sh

curl -s -X POST "http://192.168.1.12:5300/api/notify/push" \ -H "Content-Type: application/json" \ -d "{\"title\": \"${NOTIF_TITLE}\", \"body\": \"${NOTIF_BODY}\", \"level\": \"info\"}"

- **Impact** : Le newline dans NOTIF_BODY casse le JSON. La notification echoue probablement a chaque execution. Le `|| echo` masque l'erreur.
- **Fix suggere** : Utiliser `jq` pour construire le JSON, ou echapper les newlines.

---

### F-22 : audit-notify.sh - Injection JSON dans le body de notification
- **Severite** : RISQUE THEORIQUE
- **Fichier** : `/stock_8to/33800-stack/monitoring/audit-notify.sh:59-62`
- **Description** : Le body de notification inclut la variable `$BODY` qui contient des backslash-n et des details extraits de la sortie de l'audit. Ces details ne sont pas echappes pour JSON, ce qui peut casser le JSON si les messages d'audit contiennent des guillemets.
- **Code concerne** :
```bash
BODY="Score: $PASSED/$TOTAL checks OK\nCritical: $CRITICAL\nWarning: $WARNING\n\nDetails:\n$DETAILS"

curl -s -X POST "$NOTIF_URL" \
    -H "Content-Type: application/json" \
    -d "{\"title\": \"$TITLE\", \"body\": \"$BODY\", \"level\": \"$LEVEL\"}"

F-23 : config.json - vscode IP potentiellement obsolete


F-24 : Lockfile de collect.sh vulnerables au PID reuse


Synthese par theme

Securite des credentials (CRITIQUE)

Integration SSH

Coherence config.json

Generation HTML / Echappement

Scripts bash

Deploiement O2switch