La sécurité a été traitée comme un fil rouge : quatre audits en trois 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.
main (pas de suppression, pas de force push).@cyberbot.fr.