La sécurité des projets
Cédric BRASSEUR

Cédric BRASSEUR
- Ancien étudiant de l'Exia.cesi
- 4 ans consultant chez Amaris, placé chez Euro Information Dev
- Auto-entrepreneur depuis début 2020 (Création de sites web, applications mobiles, client lourds... & formateur)
Et vous ?
- Nom, prénom
- Etudes réalisées et niveau sur la sécurité logicielle

Plan du cours
- Introduction à la sécurité au sein d'un SI
- La sécurité au sein des cycles de vie
- Rappels de notions sur la sécurité dans le web
- Sécurité du code : Les différents types d'analyses sécurités
- Sécurité des API & Frameworks
- Sécurité des Bases de données

Summary
Objectifs du jour
- Acquérir les concepts de la sécurité dans les cycles projets et mettre en œuvre la sécurité dans les différentes phases d’un projet
- Appréhender la sécurité des API et des bases de données








Introduction sur la sécurité au sein d'un SI
Cybersécurité &
sécurité d'infrastructure
Il est important de différencier ces deux aspects de la sécurité informatique

Objectifs
- Intégrité des données
- Confidentialité des données
personnelles - Authentification pour effectuer les actions qui me concernent
- Disponibilité immédiate
- Sauvegarde des données et altérations

Enjeux
<?php
$enjeux = [
'Objectifs précédents',
'Légitimité / Crédibilité',
'Droits à la vente de certains produits',
'Obligations légales (hopitaux, banques,...)'
];
?>

DSI
Accompagne dans les choix stratégiques de l'entreprise et en est responsable
Gestion de l'infrastructure physique et logique de l'entreprise et en est responsable également
RSSI
Responsable de la sécurité, de l'intégrité et de la disponibilité des données
Réalise le PSSI qui sera validé par le DSI
Responsable de la formation de ses équipes au développement sécurisé
Gouvernance
Dev(Sec)Ops
Le cycle de vie de la sécurité d'une application
- Versionning
- Build
- Intégration
- Tests
- Déploiement
- Configuration
- Monitoring
Comment intégrer la sécurité dans ce processus de développement continu ?
Et vôtre rôle à vous ?
Normes et législations
ISO/IEC 27034
PCI-DSS / PA-DSS
HIPAA
CNIL
RGPD
Autres.. Renseignez-vous !
Bibliothèques, projet et recommandations
- MITRE CWE
- BSIMM
- OpenSAMM
- SDL Microsoft
- OWASP CLASP
- ANSSI + CLUSIF

La sécurité dans le cycle de vie d'un projet
Intégration au cycle de développement
Dans un cycle en V, la sécurité vient s'intégrer généralement entre la phase de coding et celle de tests.
Aujourd'hui, les méthodes agiles sont de plus en plus utilisées… Dans ce contexte, on rajoute dans le cycle une phase de sécurisation composée de plusieurs sprints.

S-SDLC
Secure-Software Development Life Cycle
Le S-SDLC concerne à la fois les manageurs et les développeurs dans une entreprise. Ce procédé n'est pas encore très répandu dans les entreprises, bien qu'il soit très efficace. Nous allons voir les différentes étapes de mise en place d'un S-SDLC.

les développeurs
S-SDLC
Seconde étape
Exigences : phase importante où l'on défini les besoins en sécurité de l'organisation ainsi que l'élaboration du plan d'action et l'analyse de coût de la mise en place d'un S-SDLC

S-SDLC
Troisième étape
Conception : cartographie de l'architecture autour de l'application pour en modéliser les menaces. On va anticiper pour réduire les menaces potentielles.
Mieux vaut prévenir que guérir ! "

