Aller au contenu
FUTUR BTS FuturBTS
B3SLAM · chapitre 1 Chapitre offert

Sécuriser dès la conception

Ce que tu sauras faire : Intégrer la sécurité dans un projet de développement dès l'expression du besoin : écrire des exigences de sécurité vérifiables, modéliser les menaces d'une application avec STRIDE, appliquer les principes de conception sûre, protéger les données dès la conception, sécuriser la chaîne de développement et vérifier la conformité d'une application à un référentiel (OWASP Top 10, OWASP ASVS).

2 h de cours 10 exercices corrigés 10 questions de quiz
FUTUR BTS

Cherche d’abord au brouillon, puis ouvre le corrigé. Les exercices vont du plus simple au plus exigeant : les points indiquent leur difficulté. Compare ta démarche, pas seulement ton résultat.

Sauf indication contraire, les exercices se situent chez Vellacor Services Numériques (Niort), au pôle développement d’Anaïs Lecoq, en octobre 2026, sur les applications de Kervanet Hôtels & Résidences. Échelles de Vellacor (B3-01) : gravité (G) et vraisemblance (V) de 1 à 4 ; criticité = G × V ; zones faible (1 à 3), modéré (4 et 6), élevé (8 et 9), critique (12 et 16) ; à criticité égale, le plus grave d’abord. Politique de délais des composants : 7 jours (critique), 30 jours (élevée), 90 jours (moyenne), 180 jours (faible) après la publication de l’avis. Les noms de composants, les numéros d’avis et les mots de passe sont fictifs.

Exercice 1

Les mots de la conception sûre

Application

Associe chaque terme (1 à 10) à sa définition (A à J).

Terme Définition
1. Sécurité dès la conception A. Inventaire des composants d’une application, avec version, origine et licence
2. Sécurité par défaut B. Séparation entre deux zones qui n’ont pas le même niveau de confiance
3. Échec sûr C. Liste d’exigences de sécurité vérifiables, organisée en trois niveaux
4. Moindre privilège D. Traiter la sécurité comme une exigence du projet, depuis l’expression du besoin
5. Validation par liste blanche E. Quand un contrôle ne peut pas aboutir, l’application refuse
6. Frontière de confiance F. Le réglage livré, sans action de l’utilisateur, est le plus sûr raisonnable
7. STRIDE G. N’accepter une donnée que si elle correspond exactement à ce qui est attendu
8. Nomenclature logicielle (SBOM) H. Classement de sensibilisation des dix grandes catégories de risques des applications web
9. OWASP ASVS I. Chaque compte, y compris celui de l’application, reçoit seulement les droits nécessaires
10. OWASP Top 10 J. Grille de six familles de menaces pour analyser la conception d’une application
Voir le corrigé détaillé

1 → D ; 2 → F ; 3 → E ; 4 → I ; 5 → G ; 6 → B ; 7 → J ; 8 → A ; 9 → C ; 10 → H.

Piège

Sécurité par défaut (2) et échec sûr (3) se confondent souvent. La première porte sur l’état de départ (ce qui est livré : droits fermés, fonctions dangereuses désactivées) ; la seconde sur le comportement en cas de problème (un contrôle qui plante répond « non »). Une application peut respecter l’une sans l’autre.

Exercice 2

Classer des menaces avec STRIDE

Application

Pour chaque menace sur KerMaint ou sur l’API KerResa, indique la famille STRIDE principale et la propriété de sécurité atteinte.

  1. Un technicien modifie dans la requête envoyée par sa tablette le numéro de l’intervention qu’il valide, pour clôturer celle d’un collègue.

  2. Une page d’erreur de l’API KerResa affiche le nom de la table et la requête SQL qui a échoué.

  3. Un développeur parti de Vellacor se connecte au back-office de KerResa avec un jeton qui n’a pas été révoqué, en se faisant passer pour une plateforme partenaire.

  4. Dans un projet d’API d’un autre client de Vellacor, aucun appel reçu n’est journalisé : un partenaire peut affirmer qu’il n’a jamais envoyé une annulation sans que personne puisse prouver le contraire.

  5. Un utilisateur du profil Consultation obtient l’écran d’administration en ajoutant &profil=Administrateur à l’adresse de la page.

  6. Un robot appelle 500 fois par seconde la recherche de disponibilités de KerResa.

  7. Le registre PDF des contrôles d’un établissement est accessible en changeant le numéro dans son adresse.

  8. Un administrateur modifie la date d’une intervention directement dans la base, sans laisser aucune trace.

Voir le corrigé détaillé
Famille STRIDE Propriété atteinte Pourquoi
a) T falsification intégrité une donnée de la requête est modifiée pour agir sur un objet qui n’est pas le sien (on peut aussi y voir une élévation : B3SLAM-03 traite le contrôle de l’objet)
b) I divulgation confidentialité des informations internes (table, requête) sont révélées
c) S usurpation authenticité le développeur se fait passer pour une plateforme avec un jeton qui n’est pas le sien
d) R répudiation preuve sans journal, l’action ne peut pas être imputée
e) E élévation de privilèges autorisation un utilisateur obtient des droits d’administrateur en manipulant un paramètre ; le profil ne doit jamais venir du client
f) D déni de service disponibilité saturation du service par un volume de requêtes
g) I divulgation confidentialité un document est lisible par qui n’en a pas le droit (la cause est un contrôle d’accès absent)
h) R répudiation (et T falsification) preuve, intégrité la modification n’est pas traçable ; elle est aussi non autorisée si l’administrateur n’avait pas à le faire
Astuce

Quand deux familles semblent possibles, demande-toi ce que l’attaquant obtient : une identité (S), une modification (T), un déni (R), une information (I), une indisponibilité (D), un droit (E). La famille principale est celle de l’objectif ; la cause (un contrôle absent) donne la mesure.

Exercice 3

Des exigences vérifiables

Analyse

Franck Guillou demande une évolution du module préventif : « Le responsable doit pouvoir suspendre un plan pendant la fermeture d’un établissement, et exporter le registre des contrôles en PDF pour l’assureur. » Le compte rendu de l’atelier contient les phrases suivantes, rédigées par un commercial :

  1. « La suspension est sécurisée. »
  2. « L’export est réservé aux bonnes personnes. »
  3. « Les erreurs sont bien gérées. »
  4. « On sait qui a suspendu quoi. »
  1. Explique en deux phrases pourquoi ces formulations ne sont pas des exigences de sécurité.

  2. Réécris chacune sous la forme d’une exigence vérifiable (identifiant EXS-10 à EXS-13, formulation testable, moyen de vérification).

  3. Écris le récit utilisateur de la suspension et deux critères d’acceptation au format « Étant donné / Quand / Alors », dont un scénario de sécurité qui doit échouer.

  4. Rédige un cas d’abus (récit d’attaquant ou d’utilisateur malveillant) lié à la suspension, et l’exigence qui y répond.

