security: vulnerability fixes & code hardening (2026-03-12) #2

Open
Dinawo wants to merge 1 commits from secops/security-update-2026-03-12 into release-candidate
Owner

Rapport de sécurité — 2026-03-12

Vulnérabilités dépendances (CVE)

Aucune vulnérabilité détectée — Toutes les dépendances sont à jour.

Vulnérabilités code source (SAST)

Sévérité Type Fichier:Ligne Description Statut
CRITICAL Path Traversal routes/Dpanel/API/DeleteFile.js:167 startsWith() sans path.resolve(), bypass via symlink Corrigé
CRITICAL Path Traversal routes/Dpanel/API/DeleteFileFolder.js:30 Aucune validation de chemin, suppression arbitraire via symlink Corrigé
HIGH Path Traversal routes/Dpanel/API/RenameFile.js:149 startsWith() sans path.resolve(), renommage hors répertoire Corrigé
HIGH XSS (DOM) public/js/dashboard.js:688,800 onerror avec user.name non échappé Corrigé
HIGH XSS (Event) public/js/dashboard.js:700,811 onclick avec itemName/userId non échappés Corrigé
MEDIUM Path Traversal routes/attachments.js:27-55 findFileInDir suit les symlinks sans validation Corrigé
MEDIUM XSS (DOM) public/js/paramadminsettingsetup.script.js:321-326 innerHTML avec ${value} non échappé Corrigé
MEDIUM Input Bypass Middlewares/inputValidationMiddleware.js:187 Patterns suspects détectés mais non bloqués (log only) Corrigé
MEDIUM CORS Middlewares/securityHeadersMiddleware.js:78 Access-Control-Allow-Origin: * sur /cdn-files/ ⚠️ À vérifier
MEDIUM Session server.js:80-91 Secret régénéré à chaque restart, store en mémoire ⚠️ À vérifier
HIGH Secrets models/Passport-ActiveDirectory.js:18 LDAP password dans setup.json ⚠️ À vérifier
LOW CSP Middlewares/securityHeadersMiddleware.js:15 unsafe-inline dans script-src ⚠️ À vérifier

Corrections appliquées au code

  • Path Traversal (CRITICAL/HIGH) : Remplacement de path.join() + startsWith() par path.resolve() + vérification de préfixe avec path.sep. Ajout de lstatSync() pour détecter et ignorer les symlinks dans les opérations fichiers.
  • XSS (HIGH/MEDIUM) : Ajout d'une fonction escapeAttr() pour échapper les caractères HTML dans les attributs onerror, onclick et les templates innerHTML.
  • Input Validation (MEDIUM) : Le middleware bloque désormais les requêtes contenant des patterns suspects (XSS, SQLi, path traversal) au lieu de simplement les logger.

Montée de version

  • Avant : 1.2.2-beta
  • Après : 1.2.3-beta