Secure by design
Réduire les surfaces d'attaques : L'objectif de cette étape est de diminuer au maximum les possibilités afin de n'autoriser que ce qui est nécessaire au bon fonctionnement de l'application.
Plus on réduit les surfaces d'attaques, plus il est simple de maîtriser les éléments constituants notre système. Par exemple, refuser l'accès à tous les ports excepté une whitelist nécessaire à l'application.
Inclus également : La défense en profondeur (données, application, hôte, réseau, physique, politique de sécurité), la séparation des privilèges, la paramètres par défauts (mots de passes, etc...)
Modélisation des menaces
La modélisation des menaces est également une étape importante pour s'assurer de la sécurité de son projet.
Diagrammes
Identification
Atténuation
Validation
Documentation et validation entre les parties prenantes
Utilisation du modèle STRIDE
Déterminer les points d'entrées et les interactions
Interventions sur les éléments identifier en phase précédente
S-SDLC
Quatrième étape
Code : Déterminer les règles de développement à suivre et penser à effectuer une analyse de code statique !
Ces règles devront être respectées par toutes les parties prenantes de votre projet.

S-SDLC
Cinquième étape
Test : S'assure de la sécurité de manière dynamique avec l'utilisation de scans de vulnérabilités (dynamique), tests de fuzzing, ou tests de pénétrations.

S-SDLC
Sixième et dernière étape
Permet l'analyse des écarts entre les principes définis lors de l'étape 2 et la réalité du code applicatif de notre application.
On réalise également un plan de réponse aux incidents (écarts), puis on réalise une revue finale de sécurité.

Notions et rappels sur la sécurité (pour le Web)
Architecture d'une application web (rappel)

Les requêtes http
HTTP Request
Demande du client à effectuer une action via le protocole HTTP

HTTP Response
Réponse formatée par le serveur pour retourner l'information voulue au client via HTTP
La sécurité des navigateurs et serveurs web
SOP (Same Origin Policy)
CORS (Cross Origin
Resource Sharing)
Autorisé:
Non Autorisé :
Origine :
http://www.exemple.com/test/index.html
http://www.exemple.com/test/toto/page.html
http://www.exemple.com/test/autrePage.html
http://exemple.com/test/page2.html
https://www.exemple.com/...
http://www.exemple.com:8081/...
Permet de définir quelques options supplémentaires souvent nécessaires !
Telles que
- host,
- origin,
- allow-origin,
- allow-methods (pour les types de méthodes GET, POST, PUT, DELETE,...)
ANTI XSS
ANTI XSS
HSTS
Force le protocole HTTPS !
Se configure au niveau du serveur Apache, en suivant un guide, vous devriez vous en sortir aisément.

CSP

Content Security Policy
Filtre tous les scripts, fichiers, ou autres éléments autorisés selon une liste blanche de fichier par un système de hashage
ANTI XSS
HTTPOnlyCookie & Authentification HTTP
HTTPOnlyCookie
Permet d'éviter toute récupération du cookie via autre chose qu'une requête HTTP. On empêche donc un script javascript contenant document.cookie d'être exécuté par exemple.
Authentification HTTP
Permet de sécuriser un peu plus une connexion utilisateur via un protocole HTTP en rajoutant du hashage par exemple. Mais ça n'empêche pas qu'il est contournable par un brute force.
Donc mon conseil c'est simplement de forcer HTTPS.
Pare-feu WAF
Module d'une application web, serveur ou machine virtuelle, un WAF permet de protéger contre les attaques HTTP malveillantes.

Challenge "hacking"
Hacking de session simple
Rendez-vous sur https://www.hackthissite.org/missions/basic/
Vous allez être contraint de créer un compte…
Votre but est d'aller le plus loin possible dans les 11 challenges basics disponibles.
Pour ceux qui finissent vite, n'hésitez pas à fouiner sur les autres challenges du site.
Challenge "hacking"
Hacking using JavaScript
Rendez-vous sur https://www.hackthissite.org/missions/javascript/
Votre but est d'aller le plus loin possible dans les 7 challenges JavaScripts disponibles.
Pour ceux qui finissent vite, n'hésitez pas à fouiner sur les autres challenges du site.
La sécurité dans le code : Les différents types d'analyse sécurité
Les analyses automatisées
SAST
Static Application Security Testing : Analyse statique du code
DAST
Dynamic Application Security Testing : Analyse dynamique de l'application



IAST
Interactive Application Security Testing : Analyse interactive de l'application, ici on va également tester de manière interactive les frameworks et dépendances utilisées en continue sur notre application