Voir le corrigé détaillé

a) Ces phrases décrivent une intention, pas une condition : « sécurisée », « bonnes personnes », « bien gérées » ne disent ni ce qui doit être refusé, ni à qui, ni comment le vérifier. Aucun test ne peut prouver qu’elles ne sont pas respectées : elles ne protègent donc rien et ne peuvent pas fonder une réserve à la recette.

b) Une réponse possible :

Id Exigence Vérification
EXS-10 Seul le profil Responsable peut suspendre ou réactiver un plan ; le contrôle est fait par le serveur à chaque requête ; tout autre profil reçoit un refus, journalisé. appel direct de l’action avec un compte Technicien et un compte Consultation : refus ; avec un compte Responsable : succès
EXS-11 L’export PDF du registre d’un établissement n’est accessible qu’au profil Responsable ; l’adresse de l’export ne suffit pas à l’obtenir (contrôle des droits à chaque téléchargement). téléchargement par l’adresse directe sans session et avec un compte Technicien : refus
EXS-12 En cas d’erreur lors de la suspension ou de l’export, l’utilisateur voit un message générique et une référence ; aucun détail technique (requête, chemin, compte) n’est affiché ; le détail est journalisé ; la suspension est annulée entièrement si elle échoue. erreur de base provoquée en recette ; lecture de l’écran et du journal ; contrôle que le plan est resté dans son état initial
EXS-13 Chaque suspension et réactivation est journalisée avec le compte, la date et l’heure en temps universel, le plan, l’ancien et le nouvel état ; le journal n’est pas modifiable par les utilisateurs de l’application. scénario de recette puis lecture du journal ; tentative de modification du journal avec le compte applicatif : refus

c) US7 — En tant que responsable technique, je veux suspendre les plans d’un établissement pendant sa fermeture afin de ne pas générer de contrôles inutiles.

  • Scénario 1 : Étant donné Franck Guillou connecté avec le profil Responsable et le plan « Contrôle mensuel ascenseur A » actif, quand il suspend le plan, alors le plan passe à l’état « suspendu », aucune intervention n’est générée pendant la suspension et l’action est journalisée.
  • Scénario 2 (sécurité) : Étant donné Mathis Le Goff connecté avec le profil Technicien, quand il envoie au serveur une demande de suspension du même plan, alors la demande est refusée, le plan reste actif et le refus est journalisé.

d) Cas d’abus : « En tant que technicien en retard sur ses contrôles, je veux suspendre les plans en retard afin qu’ils n’apparaissent plus en orange. » Exigences qui y répondent : EXS-10 (seul le Responsable suspend) et EXS-13 (toute suspension est tracée) ; on peut ajouter une règle : « une suspension porte une date de fin obligatoire et un motif ».

Piège

Ne confonds pas exigence et solution technique. « Utiliser un framework sécurisé » n’est pas une exigence : c’est un moyen. L’exigence dit ce qui doit être garanti et comment on le vérifie ; le développeur choisit ensuite le moyen.

Exercice 4

Niveaux de l’ASVS et délais des composants

Calcul

Partie A. L’ASVS 5.0.0 compte 70 exigences de niveau 1, 183 de niveau 2 et 92 de niveau 3.

  1. Calcule le nombre total d’exigences et la part de chaque niveau (en %, à 0,1 près).

  2. Une application qui vise le niveau 2 doit satisfaire toutes les exigences des niveaux 1 et 2. Combien, et quelle part du total ?

  3. La charte de Vellacor fixe L1 pour toute application et L2 pour toute application exposée sur Internet ou traitant des données de clients. Quel niveau pour KerResa ? pour KerMaint ? Justifie.

Partie B. Le 20/10/2026, la veille de Sarah relève quatre avis concernant des composants encore en version vulnérable dans les applications de Vellacor.

Avis Gravité Publié le
A critique 14/10/2026
B élevée 25/09/2026
C moyenne 30/06/2026
D faible 01/08/2026
  1. Calcule la date limite de mise à jour de chaque composant et le nombre de jours restants (ou de dépassement) au 20/10/2026.

  2. Dans quel ordre Sarah doit-elle traiter ces avis ? Justifie.

Voir le corrigé détaillé

a) Total = 70 + 183 + 92 = 345 exigences.

  • L1 : 70 ÷ 345 = 20,3 % ;
  • L2 : 183 ÷ 345 = 53,0 % ;
  • L3 : 92 ÷ 345 = 26,7 %.

b) Niveau 2 = L1 + L2 = 70 + 183 = 253 exigences, soit 253 ÷ 345 = 73,3 % du total. (L’ASVS annonce « environ 70 % » : le calcul le confirme.)

c) KerResa est exposée sur Internet et traite les données des clients : L2. KerMaint est interne et ne traite pas de données de clients (les noms des techniciens sont des données de salariés) : L1, complété des exigences L2 que la modélisation des menaces rend utiles (journalisation, gestion des erreurs, secrets). Le niveau se justifie par l’exposition et la sensibilité des données, pas par la taille de l’application.

d) Date limite = date de publication + délai de la politique.

Avis Gravité Publié le Délai Date limite Situation au 20/10/2026
A critique 14/10/2026 7 j 21/10/2026 reste 1 jour
B élevée 25/09/2026 30 j 25/10/2026 reste 5 jours
C moyenne 30/06/2026 90 j 28/09/2026 dépassé de 22 jours
D faible 01/08/2026 180 j 28/01/2027 reste 100 jours

e) Ordre : C d’abord (déjà hors délai : non-conformité à la politique, à régulariser et à signaler à Anaïs), puis A (critique, demain), puis B, enfin D. On peut défendre A avant C si la faille A est activement exploitée et le composant exposé : la gravité réelle compte plus que l’ordre administratif ; il faut alors l’écrire.

Astuce

Pour les dates, compte les jours mois par mois : du 30/06 au 28/09, il y a 31 (juillet) + 31 (août) + 28 = 90 jours. Un tableur ou date -d "2026-06-30 + 90 days" sous Linux évite les erreurs.

Exercice 5

Relire un prototype

Analyse

Romain a écrit en septembre, pour une démonstration, un prototype d’enregistrement des plans préventifs. Avant de l’intégrer, Anaïs demande une revue de code à Sarah. Extrait :

<?php
// enregistrer_plan.php (prototype de démonstration, à ne pas reproduire)
ini_set('display_errors', '1');
$pdo = new PDO('mysql:host=localhost;dbname=kermaint', 'root', 'Exemple-2026!');

function peutModifier($profil) { return $profil != 'Technicien'; }

