Sécuriser mes applications avec ZF2

66
lien Charpentier – Directeur R&D rille Grandval – Directeur Général ZF2 Sécurité « Sécuriser mes applications avec ZF2 » 18.06.20 Darkmira Tour Zend Day 20

Transcript of Sécuriser mes applications avec ZF2

Page 1: Sécuriser mes applications avec ZF2

Julien Charpentier – Directeur R&DCyrille Grandval – Directeur Général

ZF2 Sécurité

« Sécuriser mes applications avec ZF2 »

18.06.2015Darkmira Tour Zend Day 2015

Page 2: Sécuriser mes applications avec ZF2

Qui sommes nous?

Cyrille GrandvalZend Evangelist (membre Z-Team)

Consultant PHP / SécuritéProfesseur / Formateur PHP et Sécurité des applications Web

[email protected]@CyrilleGrandval

Julien CharpentierConsultant / Architecte PHPProfesseur / Formateur PHP

[email protected]@jcharpentier_

Co-auteur du livre « Préparation à la certification Zend Certified PHP Engineer - ZCPE » aux éditions ENI

Page 3: Sécuriser mes applications avec ZF2

ZF2 – Composants de sécurité

• Zend\Authentification• Zend\Db• Zend\Captcha• Zend\Crypt• Zend\Escaper

• Zend\Filter• Zend\InputFilter• Zend\Permissions• Zend\Math• Zend\Validator

Page 4: Sécuriser mes applications avec ZF2

Première (et seule) vérité

Ne vous fiez à personne…

Page 5: Sécuriser mes applications avec ZF2
Page 6: Sécuriser mes applications avec ZF2

Les hackers ne se soucient pas de mon site !

Page 7: Sécuriser mes applications avec ZF2

Sécurité – Mantra du No®ris (que)

Filtre et valide les données entrantes, encode les données

sortantes !

Page 8: Sécuriser mes applications avec ZF2

Sécurité ZF2 – données entrantes

• S’assurer de la provenance des données (Zend\Captcha)

• Filtrer les données utilisateurs (Zend\Filter)• Valider les données utilisateurs (Zend\Validate)• Etablir une stratégie de filtrage (Zend\

InputFilter)

Page 9: Sécuriser mes applications avec ZF2

Zend\Captcha

• Captcha => Test de défi-réponse utilisé en informatique

• S'assure qu'une réponse n'est pas générée par un ordinateur

L'acronyme « CAPTCHA » est basé sur le mot capture, et vient de l'anglais completely automated public Turing test to tell computers and humans apart

Permet de s’assurer qu’un formulaire est bien soumis par un utilisateur.

Page 10: Sécuriser mes applications avec ZF2

Zend\Captcha

Plusieurs adaptateurs

• Zend\Captcha\Dumb• Zend\Captcha\Figlet• Zend\Captcha\Image• Zend\Catpcha\ReCaptcha

Page 11: Sécuriser mes applications avec ZF2

Zend\Captcha\Image

Création et configuration du captcha

Ajout dans un formulaire

Page 12: Sécuriser mes applications avec ZF2

Zend\Captcha\Image

Page 13: Sécuriser mes applications avec ZF2

Zend\Captcha

Page 14: Sécuriser mes applications avec ZF2

Zend\Filter

• Appliquer un ou plusieurs traitement sur une donnée

• Un filtre est un transformateur -> retourne une donnée après l’avoir nettoyée, tronquée, cryptée, compressée voire même traduite ou convertie

• Méthode filter qui retourne la donnée d’entrée « nettoyée »

Permet de transformer une source de données externe

Page 15: Sécuriser mes applications avec ZF2

Zend\Filter

• Zend\Filter\Blacklist• Zend\Filter\Boolean• Zend\Filter\Callback• Zend\Filter\Digits• Zend\Filter\Decrypt• Zend\Filter\Encrypt

• Zend\Filter\HtmlEntities• Zend\Filter\PregReplace• Zend\Filter\StripNewlines• Zend\Filter\StripTags• Zend\Filter\ToInt• Zend\Filter\WhiteList• Zend\I18n\Filter\*

