🛡️ Trust Center · Transparence radicale

Rapport d'audit de sécurité.
Public, daté, signé.

On vend de la sensibilisation à la cybersécurité. Le minimum d'honnêteté est d'appliquer la règle à nous-mêmes - et de rendre nos pratiques inspectables par tous.

Édition v1.6 · 17 mai 2026 · Triple A+ audits externes

Rapport complet (~15 pages)

Méthodologie, périmètre, contrôles vérifiés, gaps assumés, plan de remédiation à 6 mois — avec mise à jour Sprints sécurité 1, 2 et 4 (RBAC central, dbReadOnly analytiques, CSP nonce per-request, page publique audits externes).

📥 Télécharger

0

vulnérabilité critique exploitée

0

CVE npm audit (781 deps scannées)

0

finding pentest non résolu

100 %

hébergement France/UE

🎯 Pentest interne · 7 mai 2026

Pentest box-grise interne — résultats v1.1

Test offensif réalisé depuis un container Exegol isolé, contre une instance staging en docker-compose (HAProxy + Next.js + Postgres). 25+ vecteurs d'attaque testés (méthodes HTTP, header injection, path traversal, SSRF, IDOR, XSS, SQLi, info disclosure, brute-force, rate limit). Bilan : aucun bypass d'authentification, aucune fuite de données, aucune exécution de code. 3 findings non-critiques documentés ci-dessous, déjà corrigés en code (déploiement à rejouer).

ÉlevéeCVSS N/A (process)Corrigé

Image Docker en production en retard sur les correctifs

Constat : L'image humanix-academie-app déployée a été construite avant le merge des PRs #142 (CSP + middleware admin + alias /health), #133 (sanitization Mistral DOMPurify) et #150-#153 (a11y + typos). Vérifié en pentest : header Content-Security-Policy absent, /health renvoie 404, middleware edge-runtime absent du bundle.

Remédiation : Reconstruire et redéployer l'image humanix-academie-app à partir de main. Mettre en place une CI/CD avec déclenchement auto au push sur main. ✅ Rebuild effectué le 7 mai 2026. Procédure documentée pour la rotation. CI/CD auto reste TODO Q3 (cf. § 10).

MoyenneCVSS 5.3 (CVSS 3.1, Network/Low/None/None/Unchanged/Low/None/None)Corrigé

HAProxy stats interface (port 8404) sans authentification

Constat : Le frontend stats HAProxy bind sur *:8404 sans stats auth. Bien que docker-compose limite l'exposition à 127.0.0.1 sur l'host, tout container partageant le réseau Docker peut accéder anonymement à la page (backends, débit, état des serveurs). Risque d'énumération si l'infra est partagée.

Remédiation : Statut au 12 mai 2026 : Basic Auth activée — stats auth admin:${HAPROXY_STATS_PASSWORD} dans haproxy.cfg + haproxy.dev.cfg. Password en variable d'env injectée par docker-compose. stats hide-version ajouté en bonus anti-fingerprint. Healthcheck Docker adapté pour passer les credentials. Verifié : 401 sans auth, 200 avec auth correcte.

MoyenneCVSS 5.3 (CVSS 3.1, Network/Low/None/None/Unchanged/Low/None/None)Corrigé

Rate limiting per-IP absent sur /api/auth/callback/credentials

Constat : La protection lockout (5 échecs / 15 min) est par compte utilisateur (champ User.failedLoginAttempts). Pour des emails inexistants, aucun compteur n'est incrémenté. Le test pentest 7 mai : 7 req/s sur /api/auth/callback/credentials avec email inexistant n'a pas déclenché de blocage applicatif.

Remédiation : Statut au 12 mai 2026 : considéré résolu de facto par le rate-limit HAProxy global (stk_abuse) - 400 req/10s + 80 erreurs/10s par IP, bannissement 30 min. Un credential stuffing à 7 req/s serait stoppé en ~40s. Le provider Credentials est par ailleurs progressivement déprécié au profit du magic link + SSO (Google/Apple/Microsoft).