if (peutModifier($_SESSION['profil'] ?? null)) {
    try {
        $donnees = $_POST;                       // tous les champs reçus
        $champs = implode(', ', array_keys($donnees));
        $marques = ':' . implode(', :', array_keys($donnees));
        $req = $pdo->prepare("INSERT INTO plan_preventif ($champs) VALUES ($marques)");
        $req->execute($donnees);
    } catch (PDOException $e) {
        echo 'Erreur : ' . $e->getMessage();
    }
}
  1. Relève au moins cinq défauts de sécurité de cet extrait. Pour chacun, cite la ligne, explique le risque et nomme le principe de conception non respecté.

  2. La requête est « préparée ». Pourquoi n’est-elle pas sûre pour autant ?

  3. Propose une version corrigée de la fonction d’enregistrement, en t’appuyant sur les modules communs du cours (erreurs.php, config.php, droits.php, validation.php), et indique les essais qui prouvent qu’elle fonctionne.

Voir le corrigé détaillé

a) Défauts relevés :

Ligne Défaut Risque Principe non respecté
ini_set('display_errors', '1') erreurs affichées divulgation d’informations internes (chemins, requêtes) gestion des erreurs sans fuite, sécurité par défaut
new PDO(…, 'root', …) compte d’administration de la base une faille donne tous les droits sur toutes les bases moindre privilège
'Exemple-2026!' dans le code secret écrit en dur le mot de passe est dans le dépôt, sur chaque poste, dans les sauvegardes secrets hors du code
return $profil != 'Technicien'; liste noire tout ce qui n’est pas « Technicien » est autorisé : le profil Consultation, un profil créé plus tard, et même une session sans profil (null) refus par défaut (liste blanche), échec sûr
$donnees = $_POST; puis noms de colonnes tirés des clés affectation de masse ; aucune validation l’utilisateur choisit les champs écrits (par exemple actif) et leurs valeurs validation par liste blanche à la frontière
echo 'Erreur : ' . $e->getMessage(); message technique renvoyé divulgation (compte, serveur, morceau de requête) gestion des erreurs sans fuite
absence de journalisation aucune trace de qui a créé le plan répudiation traçabilité

b) La préparation protège les valeurs transmises par execute() : elles ne peuvent pas devenir du SQL. Mais ici les noms de colonnes sont collés dans le texte de la requête à partir des clés envoyées par l’utilisateur : cette partie n’est pas protégée par la préparation, et l’utilisateur décide des colonnes écrites. Une requête préparée doit avoir un texte fixe, écrit par le développeur.

c) Version corrigée, qui réutilise les modules communs du cours :

<?php
declare(strict_types=1);
require __DIR__ . '/erreurs.php';      // pas d'affichage d'erreur, journal + référence
require __DIR__ . '/config.php';       // secrets lus dans l'environnement
require __DIR__ . '/droits.php';       // refus par défaut
require __DIR__ . '/validation.php';   // normalisation + liste blanche

function enregistrerPlan(PDO $pdo, ?string $profil, array $saisie): string
{
    if (!peutFaire($profil, 'gerer_plan')) {
        return 'refusé : droit insuffisant';
    }
    [$plan, $erreurs] = validerPlan($saisie);
    if ($plan === null) {
        return 'refusé : ' . implode(' ', $erreurs);
    }
    $req = $pdo->prepare('INSERT INTO plan_preventif (id_equip, libelle, periodicite, prochaine_echeance, actif)
                          VALUES (:id_equip, :libelle, :periodicite, :premiere_echeance, 1)');
    $req->execute($plan);              // seuls les champs validés partent vers la base
    return 'enregistré (plan ' . $pdo->lastInsertId() . ')';
}

En production, la connexion est ouverte avec le compte kermaint_app et le mot de passe obtenu par parametresBase(). Pour l’essai, la fonction est appelée sur une base SQLite en mémoire qui contient la table plan_preventif :

Responsable           : enregistré (plan 1)
Technicien            : refusé : droit insuffisant
Consultation          : refusé : droit insuffisant
Responsable + "actif" : refusé : Champ non prévu : actif
Lignes en base        : 1

Les essais prouvent : un essai positif (le Responsable enregistre), deux essais négatifs de droits (Technicien, Consultation), un essai négatif de validation (champ ajouté), et le contrôle final qu’une seule ligne a été écrite. Le texte de la requête est fixe ; la valeur de actif est imposée par le code (1, sécurité par défaut). Il resterait à journaliser la création (EXS-03).

Piège

Corriger seulement le mot de passe (le passer en variable d’environnement) en gardant root ne suffit pas : le défaut principal est le compte. Un secret bien rangé qui donne tous les droits reste dangereux.

Exercice 6

Les menaces de la tâche nocturne

Analyse

Chaque nuit à 5 h, une tâche planifiée de KV-KERMAINT lit les plans actifs, crée les interventions préventives des 7 jours suivants (règle RG4) et envoie un courriel au responsable pour chaque contrôle non conforme de la veille. Elle se connecte à la base avec le compte kermaint_app et envoie les courriels par le serveur de messagerie de Kervanet. Les messages de la tâche sont écrits dans un fichier de journal lisible par tous les comptes du serveur.

Sarah et Romain ont relevé six menaces, avec leur évaluation.

Code Menace G V
a Un plan modifié en base avec une périodicité de 0 fait tourner la tâche en boucle 2 3
b La tâche utilise kermaint_app, qui peut aussi modifier les comptes des techniciens 3 2
c Un courriel de non-conformité contient tout le détail du contrôle et part vers une adresse erronée 2 2
d Le journal de la tâche, lisible par tous, contient la chaîne de connexion avec le mot de passe 3 3
e La tâche ne s’exécute pas une nuit, sans que personne ne le voie 1 3
f Un attaquant qui a pris la main sur le serveur modifie le script de la tâche 3 1
  1. Dessine (ou décris) le diagramme de flux de données de la tâche : entités, traitement, stockages, flux, frontières de confiance.

  2. Donne la famille STRIDE de chaque menace.

  3. Calcule la criticité de chaque menace, indique sa zone et classe les menaces.

  4. Pour chaque menace, propose une mesure de conception et indique le principe qu’elle applique.

Voir le corrigé détaillé

a) Diagramme de flux de données :

  • traitement : la tâche nocturne (planifiée à 5 h sur KV-KERMAINT) ;
  • stockages : la base kermaint (lecture des plans, écriture des interventions) ; le fichier de journal de la tâche ;
  • entités externes : le serveur de messagerie ; le responsable technique (destinataire des courriels) ; le planificateur du système (qui déclenche la tâche) ;
  • flux : plans → tâche ; tâche → interventions ; tâche → journal ; tâche → messagerie → responsable ;
  • frontières de confiance : entre la tâche et la base (compte applicatif), entre le serveur et la messagerie (sortie vers un autre système), et entre le journal et les autres comptes du serveur (le journal est lisible par tous : la frontière n’est pas protégée).