L'analyse statique
S'effectue via :
- Scripts
- Analyse à la frappe dans l'IDE
- Scans ponctuels,
- ...
Remonte les vulnérabilités :
- Top 10 OWASP
- Certaines normes PCI-DSS
- Inclus la qualité de votre code (pour la qualité SonarQube est meilleur)
Permet de :
- Détecter au plus tôt les vulnérabilités
- Propose des corrections ciblées
- Associe une criticité à chaque vulnérabilité
- Aide à la découverte des nœuds communs aux failles pour déterminer efficacement le "Best Fix Location"
Explications
Analyse statique
Comment ça marche ?
Transforme le code de votre application en arbre syntaxique pour en définir les interactions et y déceler de potentielles vulnérabilités.
Un arbre syntaxique se représente sous forme de nœuds liés les un aux autres. Permet par exemple de vérifier que les entrées utilisateurs sont bien purgées par une méthode d'assainissement.

Attention :
- De nombreux faux positifs sont à prévoir avec l'analyse statique
- Il faut parfois développer ou surcharger les règles de base pour s'adapter aux normes de votre entreprise
Analyse statique
Exemples d'analyseurs
- sonarqube
- checkmarx
- appscan
- bandit (Bandit)
- eslint (ESLint (JavaScript and React))
- flawfinder (Flawfinder)
- kubesec (Kubesec)
- nodejs-scan (NodeJsScan)
- phpcs-security-audit (PHP CS security-audit)
- pmd-apex (PMD (Apex only))
- security-code-scan (Security Code Scan (.NET))
- semgrep,...

Analyse dynamique
En quoi c'est différent de l'analyse statique ?
Contrairement à l'analyse statique qui ne va analyser que les sources, l'analyse dynamique va tenter de profiter de failles plus poussées et liées également à la configuration de votre infrastructure sécurisée (tests de pénétration automatisés). Sera plus enclin à détecter des failles de types Cross-Site Scripting & les problèmes de gestion autour de l'authentification.

Attention :
- Plutôt complexe à mettre en place (même si depuis peu DAST peu être intégré à une CI)
- Attention à ne pas laisser trainer les résultats de ce genre de tests (ceux de l'analyse statique non plus)
Tests de pénétration
C'est là où on fait appel à des experts pour tester notre application de bout en bout !

Plusieurs types :
- White-box : Avec un accès total, pour identifier des vulnérabilités
- Black-box : Le mode criminel qui s'infiltre
- Grey-box : Le pentester a l'adresse IP du serveur et un compte utilisateur (= Man in the middle)
- Red-team : Deux équipes dans votre entreprise se challengent, l'une en temps que hacker, l'autre en tant que protecteur de l'application
Souvent très cher !
(Manuel)
Revue de code
Pratique très courante et à réaliser en continue, la sécurité n'échappe pas au besoin de réaliser des revues de code.

Plusieurs types :
- Inter équipe : Un responsable de revue de code est défini pour le projet afin de pouvoir vérifier en continue ce qui est livré.
- Externe : Faire intervenir un externe pour réaliser des revues de code poussées
- Soi-même, sur son propre code : C'est souvent le plus oublié, mais c'est la première revue de code à réaliser !
Systématique
Installation & exercice SonarQube
- Téléchargez https://www.sonarqube.org/downloads/
- Suivez la documentation https://docs.sonarqube.org/latest/setup/get-started-2-minutes/
- Analysez cette application, utilisez git clone ou récupérez le zip sur https://github.com/EditionsENI/securiteWEB
- Analysez les résultats dans SonarQube et tentez de comprendre où sont les vulnérabilités et rendez-vous dans le code de DVWA et / ou bWAPP pour trouver des solutions.
La sécurité des bases de données
Sécuriser sa base de données
- Contrôler les accès à votre base au maximum et limiter l’accès aux données confidentielles
- Identifier les données sensibles et critiques
- Chiffrer les données en base
- Prendre le soin de ne pas donner de copie de la base de données de production
- Suivre l'activité sur votre base de données en continue

BDD

Contrôler l'accès
Vos systèmes de gestion de bases de données doivent idéalement gérer les droits et utilisateurs directement dans leurs propres systèmes. Ceci vous permettra de bien vérifier qui accède à quoi et surtout contrôler les accès de chaque utilisateur (ou pour chaque rôle).
L'accès physique au serveur de la base de données est également à sécuriser mais ce n'est pas l'objet de cette formation.
Utilisateur
Rôle(s)
Droits
Authentification
Autorisations

Identifier les données sensibles
Identification des données sensibles :
- Mots de passes : Hacher et saler
- Données d'environnement (clé d'api, versions...)
- Données de config
- Données personnelles
- Données de cartes bancaires
- Informations médicales (secret médical)
- Point de vue religieux, idéologique,
- ...
Chiffrer les données sensibles
C'est s'assurer de rendre une information confidentielle en la chiffrant, tout en s'assurant que seule la source de destination sera capable de décrypter le contenu sécurisé.


