Cybersécurité de Tavernaute
Ce que nous faisons, ce que nous ne faisons pas encore, et ce que tu risques en cas d'attaque ou de détournement. Transparence volontaire.
Indice de fiabilité et de confiance : comment est-il calculé ?
L'indice affiché sur l'accueil est un score sur 100, recalculé sur les 30 derniers jours :
- Votes des membres : note de 1 à 10, multipliée par 10 pour atteindre l'échelle de 100 (50 tant qu'aucun vote n'a été donné).
- Positifs : +1 par connexion quotidienne, +5 par première connexion, +5 par attaque évitée (jeton de sécurité invalide, défi anti-robot échoué, limite de débit dépassée). Ils sont lissés par jour et plafonnés à +20.
- Négatifs : −2 par membre banni, −10 par attaque subie (déclarée par un administrateur).
Formule : note moyenne × 10 + min(20 ; points positifs ÷ 30) − points négatifs, bornée de 0 à 100. Zones : rouge < 40, orange de 40 à 69, vert à partir de 70.
Indicateur interne, déclaratif et non audité : il n'est délivré par aucun cabinet de conseil ni organisme de certification. Les membres connectés votent depuis leur profil.
Score de sécurité
Important : ce score est calculé en interne à partir de la liste de contrôles ci-dessous (points pondérés : fait = 100 %, partiel = 50 %, non fait = 0 %). Il n'est délivré par aucun cabinet de conseil ni organisme de certification spécialisé.
Zones : rouge < 40 · orange 40 à 69 · vert ≥ 70. Calculé à l'instant sur cette installation ; certains contrôles dépendent de la configuration du serveur.
| Contrôle | Poids | État |
|---|---|---|
| Transport TLS (HTTPS) actif sur cette requête | 8 | ✔ Fait |
| Content-Security-Policy stricte + Trusted Types appliqués | 8 | ✔ Fait |
| Authentification FIDO2 / WebAuthn + 2e facteur (PIN) aux jours 3 et 6 | 10 | ✔ Fait |
| Session unique, jeton anti-CSRF, liste blanche d'actions, requêtes préparées | 8 | ✔ Fait |
| Anti-robot (preuve de travail) et limitation de débit par IP | 6 | ✔ Fait |
| Chiffrement de bout en bout : messages privés et salons privés (5 personnes) | 10 | ✔ Fait |
| Salons officiels : en clair par choix (modération obligatoire), protégés par TLS | 6 | — Non applicable |
| Double ratchet (confidentialité persistante complète) | 6 | ✖ Non fait |
| Cloisonnement mineurs / adultes (salons, privés, Moments) | 6 | ✔ Fait |
| Protection des Moments : ré-encodage GD, dossiers isolés, expiration 24 h | 4 | ✔ Fait |
| Filtre de nudité des photos configuré | 5 | ✖ Non fait |
| Base de données hors racine publique | 4 | ✔ Fait |
| Sauvegarde récente (moins de 48 h) | 4 | ✖ Non fait |
| Fonctions système PHP désactivées (disable_functions) | 3 | ✖ Non fait |
| Mentions légales complètes | 3 | ✖ Non fait |
| Rétention limitée (30 jours) et journal de connexion 1 an | 4 | ✔ Fait |
| Test d'intrusion par un tiers indépendant | 8 | ✖ Non fait |
| Journal d'incidents et plan PCA/PRA documentés | 3 | ✔ Fait |
1. Éléments techniques
Transport et navigateur
- TLS 1.3 (HTTPS) et en-tête HSTS sur toutes les réponses.
- Content-Security-Policy stricte : scripts et styles uniquement du site (nonce par requête), aucun objet, aucun cadre, aucune ressource externe.
- X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer, Permissions-Policy (micro autorisé pour les vocaux seulement).
- Trusted Types activés en mode rapport (voir limites).
Authentification et sessions
- Code PIN conservé sous forme de hash (bcrypt) ; verrouillage après 5 échecs en 10 minutes.
- Défi anti-robot par preuve de travail : le navigateur calcule un SHA-256 commençant par 4 zéros avant chaque connexion ; défi signé (HMAC), lié à l'IP, à usage unique, valable 10 minutes.
- Session unique : une nouvelle connexion invalide immédiatement les sessions concurrentes. Cookie
HttpOnly,SameSite=Strict,Secureen HTTPS. - Jeton anti-CSRF généré en session et exigé dans l'en-tête de chaque requête d'écriture.
- Limitation de débit : 60 requêtes d'écriture par minute et par IP (HTTP 429 au-delà).
Serveur
- Requêtes SQL préparées exclusivement ; actions de l'API validées par liste blanche stricte.
- Base SQLite placée au-dessus de la racine publique quand l'hébergement le permet, verrouillage géré par SQLite (mode WAL), transactions à verrou d'écriture immédiat.
- Aucune fonction d'exécution système n'est utilisée par le code ; leur désactivation côté PHP est recommandée (
exec, shell_exec, system, passthru, popen, proc_open). - Rétention courte : messages supprimés après 30 jours ; journal de connexion 1 an.
Chiffrement de bout en bout des messages privés
- Salons privés : une copie chiffrée du message par membre (5 maximum) ; un membre qui rejoint plus tard ne lit pas les messages antérieurs.
- Paire de clés ECDH P-256 générée dans le navigateur (Web Crypto API) ; clé privée non exportable, stockée dans l'IndexedDB du navigateur, jamais envoyée au serveur.
- Chaque message utilise une clé éphémère : ECDH puis HKDF-SHA-256 donnent une clé AES-256-GCM unique, jamais stockée.
- AES-GCM est authentifié : toute altération en base fait échouer le déchiffrement. Le salon et l'expéditeur sont liés au message.
- Un code de sécurité affiché dans la conversation permet de vérifier de vive voix que la clé du correspondant n'a pas été substituée.
Protection des mineurs
Indicateur majeur/mineur calculé côté serveur ; salons, Moments et messages privés cloisonnés par âge ; protection des Moments : image ré-encodée (EXIF/GPS supprimés), enregistrée dans un dossier distinct pour les adultes et pour les mineurs hors racine publique, servie uniquement à la même tranche d'âge, supprimée après 24 h, signalable (🚩) et retirable par l'équipe ; filtre de nudité appelé avant l'enregistrement (rejet au-dessus du seuil ; photos refusées tant que le filtre n'est pas configuré).
2. Limites connues
- Les salons officiels ne sont pas chiffrés de bout en bout (modération et historique obligatoires) : ils sont protégés par TLS et lisibles par le serveur. Les salons privés créés par les membres (5 personnes) et les messages privés le sont.
- Le chiffrement des messages privés n'est pas un « double ratchet » : la clé privée d'un appareil compromis révèle les messages reçus sur cet appareil. L'historique n'est lisible que sur l'appareil qui a la clé ; vider les données du navigateur le rend illisible.
- La connexion par clé d'accès FIDO2 est prioritaire ; le code PIN (vérifié par le serveur) sert de 2e facteur aux 3e et 6e jours de connexion et de secours pour les comptes sans clé. Un PIN purement local n'est pas retenu.
- Trusted Types est appliqué avec une politique « default » qui assainit le HTML inséré (l'interface d'origine utilise encore
innerHTML) ; le contenu des messages, lui, est échappé avant affichage. - Les messages éphémères ne peuvent empêcher une capture d'écran.
3. Définitions
- Chiffrement de bout en bout (E2EE)
- Seuls l'expéditeur et le destinataire détiennent les clés : ni l'hébergeur ni l'éditeur ne peuvent lire le message.
- AES-256-GCM
- Algorithme de chiffrement symétrique « authentifié » : il chiffre et détecte toute modification du message.
- ECDH / HKDF
- Échange de clés sur courbe elliptique permettant à deux parties de calculer un secret commun ; HKDF en dérive une clé de chiffrement.
- Perfect Forward Secrecy (PFS)
- Propriété selon laquelle le vol d'une clé n'ouvre pas les échanges passés. Tavernaute utilise des clés éphémères par message, sans atteindre un ratchet complet.
- XSS (Cross-Site Scripting)
- Injection de code JavaScript dans une page par un attaquant ; combattue par l'échappement du texte et la CSP.
- CSRF
- Requête forgée faite à l'insu de l'utilisateur depuis un autre site ; combattue par le jeton anti-CSRF et SameSite.
- CSP / Trusted Types
- Politique du navigateur qui limite les scripts autorisés / oblige à n'insérer du HTML que via des chaînes assainies.
- HSTS / TLS
- Chiffrement du transport (HTTPS) et obligation pour le navigateur de l'utiliser.
- Preuve de travail (PoW)
- Petit calcul imposé au navigateur pour ralentir les robots.
- Passkey / WebAuthn / FIDO2
- Connexion sans mot de passe par clé cryptographique de l'appareil.
- PCA / PRA
- Plan de continuité d'activité (rester disponible) / plan de reprise d'activité (redémarrer après un sinistre).
- RTO / RPO
- Durée maximale d'interruption acceptable / quantité maximale de données pouvant être perdue.
4. Règles de non-reproduction
Le code, l'interface, la charte graphique, les textes, les captures d'écran, le protocole PQCM et le nom Tavernaute sont protégés par le droit d'auteur et le droit des marques. Sont interdits sans autorisation écrite :
- copier, redistribuer, vendre ou publier tout ou partie du code, du design ou des contenus du site ;
- aspirer ou extraire automatiquement les contenus (scraping, robots d'indexation non autorisés, constitution de bases de données) ;
- rétro-ingénierie, décompilation, contournement des protections et des limitations techniques ;
- créer un service imitant Tavernaute de manière à tromper les utilisateurs (phishing, faux site) ;
- republier les messages, vocaux ou Moments d'autres membres sans leur accord.
Les moteurs de recherche respectant le fichier robots.txt peuvent indexer les pages publiques.
5. Plan de continuité et de reprise d'activité (PCA / PRA)
Objectifs
- RTO (reprise) : 4 heures ouvrées.
- RPO (perte de données maximale) : 24 heures (sauvegarde quotidienne).
Sauvegardes
Copie cohérente quotidienne de la base (php src/backup.php, tâche planifiée), 14 exemplaires conservés dans le dossier de données hors racine publique, copie complémentaire hors de l'hébergeur recommandée. Les messages privés y figurent chiffrés. Test de restauration trimestriel.
Scénarios et réponses
| Scénario | Réponse |
|---|---|
| Panne de l'hébergeur | Page d'état sur le blog, suivi du ticket LWS, bascule vers un hébergement de secours avec la dernière sauvegarde. |
| Corruption de la base | Arrêt du service, restauration de la dernière sauvegarde saine, contrôle d'intégrité (PRAGMA integrity_check). |
| Attaque / intrusion | Isolement, rotation des secrets et fermeture de toutes les sessions, analyse des journaux, correction, remise en ligne. |
| Déni de service | Limitation par IP, filtrage en amont chez l'hébergeur, défi anti-robot renforcé. |
| Perte d'un compte administrateur | Réattribution en ligne de commande par le Fondateur (src/make-founder.php). |
Violation de données
Notification à la CNIL dans les 72 heures (art. 33 RGPD) et information des personnes concernées en cas de risque élevé (art. 34). Un registre des incidents est tenu.
Communication et tests
Information des utilisateurs via les actualités et le chat. Exercice annuel de simulation d'incident et mise à jour du plan après chaque événement.
6. Sanctions possibles en cas de détournement ou d'attaque
Les textes ci-dessous rappellent les principales infractions ; les peines maximales sont indiquées à titre d'information et peuvent évoluer.
- Accès ou maintien frauduleux dans un système de traitement automatisé de données (art. 323-1 du Code pénal) : jusqu'à 3 ans d'emprisonnement et 100 000 € d'amende, portés à 5 ans et 150 000 € si des données sont supprimées ou modifiées ou si le fonctionnement est altéré.
- Entrave au fonctionnement d'un système, y compris par déni de service (art. 323-2) et extraction, modification ou suppression frauduleuse de données (art. 323-3) : jusqu'à 5 ans et 150 000 €.
- Atteinte au secret des correspondances (art. 226-15) et atteinte à l'intimité de la vie privée par enregistrement ou diffusion de paroles privées (art. 226-1 et 226-2) : jusqu'à 1 an et 45 000 €.
- Usurpation d'identité en ligne (art. 226-4-1) : jusqu'à 1 an et 15 000 €.
- Contrefaçon du code, du design ou des contenus (articles L335-2 et L335-3 du Code de la propriété intellectuelle) : jusqu'à 3 ans et 300 000 €.
- Contenus pédopornographiques ou accessibles aux mineurs (art. 227-23 et 227-24) : voir la Charte d'engagement.
Sanctions internes
Avertissement, mise en sourdine, éjection, bannissement définitif du compte et de l'appareil, conservation des preuves, dépôt de plainte et signalement aux autorités (PHAROS, CNIL, ANSSI) ; les données de connexion conservées un an sont communiquées sur réquisition judiciaire.
Signaler une vulnérabilité
Écris à [À COMPLÉTER : e-mail de contact] avec les détails reproductibles ; merci de ne pas accéder à des données d'autres personnes ni de perturber le service. Nous accusons réception sous 72 h.