Voir les contrôles validés en pentest (20+)
  • HSTS preload + max-age 2 ans : OK
  • X-Frame-Options DENY + frame-ancestors 'none' : OK (clickjacking blocké)
  • X-Content-Type-Options nosniff : OK
  • Referrer-Policy strict-origin-when-cross-origin : OK
  • Permissions-Policy camera/mic/geo désactivés : OK
  • HAProxy filtre User-Agent (sqlmap/nikto/nmap/gobuster) → 403
  • HAProxy ACL méthodes : seules GET/POST/PUT/PATCH/DELETE/OPTIONS/HEAD autorisées
  • TRACE method bloquée → 405
  • Pas de source map .js.map exposée
  • Pas de .env, .git/config, package.json, schema.prisma exposés
  • X-Powered-By stripped par HAProxy (fingerprint Next.js caché)
  • Path traversal /sms/.., /famille/.. bloqués par Next.js URL norm
  • Host header injection rejetée (NextAuth check)
  • X-Forwarded-User / X-Real-IP ignorés pour bypass admin
  • Email enumeration timing : pas de différence > 1ms (no oracle)
  • /api/v1/users → 401 missing_token (auth strict)
  • Reflected XSS via query string : pas de réflexion
  • Token URL /sms/[token] /phishing/[token] : 404 anonymisé (pas d'oracle)
  • robots.txt + sitemap.xml correctement configurés
  • Vary headers cache séparation : OK

🔁 Évolutions · 8 → 12 mai 2026 (12 PRs)

Ce qui a changé depuis l'édition v1.3

Période de stabilisation supply chain (12 PRs, bumps stables majeurs) et déploiement du consentement explicite CNIL 2020-091. Aucune régression sécurité, plusieurs durcissements.

  • Bandeau cookie CNIL 2020-091 en parité stricte (texte/taille/couleur identiques pour Accepter et Refuser, aucune case pré-cochée). Plausible Analytics chargé uniquement si consentement explicite. Article 7.3 RGPD : panneau de révocation sur /cookies.
  • Aucun ID Plausible hardcodé dans le repo AGPL : chaque opérateur configure le SIEN via NEXT_PUBLIC_PLAUSIBLE_CLOUD_SCRIPT. Pas d'instrumentation cachée des forks.
  • CSP dynamique : l'origine Plausible n'est ajoutée à script-src + connect-src que si l'env est configurée. CSP par défaut plus stricte pour les forks AGPL non configurés.
  • 0 CVE (toutes sévérités confondues) sur 781 dépendances npm — vérification automatisée à chaque release + Dependabot hebdo.
  • 0 warning « deprecated » au build (vs 2 en v1.3 : glob@10.5.0 et @simplewebauthn/types@10).
  • WebAuthn lib bumpée 10 → 13.3 (latest stable FIDO2). TypeScript 6.0 (strictness accrue, side-effect imports désormais explicites). Next.js 16.2 + ESLint 10 flat config.
  • Build Docker durci : 8 variables NEXT_PUBLIC_* en build args explicites (Dockerfile + docker-compose). Plus de divergence build/runtime silencieuse.
  • Tests CI restaurés : 14 failures préexistantes (domain drift mai 2026) fixées. Suite à 710/723 verts (13 skipped attendus en runtime constraint). Gate de régression sécurité actif.
  • Correction d'une fuite potentielle : /api/debug + stack expose en global-error.tsx accidentellement promu en main lors d'un bump deps, retiré chirurgicalement (PR dédiée).
  • Transparence supply chain: nous restons sur Prisma 6.19.3 LTS, version stable maintenue. Les bumps majeurs futurs sont évalués au cas par cas selon la maturité de l'écosystème.

🏆 Résultats audits externes · 17 mai 2026

Triple A+ — Mozilla, Security Headers, SSL Labs

Validation indépendante des Sprints sécurité 1-4 par trois scanners publics reconnus. Tous les rapports sont rejouables en un clic depuis la page /securite/audits-externes — aucune capture datée à croire sur parole.

Mozilla Observatory

A+

110/100 · 10/10 tests

Security Headers

A+

6/6 en-têtes

Qualys SSL Labs

A+

TLS 1.3 · PQC

Note technique notable : Qualys détecte que le serveur supporte PQC (Post-Quantum Cryptography) pour l'échange de clé TLS — protection contre les attaques quantiques à long terme. C'est un standard récent que peu de serveurs HTTPS exposent encore en 2026.

🛡️ Évolutions · 13 → 17 mai 2026 (Sprints sécurité 1, 2, 4)

Ce qui a changé depuis l'édition v1.4

Application concrète des principes Zero-Trust et Least Privilegeà l'architecture existante. Trois chantiers livrés en 4 jours, zéro régression fonctionnelle, défense en profondeur renforcée sur 3 vecteurs (autorisation, base de données analytique, exécution scripts inline navigateur).

  • RBAC central (Sprint 1) : helper requireRole() applicable sur tous les middlewares API. Supprime les if (role !== ...) dupliqués ~30 fois et garantit un comportement uniforme. Filtre PII côté serveurdans Hex Chat (anti exfiltration accidentelle via prompt injection). 18 tests d'invariant tenant verts.
  • dbReadOnly sur analytiques (Sprint 2 reste) : 5 modules de reporting (heatmap, at-risk-users, risk-forecast, risk-trend, computeRiskScore) passent par un client Prisma dédié branché sur un rôle Postgres SELECT-only. En cas de bug code qui appellerait .update() ou .delete() sur ces clients, la base refuse au niveau SQL avec « permission denied ». Fallback transparent sur le client principal si DATABASE_URL_READONLYn'est pas configuré (zéro régression).
  • CSP nonce per-request (Sprint 4) : adoption de la stratégie « Strict CSP » Google — script-src 'self' 'nonce-XXX' 'strict-dynamic'. Nonce 96 bits b64 généré à chaque requête par le proxy edge, injecté dans les 4 scripts inline du site (theme init, JSON-LD SEO). Sur les navigateurs CSP3-aware (Chrome 60+, Firefox 56+, Safari 14+, Edge moderne), 'unsafe-inline'est ignorédès qu'un nonce est présent — protection forte contre XSS reflechi.
  • Page publique /securite/audits-externes — transparence radicale : Mozilla Observatory, Security Headers (Scott Helme), Qualys SSL Labs, rapport interne. Chaque entrée a un lien LIVE vers le scanner officiel. Aucun score auto-déclaré, le visiteur vérifie en temps réel.
  • Reste à activer en prod : provisionner le rôle Postgres readonly avec prisma/sql/setup-readonly-role.sql puis renseigner DATABASE_URL_READONLYdans l'environnement. Sans cette étape, le code tourne en fallback mais la défense en profondeur n'est pas effective.
  • Sprint 3 (à venir) : finalisation WebAuthn (login passkey-first par défaut, fallback password en backup) + interface getSecret()pour découpler les secrets API tiers de l'environnement (préparation à une intégration Scaleway Secret Manager ou Vault optionnels).

Notre niveau de maturité par domaine

Authentification & autorisationMature
Sécurité applicative (validation, anti-XSS DOMPurify, anti-SSRF)Mature
Sécurité réseau & infrastructureMature
Protection des données personnelles (RGPD)Mature
Headers HTTP (HSTS, X-Frame, Permissions-Policy, CSP en code)Mature
SDLC sécurisé (TypeScript 6 strict, Prisma ORM, vitest 710 tests verts)Intermédiaire
CI/CD : déploiement auto au push mainÀ faire
Gestion des incidents (Cyber-Réflexe)Intermédiaire
Audit externe formel par cabinet PASSIÀ faire

Position éditoriale assumée

  • Nous ne prétendons pasêtre ISO 27001 ni SOC 2. Ces certifications sont disproportionnées pour notre cible (organisations avec budget cyber limité < 5 K€/an, particuliers, associations).
  • Nous ne prétendons pas non plus être SecNumCloud. Cette qualification s'adresse à des opérateurs critiques.
  • Nous revendiquons un niveau de sécurité « ANSSI-ready » : robuste pour la gouvernance cyber française du quotidien, transparent dans ses limites, en amélioration continue.

✅ Ce qui est en place

Auth.js v5 + SSO Google/Microsoft + magic link Scaleway TEM (zero-password)

Multi-tenant scoping strict sur tous les modèles Prisma

Plan-gating à 3 paliers cloud (starter / pro / enterprise) + Community Edition self-host

HAProxy 2.9 frontend (TLS 1.2+, rate limit, ACL méthodes, anti-bots)

Réseaux Docker segmentés (frontend / backend privé)

Validation Zod systématique sur toutes les routes API

Anti-SSRF strict sur les webhooks (refus IPs privées + .local)

Sanitisation HTML pour le générateur phishing IA

Rate limiting applicatif (TTS, Outlook report, IA Mistral)

Audit trail complet (table Event, sans PII dans les payloads)

DPA art. 28 + registre RGPD art. 30 maintenus

IP hashées dans audits (anti-fingerprint utilisateur)

Hébergement France (Scaleway), zéro Cloud Act US sur données

IA souveraine (Mistral FR) pour génération phishing

🔲 Ce qui est en backlog (et pourquoi)

CI/CD avec redeploy automatique au push main Q2 2026 (avant launch)

Pentest interne du 7 mai a montré qu'une image en prod peut diverger des correctifs de main (CSP, middleware, sanitization absents du build déployé). Pipeline GitHub Actions → registre Docker → pull + restart automatique.

HAProxy stats auth + rate limit /api/auth Q2 2026

Findings du pentest interne : ajouter `stats auth admin:<pwd>` sur frontend stats (ligne 157 actuellement en commentaire), et ACL `http_req_rate(10s) gt 20` sur `path_beg /api/auth/callback/` pour anti-credential-stuffing.

Pentest externe par cabinet PASSI Q3 2026

Devis pris auprès de 3 cabinets (Wavestone, Devoteam, ou cabinet PASSI plus petit). Pentest boîte grise, ~5-7 jours.

Audit RGAA externe Q4 2026

Audit interne 88 % conformité déjà fait. Cabinet certifié ciblé (Atalan / Tanaguru / Access42). Budget identifié ~3 000 € HT.

Dependabot / scan SCA en CI post-launch OSS

Aujourd'hui : npm audit manuel mensuel. Demain : auto-PR à chaque CVE détectée.

Scan SAST en CI (Semgrep / CodeQL) post-launch OSS

Détection automatisée de patterns à risque dans le code. Ruleset OWASP par défaut.

Tests E2E Playwright sur flows critiques Q3 2026

Auth, achat boutique, génération phishing IA, téléchargement Pack NIS2, complétion épisode.

Programme bug bounty formalisé Q4 2026

Aujourd'hui : divulgation responsable via security@humanix-cybersecurity.fr (cf. plus bas). Demain : périmètre + récompenses formalisés.

❌ Limites assumées par design

  • Pas de SAML 2.0 / SCIM enterprisepar défaut. Focus délibéré sur la cible standard (particuliers, équipes, organisations de taille moyenne). SSO Google + Microsoft Entra suffit pour 95 % des prospects. SAML/SCIM disponible sur demande pour les contrats > 50 utilisateurs.
  • Pas de chiffrement applicatif au-delà du TLS : nos données ne sont pas considérées comme ultra-sensibles (pas de santé, pas de défense). Le chiffrement TLS bout en bout + chiffrement filesystem Scaleway est jugé adapté à notre cible.
  • Pas d'ISO 27001 ni SOC 2 : disproportionné pour la cible visée. À reconsidérer si nous montons en gamme vers le mid-market et grands comptes.

🛡️ Programme de divulgation responsable

Vous avez découvert une faille ? Écrivez-nous, nous l'écoutons et nous la corrigeons. Pas de poursuites tant que les règles sont respectées.

  • Accusé de réception sous 48h ouvrées
  • Évaluation et plan d'action sous 5 jours ouvrés
  • Information sur la résolution dans les 30 jours
  • Crédit public sur ce rapport et la page /sécurité (avec votre accord)
security@humanix-cybersecurity.fr

Documents complémentaires

« La cybersécurité n'est pas une destination, c'est une trajectoire. Nous vous tenons informés. »
- Florian DURANO, fondateur, Humanix-Cybersecurity.