La sécurité a été traitée comme un fil rouge : cinq audits en quatre jours, chaque fois avec un rapport classé par priorité, une explication simple de chaque faille, puis les corrections testées.

.env ne quitte jamais la machine : il contient le token du bot, le secret OAuth2, le token du tunnel et la clé d’API. Il est exclu par .gitignore et les scripts d’envoi bloquent tout ce qui ressemble à un secret.127.0.0.1, cloudflared lancé sans accès au token Discord.Point de départ : npm audit signalait 4 vulnérabilités dans Express. Elles ont été corrigées (Express 4.22.3, 0 vulnérabilité), puis tout le code a été passé en revue. 12 failles corrigées :
| Faille | Risque concret | Correction |
|---|---|---|
| Dépendances Express vulnérables | Une requête piégée pouvait faire planter le bot (déni de service) | Mise à jour, npm audit à 0 |
| Rôles donnés automatiquement sans contrôle (la plus grave) | Un rôle Admin placé dans la vérification, l’autorôle, une récompense ou un panneau de rôles rendait n’importe quel membre administrateur | Un rôle avec des permissions de modération ou d’admin n’est jamais distribué automatiquement, et la personne qui le configure doit pouvoir le donner elle-même |
| Mentions @everyone / @here | Faire pinger tout le serveur par Cyber via un tag ou un rappel | Par défaut, Cyber ne mentionne que des membres |
| Invitation en Administrateur | Si le token fuitait, contrôle total de chaque serveur | Lien d’invitation avec les seules permissions utiles |
| Fixation de session | Réutiliser un cookie connu après la connexion de la victime | Nouveau cookie à chaque connexion, vérification stricte du state |
| Panel sans limite de requêtes | Saturer la mémoire de sessions | Limites par IP, sessions inactives effacées, plafond global |
| Publication dans n’importe quel salon | Faire poster un panneau dans un salon invisible pour l’admin | Droits de lecture et d’écriture vérifiés |
Clés spéciales (__proto__, constructor) |
Écrire n’importe quoi dans la configuration (pollution de prototype) | Liste blanche des réglages, en-têtes de sécurité renforcés |
/pingip |
Une IPv6 cachant une adresse privée (::ffff:7f00:1) permettait de sonder le réseau de l’hébergeur (SSRF) |
Détection complète des adresses privées, limite globale de 20 pings par minute |
/dns |
Révéler des adresses internes | Adresses privées masquées |
/embed |
Publier là où le modérateur n’a pas le droit d’écrire | Droits revérifiés au moment de publier |
| Spam (tickets, vocaux, boutons, tags) | Créer des dizaines de salons ou cliquer en boucle | Limites de fréquence et plafonds |
Vérifié sans problème : /calcul (aucun eval), expressions régulières de l’automod, affichage du panel (texte toujours échappé).
Question d’Enzo : « Les injections SQL sont-elles possibles sur le login admin ? »
Réponse : non, car il n’y a ni base SQL ni mot de passe. Le reste a été vérifié (XSS, CSRF, cookies, vol de session, force brute, permissions) et 3 améliorations ont été faites :
Bot, panel, site et dépôts. Aucune fuite de secret trouvée (site, historique Git, archives). Points traités :
Critique
Importants
data/, et un fichier JSON abîmé était remplacé par un fichier vide → sauvegardes quotidiennes automatiques (7 jours), envoi possible dans un salon Discord privé, fichier corrompu mis de côté au lieu d’être écrasé, RESTAURER.bat.cloudflared téléchargé sans vérification → version fixée et empreinte SHA-256 contrôlée.Mineurs (tous corrigés) : membres du serveur mis en cache 5 minutes, petites fuites de mémoire nettoyées toutes les 10 minutes, automod optimisé, verrou sur le planificateur, giveaways terminés supprimés N jours après leur fin (réglable avec /config giveaways jours:, idée d’Enzo pour les giveaways qui durent plus de 30 jours), .gitignore ajouté au site, panel jamais servi en HTTP public sans tunnel, npm audit lancé à chaque démarrage, alertes Dependabot et Malware alerts activées sur le dépôt privé.
Choix de sauvegarde discuté avec Enzo : GitHub ou Discord ? Discord a été retenu, car GitHub aurait demandé de donner au bot un jeton en écriture (un secret de plus à protéger), alors que les données ne pèsent que quelques Ko.
Aucune faille grave, et les anciennes failles des commandes restent bouchées. 15 petits trous corrigés :
/userinfo montrait à tous le nombre d’avertissements : réservé aux modérateurs./suggestion et /rappel pouvaient faire écrire Cyber dans un salon en lecture seule : bloqué./dns et /pingip acceptaient des noms du réseau local (.lan, .home, .local) : refusés.@everyone refusé pour le défi ; double fermeture de ticket ; doublons dans /panelroles ; numérotation de /warn ; salons vocaux et tickets orphelins nettoyés au démarrage ; bot qui ne plante plus si le disque est plein ; sauvegardes conservées avec Docker.Un bug de sauvegarde a aussi été trouvé grâce à un retour d’Enzo : la sauvegarde du jour n’était envoyée sur Discord qu’au moment de sa création. Si elle avait été créée avant la configuration du salon, elle n’était jamais envoyée. Désormais, le bot la renvoie tant qu’elle n’est pas bien arrivée.
Question posée : « Entre le site et le panel, c’est sécurisé ? » Avant de retirer Cloudflare Access, le chemin complet a été revérifié point par point :
| Point vérifié | Résultat |
|---|---|
| Connexion Discord OAuth2 | Paramètre state anti-falsification, retour accepté seulement vers panel.cyberbot.fr/callback, nouveau cookie après connexion |
| Cookies | HttpOnly, Secure, SameSite |
| Droits | « Gérer le serveur » et présence du bot revérifiés en direct sur Discord à chaque requête |
| CSRF et XSS | En-tête spécial + origine vérifiée, CSP stricte, textes échappés |
| Abus | Limite de requêtes par personne (vraie IP lue derrière Cloudflare), sessions limitées |
| Exposition | Le panel n’écoute que sur la machine elle-même : seul le tunnel peut l’atteindre |
Un seul trou trouvé : dans le panel, un modérateur avec « Gérer le serveur » pouvait changer le salon des logs, alors que la commande /config logs le réserve aux administrateurs. Il aurait pu rediriger les messages supprimés et les tickets vers un salon qu’il voit. Corrigé : réservé aux administrateurs et au propriétaire.
Dans la foulée :
/mesdonnees ;Test final avec un autre compte Discord : validé.
Ma question : « On pourrait intégrer un peu d’IA dans l’automod, qui peut être contourné avec deux ou trois changements de texte ? » Deux couches ont été proposées :
main (pas de suppression, pas de force push).@cyberbot.fr.