On va donc rendre une donnée illisible le temps du transport (quelque soit le protocole) et seul le destinataire possède la clé de décryptage pour rendre lisible la donnée envoyée.
Quelques algorithmes de chiffrage
Il existe différents types d'algorithmes de chiffrages, nous allons en lister quelques un et réaliser un exemple d'algorithme de César.

Les différents algorithmes
- DES,
- Triple DES,
- Algorithme de César,
- Vigenère,
- Chiffrement symétrique / asymétrique,
- RSA/DSA,
- fonctions de hachages (MD5, SHA-0, SHA-1,...)
Exercice simple (César)
Réalisez un script en php qui transforme une chaîne en une chaine chiffrée grâce à l'algorithme de César.
L'algorithme de César :
- Décalage de la lettre courante de 3 caractères vers la gauche dans l'alphabet ("BONSOIR" ==> "ERQVRLU")
- (optionnel) Découpage de la chaîne en tronçons de 5 caractères. Attention, cette étape rend le déchiffrage automatisé plus complexe pour une phrase !
Exemple : "BONSOIR" ==> "ERQVR LU"
& Réalisez le script de décryptage d'une chaine chiffré par l'algo de César (Exemple : "ERQVRLU" => "BONSOIR")
Production
Cet environnement doit être sécurisé en permanence et aucune copie ne devrait être réalisée
Pré-production
Attention aux données de production
Cet environnement doit avoir des données cohérentes par rapport à celles de production, mais ne doit pas en être une copie (Exemple carte de crédit). Et dans l'idéal rester sécurisé.
Développement
Environnement avec aucune sécurité !
Ne surtout pas utiliser de copie de la base de production sur cet environnement non sécurisé
Tracker en continu
Plusieurs outils permettent de surveiller en continue tout ce qu'il se passe sur votre base de données.
Ceci devrait être systématique pour chacun de vos projets ayant un besoin en sécurité élevé.
L'objectif est de :
- Contrôler qui accède
- Connaître toutes les requêtes effectuées et par qui !
- Être alerté en cas de tentatives d'accès à une ressource non accessible
- (Hors sécurité) Permet aussi l'optimisation de votre base de données car vous pourrez aisément connaître les requêtes les plus réalisées et donc les optimiser.








