Chapitre 1014 minIntermédiaire
Conception sécurisée (A06) et protection des données dès la conception
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- distinguer un défaut de conception d'un défaut d'implémentation ;
- trouver les abus possibles d'une règle métier ;
- appliquer la grille STRIDE à une fonctionnalité ;
- rédiger des exigences de sécurité vérifiables ;
- appliquer la protection des données dès la conception.
4 exercices corrigés
Une conception non sécurisée (Insecure Design, A06:2025) est un défaut de sécurité qui vient de ce que l'application est censée faire, et non de la façon dont elle est codée : une règle métier absente, un processus contournable, une architecture qui ne prévoit pas l'abus. Ce chapitre montre les failles de logique métier, la modélisation des menaces (STRIDE, cas d'abus), l'écriture d'exigences de sécurité avec l'ASVS, la protection des données dès la conception imposée par le RGPD et l'intégration de la sécurité à chaque étape du développement.
C'est quoi une conception non sécurisée ?
L'OWASP distingue deux sources de failles. Un défaut d'implémentation : la conception prévoyait le bon contrôle, le code l'a oublié ou mal écrit (une requête concaténée, un middleware manquant). Un défaut de conception : même un code parfait reste vulnérable, parce que le contrôle n'a jamais été prévu. On ne corrige pas une conception défaillante en relisant le code ligne à ligne ; il faut revenir à la spécification.
Exemples de défauts de conception :
- la récupération de mot de passe repose sur une question secrète (« ville de naissance ? ») ;
- aucune limite au nombre de tentatives de connexion, d'envois de SMS ou de bons de réduction ;
- un circuit de validation dont une étape peut être sautée en appelant directement l'étape suivante ;
- des données sensibles collectées « au cas où », sans besoin réel ;
- une fonctionnalité d'administration accessible depuis Internet alors qu'elle ne sert qu'en interne.
Les failles de logique métier
Une faille de logique métier exploite les règles de gestion de l'application. Aucun scanner automatique ne la trouve : il faut comprendre le métier.
| Fonctionnalité | Abus possible | Règle à prévoir |
|---|---|---|
| Saisie d'un frais | Montant négatif, qui réduit le total des autres frais ou annule une retenue | Montant strictement positif, plafonné par type de frais |
| Frais forfaitaires | 40 nuitées déclarées dans un mois de 31 jours | Quantité bornée par le nombre de jours du mois |
| Circuit de validation | Le visiteur passe sa fiche de CR à RB directement par l'API | Machine à états : seules les transitions prévues sont acceptées, chacune par le bon rôle |
| Remboursement | Deux clics rapides (ou deux requêtes simultanées) déclenchent deux virements | Opération atomique : UPDATE … SET etat = 'RB' WHERE id = ? AND etat = 'VA', puis virement seulement si une ligne a été modifiée |
| Réinitialisation du mot de passe | Demandes en boucle pour inonder la boîte mail d'une victime | Limite par compte et par adresse IP |
| Justificatif | Le même justificatif déclaré sur deux fiches | Empreinte du fichier stockée et vérifiée |
Le cas du double remboursement est une condition de concurrence (race condition) : deux requêtes lisent l'état VA en même temps, et chacune déclenche un virement. La parade est de faire la vérification et le changement d'état en une seule opération atomique, ou dans une transaction qui verrouille la ligne :
const [resultat] = await pool.execute(
"UPDATE fiche_frais SET etat = 'RB', date_modif = NOW() WHERE id = ? AND etat = 'VA'",
[idFiche]
);
if (resultat.affectedRows === 0) {
return res.status(409).json({ erreur: 'Fiche déjà remboursée ou non validée' });
}
await declencherVirement(idFiche); // n'est atteint qu'une seule fois
Le chapitre Transactions du cours SQL explique les verrous et les niveaux d'isolation.
Penser comme un attaquant : cas d'abus et modélisation des menaces
Les spécifications décrivent ce que les utilisateurs doivent pouvoir faire. La conception sécurisée ajoute ce qu'un utilisateur malveillant voudrait faire. Pour chaque récit utilisateur, on écrit un ou plusieurs cas d'abus :
| Récit utilisateur | Cas d'abus |
|---|---|
| En tant que visiteur, je saisis mes frais du mois | En tant que visiteur malveillant, je veux déclarer des frais pour un autre visiteur, ou modifier une fiche déjà validée |
| En tant que comptable, je valide une fiche | En tant qu'attaquant, je veux faire valider une fiche par le navigateur d'un comptable (CSRF) |
| En tant qu'utilisateur, je réinitialise mon mot de passe | En tant qu'attaquant, je veux prendre le contrôle d'un compte dont je connais seulement l'adresse mail |
La modélisation des menaces (threat modeling) systématise cette démarche. On dessine les flux de données de l'application (qui envoie quoi à qui, où les données sont stockées), on repère les frontières de confiance (entre le navigateur et l'API, entre l'API et la base, entre l'application et un service tiers), puis on passe chaque élément au crible d'une grille. La plus connue est STRIDE, proposée par Microsoft :
| Lettre | Menace | Critère atteint | Exemple dans AppliFrais | Contre-mesure type |
|---|---|---|---|---|
| S | Spoofing : usurpation d'identité | Authentification | Se connecter avec le mot de passe volé d'un comptable | MFA, limitation des tentatives |
| T | Tampering : altération | Intégrité | Modifier le montant d'une fiche validée | Contrôle d'accès, machine à états, journal |
| R | Repudiation : répudiation | Preuve | Un comptable nie avoir validé une fiche | Journal horodaté et protégé |
| I | Information disclosure : divulgation | Confidentialité | Lire les RIB des autres visiteurs | Contrôle d'accès, chiffrement |
| D | Denial of service : déni de service | Disponibilité | Envoyer des milliers de justificatifs de 50 Mo | Limites de taille et de débit |
| E | Elevation of privilege : élévation de privilèges | Autorisation | Un visiteur devient administrateur par affectation de masse | Liste blanche des champs, rôle fixé par le serveur |
Pour une analyse de risques à l'échelle de l'organisation, l'ANSSI propose la méthode EBIOS Risk Manager, que tu rencontreras dans les sujets d'E7 (ateliers, événements redoutés, scénarios). Le cours Droit informatique et RGPD présente l'analyse d'impact relative à la protection des données (AIPD).
Écrire des exigences de sécurité
Une exigence de sécurité se rédige comme une exigence fonctionnelle : précise, vérifiable, avec un critère d'acceptation. « L'application doit être sécurisée » ne vaut rien ; « un visiteur ne peut lire que ses propres fiches ; une demande sur la fiche d'un autre renvoie 404 » se teste.
Récit : en tant que visiteur, je consulte mes fiches de frais.
Critères d'acceptation :
- seules les fiches dont id_visiteur est celui du visiteur connecté sont renvoyées ;
- une demande sur la fiche d'un autre visiteur renvoie 404 et est journalisée ;
- sans jeton valide, l'API renvoie 401 ;
- la liste est paginée, 50 fiches au maximum par page.
Pour ne rien oublier, on s'appuie sur un référentiel. L'OWASP ASVS (Application Security Verification Standard, version 5.0 publiée en 2025) liste des centaines d'exigences vérifiables, rangées par thème (authentification, sessions, contrôle d'accès, validation, cryptographie, journalisation, API, fichiers…) et par niveau :
| Niveau | Pour quelles applications |
|---|---|
| 1 | Le socle minimal, pour toute application ; vérifiable en grande partie par des tests |
| 2 | La plupart des applications qui traitent des données sensibles ou personnelles ; le niveau visé par défaut |
| 3 | Les applications les plus critiques (santé, finance, infrastructures) |
« Mettre en œuvre et vérifier la conformité d'une solution applicative à un référentiel » se traduit concrètement par : choisir un niveau de l'ASVS, en tirer la liste des exigences applicables, et vérifier chacune par un test, une revue de code ou un audit.
Protection des données dès la conception et par défaut
L'article 25 du RGPD impose au responsable de traitement la protection des données dès la conception (privacy by design) et par défaut (privacy by default) : les mesures techniques et organisationnelles se prévoient dès la conception du traitement, et les réglages par défaut ne traitent que les données nécessaires à chaque finalité. Pour un développeur, cela se traduit par des choix concrets :
| Principe | Traduction dans AppliFrais |
|---|---|
| Minimisation (article 5) : ne collecter que ce qui est nécessaire | Pas de date de naissance ni de numéro de sécurité sociale : ils ne servent pas au remboursement |
| Limitation de la conservation | Fiches archivées puis supprimées à l'issue de la durée légale de conservation des pièces comptables ; journaux conservés de six mois à un an, comme le recommande la CNIL |
| Accès restreint | Le RIB n'est visible que par le service comptable, et seulement au moment de la mise en paiement |
| Pseudonymisation | Les statistiques de frais par région utilisent un identifiant, jamais le nom |
| Protection par défaut | Un nouveau compte est créé avec le rôle le plus faible ; les données d'un visiteur ne sont pas visibles des autres visiteurs, sans réglage à faire |
| Sécurité (article 32) | Chiffrement du RIB, hachage des mots de passe, HTTPS, journalisation des accès |
| Droits des personnes | Une fonction d'export des données du visiteur (droit d'accès et de portabilité) prévue dès le départ |
Quand un traitement présente un risque élevé pour les personnes (données de santé, données biométriques, surveillance systématique), une analyse d'impact (AIPD, article 35) est obligatoire avant sa mise en œuvre. Le cours Droit informatique et RGPD et le chapitre Données personnelles et CNIL du cours CEJM détaillent ces obligations.
Sécuriser tout le cycle de développement
La sécurité coûte d'autant moins cher qu'elle intervient tôt. Corriger un défaut de conception pendant l'analyse prend une réunion ; le corriger après la mise en production peut imposer de refondre l'application. On parle d'approche DevSecOps ou de « décaler la sécurité vers la gauche » (shift left) : chaque étape du cycle a ses activités de sécurité.
| Étape | Activités de sécurité |
|---|---|
| Expression des besoins | Classer les données (DICP), identifier les contraintes légales (RGPD), écrire les cas d'abus et les exigences de sécurité |
| Conception | Modéliser les menaces (STRIDE), choisir l'architecture (frontières de confiance, isolation), prévoir la journalisation |
| Développement | Bonnes pratiques de code, bibliothèques éprouvées, revue de code, analyse statique (SAST) |
| Tests | Tests de sécurité automatisés (contrôle d'accès), analyse des dépendances (SCA), scan dynamique (DAST) |
| Déploiement | Configuration durcie, secrets hors du code, en-têtes de sécurité |
| Exploitation | Mises à jour, surveillance des journaux et des alertes, réponse aux incidents, veille sur les vulnérabilités |
Le chapitre 14 détaille les outils de test ; le chapitre 12, la surveillance en exploitation.
Exercice 1 sur 4 Trouver les failles de logique Réussi À revoir
Voici les règles d'une nouvelle fonctionnalité d'AppliFrais : « Le visiteur peut demander une avance sur frais pour un déplacement à venir. Il saisit le montant souhaité. Le comptable accepte ou refuse. Une avance acceptée est versée immédiatement, puis déduite de la fiche du mois suivant. »
Trouve au moins quatre abus possibles et propose une règle pour chacun.
Voir la réponseMasquer la réponse de l'exercice 1
Exemples d'abus et de règles :
- Montant démesuré ou négatif : plafonner l'avance (par exemple à un montant fixé par la direction) et exiger un montant strictement positif.
- Plusieurs avances en cours : une seule avance non soldée par visiteur à la fois.
- Départ avant déduction : si le visiteur quitte l'entreprise ou n'a plus de fiche le mois suivant, l'avance n'est jamais déduite ; prévoir un solde de tout compte et un suivi des avances non soldées.
- Double versement : deux acceptations simultanées déclenchent deux virements ; faire le changement d'état et le versement de façon atomique (
UPDATE … WHERE etat = 'DEMANDEE', versement seulement si une ligne est modifiée). - Auto-validation : un comptable qui est aussi visiteur accepte sa propre avance ; interdire de valider une demande dont on est l'auteur (séparation des responsabilités).
- Contournement par l'API : le visiteur passe lui-même l'état à
ACCEPTEE; seules les transitions prévues, chacune réservée au bon rôle, sont acceptées côté serveur.
Tu avais trouvé ?
Exercice 2 sur 4 STRIDE sur une fonctionnalité Réussi À revoir
Applique la grille STRIDE à la fonctionnalité « envoi d'un justificatif » (le visiteur envoie un fichier PDF ou une photo, stocké sur le serveur et consultable par le comptable). Donne une menace et une contre-mesure par lettre.
Voir la réponseMasquer la réponse de l'exercice 2
- S (usurpation) : envoyer un justificatif au nom d'un autre visiteur → l'auteur est déduit de la session, jamais d'un paramètre.
- T (altération) : remplacer un justificatif après la validation de la fiche → interdire la modification après l'état
CL, stocker l'empreinte SHA-256 du fichier. - R (répudiation) : le visiteur nie avoir envoyé un faux justificatif → journaliser l'envoi (auteur, date, empreinte, adresse IP).
- I (divulgation) : lire les justificatifs des autres en devinant leur nom ou par parcours de répertoire → noms générés aléatoirement, accès par la ligne de frais après vérification du propriétaire.
- D (déni de service) : envoyer des fichiers énormes ou très nombreux → taille maximale (par exemple 10 Mo), nombre maximal par fiche, limitation du débit.
- E (élévation de privilèges) : déposer un fichier
.phpou.htmlqui s'exécute sur le serveur ou dans le navigateur du comptable → vérifier le type réel du fichier (pas seulement l'extension), stocker hors de la racine web, servir avecContent-Disposition: attachment.
Tu avais trouvé ?
Exercice 3 sur 4 Privacy by design Réussi À revoir
Le chef de projet propose d'ajouter au profil des visiteurs : date de naissance, numéro de sécurité sociale, photo, adresse personnelle et plaque d'immatriculation du véhicule.
- Quel principe du RGPD faut-il appliquer pour trier ces données ?
- Lesquelles sont justifiées pour le remboursement des frais ? Justifie.
- Pour celles que tu gardes, propose une mesure de protection.
Voir la réponseMasquer la réponse de l'exercice 3
- Le principe de minimisation (article 5 du RGPD), décliné par la protection des données dès la conception et par défaut (article 25) : ne collecter que les données nécessaires à la finalité.
- La plaque d'immatriculation (ou plutôt la puissance fiscale du véhicule) peut être justifiée pour calculer les indemnités kilométriques selon le barème. L'adresse personnelle peut l'être pour calculer les distances, si les trajets partent du domicile. La date de naissance, le numéro de sécurité sociale et la photo ne servent pas au remboursement : on ne les collecte pas dans AppliFrais (le service RH les détient déjà dans son propre système, pour d'autres finalités).
- Accès limité au visiteur lui-même et au service comptable ; pas d'affichage dans les listes ; durée de conservation définie ; journalisation des consultations. Si seule la puissance fiscale sert au calcul, ne stocker qu'elle, et pas la plaque : c'est encore de la minimisation.
Tu avais trouvé ?
Exercice 4 sur 4 Rédiger des critères d'acceptation Réussi À revoir
Rédige trois critères d'acceptation de sécurité, vérifiables, pour le récit : « En tant que comptable, je valide une fiche de frais clôturée. »
Voir la réponseMasquer la réponse de l'exercice 4
Par exemple :
- seule une fiche à l'état
CLpeut passer à l'étatVA; toute autre transition renvoie une erreur 409 ; - seul un utilisateur de rôle
comptablepeut valider ; un autre rôle reçoit 403 ; - un comptable ne peut pas valider une fiche dont il est lui-même le visiteur ;
- chaque validation est journalisée avec l'identifiant du comptable, la date et l'heure, l'identifiant de la fiche et l'adresse IP ;
- la requête de validation est protégée contre la CSRF (jeton vérifié, ou jeton d'API dans l'en-tête
Authorization).
Tu avais trouvé ?