Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sécurité d'applications PHP - 11 mars 2019

Sécurité d'applications PHP - 11 mars 2019

Anna Filina

March 11, 2019
Tweet

More Decks by Anna Filina

Other Decks in Programming

Transcript

  1. Anna Filina ‣ @ZenikaMontreal ‣ Je réusine le code legacy.

    ‣ J'automatise les tests. ‣ Je corrige la sécurité et la performance. ‣ Je donne des présentations et des ateliers.
  2. Plan de cours ‣ Bases de durcissement d'applications. ‣ Injection.

    ‣ Authentification brisée. ‣ Exposition de données sensibles. ‣ Entités externes XML (XXE). ‣ Contrôle d'accès brisé. ‣ Mauvaise configuration de la sécurité. ‣ Cross-site scripting (XSS). ‣ Désérialisation insécure. ‣ Utilisation de composants avec des vulnérabilités connues. ‣ Journalisation et surveillance insuffisants. ‣ Dépassement de tampon. ‣ Cross-site request forgery (CSRF). ‣ Identification et classification des vulnérabilités. ‣ Modélisation des menaces.
  3. Surface d'attaque ‣ La somme de tous les chemins entrants

    et sortants de l'application. ‣ Le code qui protège ces chemins. ‣ Toutes les données sensibles utilisées dans l'application. ‣ Le code qui protège ces données. ‣ Réduire la surface d'attaque.
  4. Réduire la quantité de code exécuté ‣ Passer en revue

    et simplifier le code. ‣ Réusiner le legacy. ‣ Supprimer le code mort. ‣ Formulaires moins nombreux, plus simples. ‣ Beaucoup de code = grande surface d'attaque.
  5. Réduire points d'entrée pour utilisateurs non vérifiés ‣ Mode débogage.

    ‣ Endpoints d'API. ‣ Accès à la BD ou aux formulaires de connexion admin 
 en dehors du réseau interne. ‣ Fichiers accessibles via le serveur Web.
  6. Mauvais /var/www/myproject << vhost target - config - index.php -

    src Bon /var/www/myproject - config - public << vhost target - src
  7. Éliminer les services demandés par peu d'utilisateurs ‣ <5% des

    utilisateurs s'authentifient auprès de votre AD? ‣ <1% des utilisateurs ont besoin de téléverser des fichiers PDF?
  8. Désactiver les fonctionnalités inutilisées ‣ Fermer les ports. ‣ Désinstaller

    les logiciels inutilisés. ‣ Supprimer les fonctionnalités inutilisées dans le code.
  9. Réduire le transit inutile ‣ Envoyer les informations d'identification une

    seule fois,
 puis utiliser un jeton. ‣ Ne pas envoyer de données inutiles.
  10. Réduire la quantité de données stockées ‣ Stocker moins de

    données utilisateur. ‣ Supprimer les données dès qu'elles ne servent plus. ‣ Rendre les données stockées inutilisables.
  11. Vecteurs ‣ Injections stockées. ‣ Requêtes: SQL, LDAP, XPath, NoSQL.

    ‣ Commandes OS. ‣ En-têtes SMTP. ‣ Langages d'expression (regex). ‣ Analyseurs syntaxique XML.
  12. Solutions ‣ Examiner le code: scanneurs, fuzzing, revues de code.

    ‣ Garder les données non fiables séparées des commandes et des requêtes. ‣ Validation par liste blanche. ‣ Utiliser ORM ou ODM. ‣ Requêtes paramétrées (where user_id = ?) ‣ Filtrer les données fournies par l'utilisateur.
  13. Solutions ‣ Requêtes paramétrées: • Assurez-vous qu'un attaquant n'est pas

    en mesure de changer l'intention d'une requête. • Il suffit d'oublier une fois, alors faites-le systématiquement.
  14. Impact ‣ Exécuter du code arbitraire. ‣ Corrompre des adresses

    de mémoire, provoquant un crash. ‣ Exposer des données sensibles.
  15. Solutions ‣ Valider les frontières (rejeter ou tronquer). ‣ Mettre

    à jour les logiciels et les librairies à temps. ‣ Le code écrit en PHP est à l'abri, à moins d’un problème dans PHP ou une extension.
  16. Mots de passe ‣ Pas de texte en clair. ‣

    Pas de hash (empreinte). ‣ À cause des "ranbow tables".
  17. Rainbow tables ‣ Créer des permutations. ‣ Calculer le hash

    et stocker dans la table. ‣ Voler les hash de mots de passe. ‣ Chercher dans la table.
  18. Qu'en est-il des collisions? ‣ Ils n'existent pas pour les

    chaînes courtes. ‣ Vous n’en aurez pas dans vos tables.
  19. Solutions ‣ Saler les hash: • Clé aléatoire supplémentaire (sel)

    pour le hachage. • Conserver le sel et le hash. • Plus de permutations à essayer pour les attaquants. ‣ Hachage répété.
  20. Bcrypt ‣ Fait tout le travail lourd pour vous. ‣

    Choisissez le coût, augmentez plus tard. ‣ Toutes les métadonnées stockées dans le hash résultant.
  21. Politique de mot de passe ‣ Ne pas limiter le

    nombre et le type de caractères. ‣ Plus difficile de générer des rainbow table. ‣ Empêche également les attaques par force brute.
  22. Questions de sécurité ‣ Connu par un large groupe de

    personnes. ‣ Vous stockez plus de données privées. ‣ Mêmes questions de sécurité sur d'autres sites.
  23. Tokenisation de cartes de crédit Carte de crédit Jeton Montant

    + jeton App Passerelle de paiement Navigateur
  24. Personne ne peut voir le numéro complet ‣ Requête avec

    jeton donne **** **** **** 0123. ‣ Imprimer partiel sur les reçus. ‣ Afficher partiel aux directeurs de compte. ‣ Même les développeurs ne peuvent pas obtenir le nombre complet.
  25. Attention aux sessions ‣ Sessions signifie stockage. ‣ Stockage signifie

    qu'il peut être volé. ‣ Envoyer directement à la passerelle. ‣ Vous pouvez stocker les jetons.
  26. Stockage imprévu ‣ Instructions de l'utilisateur ‣ Commentaires de l'administrateur.

    ‣ Détecter les pattern et supprimer les données en clair.
  27. Vecteurs ‣ Transit. ‣ Stockage sur le serveur: • Bases

    de données. • Sauvegardes. • Etc. ‣ Stockage sur le client: • Navigateur. • Cookies. • Etc.
  28. Sécuriser le transit ‣ Tout via SSL. ‣ Refuser les

    certificats auto-signés. ‣ Mobile: forcer la vérification de la chaîne SSL. ‣ Éviter les données sensibles sur les canaux non sécurisés
 (e-mail, SMS, etc.) ‣ Données hautement sensibles: chiffrer même si elles sont envoyées via SSL (Heartbleed).
  29. Messages d'erreurs trop détaillés ‣ Stack trace. ‣ Enumération de

    compte (réinitialisation du mot de passe). ‣ Énumération d'objets (numéros de commande, pages d'administration, etc.).
  30. Solutions ‣ Désactiver le mode débogage. ‣ Régler les paramètres

    de sécurité (framework, langage et système). ‣ Renvoyer des messages d'erreur génériques où applicable.
  31. Impact ‣ Détourner les sessions. ‣ Lire les cookies. ‣

    Vandaliser le site. ‣ Rediriger l'utilisateur, ‣ Insérer du contenu hostile (phishing, keylogger). ‣ Télécharger des logiciels malveillants. ‣ Méfiez-vous des XSS stockés.
  32. Solutions ‣ Utilisez un moteur de templating. • Évitez les

    filtres “raw”. ‣ Ne pas transmettre de données utilisateur directement à JS (ou assainir avant). ‣ Filtrer en fonction du contexte (LDAP, XPATH, etc.) ‣ Utiliser le Content Security Policy.
  33. Solutions ‣ Éviter d'exposer des identifiants séquentiels. ‣ L'utilisation de

    jetons peut ne pas suffire (jeton plus longs ou combinaisons). ‣ Authentifier les utilisateurs et filtrer les données / actions. ‣ Vérifier les rôles et les privilèges. ‣ Revue de code. ‣ Penser au ACL. ‣ Ajouter à la suite de tests automatisés.
  34. Given I am authenticating as "user1" with password "123" When

    I request "/purchases/5" Then the response code is 404
  35. Structure générale ‣ Tromper un utilisateur pour effectuer une action

    sur votre site. ‣ Votre site par défaut ne se soucie pas de l'origine de la requête. ‣ Pas de problème avec les API REST, car elles n'ont pas d'état.
  36. Solutions ‣ Ne pas laisser GET avoir des effets secondaires.

    ‣ Jeton CSRF (nonce) - Symfony, Laravel et ZF l’ont. ‣ Ré-authentifier pour les opérations importantes.
  37. Fixation de sessions Identification Utilisateur App Attaquant sid=123 Lien de

    rabais /login?sid=123 Identification /account?sid=123
  38. Solutions ‣ N'utilisez pas d'URL pour l'ID de session. ‣

    Régénérez l'ID de session lors de la connexion. ‣ Expiration pour le ID de session. ‣ Tout via SSL. ‣ La gestion de session intégrée au framework. ‣ Éviter de stocker des données dans les cookies. ‣ Vérifier le changement / récupération du mot de passe.
  39. Vecteurs ‣ Configurations par défaut. ‣ Comptes par défaut. ‣

    Logiciels obsolètes (système d'exploitation, librairies, plugins, etc.) ‣ Code accessible au public. ‣ Etc.
  40. Exemple: MongoDB ‣ Ne force pas l'identification par défaut. ‣

    "More than 27,000 MongoDB databases seized by ransomware"
 – The Register
  41. Example: Petya ‣ Infecté corporations, infrastructure & banques dans le

    monde. ‣ Les victimes n'ont pas mis à jour leurs logiciels. ‣ Les victimes n'ont pas désactivé un protocole de partage de fichiers obsolète SMBv1 (30 ans).
  42. Exemple: surligneur de syntaxe WordPress ‣ Lors de l'utilisation d'une

    version obsolète:
 afficher n'importe quel fichier du serveur, tel que la config BD.
  43. Solutions ‣ Mettez à jour les logiciels et les librairies

    à temps. ‣ Désactive le mode débogage. ‣ Changer les mots de passe par défaut. ‣ Régler les paramètres de sécurité. ‣ Vérification automatique de la configuration. ‣ Architecture sécurisée. ‣ Processus de durcissement continu.
  44. <?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ELEMENT lolz

    (#PCDATA)> <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> <lolz>&lol9;</lolz>
  45. Attaques similaires ‣ Fork bomb: répliquer de manière récursive un

    processus. ‣ Zip bomb / zip de la mort: • Zipper un fichier de 1.3 Go contenant que des zéros. • Faire 10 copies, zipper. • Répéter 10 fois. • Zip final de seulement 45.1 Ko. • Décompresse en 1.3 exaoctets (giga > tera > peta > exa). • Brise les scanneurs de virus quand ils l'ouvrent récursivement.
  46. Exemples d'attaques ‣ Injecter du contenu malveillant. ‣ Lire un

    fichier. ‣ Sonder le réseau interne (https:/ /192.168.1.1). ‣ DoS (file:/ / /dev/random)
  47. Solutions ‣ Utiliser JSON si possible. ‣ Valider / assainir

    l'entrée. ‣ Mettre à jour les librairies XML. ‣ Désactiver les entités externe XML et le traitement DTD.
  48. Exemples d'attaques ‣ Exécuter n'importe quelle méthode __destruct/__wakeup avec n'importe

    quelle propriété. • Téléverser un root kit. • Envoyer des données ou des fichiers silencieusement
 à un serveur tiers. • Injecter en permanence des keyloggers dans les vues. • Etc. ‣ Modifier les données sérialisées pour augmenter les privilèges (exemple: cookie utilisateur).
  49. Solutions ‣ Rejeter les entrées de sources non fiables (formulaires,

    bases de données, en-têtes, etc.). ‣ Autoriser uniquement les types primitifs. ‣ Utiliser des sommes de contrôle (checksum). ‣ Exécuter la désérialisation en utilisant des privilèges faibles. ‣ Restreindre les requêtes réseau (domaines de la liste blanche). ‣ Journaliser les erreurs de désérialisation. ‣ Surveiller pour des désérialisations répétées par un seul utilisateur.
  50. Pourquoi journaliser et surveiller ‣ Les attaques commencent par un

    sondage, souvent avec des échecs. ‣ Surveiller pour détecter le sondage: • Devinez ce que l'attaque essayait de réaliser. • Découvrez vos vulnérabilités avant les autres. ‣ Journaliser: • Comprendre l'attaque pour trouver les vulnérabilités qui ont été exploitées. • Peut-être même trouver l'attaquant.
  51. ‣ Aucune alerte lorsque les sauvegardes de la base de

    données échouent. ‣ Aucune détection d'attaque par force brute. ‣ Pas de détection de DDoS. ‣ Aucune détection de scan d'URL. ‣ Aucune alerte en cas de pics de processeur. ‣ Aucune alerte en cas d'erreur d'application. ‣ Pas de gestion centralisée des journaux. Exemples
  52. Quoi journaliser? ‣ Échec des tentatives de connexion: force brute

    en rotation. ‣ Erreurs ACL: l’utilisateur A a tenté d’accéder à la transaction de l’utilisateur B. ‣ Erreurs 404 et 500: analyses d'URL ou recherche de vulnérabilités d'applications. ‣ Erreurs de validation d'entrée: téléverser un fichier malveillant ou sauvegarder une injection SQL. ‣ Journaliser avec le contexte et conserver pendant une longue période, pour la forensique. ‣ Faites un test pour voir si vos journaux fournissent suffisamment de données sur une attaque.
  53. Gestion de la journalisation ‣ Envoyer les journaux à un

    aggrégateur (exemple: Datadog). ‣ Ajouter des règles pour détecter les activités suspectes et alerter. ‣ Peut être utilisé pour détecter d'autres menaces, telles que les pics de processeur et les requêtes lentes.
  54. Eviter de les découvrir en prod ‣ Revues de code.

    ‣ Tests de pénétration. ‣ Suivre les actualités sur la sécurité, les listes de diffusion, experts sécurité sur Twitter, etc. ‣ Modélisation des menaces.
  55. Extra ‣ Adopter un plan de réponse aux incidents et

    de récupération. ‣ Exemple: NIST Computer Security Incident Handling Guide
 https:/ /nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP. 800-61r2.pdf
  56. Exemple de plan de réponse ‣ Processus en un clic

    en cas de fuite des mots de passe: • Déconnecter tous les utilisateurs. • Marquer comme compromis (is_dirty = 1). • Forcer l'authentification à 2 facteurs (ex.: Google Authenticator). • Forcer le changement de mot de passe. • Marquer comme non compromis.
  57. Processus de modélisation des menaces ‣ Deux types de menaces:

    • Malveillantes (attaque DDoS) • Accessoire (échec d'un périphérique de stockage) ‣ Chaque décision technique introduit une menace potentielle. ‣ Ne pas perdre de temps sur des choses improbables ou ayant un impact minimal.
  58. 1 – Évaluation: identifier les actifs ‣ BD ‣ Fichiers

    sensibles ‣ Réputation ‣ Clientèle ‣ Relations avec les employés ‣ Etc.
  59. 2 – Identifier les agents de menace et les attaques

    possibles ‣ Internes: personnel, fournisseurs, etc. ‣ Externes: compétiteurs, criminels, activistes, etc. ‣ Réalisent des attaques malveillantes ou des erreurs par inadvertance. ‣ Autres agents: incendies, tremblements de terre, malware, etc.
  60. Exemples de contre-mesures ‣ Action: formation à la sécurité, mise

    à jour du système d'exploitation. ‣ Dispositif: appareils pare-feu, systèmes de détection d'intrusion. ‣ Procédure: réviser le code, supprimer les clés SSH inutilisées. ‣ Technique: validation des entrées, cryptage des données.
  61. 4 – Identifier les vulnérabilités exploitables ‣ Rechercher les vulnérabilités

    qui relient les attaques possibles aux conséquences négatives. Perte de confidentialité Numéros CC en clair
  62. 5 – Risques identifiés par priorité ‣ Risque = probabilité

    et impact.
 ‣ Probabilité: moyenne. ‣ Impact: élevé. ‣ Risque: élevé.
  63. 6 – Identifier les contre-mesures pour réduire la menace ‣

    Réduire le risque à des niveaux acceptables. ‣ Exemple: utiliser des requêtes SQL paramétrées.
  64. 1 – Identifier un risque ‣ Actifs. ‣ Agents de

    menace et attaques. ‣ Contre-mesures existantes. ‣ Vulnérabilités exploitables. ‣ Noter et prioriser. ‣ Contre-mesures pour réduire la menace.
  65. 2 – Probabilité ‣ Facteurs d'agent de menace: • Niveau

    de compétence • Motif • Opportunité • Taille du groupe
  66. 2 – Probabilité ‣ Facteurs de vulnérabilité: • Facilité de

    découverte • Facilité d'exploitation • Conscience • Détection d'intrusion
  67. 3 - Impact ‣ Facteurs d'impact technique • Perte de

    confidentialité • Perte d'intégrité • Perte de disponibilité • Perte de responsabilité
  68. 3 - Impact ‣ Facteurs d'impact commercial: • Dommages financiers

    • Dommages de réputation • Non-conformité • Violation de la vie privée
  69. 4 – Niveau de risque global Probabilité Bas Moyen Élevé

    Impact Bas Note Bas Moyen Moyen Bas Moyen Élevé Élevé Moyen Élevé Crinque
  70. 5 – Décider quoi réparer ‣ Critique d'abord, mais vérifiez

    le coût du correctif. ‣ Ne passez pas trop de temps sur des choses faciles à résoudre mais sans importance.
  71. 6 – Personnalisez votre modèle d’évaluation du risque ‣ Ajouter

    des facteurs. ‣ Personnaliser les options. ‣ Peser les facteurs.