Réponses point par point de Cybernetics aux OWASP Secure Coding Practices : validation des entrées, encodage des sorties, authentification, sessions, contrôle d'accès, chiffrement, journalisation.
ℹ Bon à savoir
Cette page est une autoévaluation de Cybernetics au regard des OWASP Secure Coding Practices. Référentiel : checklist OWASP Secure Coding Practices, version de travail postérieure à la v2.0.1 (reprise dans l'OWASP Developer Guide). Pour une évaluation plus exigeante, avec des exigences testables, voir aussi OWASP ASVS 5.0 chez Cybernetics. Elle ne constitue ni une certification ni une déclaration de conformité intégrale : chaque réponse indique si la pratique est en place, partiellement en place ou non encore mise en œuvre, et les écarts connus font l'objet de corrections planifiées.
Couverture par thématique
Thématique | Points | Oui | Partiellement | Non | Sans objet | Couverture |
1. Validation des entrées | 17 | 8 | 9 | 0 | 0 | 74 % |
2. Encodage de sortie | 7 | 5 | 2 | 0 | 0 | 86 % |
3. Authentification et gestion des mots de passe | 35 | 23 | 9 | 1 | 2 | 83 % |
4. Gestion des sessions | 21 | 14 | 7 | 0 | 0 | 83 % |
5. Contrôle d'accès | 25 | 11 | 13 | 1 | 0 | 70 % |
6. Pratiques cryptographiques | 6 | 2 | 3 | 1 | 0 | 58 % |
7. Gestion des erreurs et journalisation | 24 | 10 | 13 | 1 | 0 | 69 % |
8. Protection des données | 12 | 5 | 7 | 0 | 0 | 71 % |
9. Sécurité des communications | 8 | 7 | 1 | 0 | 0 | 94 % |
10. Configuration du système | 16 | 8 | 8 | 0 | 0 | 75 % |
11. Sécurité de la base de données | 13 | 5 | 7 | 1 | 0 | 65 % |
12. Gestion des fichiers | 14 | 3 | 3 | 0 | 8 | 75 % |
13. Gestion de la mémoire | 10 | 6 | 4 | 0 | 0 | 80 % |
14. Pratiques générales du codage | 12 | 3 | 9 | 0 | 0 | 62 % |
Total | 220 | 110 | 95 | 5 | 10 | 75 % |
Couverture = (points « Oui » + ½ × points « Partiellement ») ÷ points applicables (hors « Sans objet »). Les points « Non revendiqué » comptent comme « Non ». Calculée au 27/09/2026 à partir des statuts indiqués sur cette page ; elle sera mise à jour à chaque évolution.
Sécurisation du code
La sécurisation du code est un aspect crucial du développement de logiciels et chez Cybernetics nous prenons cela très au sérieux. Cybernetics respecte une sécurité dès conception (security by design).
Validation des entrées
Les différentes entrées renseignées par les utilisateurs sont contrôlées par Cybernetics.
1.1 Effectuer la validation de toutes les données sur un système fiable
Réponse de Cybernetics : Oui. Les données sont validées côté serveur, sur notre API dédiée (api.cybernetics.fr), système de confiance.
1.2 Identifier toutes les sources de données et les classer en fiables et non fiables
Réponse de Cybernetics : Partiellement. Les sources sont classées : saisies des utilisateurs, données de l'agent Cybernetics et réponses des services tiers sont toutes traitées comme non fiables ; la base de données est un stockage maîtrisé dont les valeurs ne sont pas réputées sûres. Les saisies et les données de l'agent sont validées par schéma ; la validation par schéma des réponses des services tiers est en cours.
La base de données n'est pas considérée comme une source de valeurs sûres. Ce qui est maîtrisé, c'est l'intégrité du canal (connexion TLS vérifiée) et l'accès (comptes dédiés) ; une valeur stockée peut en revanche provenir d'un utilisateur, d'un connecteur, d'une ancienne version, d'une migration ou d'une intervention administrative. Elle est donc encodée selon son contexte de sortie (échappement Vue et Edge, paramètres liés en SQL), et doit être contrôlée à nouveau avant toute utilisation dans une URL ou une commande ; ce contrôle n'est pas encore systématique (voir 2.4 et 2.7).
1.3 Valider toutes les données provenant de sources non fiables
Réponse de Cybernetics : Partiellement. Les saisies des utilisateurs et les données de l'agent sont validées par des schémas avant tout traitement ; quelques champs de l'agent doivent encore être bornés. Les réponses des services tiers sont considérées comme non fiables mais ne sont pas encore validées par schéma : cette validation est planifiée en priorité. En sortie, ces données bénéficient des mêmes protections que les autres (requêtes SQL paramétrées, échappement à l'affichage).
1.4 Il doit y avoir une routine centralisée de validation des entrées pour l'application
Réponse de Cybernetics : Oui. Chaque route de l'API valide ses entrées avec un schéma déclaré dans un validateur dédié, qui fixe le nom, le type, le format et les limites de chaque champ ; les entrées non déclarées sont ignorées, à l'exception de quelques objets d'attributs de champs personnalisés, stockés tels quels.
1.5 Spécifier les jeux de caractères appropriés, tels que UTF-8, pour toutes les sources d'entrées
Réponse de Cybernetics : Oui. L'API décode tous les corps de requête en UTF-8 (JSON et formulaires). Il s'agit d'un choix de jeu de caractères, qui garantit une interprétation unique des octets reçus ; ce n'est pas en soi une protection contre les injections, assurée par la validation et l'encodage de sortie décrits dans cette page.
1.6 Encoder les données dans un jeu de caractères commun avant de valider
Réponse de Cybernetics : Oui. Les requêtes sont décodées en UTF-8 par l'API avant la validation : les règles VineJS s'appliquent donc sur les caractères décodés, et non sur leur représentation encodée.
1.7 Tous les échecs de validation devraient entraîner le rejet de l'entrée
Réponse de Cybernetics : Oui. Lorsque la validation échoue, une réponse en erreur est systématiquement retournée au client (Erreur 422 : Unprocessable Entity).
1.8 Vérifier si le système prend en charge les jeux de caractères étendus UTF-8 et les valide une fois le décodage UTF-8 terminé
Réponse de Cybernetics : Oui. Node.js décode l'UTF-8 avant tout traitement, puis la validation s'applique sur la chaîne décodée. Une séquence d'octets invalide ne peut pas contourner la validation, puisque celle-ci porte sur le texte décodé.
1.9 Valider toutes les données fournies par le client avant le traitement
Réponse de Cybernetics : Partiellement. Corps de la requête, paramètres d'URL, query string et données envoyées par l'agent sont validés par des schémas (types, formats, longueurs) ; les réponses des services tiers ne sont pas encore validées par schéma (voir 1.3).
1.10 Vérifier que les valeurs d'en-tête de protocole dans les requêtes et les réponses contiennent uniquement des caractères ASCII
Réponse de Cybernetics : Partiellement. Node.js refuse d'émettre une valeur d'en-tête contenant des caractères de contrôle (retour chariot, saut de ligne, caractère nul), ce qui empêche l'injection d'en-têtes HTTP, et les en-têtes reçus sont analysés en mode strict. Les caractères latin-1 restent techniquement admis : la restriction n'est pas limitée à l'ASCII.
1.11 Valider les données des redirections
Réponse de Cybernetics : Partiellement. L'API n'effectue aucune redirection HTTP, et les redirections de connexion Google ou Microsoft sont construites côté serveur à partir de la configuration, avec une liste fermée de fournisseurs. Côté interface, les liens reçus par e-mail (réinitialisation, invitation, décommissionnement, alerte de nouvel appareil) sont épinglés sur leur route d'API exacte avant tout appel ; un dernier type de lien signé n'est pas encore épinglé, sans exposition des données de l'utilisateur, et sa correction est planifiée.
1.12 Valider les types de données attendus en utilisant une liste « autoriser » plutôt qu'une liste « refuser »
Réponse de Cybernetics : Oui. Les validateurs VineJS décrivent ce qui est autorisé plutôt que ce qui est interdit : types attendus, listes fermées de valeurs (enum), formats (e-mail, URL, UUID) et expressions régulières. Toute valeur hors de ce cadre est rejetée.
1.13 Valider la plage de données
Réponse de Cybernetics : Partiellement. Les bornes numériques, les dates et les listes de valeurs possibles sont contrôlées dans les schémas de validation sur la plupart des champs ; certaines valeurs numériques n'ont pas encore de maximum, et leur ajout est planifié.
1.14 Valider la longueur des données
Réponse de Cybernetics : Partiellement. La plupart des champs texte ont une longueur maximale alignée sur les colonnes en base, et la taille totale des requêtes est plafonnée (1 Mo en JSON) ; quelques champs libres ne sont bornés que par cette limite globale, et leur alignement est planifié.
1.15 Si une entrée potentiellement dangereuse doit être autorisée, mettre en œuvre des contrôles supplémentaires
Réponse de Cybernetics : Partiellement. Cybernetics n'accepte pas de HTML dans les saisies : les textes libres sont traités comme du texte brut et échappés à l'affichage. Aucune bibliothèque d'assainissement HTML n'est utilisée, car aucun sous-ensemble de HTML n'est volontairement accepté. Un texte libre de champ personnalisé est encore inséré sans échappement dans un modèle d'e-mail ; sa correction est planifiée.
1.16 Si la routine de validation standard ne peut pas traiter certaines entrées, utiliser des contrôles discrets supplémentaires
Réponse de Cybernetics : Oui. Lorsqu'une règle dépend du contexte (appartenance à l'entreprise, état d'une ressource, cohérence entre plusieurs champs), le contrôle complémentaire est fait dans le contrôleur ou dans une politique d'autorisation, après la validation du schéma.
1.17 Utiliser la canonisation pour répondre aux attaques d'obscurcissement
Réponse de Cybernetics : Partiellement. Des normalisations ciblées sont appliquées : suppression des espaces en début et fin (trim) sur les champs texte, mise en minuscules et normalisation des adresses e-mail lors des invitations, normalisation Unicode (NFD, sans accents) pour la recherche et le rapprochement des noms. Il n'existe pas encore de canonisation Unicode systématique de toutes les entrées avant validation.
Encodage de sortie
Cybernetics distingue cinq mécanismes, chacun adapté à un risque :
validation d'entrée : la valeur respecte-t-elle le format métier attendu ? (schémas VineJS) ;
normalisation : les différentes représentations d'une valeur sont-elles ramenées à une forme unique ? (trim, e-mails, Unicode) ;
encodage de sortie : la valeur est-elle échappée pour son contexte de destination (HTML, URL, en-tête, journal) ? (Vue, Edge, JSON) ;
requête paramétrée : la donnée est-elle séparée de l'instruction SQL ? (Lucid) ;
assainissement HTML : utile seulement si un sous-ensemble de HTML est accepté, ce qui n'est pas le cas chez Cybernetics.
L'UTF-8 n'est qu'un encodage de caractères : il garantit une interprétation unique des données, mais ne protège pas à lui seul contre les injections (XSS, SQL, URL, commande, en-tête HTTP, journal).
2.1 Effectuer tout le codage sur un système de confiance
Réponse de Cybernetics : Oui. L'encodage est fait côté serveur pour les réponses de l'API et les e-mails, et par le moteur de rendu Vue dans le navigateur pour l'affichage : aucun encodage ne dépend d'un code ajouté par l'utilisateur.
2.2 Utiliser une routine standard testée pour chaque type d'encodage sortant
Réponse de Cybernetics : Oui. Cybernetics s'appuie sur les routines standard de chaque contexte : sérialisation JSON d'AdonisJS pour l'API, échappement automatique de Vue pour l'interface, échappement automatique d'Edge pour les e-mails, requêtes paramétrées de Lucid pour SQL, journaux JSON structurés (pino) pour la journalisation.
2.3 Spécifier des jeux de caractères, tels que UTF-8, pour toutes les sorties
Réponse de Cybernetics : Oui. Les réponses JSON et texte de l'API sont envoyées avec « charset=utf-8 » dans l'en-tête Content-Type, et l'interface déclare l'UTF-8.
2.4 La sortie contextuelle encode toutes les données renvoyées au client à partir de sources non fiables
Réponse de Cybernetics : Partiellement. Dans l'interface, Vue échappe automatiquement toutes les données affichées, et aucun rendu HTML brut (v-html, innerHTML) n'est utilisé. Dans les e-mails, Edge échappe les valeurs par défaut ; un seul modèle insère encore une valeur sans échappement, et sa correction est planifiée. Dans les URL, les paramètres sont en partie encodés (URLSearchParams) ; quelques liens internes sont encore construits par concaténation et seront alignés.
2.5 S'assurer que le codage de sortie est sûr pour tous les systèmes cibles
Réponse de Cybernetics : Oui pour les contextes principaux : HTML (échappement Vue et Edge), JSON (sérialisation de l'API), SQL (requêtes paramétrées), journaux (JSON structuré : un retour à la ligne dans une valeur ne peut pas créer une fausse entrée de journal), en-têtes HTTP (caractères de contrôle refusés par Node.js). Les exceptions connues sont décrites en 2.4 et 2.7.
2.6 Nettoyer contextuellement toutes les sorties de données non fiables dans les requêtes SQL, XML et LDAP
Réponse de Cybernetics : Oui. SQL : Cybernetics utilise des requêtes paramétrées (ORM et query builder Lucid) qui séparent les données de l'instruction SQL ; les valeurs ne sont pas « nettoyées » mais transmises comme paramètres liés. Les rares fragments SQL bruts utilisent aussi des paramètres liés, et les seules valeurs insérées directement sont des constantes internes ou des valeurs issues d'une liste fermée. XML et LDAP : sans objet, l'application n'en émet pas.
2.7 Nettoyer toutes les sorties de données non fiables vers les commandes du système d'exploitation
Réponse de Cybernetics : Partiellement. Aucune donnée saisie par un utilisateur ou un client n'est transmise à une commande système. Une exception subsiste : le connecteur interne Keeper Security, actif uniquement pour l'entreprise Cybernetics elle-même, appelle un outil externe en ligne de commande avec un identifiant qui n'est pas encore validé strictement ; son remplacement par un appel direct, sans interpréteur, est planifié en priorité. L'agent lance ses outils système avec des arguments séparés ; les valeurs insérées dans ses scripts PowerShell sont échappées, et cet échappement est en cours de renforcement.
Authentification et gestion des mots de passe
La gestion de l'authentification est contrôlée par Cybernetics.
3.1 Exiger une authentification pour toutes les pages et ressources sauf celles spécifiquement destinées à être publiques
Réponse de Cybernetics : Oui. Toutes les pages et ressources exigent une authentification, hormis les pages du mécanisme d'authentification (connexion, inscription, réinitialisation) et quelques liens signés reçus par e-mail, à durée et à portée limitées.
3.2 Tous les contrôles d'authentification doivent être appliqués sur un système de confiance
Réponse de Cybernetics : Oui. Toutes les vérifications d'authentification sont faites côté serveur, sur notre API dédiée (api.cybernetics.fr).
3.3 Établir et utiliser des services d'authentification standard et testés dans la mesure du possible
Réponse de Cybernetics : Oui. Plusieurs voies d'authentification standard sont proposées : mot de passe avec double authentification obligatoire, passkeys (WebAuthn), et connexion Google ou Microsoft via OpenID Connect, sur des bibliothèques éprouvées du framework.
3.4 Utiliser une implémentation centralisée pour tous les contrôles d'authentification, y compris les bibliothèques qui appellent des services d'authentification externes
Réponse de Cybernetics : Oui. Le système d'authentification classique est défini dans un contrôleur dédié. Le système d'authentification via OAuth est centralisé grâce à l'implémentation fournie par Cybernetics.
3.5 Séparer la logique d'authentification de la ressource demandée et utiliser la redirection vers et depuis le contrôle d'authentification centralisé
Réponse de Cybernetics : Oui. La logique d'authentification est séparée de toute ressource. Si l'accès à une ressource requérant l'authentification est demandé, l'utilisateur est notifié de l'interdiction et redirigé vers la page de connexion.
3.6 Tous les contrôles d'authentification devraient échouer en toute sécurité
Réponse de Cybernetics : Oui. L'algorithme pour l'authentification suit le principe de moindre privilège et n'autorise l'utilisateur que s'il répond à toutes les conditions requises.
3.7 Toutes les fonctions administratives et de gestion de compte doivent être au moins aussi sécurisées que le mécanisme d'authentification principal
Réponse de Cybernetics : Partiellement. Les fonctions d'administration et de gestion des comptes sont soumises aux mêmes politiques d'autorisation que le reste de l'application. Elles n'exigent pas encore toutes une réauthentification (voir 3.33).
3.8 Si l'application gère un magasin d'informations d'identification, utiliser des hachages salés unidirectionnels cryptographiquement forts
Réponse de Cybernetics : Oui. Les mots de passe sont hachés grâce à une fonction de dérivation forte et recommandée avant d'être stockés en base de données.
3.9 Le hachage du mot de passe doit être implémenté côté serveur d'un système de confiance et non côté client
Réponse de Cybernetics : Oui. Le mot de passe est haché côté serveur, sur notre API dédiée (api.cybernetics.fr), avec Argon2id.
3.10 Valider les données d'authentification uniquement à la fin de toutes les saisies de données
Réponse de Cybernetics : Oui. Les données d'authentification sont vérifiées uniquement lorsque toutes les informations sont saisies.
3.11 Les réponses aux échecs d'authentification ne doivent pas indiquer quelle partie des données d'authentification était incorrecte
Réponse de Cybernetics : Oui. Lorsque l'authentification échoue, l'exception BadCredentials est levée et un message générique est renvoyé : il ne précise pas la raison de l'échec.
3.12 Utiliser l'authentification pour les connexions à des systèmes externes impliquant des informations ou des fonctions sensibles
Réponse de Cybernetics : Oui. L'utilisateur doit obligatoirement être connecté avant la transmission d'informations relatives à ses données d'identification à des services externes.
3.13 Les informations d'authentification pour accéder aux services externes à l'application doivent être stockées dans un magasin sécurisé
Réponse de Cybernetics : Oui. Pour l'accès aux services externes, les identifiants de connexion sont chiffrés avant d'être stockés dans la base de données dédiée à l'application.
3.14 Utiliser uniquement les requêtes HTTP POST pour transmettre les identifiants d'authentification
Réponse de Cybernetics : Oui. Les identifiants sont toujours transmis dans le corps de requêtes POST ou PUT, jamais dans l'URL.
3.15 Envoyer uniquement des mots de passe non temporaires via une connexion chiffrée ou sous forme de données chiffrées
Réponse de Cybernetics : Partiellement. Toutes les communications sont chiffrées en TLS, et aucun mot de passe définitif n'est envoyé par e-mail. En revanche, certains parcours (création de compte, invitation, réinitialisation par un administrateur) envoient encore un mot de passe temporaire par e-mail, à changer obligatoirement à la première connexion. Leur remplacement par un lien d'activation à usage unique est planifié, ainsi que la correction d'un e-mail de réinitialisation qui ne contient pas le bon élément.
3.16 Appliquer les exigences en matière de complexité des mots de passe établies par la politique ou la réglementation
Réponse de Cybernetics : Oui. Le mot de passe doit contenir au moins 16 caractères (128 au maximum). Il est refusé s'il figure dans une base de mots de passe compromis (vérification en ligne par k-anonymat ; un repli local est planifié), conformément aux recommandations du NIST et de l'ANSSI qui privilégient la longueur à la complexité imposée.
3.17 Appliquer les exigences en matière de longueur de mot de passe établies par la politique ou la réglementation
Réponse de Cybernetics : Oui. Le mot de passe doit être composé d'au moins 16 caractères.
3.18 La saisie du mot de passe doit être masquée sur l'écran de l'utilisateur
Réponse de Cybernetics : Oui. La saisie du mot de passe est masquée sur l'interface.
3.19 Appliquer la désactivation du compte après un nombre établi de tentatives de connexion invalides
Réponse de Cybernetics : Oui. Le compte est verrouillé pendant 5 minutes après 5 tentatives infructueuses en 5 minutes, ainsi qu'après 10 échecs sur 24 heures.
3.20 Les opérations de réinitialisation et de modification de mot de passe nécessitent le même niveau de contrôle que la création et l'authentification de compte
Réponse de Cybernetics : Partiellement. Le changement de mot de passe et d'adresse e-mail exige une réauthentification récente, obtenue aujourd'hui avec un seul facteur. Tous les chemins de modification ou de création de mot de passe n'appliquent pas encore ce même niveau de contrôle, et le changement d'e-mail ne demande pas encore de confirmation de la nouvelle adresse ; leur alignement est en cours.
3.21 Les questions de réinitialisation du mot de passe doivent prendre en charge des réponses suffisamment aléatoires
Réponse de Cybernetics : Sans objet. Nous n'utilisons pas de tel système pour la réinitialisation du mot de passe.
3.22 Si des réinitialisations par courrier électronique sont mises en place, envoyer uniquement un courrier électronique à une adresse pré-enregistrée avec un lien/mot de passe temporaire
Réponse de Cybernetics : Oui. Nous utilisons des réinitialisations de mot de passe par e-mail. L'e-mail contient un lien avec un jeton de réinitialisation à usage unique, à forte entropie ; seule son empreinte est conservée côté serveur.
3.23 Les mots de passe et les liens temporaires devraient avoir un temps d'expiration court
Réponse de Cybernetics : Partiellement. Le lien de réinitialisation de mot de passe est valable 10 minutes et un seul jeton est actif à la fois. Les mots de passe temporaires envoyés à la création de compte n'ont pas encore de durée de validité propre ; ils seront remplacés par des liens d'activation à durée courte.
3.24 Imposer le changement du mot de passe temporaire au prochain usage
Réponse de Cybernetics : Oui. L'utilisateur doit changer son mot de passe temporaire à la première connexion : tant que ce n'est pas fait, l'accès aux ressources lui est refusé.
3.25 Avertir les utilisateurs lorsqu'une réinitialisation de mot de passe se produit
Réponse de Cybernetics : Oui. Un e-mail est envoyé à l'utilisateur dès qu'il y a une modification de son mot de passe.
3.26 Empêcher la réutilisation des mots de passe
Réponse de Cybernetics : Oui. Une restriction lors de la phase du changement de mot de passe permet de s'assurer que l'utilisateur ne peut pas définir le mot de passe utilisé actuellement comme nouveau mot de passe.
3.27 Les mots de passe doivent dater d'au moins un jour avant de pouvoir être modifiés, afin d'éviter les attaques liées à la réutilisation des mots de passe
Réponse de Cybernetics : Non. Cybernetics n'impose pas de durée minimale avant un nouveau changement de mot de passe. La réutilisation du mot de passe actuel est interdite et les mots de passe compromis sont refusés.
3.28 Appliquer les changements de mot de passe en fonction des exigences établies dans la politique ou la réglementation, avec le temps entre les réinitialisations contrôlé administrativement
Réponse de Cybernetics : Partiellement. Cybernetics impose le changement du mot de passe initial à la première connexion. La réinitialisation passe par un jeton à usage unique, valable 10 minutes, dont seule l'empreinte SHA-256 est stockée, et les demandes sont limitées en fréquence par e-mail et par adresse IP. En revanche, Cybernetics n'impose pas encore de délai minimum entre deux changements de mot de passe, et ce délai n'est pas réglable par un administrateur.
3.29 Désactiver la fonctionnalité « Se souvenir de moi » pour les champs de mot de passe
Réponse de Cybernetics : Oui. Cybernetics ne propose pas de connexion persistante (« se souvenir de moi »). Les garanties côté serveur sont : expiration de la session après 15 minutes d'inactivité, expiration absolue 8 heures après la connexion, et révocation immédiate à la déconnexion. Les comptes d'assistance (Admin Support) ont une session de durée fixe, 24 heures au plus. Le cookie de session n'a pas de durée de conservation propre, mais certains navigateurs peuvent le restaurer après redémarrage : la sécurité repose sur les expirations côté serveur.
3.30 La dernière utilisation (réussie ou non) d'un compte utilisateur doit être signalée à l'utilisateur lors de sa prochaine connexion réussie
Réponse de Cybernetics : Partiellement. L'historique des connexions (réussies ou non, avec horodatage, adresse IP, statut et type) est consultable dans le profil, et un e-mail signale tout nouvel appareil ; la dernière utilisation n'est pas encore affichée au moment de la connexion.
3.31 Mettre en œuvre une surveillance pour identifier les attaques contre plusieurs comptes d'utilisateurs, en utilisant le même mot de passe
Réponse de Cybernetics : Partiellement. Chaque compte est verrouillé après des échecs répétés, avec une alerte par e-mail, et le nombre de tentatives par adresse IP est limité sur l'ensemble des comptes ; il n'existe pas encore de détection dédiée d'un même mot de passe tenté sur plusieurs comptes.
3.32 Modifier tous les mots de passe et identifiants utilisateur par défaut fournis par le fournisseur ou désactiver les comptes associés
Réponse de Cybernetics : Sans objet. Cybernetics n'est pas concerné puisqu'il gère les mots de passe de bout en bout.
3.33 Réauthentifier les utilisateurs avant d'effectuer des opérations critiques
Réponse de Cybernetics : Partiellement. Une réauthentification récente est exigée pour les opérations critiques du compte : changement de mot de passe ou d'e-mail, suppression du compte, ajout ou révocation de passkey, codes de récupération, génération de clés d'API, modification ou suppression de secrets de connecteurs. Elle ne couvre pas encore toutes les actions d'administration (invitations, réinitialisations faites par un administrateur, changements de rôle ou de méthode de double authentification, création de secrets), et elle accepte aujourd'hui un seul facteur. Son extension et l'exigence du second facteur sont planifiées.
3.34 Utiliser l'authentification multifacteur pour les comptes transactionnels très sensibles ou de haute valeur
Réponse de Cybernetics : Partiellement. La double authentification est obligatoire pour tous les comptes, à l'exception des comptes d'assistance (Admin Support) pour lesquels un administrateur peut la désactiver ; la suppression de cette exception est planifiée.
3.35 Si un code tiers est utilisé pour l'authentification, inspecter attentivement le code pour s'assurer qu'il n'est pas affecté par un code malveillant
Réponse de Cybernetics : Oui. La connexion Google et Microsoft passe par le module d'authentification d'AdonisJS (Ally), épinglé par fichier de verrouillage et surveillé comme les autres dépendances (Dependabot, analyse SCA Datadog, CodeQL). Cybernetics le complète par un pilote durci : paramètre state conservé dans un cookie chiffré, PKCE, cookies de flux HttpOnly et Secure valables 10 minutes, et URL de retour fixées par la configuration du serveur. Pour Microsoft Entra ID, le jeton d'identité est vérifié (signature via les clés publiées par Microsoft, audience, émetteur et nonce). Pour Google, le profil est obtenu auprès de l'API Google avec le jeton d'accès.
Gestion des sessions
La gestion des sessions est contrôlée par Cybernetics.
4.1 Utiliser les contrôles de gestion de session du serveur ou du framework. L'application doit uniquement reconnaître ces identifiants de session comme valables
Réponse de Cybernetics : Oui. Nous utilisons le système de session mis en place par le framework. Il établit le contrôle via l'identifiant de la session.
4.2 La création de l'identifiant de session doit toujours être effectuée sur un système de confiance (côté serveur et non côté client)
Réponse de Cybernetics : Oui. La vérification est faite côté serveur, sur notre API dédiée (api.cybernetics.fr).
4.3 Les contrôles de gestion de session doivent utiliser des algorithmes bien vérifiés qui garantissent des identifiants de session suffisamment aléatoires
Réponse de Cybernetics : Oui. Le jeton de session est généré par AdonisJS avec le générateur aléatoire cryptographique de Node.js (crypto.randomBytes) : 40 caractères aléatoires, soit environ 240 bits d'entropie, suivis d'une somme de contrôle. Seule son empreinte SHA-256 est stockée côté serveur, et chaque jeton est unique et révocable.
4.4 Définir le domaine et le chemin des cookies contenant des identifiants de session authentifiés sur une valeur restreinte appropriée pour le site
Réponse de Cybernetics : Partiellement. Le cookie de session lu par l'API est HttpOnly, Secure et SameSite=Strict, avec le chemin / et sans attribut Domain : il est limité à l'hôte de l'API. Il ne porte pas encore le préfixe __Host- ni de durée de vie propre (sa validité est bornée côté serveur). L'application pose aussi une copie au préfixe __Host- ; l'alignement entre les deux cookies est en cours.
4.5 La fonctionnalité de déconnexion doit mettre fin complètement à la session ou à la connexion associée
Réponse de Cybernetics : Oui. La session se termine complètement suite à la procédure dédiée à la déconnexion.
4.6 La fonctionnalité de déconnexion doit être disponible sur toutes les pages protégées par autorisation
Réponse de Cybernetics : Oui. Les pages protégées par autorisation ont toutes la fonctionnalité de déconnexion.
4.7 Établir un délai d'inactivité de session aussi court que possible, en fonction de l'équilibre entre les risques et les exigences fonctionnelles de l'entreprise
Réponse de Cybernetics : Partiellement. La session expire après 15 minutes d'inactivité ; les comptes d'assistance (Admin Support) ont une session de durée fixe de 24 heures, sans délai d'inactivité, en cours d'alignement.
4.8 Interdire les connexions persistantes et imposer des fermetures de session périodiques, même lorsque la session est active
Réponse de Cybernetics : Partiellement. Toute session est fermée au plus tard 8 heures après la connexion, même si elle est active, et une nouvelle authentification est alors exigée ; les comptes d'assistance ont une session fixe de 24 heures, en cours d'alignement.
4.9 Si une session a été établie avant la connexion, fermer cette session et établir une nouvelle session après une connexion réussie
Réponse de Cybernetics : Oui. En cas de session établie, Cybernetics propose de fermer la session et en propose une nouvelle à l'utilisateur connecté.
4.10 Générer un nouvel identifiant de session à toute ré-authentification
Réponse de Cybernetics : Partiellement. Un nouveau jeton de session est créé à chaque connexion, y compris après une reprise de session. La réauthentification demandée pour les opérations sensibles délivre un ticket distinct, sans renouveler le jeton de session.
4.11 Ne pas autoriser les connexions simultanées avec le même ID utilisateur
Réponse de Cybernetics : Oui. Cybernetics n'autorise pas les connexions simultanées avec le même ID utilisateur.
4.12 Ne pas exposer les identifiants de session dans les URL, les messages d'erreur ou les journaux
Réponse de Cybernetics : Oui. Le jeton de session est opaque et n'apparaît ni dans les URL ni dans les messages d'erreur ; il est masqué dans les journaux, et seule son empreinte est conservée côté serveur. Il est transmis dans un cookie HttpOnly ; il transite également une fois dans la réponse de connexion, avant d'être placé en cookie.
4.13 Mettre en œuvre des contrôles d'accès appropriés pour protéger les données de session côté serveur contre tout accès non autorisé d'autres utilisateurs du serveur
Réponse de Cybernetics : Oui. Cybernetics assure le contrôle d'accès avec la conteneurisation et protège les sessions côté serveur contre tout accès non autorisé d'autres utilisateurs du serveur.
4.14 Générer un nouvel identifiant de session et désactiver périodiquement l'ancien
Réponse de Cybernetics : Partiellement. Chaque jeton de session expire côté serveur après 15 minutes d'inactivité et au plus tard 8 heures après la connexion (24 heures fixes pour les comptes d'assistance) ; un nouveau jeton est alors exigé. Les jetons expirés ne sont pas encore purgés automatiquement de la base.
4.15 Générer un nouvel identifiant de session si la sécurité de la connexion passe de HTTP à HTTPS, comme cela peut se produire lors de l'authentification
Réponse de Cybernetics : Oui. Cybernetics transmet directement l'identifiant de session en HTTPS, sans bascule HTTP.
4.16 Utiliser systématiquement HTTPS plutôt que de basculer entre HTTP et HTTPS
Réponse de Cybernetics : Oui. Cybernetics utilise systématiquement le protocole HTTPS.
4.17 Compléter la gestion de session standard pour les opérations sensibles côté serveur, comme la gestion des comptes, en utilisant des jetons ou des paramètres aléatoires forts par session
Réponse de Cybernetics : Partiellement. Les opérations sensibles sur les comptes s'appuient sur des jetons aléatoires à usage unique (réauthentification, réinitialisation, invitation) en plus de la session. Les actions d'administration sur les comptes d'autres utilisateurs (réinitialisations, changements de rôle) sont contrôlées par autorisation, limitation de débit et notification, mais n'exigent pas encore de réauthentification.
4.18 Compléter la gestion de session standard pour les opérations hautement sensibles ou critiques en utilisant par requête, plutôt que par session, des jetons ou des paramètres aléatoires forts
Réponse de Cybernetics : Partiellement. Un ticket de réauthentification par requête est exigé pour les opérations les plus sensibles : il est opaque, stocké sous forme d'empreinte, lié à l'utilisateur, à usage unique et valable 60 secondes. Il n'est pas encore lié à une action précise, n'est pas exigé sur toutes les opérations critiques, et peut aujourd'hui être obtenu avec un seul facteur. Ces trois points sont en cours de correction.
4.19 Définir l'attribut « sécurisé » pour les cookies transmis sur une connexion TLS
Réponse de Cybernetics : Oui. Les cookies d'authentification sont émis avec l'attribut Secure en production.
4.20 Définir des cookies avec l'attribut HttpOnly, sauf si des scripts côté client sont spécifiquement nécessaires dans votre application pour lire ou définir la valeur d'un cookie
Réponse de Cybernetics : Oui. Les cookies d'authentification sont HttpOnly. Seules des préférences d'affichage sans effet sur la sécurité sont lisibles par les scripts.
4.21 Protéger les données de session côté serveur contre l'accès non autorisé par d'autres utilisateurs du serveur, en implémentant des contrôles d'accès appropriés sur le serveur
Réponse de Cybernetics : Oui. Les jetons de session sont stockés côté serveur sous forme d'empreinte. Leur accès est contrôlé et des règles d'autorisation vérifient les droits sur chaque ressource.
Contrôle d'accès
5.1 Utiliser uniquement des objets système de confiance, par exemple objets de session côté serveur, pour prendre des décisions d'autorisation d'accès
Réponse de Cybernetics : Oui. Cybernetics valide les autorisations d'accès côté serveur. L'identification de l'utilisateur repose sur un jeton de session opaque transmis dans un cookie HttpOnly, Secure et SameSite=Strict.
5.2 Utiliser un seul composant à l'échelle du site pour vérifier l'autorisation d'accès. Cela inclut les bibliothèques qui appellent des services d'autorisation externes
Réponse de Cybernetics : Oui. Cybernetics utilise le paquet fourni par son framework pour le contrôle d'accès, qui vérifie également l'authentification.
5.3 Les contrôles d'accès devraient échouer en toute sécurité
Réponse de Cybernetics : Oui. Lorsque l'accès n'est pas permis, une exception est levée. Le retour client est de type 403, Forbidden.
5.4 Refuser tout accès si l'application ne peut pas accéder à ses informations de configuration de sécurité
Réponse de Cybernetics : Oui. Cybernetics valide toutes ses variables de configuration au démarrage de l'API AdonisJS avec un schéma typé : si une variable obligatoire (clés de chiffrement, base de données, fournisseurs d'authentification…) est absente ou invalide, l'application refuse de démarrer.
5.5 Appliquer des contrôles d'autorisation sur chaque demande, y compris celles effectuées par des scripts côté serveur
Réponse de Cybernetics : Partiellement. Les contrôles d'autorisation sont centralisés dans des politiques côté serveur, appliquées aux requêtes de l'API, et couvrent la majorité des ressources ; des tests automatisés vérifient la frontière entre entreprises sur une partie des routes. Une revue de sécurité récente a toutefois identifié des cas résiduels d'autorisation entre entreprises et de contrôle des références d'objet (objets liés transmis dans une requête, éléments partagés, flux de sortie d'actifs, changement d'abonnement). Leur correction et leur couverture par des tests négatifs sont en cours.
5.6 Séparer la logique privilégiée des autres codes d'application
Réponse de Cybernetics : Oui. Cybernetics applique une logique d'autorisation isolée dans un répertoire dédié (politiques). Les opérations critiques requièrent en plus notre middleware pour une couche supplémentaire de vérification.
5.7 Restreindre l'accès aux fichiers ou autres ressources, y compris ceux extérieurs au contrôle direct de l'application, aux uniques utilisateurs autorisés
Réponse de Cybernetics : Partiellement. Aucun fichier d'utilisateur n'est stocké ; les seuls fichiers distribués (installateurs de l'agent) sont servis par des liens signés temporaires, et la restriction de ces liens aux seuls fichiers attendus est en cours.
5.8 Restreindre l'accès aux URL protégées aux utilisateurs autorisés uniquement
Réponse de Cybernetics : Oui. L'application Cybernetics bénéficie d'URL protégées.
5.9 Restreindre l'accès aux fonctions protégées aux seuls utilisateurs autorisés
Réponse de Cybernetics : Partiellement. L'accès aux fonctions protégées est vérifié côté serveur par des politiques d'autorisation ; les cas résiduels décrits en 5.5 sont en cours de correction.
5.10 Restreindre les références d'objet directes aux seuls utilisateurs autorisés
Réponse de Cybernetics : Partiellement. Les contrôles d'autorisation sont centralisés dans des politiques côté serveur, appliquées aux requêtes de l'API, et couvrent la majorité des ressources ; des tests automatisés vérifient la frontière entre entreprises sur une partie des routes. Une revue de sécurité récente a toutefois identifié des cas résiduels d'autorisation entre entreprises et de contrôle des références d'objet (objets liés transmis dans une requête, éléments partagés, flux de sortie d'actifs, changement d'abonnement). Leur correction et leur couverture par des tests négatifs sont en cours.
5.11 Restreindre l'accès aux services aux seuls utilisateurs autorisés
Réponse de Cybernetics : Partiellement. L'accès aux services est réservé aux utilisateurs autorisés par des politiques côté serveur ; les cas résiduels décrits en 5.5 sont en cours de correction.
5.12 Restreindre l'accès aux données de l'application aux seuls utilisateurs autorisés
Réponse de Cybernetics : Partiellement. Les contrôles d'autorisation sont centralisés dans des politiques côté serveur, appliquées aux requêtes de l'API, et couvrent la majorité des ressources ; des tests automatisés vérifient la frontière entre entreprises sur une partie des routes. Une revue de sécurité récente a toutefois identifié des cas résiduels d'autorisation entre entreprises et de contrôle des références d'objet (objets liés transmis dans une requête, éléments partagés, flux de sortie d'actifs, changement d'abonnement). Leur correction et leur couverture par des tests négatifs sont en cours.
5.13 Restreindre l'accès aux attributs des utilisateurs et des données ainsi qu'aux informations de stratégie utilisées par les contrôles d'accès
Réponse de Cybernetics : Partiellement. L'accès aux attributs des utilisateurs, aux données et aux informations de politique est restreint par les politiques côté serveur ; les cas résiduels décrits en 5.5 sont en cours de correction.
5.14 Restreindre l'accès aux informations de configuration relatives à la sécurité aux seuls utilisateurs autorisés
Réponse de Cybernetics : Oui. L'application Cybernetics restreint l'accès aux informations de configuration relatives à la sécurité aux seuls utilisateurs autorisés.
5.15 La mise en œuvre côté serveur et les représentations de la couche de présentation des règles de contrôle d'accès doivent correspondre
Réponse de Cybernetics : Partiellement. Les permissions sont chargées depuis le serveur et propagées à l'interface, qui masque les actions non autorisées ; le serveur reste la seule source de décision. Les écarts d'autorisation résiduels décrits en 5.5 sont en cours de correction, et une incohérence de définition du rôle Éditeur (droits de modification non appliqués) est en cours d'analyse.
5.16 Si les données d'état doivent être stockées sur le client, utiliser le chiffrement et la vérification d'intégrité côté serveur pour détecter la falsification de l'état
Réponse de Cybernetics : Oui. Le serveur ne fait confiance à aucun état stocké côté client. Côté navigateur ne sont conservés que : le jeton de session opaque (cookie HttpOnly), les étapes de double authentification et du flux OAuth (cookies chiffrés et signés par le serveur, HttpOnly, à durée limitée), et des préférences d'affichage sans effet sur la sécurité (masquage des identités, vue choisie, mode d'édition), dans des cookies ou le stockage local. Les droits sont chargés depuis le serveur et revérifiés à chaque requête : modifier une préférence ou un cookie ne donne accès à rien.
5.17 Appliquer les flux logiques des applications pour se conformer aux règles métier
Réponse de Cybernetics : Oui. Cybernetics, avec son middleware, applique systématiquement toutes les règles métier avant tout accès à une ressource : validité du plan (dates de début et de fin), changement de mot de passe initial obligatoire, acceptation des CGU et de la politique de confidentialité, vérification RGPD, confirmation du compte. Tout manquement bloque l'accès avec une exception spécifique.
5.18 Limiter le nombre de transactions qu'un seul utilisateur ou appareil peut effectuer sur une période de temps donnée, suffisamment bas pour dissuader les attaques automatisées mais supérieur aux besoins réels de l'entreprise
Réponse de Cybernetics : Oui. Cybernetics applique une limitation de débit complète avec des profils granulaires adaptés à chaque type d'opération : lecture, mise à jour, suppression, authentification, réinitialisation de mot de passe… Les limites s'appliquent par adresse IP ou par adresse e-mail selon l'opération.
5.19 Utiliser l'en-tête « referer » comme vérification supplémentaire uniquement, il ne doit jamais être le seul contrôle d'autorisation car il peut être usurpé
Réponse de Cybernetics : Oui. Cybernetics n'utilise pas l'en-tête « referer » comme mécanisme d'autorisation. Le contrôle d'accès repose exclusivement sur les jetons d'authentification opaques et les politiques côté serveur. La configuration CORS restreint les origines autorisées via une liste d'autorisation explicite.
5.20 Si de longues sessions authentifiées sont autorisées, revalider périodiquement l'autorisation d'un utilisateur pour s'assurer que ses privilèges n'ont pas changé et si c'est le cas, déconnecter l'utilisateur et le forcer à se ré-authentifier
Réponse de Cybernetics : Partiellement. Les permissions sont rechargées depuis le serveur à chaque requête, et la durée de session est bornée (15 minutes d'inactivité, 8 heures au maximum, 24 heures fixes pour les comptes d'assistance). Les écarts d'autorisation décrits en 5.5 restent à corriger.
5.21 Mettre en œuvre l'audit des comptes et appliquer la désactivation des comptes inutilisés
Réponse de Cybernetics : Non. Il n'existe pas encore de désactivation automatique des comptes inactifs ni de revue périodique outillée des comptes : un compte reste actif tant qu'il n'est pas supprimé ou détaché de son entreprise. Seules les données inactives depuis 3 ans sont purgées automatiquement.
5.22 L'application doit prendre en charge la désactivation des comptes et la fin des sessions lorsque l'autorisation cesse
Réponse de Cybernetics : Partiellement. Lorsqu'un compte perd son rattachement à l'entreprise ou n'est plus confirmé, ses jetons de session sont révoqués à sa requête suivante ; un défaut de révocation au retrait d'un membre d'assistance est en cours de correction.
5.23 Les comptes de service ou les comptes prenant en charge les connexions vers ou depuis des systèmes externes doivent avoir le moins de privilèges possible
Réponse de Cybernetics : Partiellement. Les comptes de service Kubernetes ont des droits RBAC dédiés par namespace, sans jeton monté par défaut, et chaque base de données a son propre compte. Le compte applicatif de la base sert encore aux migrations de schéma, et un même certificat d'accès au KMS est utilisé pour toutes les entreprises ; leur séparation est planifiée.
5.24 Créer une politique de contrôle d'accès pour documenter les règles métier, les types de données et les critères et/ou processus d'autorisation d'accès d'une application afin que l'accès puisse être correctement provisionné et contrôlé. Cela comprend l'identification des exigences d'accès aux données et aux ressources système
Réponse de Cybernetics : Partiellement. Les règles d'accès sont définies dans le code (rôles, permissions par plan, politiques d'autorisation) et versionnées. Il n'existe pas encore de document de politique de contrôle d'accès distinct, relu et approuvé, et les écarts décrits en 5.5 montrent que la couverture doit être complétée.
5.25 Les représentations de la mise en œuvre côté serveur et de la couche de présentation des règles de contrôle d'accès doivent correspondre
Réponse de Cybernetics : Partiellement. Les permissions sont chargées depuis le serveur et propagées à l'interface, qui masque les actions non autorisées ; le serveur reste la seule source de décision. Les écarts résiduels décrits en 5.5 sont en cours de correction.
Pratiques cryptographiques
La gestion des pratiques cryptographiques est contrôlée par Cybernetics.
6.1 Toutes les fonctions cryptographiques utilisées pour protéger les secrets de l'utilisateur de l'application doivent être implémentées sur un système de confiance
Réponse de Cybernetics : Oui. Toutes les opérations cryptographiques sont effectuées côté serveur, sur notre API dédiée (api.cybernetics.fr).
6.2 Protéger les secrets contre tout accès non autorisé
Réponse de Cybernetics : Partiellement. Les secrets de la plateforme sont stockés dans OVHcloud OKMS et injectés par External Secrets Operator ; une politique Kyverno bloque les secrets Kubernetes créés hors de ce mécanisme, et les accès sont restreints par RBAC. Certaines clés applicatives sont encore partagées entre plusieurs usages, et des secrets de construction et de distribution doivent être retirés des pipelines et des binaires ; leur rotation et leur séparation sont en cours.
6.3 Les modules cryptographiques devraient échouer en toute sécurité
Réponse de Cybernetics : Partiellement. En cas d'indisponibilité du KMS, un chiffrement de secours géré par la plateforme est appliqué et tracé, puis remplacé par le chiffrement KMS lors des écritures suivantes ou d'un rechiffrement : ce mode de secours ne bénéficie pas de l'isolation par entreprise. Les échecs de déchiffrement sont journalisés. La procédure de désactivation d'une clé est en cours de fiabilisation.
6.4 Tous les nombres aléatoires, noms de fichiers aléatoires, GUID aléatoires et chaînes aléatoires doivent être générés à l'aide du générateur de nombres aléatoires approuvé par les modules cryptographiques
Réponse de Cybernetics : Oui. Les GUID/UUID sont bien aléatoires et gérés par notre technologie backend.
6.5 Les modules cryptographiques utilisés par l'application doivent être conformes à la norme FIPS 140-2 ou à une norme équivalente
Réponse de Cybernetics : Non revendiqué. Cybernetics n'active pas le mode FIPS de Node.js et ne revendique pas de conformité FIPS 140-2 ou 140-3. Les algorithmes utilisés (AES-256-GCM, HKDF-SHA256, SHA-256, et AES-256-CBC avec HMAC-SHA256 pour certaines données hors KMS) figurent parmi ceux recommandés par le NIST, mais cela ne vaut pas validation FIPS d'un module cryptographique. Argon2id, utilisé pour les mots de passe, n'est pas un algorithme approuvé FIPS.
6.6 Établir et utiliser une politique et un processus sur la façon dont les clés cryptographiques seront gérées
Réponse de Cybernetics : Partiellement. Chaque entreprise dispose de sa propre clé de service dans OVHcloud KMS, créée à son inscription. Cette clé génère des clés de données (chiffrement par enveloppe) : chaque valeur chiffrée est stockée avec sa clé de données chiffrée par le KMS, et la version en clair de cette clé n'est gardée en mémoire que pour une durée limitée (cache d'une minute). Chaque valeur est chiffrée en AES-256-GCM avec une sous-clé dérivée par HKDF-SHA256 à partir de la clé de données, d'un sel aléatoire et du contexte (entreprise, table, colonne). La compromission d'une clé de service isolée n'expose donc que les données de cette entreprise chiffrées par le KMS. D'autres données (secrets de connecteurs, certains champs d'entreprise et d'utilisateur, chiffrement de secours) sont protégées par des clés applicatives gérées par la plateforme et communes à toutes les entreprises ; un même certificat d'accès au KMS sert à toutes les entreprises. La liaison du chiffré à l'enregistrement hôte, la séparation des clés par usage et la vérification TLS du KMS sont en cours de renforcement. Les mots de passe sont hachés avec Argon2id.
Gestion des erreurs et journalisation
La gestion des erreurs et sa journalisation sont contrôlées par Cybernetics.
7.1 Ne pas divulguer d'information sensible dans les réponses aux erreurs, y compris les détails du système, les identifiants de session ou les informations de compte
Réponse de Cybernetics : Partiellement. Les erreurs attendues (authentification, autorisation, validation) renvoient des messages génériques ou des erreurs de champ, sans détail système. Certaines erreurs internes inattendues peuvent encore renvoyer leur message technique au client ; le passage systématique à un message générique, avec des tests dédiés, est en cours.
7.2 Utiliser des gestionnaires d'erreurs qui n'affichent pas d'information de débogage ou de trace de pile
Réponse de Cybernetics : Partiellement. En production, aucune trace de pile n'est renvoyée au client. Certaines erreurs internes peuvent encore exposer leur message technique (voir 7.1) ; leur correction est en cours.
7.3 Implémenter des messages d'erreur génériques et utiliser des pages d'erreur personnalisées
Réponse de Cybernetics : Partiellement. L'API renvoie des erreurs JSON génériques pour les erreurs attendues, et l'interface affiche une page d'erreur générique. Certaines erreurs internes peuvent encore renvoyer leur message technique (voir 7.1).
7.4 L'application doit gérer les erreurs d'application et ne pas s'appuyer sur la configuration du serveur
Réponse de Cybernetics : Oui. L'application Cybernetics gère les erreurs et ne relaie pas la gestion de la configuration du serveur.
7.5 Libérer correctement la mémoire allouée lorsque des conditions d'erreur se produisent
Réponse de Cybernetics : Oui. Cybernetics utilise des runtimes qui libèrent automatiquement la mémoire allouée à la fin de chaque requête, y compris en cas d'erreur.
7.6 La logique de gestion des erreurs associée aux contrôles de sécurité doit refuser l'accès par défaut
Réponse de Cybernetics : Partiellement. Les politiques d'autorisation et les middlewares refusent l'accès par défaut (401 et 403). Les erreurs internes inattendues renvoient une erreur 500, mais pas toujours avec un message générique (voir 7.1).
7.7 Tous les contrôles de journalisation doivent être implémentés sur un système fiable
Réponse de Cybernetics : Oui. Cybernetics écrit ses journaux applicatifs côté serveur uniquement. Le journal d'audit est stocké dans une base PostgreSQL dédiée, séparée de la base principale, avec ses propres identifiants et une connexion TLS vérifiée ; les journaux techniques sont centralisés dans Datadog.
7.8 Les contrôles de journalisation doivent prendre en charge à la fois le succès et l'échec des événements de sécurité spécifiés
Réponse de Cybernetics : Oui. Cybernetics enregistre explicitement les événements de succès et d'échec pour chaque tentative d'authentification. Nous récoltons également via Datadog des journaux complémentaires liés aux événements de sécurité spécifiés.
7.9 S'assurer que les journaux contiennent des données d'événements de journal importantes
Réponse de Cybernetics : Partiellement. Les journaux applicatifs contiennent l'horodatage, le niveau et des identifiants de trace, et le journal d'audit enregistre la ressource, l'action et les valeurs modifiées ; il n'enregistre pas encore l'auteur, la requête ni la source de chaque modification, et leur ajout est planifié.
7.10 S'assurer que les entrées de journal qui incluent des données non fiables ne s'exécuteront pas en tant que code dans l'interface ou le logiciel d'affichage des journaux prévu
Réponse de Cybernetics : Oui. Les journaux sont structurés en JSON et stockés en PostgreSQL. Aucune interpolation de chaîne non échappée n'est effectuée. Datadog affiche les journaux en texte brut, sans interpréter leur contenu.
7.11 Restreindre l'accès aux journaux aux seules personnes autorisées
Réponse de Cybernetics : Oui. Cybernetics restreint l'accès aux journaux (infrastructure, applicatifs) via RBAC et par des politiques.
7.12 Utiliser une routine centrale pour toutes les opérations de journalisation
Réponse de Cybernetics : Oui. Cybernetics applique une routine centrale pour toutes les opérations de journalisation, visible par l'utilisateur dans l'interface du produit.
7.13 Ne pas stocker d'informations sensibles dans les journaux, y compris les détails inutiles du système, les identifiants de session ou les mots de passe
Réponse de Cybernetics : Partiellement. Les mots de passe, jetons, cookies, en-têtes d'authentification, secrets et adresses e-mail sont masqués automatiquement dans les journaux du serveur, selon le nom des champs. Sur les postes, un journal local de l'agent peut contenir un secret après une requête en échec ; sa correction est planifiée. Une valeur incluse dans un message d'erreur n'est pas masquée. Les copies d'e-mails conservées pour une nouvelle tentative d'envoi sont chiffrées et supprimées après l'envoi, mais deux types d'e-mails contenant un mot de passe temporaire ne sont pas encore exclus de cette conservation.
7.14 S'assurer qu'il existe un mécanisme pour effectuer l'analyse des journaux
Réponse de Cybernetics : Oui. Cybernetics permet à l'utilisateur d'analyser ses journaux depuis l'interface du produit. Côté exploitation, Datadog (région EU) analyse les journaux en temps réel, détecte les anomalies, et des tableaux de bord surveillent les événements de sécurité.
7.15 Consigner tous les échecs de validation d'entrée
Réponse de Cybernetics : Partiellement. Les échecs de validation renvoient une erreur 422 et sont visibles dans les traces HTTP de Datadog (route et code de statut), mais ne font pas l'objet d'une entrée dédiée dans les journaux applicatifs. Les échecs d'authentification sont, eux, enregistrés explicitement dans notre base de journalisation.
7.16 Enregistrer toutes les tentatives d'authentification, en particulier les échecs
Réponse de Cybernetics : Partiellement. Les tentatives de connexion par mot de passe et par Google ou Microsoft, réussies ou échouées, sont enregistrées et consultables dans Journaux > Connexion ; les vérifications de double authentification dans Journaux > MFA. Les connexions par passkey figurent dans l'historique du profil de l'utilisateur, mais pas encore dans les journaux de l'entreprise.
7.17 Enregistrer tous les échecs de contrôle d'accès
Réponse de Cybernetics : Partiellement. Les refus d'autorisation levés par les politiques sont visibles dans les journaux techniques ; une entrée dédiée et systématique, avec l'identité de l'utilisateur, est planifiée.
7.18 Enregistrer tous les événements de falsification apparentes, y compris les modifications inattendues des données d'état
Réponse de Cybernetics : Partiellement. Les liens signés invalides ou falsifiés et les jetons expirés sont refusés et visibles dans les traces HTTP de Datadog. Il n'existe pas encore de détection dédiée des modifications inattendues des données d'état (voir 7.24).
7.19 Consigner les tentatives de connexion avec des jetons de session invalides ou expirés
Réponse de Cybernetics : Partiellement. Une requête avec un jeton de session invalide ou expiré est refusée (401) et visible dans les traces HTTP de Datadog ; elle ne fait pas l'objet d'une entrée dédiée dans les journaux applicatifs.
7.20 Consigner toutes les exceptions du système
Réponse de Cybernetics : Oui. Les erreurs serveur (5xx) sont journalisées avec l'erreur complète et l'identifiant de trace ; les autres erreurs client (4xx) le sont avec leur seul message, à l'exception des erreurs attendues d'authentification et de validation (401, 422, 400), non journalisées en détail. Les champs sensibles sont masqués (voir 7.13), et Datadog capture en plus les exceptions non gérées.
7.21 Enregistrer toutes les fonctions administratives, y compris les modifications apportées aux paramètres de configuration de sécurité
Réponse de Cybernetics : Partiellement. Cybernetics trace automatiquement dans un journal d'audit les créations, modifications et suppressions des entités sensibles : utilisateurs (rôle, double authentification, mot de passe masqué), secrets de connecteurs, méthodes d'authentification, passkeys, appareils, comptes et agents. Ce journal est consultable et exportable dans l'application, mais il n'enregistre pas encore l'auteur de chaque modification. Certains paramètres d'administration, comme les permissions de l'entreprise et des utilisateurs ou les réglages de l'agent, ne sont pas encore couverts.
7.22 Consigner tous les échecs de connexion TLS backend
Réponse de Cybernetics : Partiellement. La connexion à la base de données exige TLS avec vérification du certificat : un échec empêche la connexion et apparaît dans les journaux d'erreurs de l'application. Il n'existe pas de journalisation dédiée des échecs TLS vers les autres systèmes.
7.23 Consigner les échecs du module cryptographique
Réponse de Cybernetics : Oui. Cybernetics consigne les opérations cryptographiques (chiffrement, hachage) et lève des exceptions en cas d'échec. Ces exceptions sont tracées par Datadog.
L'utilisateur peut constater par lui-même les échecs de chiffrement dans l'interface.
7.24 Utiliser une fonction de hachage cryptographique pour valider l'intégrité des entrées de journal
Réponse de Cybernetics : Non. Aucune fonction de hachage cryptographique ne protège aujourd'hui l'intégrité des entrées de journal. Le journal d'audit est stocké dans une base PostgreSQL dédiée, avec ses propres identifiants : cela garantit la cohérence des écritures, mais ne permet pas de détecter la modification ou la suppression d'un ancien événement par un compte disposant de droits d'écriture. Un chaînage cryptographique des événements et une copie vers un stockage immuable sont planifiés.
Protection des données
La protection des données est contrôlée et mise en place par Cybernetics.
8.1 Implémenter le moindre privilège et limiter les utilisateurs aux seules fonctionnalités, données et informations système nécessaires à l'exécution de leurs tâches
Réponse de Cybernetics : Partiellement. Cybernetics applique le moindre privilège avec des rôles (Lecteur, Éditeur, Administrateur, Admin Support) et l'intersection avec les permissions du plan. Les contrôles d'autorisation sont centralisés dans des politiques côté serveur, appliquées aux requêtes de l'API, et couvrent la majorité des ressources ; des tests automatisés vérifient la frontière entre entreprises sur une partie des routes. Une revue de sécurité récente a toutefois identifié des cas résiduels d'autorisation entre entreprises et de contrôle des références d'objet (objets liés transmis dans une requête, éléments partagés, flux de sortie d'actifs, changement d'abonnement). Leur correction et leur couverture par des tests négatifs sont en cours.
8.2 Protéger toutes les copies en cache ou temporaires des données sensibles stockées sur le serveur contre tout accès non autorisé et purger ces fichiers de travail temporaires dès qu'ils ne sont plus nécessaires
Réponse de Cybernetics : Partiellement. Cybernetics conserve les clés de chiffrement déchiffrées dans un cache mémoire limité à une minute et efface les tampons de clés après usage ; les copies sous forme de chaînes ne peuvent pas être effacées dans un runtime JavaScript, et l'effacement en cas d'erreur est en cours de correction. Les conteneurs tournent avec un système de fichiers racine en lecture seule et l'API ne traite aucun fichier envoyé : aucun fichier temporaire sensible n'est écrit sur disque.
8.3 Chiffrer les informations stockées hautement sensibles, telles que les données de vérification d'authentification, même si elles se trouvent côté serveur
Réponse de Cybernetics : Oui. Cybernetics hache les mots de passe et les codes de récupération avec Argon2id. Les secrets de double authentification (TOTP) et les identifiants de connecteurs sont chiffrés en base, et les jetons de réinitialisation de mot de passe ne sont stockés que sous forme d'empreinte SHA-256.
8.4 Protéger le code source côté serveur contre le téléchargement par un utilisateur
Réponse de Cybernetics : Oui. Aucun code serveur n'est accessible publiquement : l'API s'exécute dans des conteneurs durcis non root, et seules les ressources client nécessaires (JavaScript produit par le build Nuxt, CSS, images) sont distribuées au navigateur. Le serveur de fichiers statiques de l'API ne sert que des images publiques, et Traefik bloque l'accès aux chemins sensibles (package.json, .env, .git, node_modules, fichiers de configuration, source maps).
8.5 Ne pas stocker les mots de passe, les chaînes de connexion ou autres informations sensibles en texte clair ou de toute manière non cryptographiquement sécurisée du côté client
Réponse de Cybernetics : Oui. Aucun mot de passe ni jeton d'accès n'est stocké dans le localStorage ou le sessionStorage : le jeton de session est conservé dans des cookies HttpOnly. Il transite une seule fois dans la réponse de connexion avant d'être placé en cookie. Pendant la double authentification, le stockage de session ne contient que l'adresse e-mail et la méthode, effacées une fois l'authentification terminée.
8.6 Supprimer les commentaires dans le code de production accessible à l'utilisateur qui peuvent révéler le système backend ou d'autres informations sensibles
Réponse de Cybernetics : Oui. Le build Nuxt minifie le JavaScript livré au navigateur (renommage des variables) et en retire les commentaires ainsi que les appels console et debugger ; les source maps sont bloquées par Traefik en production. La minification n'est pas une frontière de sécurité : les contrôles d'autorisation sont faits côté serveur, et la configuration publique livrée au navigateur ne contient aucun secret.
8.7 Supprimer la documentation inutile sur les applications et le système, car cela peut révéler des informations utiles aux attaquants
Réponse de Cybernetics : Oui. Cybernetics n'expose pas de documentation d'API (Swagger/OpenAPI) en production : les spécifications sont générées hors ligne et ne sont pas incluses dans l'image déployée, et les routes de test internes ne sont chargées qu'en environnement de test.
8.8 Ne pas inclure d'informations sensibles dans les paramètres de la requête HTTP GET
Réponse de Cybernetics : Partiellement. Cybernetics transmet les mots de passe, codes de double authentification et jetons de session dans le corps des requêtes POST ou dans des en-têtes, jamais dans l'URL ; le jeton de réinitialisation de mot de passe voyage dans le fragment d'URL, qui n'est pas envoyé au serveur. En revanche, l'adresse e-mail apparaît encore dans l'URL de certaines requêtes (demande de réinitialisation, renvoi du code), et le lien d'invitation porte un jeton signé en paramètre.
8.9 Désactiver les fonctionnalités de saisie semi-automatique sur les formulaires susceptibles de contenir des informations sensibles, y compris l'authentification
Réponse de Cybernetics : Partiellement. Cybernetics désactive l'autocomplétion sur le champ du code de double authentification et utilise l'attribut « new-password » sur les formulaires de création et de réinitialisation de mot de passe. Le formulaire de connexion autorise volontairement les gestionnaires de mots de passe (« username », « current-password »), comme le recommandent les pratiques actuelles.
8.10 Désactiver la mise en cache côté client sur les pages contenant des informations sensibles
Réponse de Cybernetics : Partiellement. Cybernetics interdit la mise en cache (Cache-Control: no-store) des réponses qui contiennent des liens d'accès temporaires, et le jeton de session n'est jamais présent dans une page mise en cache. En revanche, un en-tête anti-cache n'est pas encore appliqué à toutes les réponses de l'API et à toutes les pages sensibles.
8.11 L'application doit prendre en charge la suppression des données sensibles lorsque ces données ne sont plus nécessaires
Réponse de Cybernetics : Partiellement. Une tâche planifiée supprime automatiquement les données qui ne sont plus nécessaires : les événements de sécurité et les e-mails collectés au bout de 7 jours, les données inactives depuis 3 ans, et les entreprises dont l'abonnement a expiré depuis plus de 2 jours, avec leurs journaux. Les jetons de réinitialisation sont à usage unique et expirent après 10 minutes. Deux limites : la clé de service KMS d'une entreprise supprimée n'est pas encore désactivée automatiquement, et les données restent dans les sauvegardes jusqu'à la fin de leur durée de conservation. La politique de suppression (délai, préavis, sauvegardes, clés) est en cours de formalisation.
8.12 Mettre en œuvre des contrôles d'accès appropriés pour les données sensibles stockées sur le serveur. Cela inclut les données mises en cache, les fichiers temporaires et les données qui ne devraient être accessibles que par des utilisateurs spécifiques du système
Réponse de Cybernetics : Partiellement. Cybernetics isole les données de chaque entreprise : les accès sont vérifiés par une politique d'autorisation qui compare l'entreprise de l'utilisateur à celle de la ressource. Les identités des comptes et des appareils sont chiffrées avec la clé de service propre à chaque entreprise dans OVHcloud KMS, et chaque valeur avec une sous-clé dérivée selon l'entreprise, la table et la colonne ; les autres données chiffrées le sont avec des clés applicatives de la plateforme (voir 6.6). Les écarts de cloisonnement décrits en 5.5 sont en cours de correction.
Sécurité des communications
9.1 Mettre en œuvre le chiffrement pour la transmission de toutes les informations sensibles. Cela doit inclure TLS pour protéger la connexion et peut être complété par un chiffrement discret des fichiers sensibles ou des connexions non HTTP
Réponse de Cybernetics : Oui. Cybernetics chiffre toutes les communications externes en TLS sur chaque segment : du navigateur à Cloudflare, puis de Cloudflare à l'origine ; Cloudflare termine la première connexion TLS et en ouvre une seconde vers l'origine (mode SSL « Full (strict) » et Authenticated Origin Pulls). Les connexions de l'application à la base PostgreSQL sont elles aussi chiffrées. Les données sensibles sont en plus chiffrées au niveau applicatif, avec des clés gérées dans OVHcloud KMS.
9.2 Les certificats TLS doivent être valides et avoir le nom de domaine correct, ne pas être expirés et être installés avec des certificats intermédiaires si nécessaire
Réponse de Cybernetics : Oui. Cybernetics obtient ses certificats d'origine auprès de Let's Encrypt via cert-manager (défi DNS-01), un certificat par domaine, renouvelé automatiquement 30 jours avant expiration. Des enregistrements CAA limitent les autorités autorisées à émettre, et Cloudflare valide ces certificats en mode « Full (strict) ».
9.3 Les connexions TLS échouées ne doivent pas revenir à une connexion non sécurisée
Réponse de Cybernetics : Oui. Cybernetics redirige systématiquement HTTP vers HTTPS chez Cloudflare (« Always Use HTTPS ») et envoie HSTS pour un an, sous-domaines inclus, via Cloudflare, Traefik et l'application. Le domaine cybernetics.fr est effectivement inscrit dans la liste de préchargement HSTS des navigateurs (statut vérifié sur hstspreload.org). Les routes publiques ne sont exposées qu'en TLS, sans repli vers une connexion non chiffrée.
9.4 Utiliser les connexions TLS pour tout le contenu nécessitant un accès authentifié et pour toutes les autres informations sensibles
Réponse de Cybernetics : Oui. Cybernetics sert l'ensemble de l'application, de l'API et des pages authentifiées uniquement en HTTPS. Une politique Kyverno bloque le déploiement de tout Ingress sans TLS.
9.5 Utiliser TLS pour les connexions à des systèmes externes impliquant des informations ou des fonctions sensibles
Réponse de Cybernetics : Partiellement. Cybernetics chiffre en TLS les connexions vers ses systèmes externes. La base PostgreSQL est jointe en TLS avec vérification du certificat par l'autorité du fournisseur, et les URL de connecteurs saisies par les clients doivent obligatoirement être en HTTPS. Le durcissement de la validation des certificats serveur est en cours de généralisation à l'ensemble des connecteurs.
9.6 Utiliser une seule implémentation TLS standard configurée de manière appropriée
Réponse de Cybernetics : Oui. Cybernetics s'appuie sur des implémentations TLS standard : Cloudflare en périphérie et Traefik à l'origine. Les deux imposent TLS 1.2 au minimum (TLS 1.3 activé chez Cloudflare). Côté Traefik, seules des suites ECDHE avec AES-GCM ou ChaCha20-Poly1305 sont acceptées, avec vérification stricte du nom de serveur (SNI).
9.7 Spécifier les codages de caractères pour toutes les connexions
Réponse de Cybernetics : Oui. Cybernetics échange ses données en UTF-8 : l'API décode les requêtes en UTF-8 et renvoie ses réponses JSON et texte avec « charset=utf-8 » dans l'en-tête Content-Type.
9.8 Filtrer les paramètres contenant des informations sensibles du référent HTTP, lors de la création de liens vers des sites externes
Réponse de Cybernetics : Oui. La politique de référent effectivement envoyée par le proxy (Traefik) est « strict-origin-when-cross-origin » : vers un site externe, seule l'origine est transmise, jamais le chemin ni les paramètres de l'URL.
Configuration du système
10.1 S'assurer que les serveurs, les frameworks et les composants du système exécutent la dernière version approuvée
Réponse de Cybernetics : Oui. Cybernetics fonctionne sur des versions récentes et maintenues : Node.js 24 (Docker Hardened Images), AdonisJS 7, Nuxt 4 et Traefik 3.7. Les versions sont épinglées et mises à jour via Dependabot.
10.2 S'assurer que les serveurs, les frameworks et les composants du système disposent de tous les correctifs publiés pour la version utilisée
Réponse de Cybernetics : Partiellement. Dependabot vérifie chaque semaine les dépendances npm, les actions GitHub et les images Docker ; les images tierces sont réanalysées chaque semaine (Grype) et les nœuds redémarrent automatiquement pour appliquer les correctifs système. Les contrôles de sécurité de l'intégration continue ne sont pas encore bloquants sur tous les dépôts, et une partie des actions GitHub n'est pas épinglée par empreinte ; leur généralisation est en cours.
10.3 Désactiver les listes d'annuaire
Réponse de Cybernetics : Oui. Cybernetics ne propose aucun listing de répertoires : les fichiers statiques sont servis sans index automatique, les fichiers cachés sont ignorés, et l'accès aux chemins sensibles (.git, node_modules, fichiers de configuration, source maps) est bloqué par Traefik.
10.4 Restreindre le serveur Web, les comptes de processus et de service au moins de privilèges possible
Réponse de Cybernetics : Partiellement. Les conteneurs applicatifs tournent avec un utilisateur non root, sans élévation de privilèges, avec toutes les capabilities Linux retirées, un système de fichiers racine en lecture seule et un profil seccomp, imposés par des politiques Kyverno bloquantes ; l'agent installé sur les postes tourne encore avec des privilèges élevés (voir 14.7).
10.5 Lorsque des exceptions se produisent, cela doit échouer en toute sécurité
Réponse de Cybernetics : Partiellement. Une session invalide est refusée et son cookie effacé, et les appels vers les services externes échouent rapidement au lieu de contourner les contrôles. Certaines erreurs internes renvoient encore leur message technique (voir 7.1).
10.6 Supprimer toutes les fonctionnalités et fichiers inutiles
Réponse de Cybernetics : Oui. Cybernetics construit ses images en plusieurs étapes : seuls le résultat compilé et les dépendances de production sont copiés dans une image finale minimale (Docker Hardened Image, sans shell ni gestionnaire de paquets). Les fichiers de build sensibles sont supprimés de l'image de l'interface.
10.7 Supprimer le code de test ou toute fonctionnalité non destinée à la production, avant le déploiement
Réponse de Cybernetics : Partiellement. Cybernetics exclut les dépendances de développement et de test de ses images de production, et l'image de l'interface ne contient que le résultat du build. Les fichiers de test sources ne sont pas encore systématiquement exclus de l'image de l'API ; ils ne sont pas exposés publiquement.
10.8 Empêcher la divulgation de la structure de répertoires dans le fichier robots.txt en plaçant les répertoires non destinés à l'indexation publique dans un répertoire parent isolé
Réponse de Cybernetics : Oui. Cybernetics interdit par défaut l'indexation de l'application (« Disallow: / ») et n'autorise nommément que quelques pages publiques : aucun chemin interne ou d'administration n'y figure. L'API et l'application envoient en plus un en-tête « X-Robots-Tag: noindex ».
10.9 Définir quelles méthodes HTTP, GET ou POST, l'application prendra en charge et si elles seront gérées différemment dans différentes pages de l'application
Réponse de Cybernetics : Oui. Cybernetics déclare explicitement chaque route de l'API avec sa méthode HTTP (GET, POST, PUT, PATCH, DELETE). La substitution de méthode est désactivée et la politique CORS liste les méthodes autorisées.
10.10 Désactiver les méthodes HTTP inutiles
Réponse de Cybernetics : Partiellement. Cybernetics bloque les méthodes TRACE et CONNECT sur l'API au niveau du WAF Cloudflare, et l'API ne répond qu'aux méthodes explicitement déclarées. Ce blocage explicite n'est pas encore étendu à tous les domaines.
10.11 Si le serveur Web gère différentes versions de HTTP, s'assurer qu'elles sont configurées de la même manière et s'assurer que toutes les différences sont comprises
Réponse de Cybernetics : Partiellement. Cybernetics applique ses règles de sécurité (TLS, en-têtes, filtrage) au niveau de Cloudflare et de Traefik, quelle que soit la version du protocole utilisée par le client. HTTP/3 est volontairement désactivé à l'origine. Les versions HTTP proposées par Cloudflare ne sont pas encore déclarées explicitement dans notre configuration Terraform.
10.12 Supprimer les informations inutiles des en-têtes de réponse HTTP liées au système d'exploitation, à la version du serveur web et aux frameworks applicatifs
Réponse de Cybernetics : Oui. Les en-têtes qui révèlent la technologie utilisée ne sont pas exposés : l'en-tête Server est vidé par Traefik et X-Powered-By n'est pas émis.
10.13 Le magasin de configuration de sécurité de l'application doit pouvoir être affiché sous une forme lisible par l'homme pour prendre en charge l'audit
Réponse de Cybernetics : Oui. Cybernetics versionne toute sa configuration de sécurité dans Git, sous forme lisible : valeurs Helm, politiques Kyverno, règles Cloudflare et infrastructure Terraform. Toute modification faite hors code apparaît comme un écart au plan Terraform. Un dossier de preuves de conformité (JSON, Markdown, PDF) est généré automatiquement chaque semaine pour les audits.
10.14 Mettre en œuvre un système de gestion des actifs et y enregistrer les composants du système et les logiciels
Réponse de Cybernetics : Oui. Cybernetics recense ses composants dans le code : l'infrastructure est décrite en Terraform, les images tierces sont inventoriées dans un registre miroir signé (Cosign) avec attestation de provenance, et un inventaire logiciel (SBOM) des images en fonctionnement est produit en continu par Datadog.
10.15 Isoler les environnements de développement du réseau de production et donner accès uniquement aux groupes de développement et de test autorisés
Réponse de Cybernetics : Partiellement. Cybernetics sépare la préproduction de la production : namespaces Kubernetes, bases de données, comptes et clés de chiffrement dédiés, et accès à la préproduction réservé aux collaborateurs authentifiés par SSO via Cloudflare Access. Les deux environnements partagent pour l'instant le même cluster Kubernetes et le même serveur de base de données.
10.16 Mettre en œuvre un système de contrôle des modifications logicielles pour gérer et enregistrer les modifications apportées au code à la fois en développement et en production
Réponse de Cybernetics : Partiellement. Toutes les modifications sont gérées dans Git (GitHub) : code, infrastructure et configuration. Les contrôles automatiques (qualité, CodeQL, dépendances, secrets) sont bloquants avant publication sur le site web ; sur l'API, l'interface et l'agent, ils ne s'appliquent pas encore à tous les contributeurs ni à tous les tags de publication, et les tests de bout en bout ne tournent pas en intégration continue. Leur généralisation est en cours.
Sécurité de la base de données
11.1 Utiliser des requêtes paramétrées fortement typées
Réponse de Cybernetics : Oui. Cybernetics accède à PostgreSQL via le query builder et l'ORM Lucid (AdonisJS), qui paramètrent les requêtes. Les quelques fragments SQL bruts utilisent des paramètres liés ; les seules valeurs interpolées sont des constantes internes ou des valeurs issues d'une liste fermée (par exemple le sens de tri), jamais une saisie libre.
11.2 Utiliser la validation d'entrée et le codage de sortie et s'assurer de traiter les métacaractères. Si ceux-ci échouent, ne pas exécuter la commande de base de données
Réponse de Cybernetics : Oui. Cybernetics valide les entrées côté API avec des schémas VineJS (types, formats, listes fermées, expressions régulières) et rejette la requête avant tout traitement si la validation échoue. Côté interface, Vue échappe automatiquement le contenu affiché et aucun rendu HTML brut (v-html) n'est utilisé.
11.3 S'assurer que les variables sont fortement typées
Réponse de Cybernetics : Partiellement. Cybernetics est développé en TypeScript, avec vérification des types dans l'intégration continue et contrôle strict des valeurs nulles. Certaines options du mode strict (comme noImplicitAny) ne sont pas encore activées sur l'API.
11.4 L'application doit utiliser le niveau de privilège le plus bas possible lors de l'accès à la base de données
Réponse de Cybernetics : Partiellement. Cybernetics utilise un compte PostgreSQL dédié par base (données applicatives, journalisation) et par environnement, distinct du compte d'administration du service managé. Ce compte applicatif sert aussi aux migrations de schéma : il n'existe pas encore de séparation fine entre droits de lecture, d'écriture et de modification du schéma.
11.5 Utiliser des informations d'identification sécurisées pour accéder à la base de données
Réponse de Cybernetics : Oui. Cybernetics stocke les identifiants de base dans le gestionnaire de secrets OVHcloud OKMS et les injecte dans les pods par External Secrets, jamais dans le code ; Kyverno bloque tout secret Kubernetes créé hors de ce mécanisme. En production, la connexion à PostgreSQL est chiffrée en TLS avec vérification du certificat, et les mots de passe de base sont stockés en SCRAM-SHA-256.
11.6 Les chaînes de connexion ne doivent pas être codées en dur dans l'application. Les chaînes de connexion doivent être stockées dans un fichier de configuration distinct sur un système approuvé et elles doivent être chiffrées
Réponse de Cybernetics : Oui. Cybernetics ne code en dur aucune chaîne de connexion : hôte, port, utilisateur, mot de passe et base sont lus depuis des variables d'environnement typées et validées au démarrage. En production, ces valeurs proviennent du gestionnaire de secrets chiffré OVHcloud OKMS, et aucun fichier .env n'est versionné.
11.7 Utiliser des procédures stockées pour abstraire l'accès aux données et permettre la suppression des autorisations sur les tables de base de la base de données
Réponse de Cybernetics : Non. Cybernetics n'utilise pas de procédures stockées. L'accès aux données passe par la couche d'abstraction de l'ORM Lucid (modèles, requêtes paramétrées) et par des contrôles d'autorisation applicatifs.
11.8 Fermer la connexion dès que possible
Réponse de Cybernetics : Oui. Cybernetics gère les connexions par un pool (de 2 à 10 connexions par base) : elles sont rendues au pool dès la fin de chaque requête, et les connexions inactives sont fermées automatiquement.
11.9 Supprimer ou modifier tous les mots de passe administratifs de base de données par défaut
Réponse de Cybernetics : Partiellement. Cybernetics utilise une base PostgreSQL managée par OVHcloud et n'utilise jamais le compte d'administration du service : l'application se connecte avec des comptes dédiés, dont les mots de passe sont générés par le fournisseur et renouvelés selon une procédure documentée.
11.10 Désactiver toutes les fonctionnalités inutiles de la base de données
Réponse de Cybernetics : Partiellement. Cybernetics active uniquement les extensions PostgreSQL nécessaires (unaccent, pg_trgm), et la base n'est accessible que depuis le réseau privé du cluster. Les autres fonctionnalités du moteur relèvent de l'offre managée OVHcloud et ne font pas l'objet d'une désactivation spécifique de notre part.
11.11 Supprimer le contenu inutile du fournisseur par défaut (comme des exemples de schémas)
Réponse de Cybernetics : Partiellement. Cybernetics ne crée aucun schéma ni jeu de données d'exemple en production : les données de démonstration et de test sont réservées aux environnements hors production. Le contenu initial fourni par le service managé relève d'OVHcloud.
11.12 Désactiver tous les comptes par défaut qui ne sont pas requis pour prendre en charge les exigences de l'entreprise
Réponse de Cybernetics : Partiellement. Cybernetics ne crée que les comptes de base strictement nécessaires (un par base et par environnement), et l'application n'utilise aucun compte par défaut. Les comptes système internes du service managé sont gérés par OVHcloud.
11.13 L'application doit se connecter à la base de données avec des informations d'identification différentes pour chaque distinction de confiance (par exemple utilisateur, utilisateur en lecture seule, invité, administrateurs)
Réponse de Cybernetics : Partiellement. Cybernetics sépare les identifiants de base par usage et par environnement : un compte pour les données applicatives, un autre pour la journalisation, et des comptes distincts entre production et préproduction. Il n'existe pas encore de comptes distincts par niveau de privilège (lecture seule, écriture, administration).
Gestion des fichiers
12.1 Ne pas transmettre les données fournies par l'utilisateur directement à une fonction d'inclusion dynamique
Réponse de Cybernetics : Oui. Cybernetics n'inclut ni ne charge dynamiquement aucun code à partir de données fournies par l'utilisateur : les seuls chargements dynamiques portent sur des modules internes d'un répertoire fixe de l'application.
12.2 Exiger une authentification avant d'autoriser le téléchargement d'un fichier
Réponse de Cybernetics : Sans objet. Cybernetics ne permet pas le téléversement de fichiers par les utilisateurs. Les images (avatar, fond d'écran) et les preuves de conformité sont référencées par URL, et toutes les routes qui modifient ces données exigent une authentification et une autorisation.
12.3 Limiter le type de fichiers pouvant être téléchargés uniquement aux types nécessaires à des fins commerciales
Réponse de Cybernetics : Sans objet. Cybernetics ne permet pas le téléversement de fichiers. L'avatar est une URL : son contrôle porte sur l'extension indiquée dans l'URL (JPEG ou PNG), pas sur le type réel du contenu. Côté navigateur, la politique de sécurité du contenu (CSP) n'autorise le chargement d'images que depuis l'application elle-même et Intercom.
12.4 Vérifier que les fichiers téléchargés sont du type attendu en vérifiant les en-têtes de fichiers plutôt que par extension de fichier
Réponse de Cybernetics : Sans objet. Cybernetics ne reçoit ni ne stocke aucun fichier des utilisateurs, et le serveur ne télécharge jamais les images référencées par URL. Le contrôle des URL d'image porte sur l'extension, non sur le contenu ; la CSP de l'application limite par ailleurs les sources d'images autorisées.
12.5 Ne pas enregistrer les fichiers dans le même contexte Web que l'application
Réponse de Cybernetics : Sans objet. Cybernetics ne stocke aucun fichier téléversé par les utilisateurs. Les seuls fichiers distribués (installateurs de l'agent Cybernetics) sont hébergés sur un stockage objet OVHcloud séparé de l'application et servis par des liens temporaires signés.
12.6 Empêcher ou restreindre le téléchargement de tout fichier pouvant être interprété par le serveur Web
Réponse de Cybernetics : Sans objet. Cybernetics ne permet pas le téléversement de fichiers ; aucun fichier fourni par un utilisateur ne peut donc être exécuté ou interprété par le serveur.
12.7 Désactiver les privilèges d'exécution sur les répertoires de téléchargement de fichiers
Réponse de Cybernetics : Sans objet. Cybernetics n'a pas de répertoire de téléversement. De plus, le système de fichiers des conteneurs applicatifs est en lecture seule et les conteneurs s'exécutent sans privilèges root.
12.8 Implémenter le téléchargement sécurisé sous UNIX en montant le répertoire de fichiers ciblé en tant que lecteur logique à l'aide du chemin associé ou de l'environnement chrooté
Réponse de Cybernetics : Sans objet. Cybernetics ne permet pas le téléversement de fichiers. Les applications s'exécutent dans des conteneurs Kubernetes isolés, non root, avec un système de fichiers racine en lecture seule, et Kyverno interdit les montages de volumes de l'hôte.
12.9 Lorsque des fichiers existants sont référencés, utiliser une liste d'autorisation de noms et de types de fichiers autorisés
Réponse de Cybernetics : Partiellement. L'avatar référencé par URL est limité aux formats JPEG et PNG. Les liens de preuve de conformité acceptent aujourd'hui les schémas http, https, smb et file, pour référencer un document conservé sur un partage interne de l'entreprise. Ces liens sont uniquement enregistrés comme texte : le serveur ne les ouvre ni ne les récupère jamais, et l'application ne les affiche pas comme liens cliquables. Les schémas smb et file présentent toutefois des risques côté poste de travail (partages internes, emplacements locaux) : leur restriction est planifiée.
12.10 Ne pas transmettre les données fournies par l'utilisateur dans une redirection dynamique
Réponse de Cybernetics : Partiellement. Les redirections d'authentification et de paiement sont générées côté serveur à partir de la configuration des fournisseurs, et les liens signés reçus par e-mail sont validés contre leur route d'API exacte, à une exception près en cours de correction. Côté interface, certains identifiants issus de l'URL de la page sont encore insérés dans les chemins d'appel de l'API sans validation de format ; les autorisations côté serveur s'appliquent, et leur validation est planifiée.
12.11 Ne pas transmettre les chemins de répertoire ou de fichier, utiliser les valeurs d'index mappées à une liste de chemins prédéfinie
Réponse de Cybernetics : Partiellement. Les ressources sont désignées par des identifiants (UUID) et aucun chemin de fichier n'est reçu des utilisateurs ; l'agent transmet encore un nom de fichier d'installation dont la restriction à une liste fermée est en cours.
12.12 Ne jamais envoyer le chemin absolu du fichier au client
Réponse de Cybernetics : Oui. Cybernetics ne renvoie jamais de chemin de fichier du serveur au client : les réponses de l'API ne contiennent que des données métier et des URL publiques.
12.13 S'assurer que les fichiers et les ressources de l'application sont en lecture seule
Réponse de Cybernetics : Oui. Cybernetics déploie ses applications avec un système de fichiers racine en lecture seule ; une politique Kyverno en mode bloquant rejette tout conteneur qui ne respecte pas cette règle.
12.14 Analyser les fichiers téléchargés par l'utilisateur à la recherche de virus et de logiciels malveillants
Réponse de Cybernetics : Sans objet. Cybernetics ne permet pas le téléversement de fichiers ; aucune analyse antivirus n'est donc nécessaire côté plateforme.
Gestion de la mémoire
13.1 Utiliser des contrôles d'entrée et de sortie pour les données non fiables
Réponse de Cybernetics : Partiellement. Cybernetics valide toutes les requêtes reçues par l'API avec des schémas VineJS (types, formats, longueurs) et limite leur taille ; les réponses des connecteurs ne sont pas encore validées par schéma (voir 1.3). En sortie, l'interface Nuxt/Vue échappe les données par défaut et n'utilise pas de rendu HTML brut. Un durcissement complémentaire est en cours sur un connecteur qui transmet des données à un outil externe.
13.2 Vérifier que le tampon est aussi grand que spécifié
Réponse de Cybernetics : Oui. Cybernetics est développé en TypeScript sur des runtimes à mémoire gérée (Node.js pour l'API, Deno pour l'agent) : les bornes des tampons sont vérifiées par le runtime, et Cybernetics ne contient aucun module natif maison.
13.3 Lorsque des fonctions qui acceptent un certain nombre d'octets sont utilisées, s'assurer que la terminaison NULL est gérée correctement
Réponse de Cybernetics : Oui. Cybernetics ne manipule pas de chaînes terminées par NULL : les chaînes JavaScript/TypeScript ont une longueur explicite, gérée par le runtime Node.js ou Deno.
13.4 Vérifier les limites du tampon si la fonction est appelée dans une boucle et se protéger contre les débordements
Réponse de Cybernetics : Oui. Cybernetics s'appuie sur des runtimes à mémoire gérée : un accès hors limites dans une boucle ne peut pas déborder en mémoire, les tableaux et les Buffers étant bornés par le runtime.
13.5 Tronquer toutes les chaînes d'entrée à une longueur raisonnable avant de les transmettre à d'autres fonctions
Réponse de Cybernetics : Partiellement. La plupart des champs texte sont bornés via les règles de validation (maxLength) et la taille des corps de requête est limitée (1 Mo en JSON et formulaire) ; quelques champs libres ne sont bornés que par cette limite globale. L'analyseur multipart d'AdonisJS n'est associé à aucun type de contenu : aucune route n'accepte de fichier téléversé.
13.6 Fermer spécifiquement les ressources, ne pas compter sur le garbage collection
Réponse de Cybernetics : Oui. Cybernetics passe par des transactions gérées qui libèrent explicitement les connexions, ses appels HTTP sortants ont des délais maximaux (20 s par requête, 5 s de connexion), et les connexions à la base sont rendues à un pool avec fermeture automatique des connexions inactives.
13.7 Utiliser des piles non exécutables lorsqu'elles sont disponibles
Réponse de Cybernetics : Oui. Cybernetics fonctionne sur les runtimes Node.js et Deno (moteur V8), qui s'appuient sur les protections mémoire du système, dont la pile non exécutable. Cybernetics ne compile aucun code natif maison.
13.8 Éviter l'utilisation de fonctions vulnérables connues
Réponse de Cybernetics : Partiellement. Cybernetics n'utilise ni eval ni new Function dans son code, qui est analysé par l'analyse statique Datadog (règles de sécurité Node.js et TypeScript) en intégration continue et par CodeQL chaque semaine ; la généralisation de ces contrôles à tous les contributeurs est en cours. L'exécution de commandes externes subsiste dans deux cas limités (un connecteur et un outil interne de documentation) et doit être remplacée par des appels plus stricts.
13.9 Libérer correctement la mémoire allouée à la fin des fonctions et à tous les points de sortie
Réponse de Cybernetics : Oui. Cybernetics délègue la libération de la mémoire au ramasse-miettes des runtimes Node.js et Deno, sans allocation manuelle ni code natif maison.
13.10 Écraser toutes les informations sensibles stockées dans la mémoire allouée à tous les points de sortie de la fonction
Réponse de Cybernetics : Partiellement. Cybernetics efface en mémoire (remplissage par des zéros) les clés racine et les clés dérivées issues du KMS dès la fin de chaque opération de chiffrement ou de déchiffrement. Cet effacement n'est pas encore garanti en cas d'erreur de déchiffrement, et les copies intermédiaires sous forme de chaînes ne peuvent pas être effacées dans un runtime JavaScript.
Pratiques générales du codage
14.1 Utiliser du code managé testé et approuvé plutôt que de créer du nouveau code non managé pour les tâches courantes
Réponse de Cybernetics : Oui. Cybernetics repose sur du code managé en TypeScript et sur des frameworks éprouvés (AdonisJS, Nuxt, Deno) et leurs bibliothèques standard (node:crypto, WebCrypto). Cybernetics ne contient pas de code natif maison ; seul l'agent Windows appelle directement l'API système Windows pour s'enregistrer comme service.
14.2 Utiliser des API intégrées spécifiques à des tâches pour effectuer des tâches du système d'exploitation. Ne pas permettre à l'application d'émettre des commandes directement au système d'exploitation, notamment via l'utilisation d'interpréteurs de commandes lancés par l'application
Réponse de Cybernetics : Partiellement. Cybernetics privilégie les API intégrées. Pour collecter l'inventaire, l'agent lance des outils système avec des arguments séparés ; les valeurs insérées dans ses scripts PowerShell sont échappées, et cet échappement est en cours de renforcement. Côté API, un connecteur fait encore appel à un outil externe en ligne de commande ; son durcissement est en cours.
14.3 Utiliser des sommes de contrôle ou des hachages pour vérifier l'intégrité du code interprété, des bibliothèques, des exécutables et des fichiers de configuration
Réponse de Cybernetics : Partiellement. Les dépendances sont figées par fichiers de verrouillage (npm ci, deno.lock) ; les images de base de l'API et du site sont épinglées par empreinte SHA-256, pas encore celle de l'interface. En production, les images tierces sont signées (Cosign) et vérifiées par Kyverno. Les exécutables de l'agent sont signés et chaque mise à jour est contrôlée par une empreinte SHA-256, sans vérification locale de la signature de l'éditeur à ce jour. Une partie des actions GitHub n'est pas épinglée par empreinte.
14.4 Utiliser le verrouillage pour empêcher plusieurs requêtes simultanées ou utiliser un mécanisme de synchronisation pour éviter les conditions de concurrence
Réponse de Cybernetics : Partiellement. Les opérations les plus sensibles sont protégées contre les requêtes simultanées par des transactions avec verrouillage de ligne (par exemple, un jeton de réinitialisation ne peut être utilisé qu'une fois, même en cas de rejeu simultané, et une session ne peut pas être ouverte deux fois en parallèle) ; certains codes à usage unique et certains quotas ne sont pas encore verrouillés, et leur correction est planifiée.
14.5 Protéger les variables et les ressources partagées contre les accès simultanés inappropriés
Réponse de Cybernetics : Partiellement. Les ressources partagées sont protégées par des transactions et des verrous de ligne, et la concurrence des traitements vers les services tiers est limitée ; les contrôles de quotas ne sont pas encore protégés contre les requêtes simultanées.
14.6 Initialiser explicitement toutes vos variables et autres magasins de données, soit lors de la déclaration, soit juste avant la première utilisation
Réponse de Cybernetics : Partiellement. Cybernetics est écrit en TypeScript avec vérification stricte des valeurs nulles (strictNullChecks), et ESLint ou deno lint sont appliqués. Certaines options strictes (noImplicitAny, strictPropertyInitialization) ne sont pas encore activées.
14.7 Dans les cas où l'application doit s'exécuter avec des privilèges élevés, augmenter les privilèges le plus tard possible et les supprimer dès que possible
Réponse de Cybernetics : Partiellement. Les conteneurs de l'API et de l'interface tournent avec un utilisateur non root, sans élévation de privilèges, avec toutes les capabilities retirées et un système de fichiers en lecture seule, imposés par Kyverno. L'agent installé sur les postes tourne en revanche avec les privilèges administrateur (root ou compte système) pour collecter l'inventaire, et sa configuration conteneur prévoit elle aussi l'exécution en root, sans mode privilégié ni capabilities.
14.8 Éviter les erreurs de calcul en comprenant la représentation sous-jacente de votre langage de programmation
Réponse de Cybernetics : Oui. Cybernetics stocke les montants (coûts unitaires) en nombres entiers de centimes pour éviter les erreurs d'arrondi des nombres à virgule flottante, et ne les convertit qu'à l'affichage.
14.9 Ne pas transmettre les données fournies par l'utilisateur à une fonction d'exécution dynamique
Réponse de Cybernetics : Partiellement. Cybernetics n'utilise aucune fonction d'exécution dynamique de code (eval, new Function, vm). Un durcissement complémentaire est en cours sur un connecteur qui transmet des données à un outil externe.
14.10 Empêcher les utilisateurs de générer du nouveau code ou de modifier le code existant
Réponse de Cybernetics : Oui. Cybernetics n'offre aucun moyen aux utilisateurs de générer ou d'exécuter du code et n'utilise pas d'évaluation dynamique. En production, les conteneurs ont un système de fichiers racine en lecture seule, imposé par Kyverno.
14.11 Examiner toutes les applications secondaires, le code tiers et les bibliothèques pour déterminer la nécessité commerciale et valider la fonctionnalité sécurisée
Réponse de Cybernetics : Partiellement. Les dépendances sont analysées en continu (Dependabot, Datadog SCA, audit des dépendances, CodeQL) et les images tierces sont scannées (Grype) avant d'être copiées dans le registre interne. Ces contrôles sont bloquants sur le site web et en cours d'extension à l'API, à l'interface et à l'agent.
14.12 Mettre en œuvre une mise à jour sécurisée à l'aide de canaux cryptés
Réponse de Cybernetics : Partiellement. L'agent Cybernetics récupère ses mises à jour via des liens temporaires signés fournis par l'API et vérifie l'empreinte SHA-256 de chaque paquet avant installation. Les images de conteneurs sont récupérées par empreinte et leur signature Cosign est vérifiée par Kyverno. L'agent ne vérifie pas encore lui-même la signature de l'éditeur au moment de la mise à jour, et le retour automatique à la version précédente en cas d'échec n'est pas encore implémenté.
Articles liés
Une question ? Nous contacter.