Listes non exhaustive des filtres prédéfinis

Page 16: Sécuriser mes applications avec ZF2

Zend\Filter - utilisation

• Zend\Filter\StripTags

• Zend\Filter\ToInt

• Zend\Filter\Whitelist

Exemples de filtrage d’une donnée entrante

Page 17: Sécuriser mes applications avec ZF2

Zend\Filter - utilisation

Intégration dans un formulaire

Page 18: Sécuriser mes applications avec ZF2

Zend\Filter - utilisation

Page 19: Sécuriser mes applications avec ZF2

Zend\Filter – aller plus loin

• Appeler un filtre de manière statique (Zend\Filter\StaticFilter)

• Définir un filtre avec une fonction de callback (Zend\Filter\Callback)

• Créer ses filtres personnels (étendre Zend\Filter\AbstractFilter et en informer le PluginManager)

Page 20: Sécuriser mes applications avec ZF2

Zend\Filter

Page 21: Sécuriser mes applications avec ZF2

Zend\Validator

• Valide le fait qu’une donnée reçue en entrée respecte certains critères prédéfinis

Un validateur contient une méthode isValid qui retourne la valeur TRUE si la donnée reçue respecte les critères, FALSE dans le cas contraire.

Permet de s’assurer que le format d’une source de données externe est conforme à nos attentes.

Page 22: Sécuriser mes applications avec ZF2

Zend\Validator

• Zend\Validator\Db\RecordExists

• Zend\Validator\Callback• Zend\Validator\CreditCard• Zend\Validator\Digits• Zend\Validator\EmailAddress• Zend\Validator\GreaterThan

• Zend\Validator\InArray• Zend\Validator\LessThan• Zend\Validator\Regexp• Zend\Validator\

StringLength• Zend\Validator\Uri• Zend\I18n\Validator\*

Listes non exhaustive des validateurs prédéfinis

Page 23: Sécuriser mes applications avec ZF2

Zend\Validator - utilisation

Exemples de validation d’une donnée entrante

• Zend\Validator\Digits

• Zend\Validator\EmailAddress

Page 24: Sécuriser mes applications avec ZF2

Zend\Validator - utilisationIntégration dans un formulaire

Page 25: Sécuriser mes applications avec ZF2

Zend\Validator - utilisation

Page 26: Sécuriser mes applications avec ZF2

Zend\Validator – aller plus loin• Appeler un validator de manière statique (Zend\Validator\

StaticValidator)

• Définir un validateur avec une fonction de callback (Zend\Validator\Callback)

• Créer ses validators personnels (étendre Zend\Validator\AbstractValidator et en informer le PluginManager)

Page 27: Sécuriser mes applications avec ZF2

Zend\Validator

Page 28: Sécuriser mes applications avec ZF2

Zend\InputFilter

Un filtre d’entrée permet de définir une collection de filtres et de validateurs applicable sur n’importe quel type de données d’entrées (formulaires, paramètres GET, COOKIE, entête HTTP, etc…) dont le nom est connu.Il est ainsi possible de définir des filtres et validateurs pour l’ensemble des données utilisées par une application.

Un filtre d’entrée contient une méthode isValid qui retourne la valeur TRUE si la donnée reçue respecte les critères, FALSE dans le cas contraire

Permet de définir une stratégie globale de validation d’une source de données externe.

Page 29: Sécuriser mes applications avec ZF2

Zend\InputFilter - utilisation

Exemple de création d’un filtre d’entrée

Page 30: Sécuriser mes applications avec ZF2

Zend\InputFilter - utilisation

Page 31: Sécuriser mes applications avec ZF2

Zend\InputFilter - utilisation

Exemple d’utilisation du filtre d’entrée

Avec un formulaire

Page 32: Sécuriser mes applications avec ZF2

Zend\InputFilter

Page 33: Sécuriser mes applications avec ZF2

Sécurité – données sortantes

Composants ZF2