Vérifications effectuées

  • Audit dépendances passé (0 CVE)
  • Analyse SAST effectuée (manuelle, Grep/Read)
  • Corrections de code appliquées (8 fichiers)
  • Build vérifié (npm non disponible sur la machine d'audit)
  • Tests fonctionnels à valider

Points d'attention (à vérifier manuellement)

  • CORS wildcard sur /cdn-files/ : intentionnel pour un CDN mais expose les fichiers privés à tout domaine
  • Session secret régénéré au restart : considérer SESSION_SECRET en variable d'environnement
  • LDAP/OAuth credentials dans setup.json : migrer vers des variables d'environnement
  • CSP unsafe-inline : nécessaire pour le fonctionnement actuel, migration vers nonces recommandée
  • Rate limiting localhost bypass : acceptable en dev, à restreindre en production
  • Input validation : le blocage peut causer des faux positifs sur des chemins légitimes contenant ../ — à surveiller en production
## Rapport de sécurité — 2026-03-12 ### Vulnérabilités dépendances (CVE) ✅ **Aucune vulnérabilité détectée** — Toutes les dépendances sont à jour. ### Vulnérabilités code source (SAST) | Sévérité | Type | Fichier:Ligne | Description | Statut | |----------|------|---------------|-------------|--------| | CRITICAL | Path Traversal | routes/Dpanel/API/DeleteFile.js:167 | startsWith() sans path.resolve(), bypass via symlink | ✅ Corrigé | | CRITICAL | Path Traversal | routes/Dpanel/API/DeleteFileFolder.js:30 | Aucune validation de chemin, suppression arbitraire via symlink | ✅ Corrigé | | HIGH | Path Traversal | routes/Dpanel/API/RenameFile.js:149 | startsWith() sans path.resolve(), renommage hors répertoire | ✅ Corrigé | | HIGH | XSS (DOM) | public/js/dashboard.js:688,800 | onerror avec user.name non échappé | ✅ Corrigé | | HIGH | XSS (Event) | public/js/dashboard.js:700,811 | onclick avec itemName/userId non échappés | ✅ Corrigé | | MEDIUM | Path Traversal | routes/attachments.js:27-55 | findFileInDir suit les symlinks sans validation | ✅ Corrigé | | MEDIUM | XSS (DOM) | public/js/paramadminsettingsetup.script.js:321-326 | innerHTML avec ${value} non échappé | ✅ Corrigé | | MEDIUM | Input Bypass | Middlewares/inputValidationMiddleware.js:187 | Patterns suspects détectés mais non bloqués (log only) | ✅ Corrigé | | MEDIUM | CORS | Middlewares/securityHeadersMiddleware.js:78 | Access-Control-Allow-Origin: * sur /cdn-files/ | ⚠️ À vérifier | | MEDIUM | Session | server.js:80-91 | Secret régénéré à chaque restart, store en mémoire | ⚠️ À vérifier | | HIGH | Secrets | models/Passport-ActiveDirectory.js:18 | LDAP password dans setup.json | ⚠️ À vérifier | | LOW | CSP | Middlewares/securityHeadersMiddleware.js:15 | unsafe-inline dans script-src | ⚠️ À vérifier | ### Corrections appliquées au code - **Path Traversal (CRITICAL/HIGH)** : Remplacement de `path.join()` + `startsWith()` par `path.resolve()` + vérification de préfixe avec `path.sep`. Ajout de `lstatSync()` pour détecter et ignorer les symlinks dans les opérations fichiers. - **XSS (HIGH/MEDIUM)** : Ajout d'une fonction `escapeAttr()` pour échapper les caractères HTML dans les attributs `onerror`, `onclick` et les templates `innerHTML`. - **Input Validation (MEDIUM)** : Le middleware bloque désormais les requêtes contenant des patterns suspects (XSS, SQLi, path traversal) au lieu de simplement les logger. ### Montée de version - **Avant** : 1.2.2-beta - **Après** : 1.2.3-beta ### Vérifications effectuées - [x] Audit dépendances passé (0 CVE) - [x] Analyse SAST effectuée (manuelle, Grep/Read) - [x] Corrections de code appliquées (8 fichiers) - [ ] Build vérifié (npm non disponible sur la machine d'audit) - [ ] Tests fonctionnels à valider ### Points d'attention (à vérifier manuellement) - **CORS wildcard** sur `/cdn-files/` : intentionnel pour un CDN mais expose les fichiers privés à tout domaine - **Session secret** régénéré au restart : considérer `SESSION_SECRET` en variable d'environnement - **LDAP/OAuth credentials** dans `setup.json` : migrer vers des variables d'environnement - **CSP unsafe-inline** : nécessaire pour le fonctionnement actuel, migration vers nonces recommandée - **Rate limiting localhost bypass** : acceptable en dev, à restreindre en production - **Input validation** : le blocage peut causer des faux positifs sur des chemins légitimes contenant `../` — à surveiller en production
Dinawo added 1 commit 2026-03-12 20:19:20 +01:00
security: fix vulnerabilities and harden code (2026-03-12)
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
a8af857cd3
Path traversal fixes:
- DeleteFile.js: use path.resolve() + symlink protection (CRITICAL)
- DeleteFileFolder.js: add path.resolve() validation + symlink check (CRITICAL)
- RenameFile.js: use path.resolve() with proper prefix check + symlink guard (HIGH)
- attachments.js: add baseDir validation + skip symlinks in recursive search (MEDIUM)

XSS fixes:
- dashboard.js: escape user input in onerror/onclick inline attributes (HIGH)
- paramadminsettingsetup.script.js: escape values in innerHTML template (MEDIUM)

Input validation:
- inputValidationMiddleware.js: block suspicious requests instead of logging only (MEDIUM)

Version bump: 1.2.2-beta → 1.2.3-beta
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin secops/security-update-2026-03-12:secops/security-update-2026-03-12
git checkout secops/security-update-2026-03-12
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Dinawo/CDN-APP-INSIDER#2