b) et c) Criticité = G × V ; classement par criticité puis par gravité.

Rang Menace STRIDE G V Criticité Zone
1 d — mot de passe dans le journal lisible par tous I (divulgation) 3 3 9 élevé
2 b — compte trop puissant pour la tâche E (élévation de privilèges) 3 2 6 modéré
3 a — périodicité 0, tâche en boucle D (déni de service), causé par une donnée falsifiée ou erronée 2 3 6 modéré
4 c — courriel détaillé vers une adresse erronée I (divulgation) 2 2 4 modéré
5 f — script de la tâche modifié T (falsification) 3 1 3 faible
6 e — tâche non exécutée sans alerte R / D (absence de trace, service rendu indisponible) 1 3 3 faible

À criticité égale (3), f passe avant e, car sa gravité est plus forte.

d) Mesures :

Menace Mesure de conception Principe
d ne jamais journaliser la chaîne de connexion ni un secret ; journal lisible par le seul compte du service et les administrateurs ; changer le mot de passe exposé secrets hors du code et des journaux ; moindre privilège
b compte de base dédié à la tâche : lecture des plans, insertion des interventions, rien d’autre moindre privilège
a revalider les données lues en base (périodicité ∈ {1, 3, 6, 12}) ; plafond d’interventions créées par nuit avec alerte ; contrainte CHECK dans la base validation à chaque frontière, défense en profondeur, échec sûr
c courriel minimal (« contrôle non conforme, voir KerMaint, intervention n° … »), sans détail ; adresse du destinataire tirée de l’annuaire minimisation, protection des données par défaut
f droits d’écriture sur le script réservés à root ; livraison signée et vérifiée (B3-06) ; journal des modifications moindre privilège, intégrité de la chaîne
e la tâche écrit un compte rendu ; la supervision alerte si aucun compte rendu n’est arrivé à 5 h 30 traçabilité, détection
Astuce

La menace a) montre qu’une donnée lue dans sa propre base franchit aussi une frontière : quelqu’un a pu l’écrire par un autre chemin (requête manuelle, autre application). La défense en profondeur revalide ce qui est critique pour le traitement.

Exercice 7

Les réclamations des clients

Droit

Gwenaëlle Le Bihan voudrait ajouter à KerMaint une fonction « réclamations » : quand un client se plaint d’une panne à la réception, le réceptionniste saisit dans KerMaint le nom, l’adresse électronique, le numéro de téléphone et le numéro de chambre du client, puis la description. Quand la panne est réparée, KerMaint envoie un courriel au client. La première maquette conserve les réclamations sans limite de durée et les affiche à tous les utilisateurs de KerMaint.

Rappel (CEJMA-08) : selon l’article 25 du RGPD, le responsable du traitement applique la protection des données dès la conception et par défaut ; par défaut, seules les données nécessaires à chaque finalité sont traitées, en quantité, en étendue du traitement, en durée de conservation et en accessibilité.

  1. Qui est responsable du traitement ? Quel est le rôle de Vellacor, et quelle obligation l’empêche de livrer la maquette telle quelle ?

  2. Pour chacune des quatre dimensions de la protection par défaut, relève ce qui ne va pas dans la maquette et propose un choix de conception conforme.

  3. Le courriel « panne réparée » doit-il être envoyé à tous les clients qui ont réclamé ? Propose le réglage par défaut et justifie.

  4. Un client demande à Kervanet l’accès à toutes ses données. Écris le récit utilisateur et deux critères d’acceptation de la fonction que KerMaint doit offrir pour que Vellacor réponde dans son délai de 5 jours ouvrés.

Voir le corrigé détaillé

a) Kervanet décide de la finalité (traiter les réclamations, informer le client) : elle est responsable du traitement. Vellacor, qui développe et héberge KerMaint pour son compte, est sous-traitant. L’article 25 vise le responsable, mais Vellacor a une obligation de conseil (CEJMA-03) et doit offrir des garanties suffisantes : livrer une conception manifestement contraire à la protection par défaut engagerait sa responsabilité contractuelle (CEJMA-08).

b)

Dimension Ce qui ne va pas Choix conforme
Quantité nom, courriel, téléphone et chambre copiés dans KerMaint ne stocker que le numéro de réservation (KerResa connaît le client) et la chambre ; pas de téléphone ; description par liste de motifs + texte court
Étendue rien n’empêche de réutiliser les coordonnées (statistiques, prospection) finalité unique écrite : suivi de la réclamation et information du client ; aucune exportation des coordonnées
Durée conservation sans limite effacement ou anonymisation de la réclamation à une durée fixée par Kervanet (par exemple quelques mois après la clôture), purge automatique livrée avec la fonction
Accessibilité tous les utilisateurs de KerMaint voient tout réception et responsable de l’établissement concerné seulement ; les techniciens voient la chambre et le motif, pas l’identité du client

c) Non. Par défaut, aucun courriel n’est envoyé : le réceptionniste demande au client s’il souhaite être informé, et coche la case avec son accord (ou le client le demande dans l’application). C’est la logique de la protection par défaut : le traitement supplémentaire (envoyer un courriel) exige une action, il n’est pas imposé.

d) En tant qu’administrateur fonctionnel de Kervanet, je veux extraire toutes les données de réclamation liées à un client afin de répondre à sa demande d’accès dans le délai d’un mois.

  • Étant donné un client ayant deux réclamations (une ouverte, une clôturée), quand l’administrateur lance l’export à partir du numéro de réservation ou de l’identifiant du client, alors un fichier JSON contient les deux réclamations avec leurs dates, motifs, statuts et le choix d’information par courriel, et l’export est journalisé.
  • Étant donné un utilisateur du profil Technicien, quand il tente de lancer l’export, alors l’export est refusé.
Piège

Le délai d’un mois est celui de Kervanet envers le client. Celui de Vellacor (5 jours ouvrés, accord de sous-traitance) est plus court pour laisser le temps à Kervanet de vérifier et répondre. Une fonction d’export prévue dès la conception rend ce délai facile à tenir.

Exercice 8

La chaîne de KerResa

Calcul et analyse

Sarah audite la chaîne de développement de l’API KerResa le 20/10/2026.

Document A — Versions installées sur le serveur de production de KerResa (relevé du 20/10/2026)

Composant Version installée Licence
exemple/planificateur 2.3.0 MIT
exemple/limiteur-debit 3.0.1 Apache-2.0
exemple/client-http 5.2.0 MIT
exemple/journal-psr 3.0.4 MIT

Document B — Avis suivis par la veille