• Zend\Escaper• Zend\View\Helper\Escape*• EscapeCss• EscapeHtml• EscapeHtmlAttr• EscapeJs• EscapeUrl

Page 34: Sécuriser mes applications avec ZF2

Zend\Escaper

• Permet de transformer une donnée destinée à l’affichage afin que celle-ci ne soit pas interprétable par le navigateur

• Un encodeur contient plusieurs méthodes permettant l’encodage suivant le contexte d’affichage (html, css, js, url ou attribut html)

Permet de s’assurer que les données s’affichent telles que nous le voulons.

Page 35: Sécuriser mes applications avec ZF2

Zend\Escaper - utilisation

Exemple d’encodage de données sortantes

Ou directement dans une vue

Page 36: Sécuriser mes applications avec ZF2

Zend\Escaper

Page 37: Sécuriser mes applications avec ZF2

Top 10 OWASP 2013

A1 – InjectionA2 – Violation de Gestion d’Authentification et de SessionA3 – Cross-Site Scripting (XSS)A4 – Références directes non sécurisées à un objetA5 – Mauvaise configuration SécuritéA6 – Exposition de données sensiblesA7 – Manque de contrôle d’accès au niveau fonctionnelA8 - Falsification de requête intersite (CSRF)A9 - Utilisation de composants avec des vulnérabilités connuesA10 – Redirections et Renvois Non Validés

Page 38: Sécuriser mes applications avec ZF2

A1 – Injection

• Une donnée entrante brute est insérée dans une commande liée à une interprétation

• Plus connu : injection SQL mais bien d’autres : LDAP, Xpath, ...

1. Valider les données entrantes2. Requêtes paramétrées (préparées, procédures stockées)

Page 39: Sécuriser mes applications avec ZF2

A1 – Injection

• Paramètres anonymes

• Paramètres nommés

Page 40: Sécuriser mes applications avec ZF2

A2 – Violation de Gestion d’Authentification et de Session

• Mot de passes utilisateurs incorrectement stockés • Divination des mots de passes utilisateurs et des

identifiants de session• Permettre l’utilisation des identifiants de session dans

l’URL• Pas de timeout de session• Pas de renouvellement d’identifiant de session après

changement de droits • Utilisation de connexion non sécurisées• Mauvaise configuration

Page 41: Sécuriser mes applications avec ZF2

A2 – Violation de Gestion d’Authentification et de Session

Exemple d’utilisation de Zend\Session\Config et ZendSession\SessionManager

Page 42: Sécuriser mes applications avec ZF2

Exemple de configuration

Exemple d’utilisation de Zend\SessionManager

A2 – Violation de Gestion d’Authentification et de Session

Page 43: Sécuriser mes applications avec ZF2

A3 – Cross-Site Scripting (XSS)

• Faille la plus répandue• Inclusion direct de code script fourni par l’utilisateur

dans la réponse au navigateur• XSS réfléchi• XSS stocké• XSS basé sur DOM

Validation des données d’entrées et encodage des données de sortie

Page 44: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

• Objet interne fait directement référence à une ressource (fichier, répertoire, enregistrement en base de données) sans contrôle d’accès spécifique• Par exemple, modification d’un id dans l’url pour accéder à

une autre ressource

Vérifier systématiquement si un utilisateur à accès à une ressource • Mise en place d’ACL simple, maintenable et clair• Vérifier en base de données à chaque action

Page 45: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Gestion des droits

Vérifier qu’un utilisateur a bien accès à un type de ressource défini

• Zend\Authentification• Zend\Permissions\Acl ou Zend\Permissions\Rbac

Page 46: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Zend\Authentification

Fournit une API permettant de gérer l’authentification d’un utilisateur

Zend\Authentification\Adapter

Plusieurs adaptateurs disponibles :• Base de données• Digest• HTTP• LDAP• Callback

Page 47: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Exemple d’utilisation de Zend\Authentification

Page 48: Sécuriser mes applications avec ZF2

Zend\Permissions\Acl et Zend\Permissions\Rbac