La sécurité des API
&
des Frameworks
APIs
- Les APIs sont de plus en plus utilisées depuis que l'on tend à utiliser des systèmes décentralisés
- Une API doit être sécurisée, testée et intégrée en continue
- Une API peut utiliser un Framework (dans l'idéal, sécurisé)
- Une API doit toujours être disponible
- Les données transitant par une API doivent être contrôlées
Frameworks
- L'utilisation d'un Framework a de nombreux avantages en matière de sécurité :
- Faciliter la gestion des droits et rôles,
- Logger à votre place,
- Sécuriser le nombre d'appels
- Sécuriser les données sensibles,...
- Mais il faut s'assurer d'utiliser un Framework sécurisé et maintenu ! Sinon, vous n'avez pas la main pour corriger une éventuelle faille.

La sécurité des APIs
Gestion des sessions
Pour réaliser des opérations sécurisées sur vos APIs, il vous faut pouvoir authentifier et maintenir les sessions de vos utilisateurs. Le maintient de la session est à considérer comme temporaire.
On recharge la session régulièrement et surtout on recharge la session avant une opération critique !
(même si l'idéal est d'éviter qu'un utilisateur lambda puisse réaliser une opération critique sur votre API)



Identifier les données sensibles
-
Cloisonnement des environnements : Et sécurisation des variables de configuration
-
Sécurisation des clés d'APIs "Secrets" : Utilisation de clé différentes pour l'environnement de test et sécurisation maximale de celle de l'environnement de production. (Exemple Stripe !)
-
Données sensibles : CB, mots de passes,...
- Hachage efficace : Utiliser le hachage pour sécuriser vos données

RGPD
Gestion des erreurs
- Gestion cohérente des erreurs dans votre API (code retour, message, type d'erreur,...)
- Journalisation des erreurs (logs)
- Intercepter les erreurs et les traiter
- Alerter en continue (lors du déploiement continue)
Gestion de la mémoire
- Gestion de la mémoire souvent oubliée dans la sécurité
- Souvent géré directement par le Framework (Garbage collector)
- Très impactant dans d'anciens langages tels que le C ou le Cobol
- Superviser la consommation mémoire en continue
Vérification des entrées / sorties
Vérifier les entrées utilisateurs !
N'importe qui peut modifier le payload, c'est à vous de vous assurer de la cohérence des données qui vont pouvoir atteindre votre base.

Vérifier la présence d'une authentification
En étant en invité, l'utilisateur ne devrait uniquement que pouvoir créer un compte et lire les données accessibles aux visiteurs.
Encoder les données avant retour
Des données encodées sont des données qui, si elles peuvent être intercéptées, ne pourront pas être lues sans l'opération de décryptage.


Contrôler l'accès
Vos APIs doivent gérer les droits et utilisateurs également. Ceci vous permettra de bien vérifier qui accède à quoi et surtout contrôler les accès de chaque utilisateur (ou pour chaque rôle).
Le nombre d'appels maximum à votre API est également à contrôler.
L'utilisation de Framework est conseillée mais pas obligatoire. Ce dernier peut directement intégrer la gestion des droits. Prenons un exemple avec Directus.
Utilisateur
Rôle(s)
Droits
Authentification
Authorisations


OpenSAMM
Chaque sous domaine est divisé en 4 niveaux de maturité pour associer une "note" à votre application :
- 0 : Niveau implicite de départ
- 1 : Compréhension initiale et mise en place de pratiques de sécurité
- 2 : Amélioration de l’efficacité/efficience des pratiques de sécurité
- 3 : Maîtrise complète des pratiques de sécurité

Workshop
TOP 10 OWASP
Exercices supplémentaires
Rendez-vous sur
https://www.root-me.org/fr/Documentation/Web/
Parcourez les cours, certains sont déjà vus mais les exemples de codes sont très complets sur ces documents.
Ensuite, rendez-vous sur la partie challenge Web-Client du site https://www.root-me.org/fr/Challenges/Web-Client/?tri_co=id_mot
Faites en le plus possible, pensez à trier par difficulté !
Vous pouvez aussi tenter les Web-Serveur Challenges.
Evaluation
Partie théorique
Envoyer fichier security_theory.docx
(sans confondre…)
Partie pratique
Déjà, dézippez les sources et mettez les dans le dossier wamp/www (ou équivalent).
Pour chaque exercice du zip envoyé votre objectif est de :
- Trouver quelle est la faille et où elle se trouve dans l'exercice. Veuillez mettre un commentaire avec la faille en question juste au dessus de la ligne ou l'élément de faille. (Si possible mettez dans un commentaire l'instruction qui provoque la faille (ou le contenu de l'entrée utilisateur))
- Corrigez cette faille en développant le correctif. Vous pouvez vous aider de ce que l'on a vu ensemble ! Normalement, ce sont des exemples de bases, vous devriez vous en sortir.
BON COURAGE !
(après c'est fini)
Security project
By Cėdric Brasseur
Security project
- 380