Avis Composant Corrigé en Gravité Publié le
AVIS-2026-0064 exemple/client-http 5.2.3 élevée 20/08/2026
AVIS-2026-0098 exemple/planificateur 2.3.2 moyenne 14/09/2026
AVIS-2026-0121 exemple/journal-psr 3.0.4 critique 16/10/2026

Document C — Constats sur le projet GitLab de KerResa

  • La branche main est protégée, mais les deux développeurs du projet ont le rôle permettant d’y pousser directement « pour les correctifs urgents ».
  • Le pipeline exécute les tests unitaires ; il ne contrôle ni les dépendances ni les secrets.
  • Les approbations de merge request sont activées (édition gratuite) ; 4 des 11 merge requests de septembre ont été fusionnées sans approbation.
  • Le fichier composer.lock n’est pas versionné : chaque environnement installe « la dernière version compatible ».
  • Le fichier .env de recette est présent dans le dépôt depuis juin 2026.
  1. Pour chaque avis, indique si KerResa est concernée, calcule l’âge de l’avis au 20/10/2026, la date limite de la politique et l’état (dans le délai ou dépassé).

  2. Pourquoi l’absence de composer.lock dans le dépôt est-elle un problème de sécurité, même si les versions installées aujourd’hui sont correctes ?

  3. Analyse chacun des constats du document C : risque, mesure proposée, principe ou recommandation appliqué.

  4. Classe tes propositions par priorité et rédige un message de dix lignes au plus à Anaïs Lecoq.

Voir le corrigé détaillé

a) Âge = 20/10/2026 − date de publication ; limite = publication + délai de la politique.

Avis Version installée Corrigé en Concerné ? Âge Délai Date limite État
AVIS-2026-0064 client-http 5.2.0 5.2.3 oui 61 j 30 j 19/09/2026 dépassé de 31 jours
AVIS-2026-0098 planificateur 2.3.0 2.3.2 oui 36 j 90 j 13/12/2026 dans le délai (reste 54 jours)
AVIS-2026-0121 journal-psr 3.0.4 3.0.4 non (déjà corrigé) 4 j 7 j 23/10/2026 —

Le contrôle de Sarah (cours, partie 6) appliqué à ces données donne :

AVIS-2026-0064  exemple/client-http    5.2.0   À METTRE À JOUR en 5.2.3 (élevée, avis de 61 j, délai 30 j : DÉPASSÉ)
AVIS-2026-0098  exemple/planificateur  2.3.0   À METTRE À JOUR en 2.3.2 (moyenne, avis de 36 j, délai 90 j : reste 54 j)
AVIS-2026-0121  exemple/journal-psr    3.0.4   corrigé (>= 3.0.4)
code retour : 1

b) Sans composer.lock versionné, chaque installation choisit « la dernière version compatible » au moment où elle est faite : la recette et la production peuvent avoir des versions différentes, la production peut recevoir une version jamais testée (voire une version piégée publiée la veille), et l’inventaire n’est plus fiable (impossible de savoir quelle version tourne où). Le fichier de verrouillage garantit que l’on livre ce qui a été testé et rend la veille possible.

c)

Constat Risque Mesure Principe ou recommandation
Push direct possible sur main code fusionné sans revue, par erreur ou par un compte volé retirer le droit de push direct à tous ; les correctifs urgents passent aussi par une merge request (courte) branche protégée ; séparation des tâches
Pipeline sans contrôle des dépendances ni des secrets composants vulnérables livrés, secrets versionnés ajouter composer audit --locked --no-dev (et le contrôle des avis de la veille) et le modèle GitLab de détection de secrets ; bloquer la fusion si un contrôle échoue intégrité de la chaîne ; ANSSI « Les essentiels — DevSecOps »
4 merge requests sur 11 fusionnées sans approbation aucune revue sur 36,4 % des modifications règle d’équipe écrite ; fusion réservée à une ou deux personnes qui vérifient l’approbation (l’édition gratuite ne bloque pas) ; suivi mensuel de l’indicateur revue de code, séparation des tâches
composer.lock absent versions non maîtrisées (question b) versionner composer.lock ; installer avec composer install versions figées, SBOM
.env de recette dans le dépôt depuis juin secrets de recette divulgués changer les secrets de recette immédiatement, vérifier leur usage, retirer le fichier, ajouter .env au .gitignore et le crochet pre-commit ; vérifier qu’aucun secret de production n’est identique secrets hors du code, un secret par environnement

Calcul de l’indicateur : 4 ÷ 11 = 36,4 % de fusions sans approbation.

d) Priorités : 1. rotation des secrets du .env (déjà divulgués) ; 2. mise à jour de client-http (hors délai) ; 3. versionner composer.lock et ajouter les contrôles au pipeline ; 4. supprimer le push direct ; 5. règle et suivi des approbations ; 6. mise à jour de planificateur avant le 13/12/2026.

Message possible :

Anaïs, audit de la chaîne KerResa du 20/10. Urgent : le fichier .env de recette est versionné depuis juin ; je propose de changer aujourd’hui tous les secrets de recette et de vérifier qu’aucun n’est réutilisé en production. client-http 5.2.0 porte un avis élevé hors délai depuis le 19/09 : mise à jour en 5.2.3 à tester en recette cette semaine. Ensuite : versionner composer.lock, ajouter composer audit et la détection de secrets au pipeline, retirer le push direct sur main. 4 fusions sur 11 en septembre n’avaient pas d’approbation : je propose que seuls Romain et toi fusionniez. planificateur est à mettre à jour avant le 13/12. Détail en pièce jointe. Sarah

Exercice 9

Un mot de passe dans l’historique

Analyse

Le 19/10/2026, en activant la détection de secrets sur tout l’historique du dépôt de KerMaint, Sarah trouve un fichier config_test.php contenant un mot de passe de base de données, ajouté le 12/03/2025 (commit « Environnement de test ») et retiré le 02/04/2025 (commit « Retrait de la configuration de test »). Ce mot de passe est celui du compte de la base de l’ancien environnement de test du pôle développement ; Sarah constate qu’il est aussi utilisé, à l’identique, par le compte de la base de recette KV-RECETTE. Le dépôt est cloné sur 6 postes de développeurs et sauvegardé chaque nuit.

Sur une copie du dépôt, elle obtient :

== fichier présent dans la version actuelle ?
non
== recherche dans tout l'historique
750df3b 2025-04-02 Retrait de la configuration de test
efa0228 2025-03-12 Environnement de test
== contenu retrouvé
-return ['mot_de_passe' => 'Recette-Exemple-2025'];
  1. Explique ce que montre cette sortie, et pourquoi le commit du 02/04/2025 n’a pas supprimé le risque.

  2. Quelle est la première action à mener, et pourquoi avant toute autre ?

  3. Liste, dans l’ordre, les actions suivantes (vérifications, corrections, information), en indiquant pour chacune qui la mène.

  4. Quelles mesures de la chaîne de développement auraient empêché ou détecté plus tôt ce problème ? Relie chacune à une exigence de l’ASVS 5.0.0 citée dans le cours.

  5. La base de recette contient une copie anonymisée de KerMaint. Le risque aurait-il été le même si elle avait contenu les données réelles ? Justifie en une phrase.