Gestion des ACL (Access Control List) et des Rbac (Role-based Access Control) de manière souple et intuitive.

A4 – Références directes non sécurisées à un objet

Page 49: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Exemple d’utilisation des Acl

Page 50: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Page 51: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Page 52: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Page 53: Sécuriser mes applications avec ZF2

A4 – Références directes non sécurisées à un objet

Page 54: Sécuriser mes applications avec ZF2

A5 – Mauvaise configuration sécurité

Configuration sécurisée doit être définie, mise en œuvre, et maintenue au jour le jour

• Ne pas afficher les messages d’erreurs / stacktrace• Modifier les login et mot de passes par défaut des applications

utilisées• Mettre à jour sa version de PHP• Mettre à jour ses bibliothèques tierces• Bloquer tous les ports inutilisés

Page 55: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

• Crypter les données sensibles• Hacher les mots de passes avec des

algorithmes forts• Protéger les données sensibles comme

données patients, cartes bleues, ...

• md5 ou sha1 avec ou sans grain de sel n’est plus suffisamment sécurisée

• Recommandé d’utiliser aujourd’hui bcrypt, scrypt ou PBKDF2

Page 56: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

Zend\Crypt

Ce composant permet de mettre en œuvre une cryptographie poussée de manière simple et intuitive.

Liste des composants

• Zend\Crypt\BlockCipher• Zend\Crypt\Hash• Zend\Crypt\Hmac• Zend\Crypt\Key\Derivation• Zend\Crypt\Password• Zend\Crypt\PublicKey• Zend\Crypt\Symmetic

Page 57: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

Zend\Crypt\BlockCipher

C’est ce composant que nous allons utiliser pour encrypter et décrypter les données sensibles de l’application (cryptage symétrique).Il gère aussi l’authentification (HMAC). L’encryptage utilise l’adapter Mcrypt.

Liste des méthodes utiles de l’API

• setKey($key)• encrypt($data)• decrypt($data)

Page 58: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

BlockCipher - options par défaut

• Algorithme AES (clé de 256 bits) • Mode CBC

« Cipher Block Chaining » ou Enchaînement des blocs• HMAC (SHA-256)

« keyed-hash message authentication code »• Mode PKCS7 (RFC 5652)

« Public Key Cryptographic Standards » ou Standard de syntaxe de message cryptographique

• PBKDF2 « Password-Based Key Derivation Function 2» comme fonction de dérivation de clé pour la génération des clés de cryptage et d’authentification

• Random IV pour générer le grain de sel

Page 59: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

Exemple d’utilisation de Zend\Crypt\BlockCipher

Page 60: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

Zend\Crypt\Password\BCrypt

Composant utilisé pour encrypter et décrypter les mots de passe de l’application

Liste des méthodes utiles de l’API

• create($password)• verify($password, $hash)• setSalt($salt) avec $salt chaine optionnelle de 16 caractères

minimum• setCost($cost) avec $cost entier compris entre 4 et 31 (14 par

défaut)

Page 61: Sécuriser mes applications avec ZF2

A6 – Exposition de donnés sensibles

Exemple d’utilisation de Zend\Crypt\Password\Bcrypt

Page 62: Sécuriser mes applications avec ZF2

A8 – Cross-site Request Forgery (CSRF)

• Faire envoyer une requête par le navigateur d’un utilisateur, à son insu, pour effectuer une action• Les navigateurs envoient automatiquement les

informations d’authentification tels que les cookies de session

Inclure un jeton unique dans un champ caché (pour un formulaire), dans une url( pour les liens)

Page 63: Sécuriser mes applications avec ZF2

A8 – Cross-site Request Forgery (CSRF)

Mise en place d’un token anti-CSRF dans vos formulaires

Page 64: Sécuriser mes applications avec ZF2

A9 – Utilisation de composants avec des vulnérabilités connues

Liste de diffusion des failles de sécurité ZF2

http://framework.zend.com/security/advisories/

Page 65: Sécuriser mes applications avec ZF2
Page 66: Sécuriser mes applications avec ZF2

Des questions ??

Merci !