Voir le corrigé détaillé

a) Le fichier n’existe plus dans la version actuelle (« non »), mais la recherche git log -S le retrouve dans deux commits : celui qui l’a ajouté et celui qui l’a retiré, et le contenu du mot de passe s’affiche encore. Un commit de suppression ajoute une nouvelle version sans effacer les anciennes : toute copie du dépôt (6 postes, sauvegardes, forge) contient le secret depuis mars 2025. Le risque n’a pas disparu le 02/04/2025 : il a seulement été caché.

b) Changer le mot de passe du compte de la base de recette (et de tout compte qui l’utiliserait) : c’est la seule action qui rend le secret divulgué inutilisable. Toutes les autres (enquête, nettoyage) prennent du temps ; pendant ce temps, le secret resterait valable.

c) Ordre proposé :

  1. Rotation du mot de passe de la base de recette par l’administrateur (Thomas Guéguen, sur demande d’Anaïs), nouveau secret rangé dans le gestionnaire de secrets ; vérification que l’ancien environnement de test n’existe plus ou que son mot de passe a aussi changé.
  2. Recherche de réutilisation : ce mot de passe sert-il ailleurs, notamment en production ? (Sarah et Thomas) Si oui, rotation immédiate là aussi.
  3. Vérification des journaux de la base de recette depuis mars 2025, dans la limite de leur conservation : connexions inhabituelles avec ce compte (Thomas).
  4. Ticket de sécurité et information d’Anaïs Lecoq ; si une utilisation frauduleuse touchant des données personnelles apparaissait, alerte de Kervanet selon l’accord de sous-traitance (B3-02).
  5. Nettoyage de l’historique, si l’équipe le décide (réécriture de l’historique et nouvelle copie sur tous les postes) : utile mais secondaire, puisque le secret est déjà changé.
  6. Prévention : crochet pre-commit sur les postes, détection de secrets dans le pipeline, analyse unique de tout l’historique, un secret différent par environnement (Sarah, validé par Anaïs).
  7. Retour d’expérience : mise à jour de la charte de développement et du registre des risques de Vellacor (risque « secrets dans GitLab », B3-01).

d)

Mesure Effet Exigence ASVS 5.0.0
Gestionnaire de secrets, aucun secret dans le code le mot de passe n’aurait jamais été écrit dans le fichier v5.0.0-13.3.1 (L2)
Crochet pre-commit et détection de secrets dans le pipeline le commit du 12/03/2025 aurait été refusé ou signalé v5.0.0-13.3.1 (L2), à l’appui de l’exigence EXS-05
Un secret différent par environnement, accès aux secrets limité la fuite du secret de test n’aurait pas ouvert la recette v5.0.0-13.3.2 (L2 : accès aux secrets selon le moindre privilège)
Aucun dossier .git exposé en production évite qu’un historique de ce type soit téléchargeable depuis le serveur web v5.0.0-13.4.1 (L1)

e) Non : avec des données réelles, la fuite d’un accès à la base aurait pu permettre une violation de données personnelles, à évaluer avec le DPO de Kervanet et peut-être à notifier ; l’anonymisation de la recette (et l’absence de données réelles hors production) réduit fortement la gravité.

Piège

« Le dépôt est privé, donc le secret n’est pas divulgué. » Un dépôt privé est copié sur tous les postes des développeurs, présents et passés, dans les sauvegardes et parfois chez un prestataire. Un secret qui y est entré doit être considéré comme connu de toutes ces personnes et de tous ces lieux.

Exercice 10

Entraînement E7 : signaler une panne depuis « Kervanet

Entraînement E7

Extrait d’étude de cas (durée conseillée : 1 h 30). Contexte SLAM. Barème indicatif sur 20 : mission 1, 4 points ; mission 2, 5 points ; mission 3, 5 points ; mission 4, 3 points ; mission 5, 3 points.

Contexte. Tu es Sarah Cherif, alternante en BTS SIO option SLAM chez Vellacor Services Numériques, prestataire de Kervanet Hôtels & Résidences. Kervanet envisage pour 2027 (projet non décidé) une fonction de l’application mobile « Kervanet & Moi » : un client en séjour signale une panne dans sa chambre (chauffage, eau, climatisation…) ; l’API KerResa transmet le signalement à KerMaint, qui crée une intervention. Anaïs Lecoq te demande de préparer le volet sécurité du dossier de conception avant le chiffrage.

ADossier documentaire

Document 1 — Le projet

  • Utilisateurs : clients en séjour (application mobile, connectés à leur compte « Kervanet & Moi ») ; réceptionnistes et techniciens (KerMaint).
  • Données saisies par le client : catégorie de la panne, description libre (300 caractères au plus), photo facultative (non retenue dans la première version).
  • L’application mobile appelle l’API KerResa (https://api.kervanet-hotels.example/), exposée sur Internet ; KerResa connaît le séjour en cours du client (établissement, chambre) ; KerResa appelle KerMaint, interne, à travers le VPN du siège.
  • Règle de gestion proposée par Franck Guillou : priorité 2 pour le chauffage et l’eau, 3 pour la climatisation et l’électricité, 4 pour la télévision, le Wi-Fi et le reste.
  • Volume attendu : quelques dizaines de signalements par jour en haute saison.

Document 2 — Récits utilisateur du premier atelier

N° Récit
R1 En tant que client en séjour, je veux signaler une panne de ma chambre depuis l’application afin de ne pas devoir appeler la réception.
R2 En tant que réceptionniste, je veux voir les signalements de mon établissement afin de prévenir le client du passage du technicien.
R3 En tant que client, je veux être informé quand la panne est réparée.

Document 3 — Prototype de démonstration (extrait PHP, côté KerResa)

// signalement.php (prototype, à ne pas reproduire)
const JETON_KERMAINT = 'jeton-de-demo';            // jeton d'appel de KerMaint
$d = json_decode(file_get_contents('php://input'), true);
error_log('signalement reçu de ' . $client['email'] . ' : ' . json_encode($d));
try {
    $inter = ['chambre' => $d['chambre'], 'categorie' => $d['categorie'],
              'priorite' => $d['priorite'] ?? 3, 'description' => $d['description']];
    envoyerAKerMaint($inter, JETON_KERMAINT);
    echo json_encode(['statut' => 'ok']);
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode(['erreur' => $e->getMessage()]);
}

Document 4 — Composants envisagés pour la fonction

Composant Version Remarque de la veille au 20/10/2026
exemple/client-http 5.2.0 AVIS-2026-0064, gravité élevée, publié le 20/08/2026, corrigé en 5.2.3
exemple/redim-image 0.9.2 dernier dépôt de code en 2022, aucune réponse aux signalements

Document 5 — Échelles et règles de Vellacor

Gravité 1 à 4, vraisemblance 1 à 4, criticité = G × V ; zones : 1 à 3 faible, 4 et 6 modéré, 8 et 9 élevé, 12 et 16 critique. Charte de développement : niveau ASVS L1 pour toute application, L2 pour toute application exposée sur Internet ou traitant des données de clients. Politique de délais des composants : 7, 30, 90, 180 jours selon la gravité (critique, élevée, moyenne, faible).

Document 6 — Cadre juridique (résumé)

  • RGPD, art. 25 : le responsable du traitement met en œuvre la protection des données dès la conception et par défaut (seules les données nécessaires, en quantité, étendue, durée et accessibilité). Art. 32 : le responsable et le sous-traitant prennent des mesures de sécurité adaptées au risque. Kervanet est responsable du traitement, Vellacor sous-traitant.
  • Règlement (UE) 2024/2847 (cyberrésilience) : pour les produits comportant des éléments numériques mis sur le marché de l’Union, conception adaptée aux risques, aucune vulnérabilité exploitable connue à la mise sur le marché, configuration sécurisée par défaut ; applicable à partir du 11/12/2027.

BTravail à faire

Mission 1 — Les exigences (4 points)

1.1 Indique le niveau de l’ASVS à viser pour la fonction et justifie-le avec le dossier.

1.2 Rédige quatre exigences de sécurité vérifiables pour la fonction (identifiant, formulation, vérification), dont une sur la priorité et une sur la chambre concernée.

1.3 Ajoute au récit R1 un critère d’acceptation négatif.

Mission 2 — La modélisation des menaces (5 points)

2.1 Décris le diagramme de flux de données de la fonction et place les frontières de confiance.

2.2 Six menaces sont présélectionnées : M1 « le client impose la priorité 1 » (G 2, V 4) ; M2 « le client signale une panne pour une autre chambre » (G 2, V 3) ; M3 « un robot envoie des milliers de faux signalements » (G 2, V 3) ; M4 « le jeton d’appel de KerMaint est lu dans le code » (G 3, V 3) ; M5 « une erreur renvoie au client un message technique » (G 2, V 3) ; M6 « l’adresse électronique des clients est copiée dans les journaux » (G 2, V 4). Donne la famille STRIDE de chacune, calcule sa criticité, sa zone, et classe-les.

Mission 3 — La revue du prototype (5 points)

3.1 Relève dans le document 3 les défauts de sécurité, en citant la ligne et le principe non respecté.

3.2 Écris une version corrigée de la fonction de traitement du signalement et décris les essais qui en prouvent le bon fonctionnement.

Mission 4 — La chaîne de développement (3 points)

4.1 Analyse les deux composants du document 4 et indique ta décision pour chacun.

4.2 Cite deux contrôles à ajouter au pipeline GitLab de KerResa pour ce projet.

Mission 5 — Protection des données et note à la direction (3 points)

5.1 Pour le récit R3, propose un réglage par défaut conforme à l’article 25 et justifie-le.

5.2 Rédige une note de huit à dix lignes à Gwenaëlle Le Bihan expliquant pourquoi ces exigences de sécurité doivent être chiffrées dès maintenant, et ce que coûterait de les ajouter après la mise en service.

Voir le corrigé détaillé

Mission 1 — Les exigences

1.1 Niveau L2 de l’ASVS : la fonction est exposée sur Internet (API KerResa, document 1) et traite des données de clients (séjour, chambre, description) ; c’est la règle de la charte de Vellacor (document 5).

1.2 Exigences possibles :

Id Exigence Vérification
EXS-P1 La priorité de l’intervention est calculée par le serveur selon la règle de gestion (document 1) ; toute priorité envoyée par l’application est refusée. requête contenant un champ priorite : refus ; contrôle de la priorité calculée pour chaque catégorie
EXS-P2 L’établissement et la chambre sont déterminés par le serveur à partir du séjour en cours du client authentifié ; aucune chambre transmise par l’application n’est acceptée. requête avec un champ chambre : refus ; signalement d’un client sans séjour en cours : refus
EXS-P3 Les champs reçus sont validés par liste blanche : catégorie de la liste fermée, description normalisée de 5 à 300 caractères ; tout autre champ fait rejeter la requête. jeu d’essai de valeurs invalides
EXS-P4 Le nombre de signalements est limité par client (par exemple 5 par séjour et par jour) ; au-delà, refus et alerte. envoi répété en recette
EXS-P5 En cas d’erreur, l’API renvoie un code et un message génériques avec une référence ; le détail est journalisé. erreur provoquée en recette
EXS-P6 Le jeton d’appel de KerMaint est fourni par le gestionnaire de secrets, différent en recette et en production ; il n’apparaît ni dans le code ni dans les journaux. revue du code, détection de secrets, lecture des journaux

1.3 Étant donné un client connecté dont le séjour en cours est la chambre 214 du Phare de Royan, quand l’application envoie un signalement contenant la chambre 101, alors le signalement est refusé et aucune intervention n’est créée.

Mission 2 — La modélisation des menaces

2.1 Entités externes : client (application mobile), réceptionniste et technicien (KerMaint). Traitements : API KerResa (exposée sur Internet) ; KerMaint (interne). Stockages : base de KerResa (séjours), base de KerMaint (interventions), journaux. Flux : application → KerResa (signalement) ; KerResa → base KerResa (séjour en cours) ; KerResa → KerMaint (création de l’intervention, avec jeton) ; KerMaint → réceptionniste et technicien ; KerMaint → client (information de réparation, si accepté). Frontières de confiance : Internet / API KerResa (la plus exposée) ; KerResa / KerMaint (passage dans le réseau interne par le VPN) ; applications / bases.

2.2 Criticité = G × V.

Rang Menace STRIDE G V Criticité Zone
1 M4 jeton d’appel de KerMaint lisible dans le code I (divulgation), qui permet ensuite S (usurpation de KerResa) 3 3 9 élevé
2 M1 priorité imposée par le client T (falsification) 2 4 8 élevé
3 M6 adresse électronique des clients copiée dans les journaux I (divulgation) 2 4 8 élevé
4 M2 signalement pour une autre chambre T (falsification), voire S 2 3 6 modéré
5 M3 milliers de faux signalements D (déni de service) 2 3 6 modéré
6 M5 message technique renvoyé au client I (divulgation) 2 3 6 modéré

M4 est classé premier (criticité 9). M1 et M6 ont la même criticité et la même gravité : l’ordre entre eux se discute (M1 désorganise le service, M6 crée une copie de données personnelles).

Mission 3 — La revue du prototype

3.1

Ligne Défaut Principe
const JETON_KERMAINT = 'jeton-de-demo'; secret écrit dans le code (M4) secrets hors du code, un secret par environnement
json_decode(...) sans contrôle aucune validation ; JSON invalide non traité validation à la frontière
error_log('… ' . $client['email'] . ' : ' . json_encode($d)) adresse du client et contenu complet copiés dans le journal (M6) minimisation, journal sans donnée inutile
'chambre' => $d['chambre'] chambre fournie par le client (M2) ne jamais faire confiance au client pour une donnée que le serveur connaît
'priorite' => $d['priorite'] ?? 3 priorité fournie par le client (M1) ; valeur par défaut arbitraire règle de gestion appliquée par le serveur ; sécurité par défaut
echo json_encode(['erreur' => $e->getMessage()]) message technique renvoyé (M5) erreurs génériques, détail au journal
aucune limite volume non contrôlé (M3) limitation (EXS-P4), à traiter avec B3SLAM-03

3.2 Version corrigée :

<?php
declare(strict_types=1);

const CATEGORIES = ['chauffage' => 2, 'eau' => 2, 'climatisation' => 3,
                    'electricite' => 3, 'tv_wifi' => 4, 'autre' => 4];   // catégorie => priorité
const CHAMPS = ['categorie', 'description'];

function traiterSignalement(string $corps, array $sejour): array
{
    try {
        $donnees = json_decode($corps, true, 4, JSON_THROW_ON_ERROR);
        if (!is_array($donnees) || array_diff(array_keys($donnees), CHAMPS) !== []) {
            return [400, ['erreur' => 'requete_invalide']];
        }
        $categorie = $donnees['categorie'] ?? null;
        if (!is_string($categorie) || !array_key_exists($categorie, CATEGORIES)) {
            return [422, ['erreur' => 'categorie_inconnue']];
        }
        $texte = trim(Normalizer::normalize((string) ($donnees['description'] ?? ''), Normalizer::FORM_C));
        if (mb_strlen($texte) < 5 || mb_strlen($texte) > 300) {
            return [422, ['erreur' => 'description_5_a_300_caracteres']];
        }
        // La chambre et l'établissement viennent du séjour en cours (serveur), jamais du client ;
        // la priorité est calculée par le serveur selon la règle de gestion.
        $signalement = ['site' => $sejour['site'], 'chambre' => $sejour['chambre'],
                        'categorie' => $categorie, 'priorite' => CATEGORIES[$categorie],
                        'description' => $texte];
        error_log(sprintf('signalement site=%s chambre=%s categorie=%s', $sejour['site'], $sejour['chambre'], $categorie));
        return [201, ['statut' => 'enregistre', 'priorite' => $signalement['priorite']]];
    } catch (JsonException $e) {
        return [400, ['erreur' => 'requete_invalide']];
    } catch (Throwable $e) {
        $ref = bin2hex(random_bytes(4));
        error_log("ref=$ref " . get_class($e));          // détail au journal, pas au client
        return [500, ['erreur' => 'erreur_interne', 'reference' => $ref]];
    }
}

$sejour est fourni par KerResa à partir du client authentifié (B3SLAM-03) ; l’envoi à KerMaint (non montré) utilise le jeton lu par la fonction secret() du cours. Essais avec le séjour « Phare de Royan, chambre 214 » :

Essai Corps envoyé Réponse
normal catégorie chauffage, description « Radiateur froid depuis ce matin » 201, priorité 2
priorité imposée catégorie tv_wifi + champ priorite = 1 400 requete_invalide
autre chambre catégorie eau + champ chambre = 101 400 requete_invalide
catégorie inconnue catégorie piscine 422 categorie_inconnue
JSON mal formé {"categorie":"eau", 400 requete_invalide

Journal produit :

signalement site=ROY chambre=214 categorie=chauffage

Un essai positif, quatre essais négatifs, et le journal ne contient ni adresse électronique ni description.

Mission 4 — La chaîne de développement

4.1 client-http 5.2.0 : avis de gravité élevée publié le 20/08/2026, délai de 30 jours, limite le 19/09/2026, dépassée de 31 jours au 20/10/2026 → ne l’utiliser qu’en version 5.2.3 ou plus (et corriger KerResa, qui l’utilise déjà, exercice 8). redim-image 0.9.2 : composant abandonné (aucune activité depuis 2022, aucune réponse aux signalements) → refuser : une faille découverte demain ne serait jamais corrigée ; la photo n’est pas dans la première version, on choisira un composant maintenu le moment venu.

4.2 Ajouter au pipeline : composer audit --locked --no-dev (avec le contrôle des avis de la veille et blocage si un délai est dépassé), et le modèle GitLab de détection de secrets ; on peut ajouter les tests automatiques des refus (priorité, chambre, catégorie).

Mission 5 — Protection des données et note

5.1 Récit R3 : par défaut, pas de notification. L’application propose au client, au moment du signalement, une case « Me prévenir quand c’est réparé » non cochée ; la notification passe par l’application (notification dans « Kervanet & Moi ») plutôt que par un courriel qui recopierait le détail ; elle ne contient que « Votre demande du … est traitée ». C’est la protection par défaut de l’article 25 (document 6) : un traitement supplémentaire n’a lieu que si la personne agit.

5.2 Note possible :

Madame Le Bihan, la fonction « signaler une panne » sera la première qui permette à des clients d’agir sur KerMaint depuis Internet. Notre analyse fait apparaître trois risques élevés : un secret technique exposé dans l’application, des priorités faussées par l’utilisateur, des adresses de clients copiées dans les journaux. Les exigences que nous proposons (contrôles côté serveur, gestion des secrets, journaux limités, composants à jour) représentent quelques jours de travail si elles sont prévues dès la conception. Ajoutées après la mise en service, elles demanderaient de modifier une application déjà utilisée, de refaire la recette et, en cas d’incident, de gérer une violation de données avec votre DPO. Le RGPD (art. 25) impose d’ailleurs à Kervanet, responsable du traitement, de protéger les données dès la conception. Nous vous proposons donc de les inclure dans le devis. Sarah Cherif, pour Anaïs Lecoq.

Astuce

Dans une note à la direction, parle de risques, de coûts et de décisions, pas de fonctions PHP. Une phrase sur le cadre juridique, tiré du dossier, renforce l’argument sans le transformer en cours de droit.

Prêt pour le quiz ?

10 questions pour vérifier que tout est acquis.

Faire le quiz