|
L'année 2004 et ce début d'année 2005 ont été marqués par de nombreuses failles impactant les navigateurs web (Internet Explorer, Mozilla, Netscape, etc...). Pour les serveurs web, les organisations sont également habituées à les mettre à jour ainsi que les serveurs d’applications pour corriger les failles qui sont régulièrement découvertes. Par contre, dans le cas d’applications web, garantir un niveau de sécurité nécessite de prendre en considération toute les nouvelles menaces, qui s’ajoutent aux menaces déjà existantes. Il reste encore des menaces et potentiellement des failles de sécurité bien que tous les composants logiciels concernés sont à jour en terme de sécurité : les applications web, et les développements qu’elles impliquent, peuvent se montrer vulnérables à de nombreuses problématiques de sécurité, propres aux applications web. Les failles de sécurité applicatives résultent de la mise en œuvre de méthodes de programmation non sûres, et du non respect de règles de programmation visant à limiter les risques suite à l'apparition de nouvelles failles. Cet article a pour objectifs :
Nota : Au delà de cet article, pour une prise en compte rigoureuse des risques de sécurité dans les applications web, il conviendrait de prendre en compte la sécurité applicative dans le cycle de vie des projets :
1/ La perte de confidentialité des données
Principe : Lors de leur fonctionnement, les applications web sont amenées à générer des messages d'erreur, lorsque l’utilisateur fournit une requête non valide. Ces messages doivent être compréhensibles pour l'utilisateur, mais préserver les informations sensibles. La mauvaise gestion des messages d'erreur au niveau d'un site web peut entraîner plusieurs types de problème de sécurité. On peut citer :
Nota : Un serveur web peut également donner des informations trop précises sur les versions des produits et systèmes utilisés. Il s’agira alors d’appliquer les derniers correctifs sur le service, ou bien de modifier sa configuration de façon à minimiser les informations envoyées au client. Solution : Mettre en place, au niveau du site, une politique de sécurité permettant de gérer tous les types possibles d'erreur, avec les informations associées. Ces dernières doivent permettre d'aider l'utilisateur sans lui révéler d'informations sensibles. Certaines erreurs doivent par ailleurs être journalisées, à des fins d'analyse en cas de tentatives d'attaques.
Il convient de veiller à ce que les traitements JavaScript, réalisés sur le navigateur client, ne comportent pas d’informations sensibles. Par exemple, la vérification de validité d’un identifiant, parmi tous les identifiants disponibles, ne devrait pas être réalisée côté client, car cela suppose de transmettre au client la liste de tous les identifiants valides. Cette vérification devrait alors être réalisée uniquement côté serveur, afin d’éviter cette fuite d’informations.
Principe : Certaines applications web doivent conserver des données sensibles (mots de passe, numéros de cartes de crédit, informations concernant les utilisateurs, etc...). Si la sensibilité de ces données l’exige, elles devront être protégées grâce à des mécanismes de chiffrement (notamment dans le cas où l’application s’interface avec une base de données, ou bien avec une application tierce). Les problèmes de sécurité liés au stockage de ces informations peuvent avoir plusieurs causes : échec de chiffrement des données confidentielles, stockage non sûr de clés, certificats ou mots de passe, conservation en mémoire de secrets, mauvais choix d'algorithme, etc... Nota : Des fichiers temporaires ou de configuration laissés dans l’espace de diffusion web peuvent entraîner la divulgation d’informations concernant le fonctionnement de l’application. Solution : Si une solution de chiffrement s'impose, privilégier une solution reconnue comme robuste et proposant un chiffrement fort. S'assurer que les informations sensibles sont stockées de manière sécurisée. 2/ Le problème d'authentification Principe : Lorsqu’une application doit gérer des espaces privatifs pour les utilisateurs, des mécanismes d'authentification et de gestion de session sont mis en place au niveau de l’application web, afin de gérer les sessions des différents utilisateurs, et de maintenir un cloisonnement de ces sessions. Ces mécanismes doivent apporter des garanties de confidentialité et d’intégrité des données privatives. Les problématiques de sécurité qui doivent être gérées par l’application sont alors principalement les suivantes :
Par exemple : POST /myAppliServlet/ HTTP/1.1 Sur cet exemple, le paramètre "ident" est à risques : il représente l’identité de l’utilisateur courant, alors que cette identité est déjà connue de l’application. L’utilisateur "Dupont", s’il est mal intentionné, pourra alors fournir une autre identité, afin de se faire passer pour un autre utilisateur : FONCTION=afficheComptes&ident=Durand Ici, si l’application n’effectue aucune vérification particulière, alors elle va utiliser l’identité "Durand" pour réaliser l’opération demandée (affichage des comptes). Sur cet exemple, il faudrait donc : 3/ Le problème de contrôle d'accès Principe : Les mécanismes de contrôle d'accès ont lieu après l'authentification de l'utilisateur et permettent de déterminer si un utilisateur donné est autorisé à accéder à certaines ressources. Un problème de contrôle d'accès va permettre à un attaquant authentifié d'accéder en lecture à des données non autorisées, mais peut également lui permettre de modifier ou détruire ces données, de réaliser des opérations nuisibles au niveau de l'application, voire de prendre le contrôle de cette dernière. Solution :
4/ L'injection sémantique Ces failles concernent les cas où les données envoyées par un pirate au système dans un contexte particulier contiennent une sémantique supplémentaire qui sera interprétée lors du traitement de ces données, mais dans un état non prévu à cet effet. Les données envoyées par l’utilisateur auront alors un sens pour une autre couche du système qui les interprétera. Trois déclinaisons courantes de ce type de failles sont :
Principe : De façon générique, le "Cross-Site Scripting" (voir l'article du bulletin de sécurité mensuel d'août 2001 du Cert-IST) correspond à l'action d'insérer des tags HTML ou scripts malicieux dans une page dynamique de l’application. L'exemple typique de "Cross-Site Scripting " est celui d'un attaquant qui envoie des scripts offensifs sur le poste d'un utilisateur victime, en utilisant la complicité involontaire d'un site web vulnérable. L'intérêt immédiat de cette attaque par rebond est que, contrairement au cas d'une attaque directe (cas où l'internaute victime visiterait un site pirate offensif), le site visité par la victime est à priori anodin, et l'utilisateur n'a donc pas de raison particulière d'être méfiant. De plus certains navigateurs web comme "Internet Explorer" permettent d'allouer des niveaux de confiances aux sites web. Ainsi, si un site web de confiance est vulnérable à un problème de type "CSS", il pourra être utilisé par un site malveillant pour exécuter sur le poste de la victime des scripts dans un contexte de confiance. Par ailleurs, ce type de vulnérabilité permet à l’attaquant de récupérer des données personnelles de la victime, dans le périmètre du site web vulnérable (par exemple, récupération du "cookie" de session, afin de voler cette session). Solution : L'effort de protection doit consister à pratiquer une programmation défensive : validation et filtrage systématique de toutes les données reçues de l'extérieur, même les plus anodines, le risque étant présent avec les données entrantes qui seront par la suite utilisées pour construire une page web résultante. Les données les plus à risques étant les caractères/mots <, >, ', ", "script", etc… Principe : Les attaques de type "injection SQL" (voir l'article du bulletin de sécurité mensuel de février 2002 du Cert-IST) consistent à exécuter du code malveillant (requêtes SQL, ...) dans un serveur de base de données SQL, par le biais d'une application web faisant appel à cette base de données. Ces attaques reposent sur un mauvais contrôle des données envoyées par l'utilisateur ; ces données, si elles contiennent du code SQL, vont être transmises telles qu’elles au SGBD, ce qui va modifier la requête SQL, et donc provoquer un détournement de l’exécution de cette requête. Exemple :
Solution : Il faut effectuer systématiquement (dans les programmes) un contrôle des données fournies par l'utilisateur (ou plus généralement reçues de l'extérieur), et interdire les caractères à risques, comme ' ou ; etc… Par ailleurs, suivant l’environnement "middleware" utilisé, des bonnes pratiques existent pour limiter ces risques. Par exemple, en environnement Java "servlet", il convient de programmer les appels vers les bases de données via des méthodes de la classe "PrepareStatement". 5/ Le débordement de pile Principe : Lorsqu'un programme est lancé, un numéro de processus est alloué par le système et une zone mémoire est attachée à ce dernier. Il s'agit de la "pile". Lors de son exécution, le programme appelle un nombre important de fonctions pour son traitement. Effectuer un "débordement de pile" consiste à écraser l'adresse de retour d'une fonction appelée par le programme, en saturant la pile judicieusement, jusqu'à pouvoir atteindre ladite adresse de retour et la modifier par un pointeur de son choix. Ainsi, le programme reprend son exécution à l'adresse modifiée, qui peut contenir du code malicieux, et le cours du programme est détourné (voir l'article du bulletin de sécurité mensuel de mai 1999 du Cert-IST). Nota : Cette problématique de débordement de pile a tendance à disparaître, avec l’avènement des serveurs d’application modernes, "de haut niveau". Par exemple, dans un environnement Java servlet, la problématique de débordement de pile n’est pas à prendre directement en compte dans les développements. Solution : Effectuer systématiquement un contrôle sur la longueur des chaînes reçues par l'application web. 6/ La mauvaise validation des données reçues (vulnérabilité de type "format string") Principe : Les applications web reçoivent des données en provenance des requêtes HTTP. Un attaquant peut donc se servir de ces requêtes (URL, en-têtes, "cookies", formulaires, champs masqués, etc...) afin de contourner les mécanismes de protection. Ce problème de validation des données conduisent à des vulnérabilités dans la gestion des chaînes de caractères ("format string"- voir l'article du bulletin de sécurité mensuel d'octobre 2000 du Cert-IST). Nota : Cette problématique de "format string" a tendance à disparaître, avec l’avènement des serveurs d’application modernes, "de haut niveau". Par exemple, dans un environnement Java "servlet", la problématique de "format string" n’impacte pas l’environnement Java. 7/ Le déni de service sur une application web Principe : La majorité des applications web traitent en temps normal un grand nombre d'utilisateurs simultanés. Un unique attaquant pourrait pourtant générer assez de trafic pour provoquer l'arrêt d'une application, empêchant dès lors les autres utilisateurs de se connecter. Il pourrait également être possible à un attaquant d'empêcher l'accès aux ressources à un seul utilisateur, en faisant par exemple verrouiller son compte. Cette problématique, dans une application web, résulte en général d’une mauvaise gestion des cas d’erreur, ou bien du fait que certains traitements soient trop gourmands en ressources et ne supportent pas la montée en charge. Solution : Les moyens à mettre en œuvre pour lutter contre les dénis de service au niveau applicatif se rapprochent de la qualité, dans le sens où il ne s'agit pas seulement d'un problème de sécurité, mais surtout d'un problème de conception/développement pour lequel des recommandations de qualité de service doivent être appliquées. 8/ La mauvaise configuration d'une application web Principe : La mauvaise configuration d'une application ou d'un serveur web peut entraîner un grand nombre de failles de sécurité. Parmi ces problèmes, on retrouve les vulnérabilités de sécurité non corrigées, les failles de types "traversée de répertoire", l'utilisation de pages par défaut ou de fichiers d'exemple, la mauvaise gestion des permissions, l'ouverture de services non utiles (administration distante par exemple), les comptes par défaut (avec les mots de passe par défaut), les messages d'erreur trop verbeux, une mauvaise configuration du chiffrement SSL, l'utilisation de certificats auto-signés, l'utilisation de certificats par défaut, etc... Nota : On s’éloigne ici des problématique de sécurité liés à l’application ; il s’agit de mesures portant sur la configuration des services. 9/ Le défaut d'auditabilité Principe : Une application est sujette à un défaut d’auditabilité lorsqu’il est impossible d’obtenir des informations sur l’utilisation qui en est faite. Il ne sera alors pas possible de détecter les utilisations ou tentatives d’utilisation frauduleuse de l’application ou d’investiguer sur un problème de sécurité constaté sur l’application. Solution : Mettre en oeuvre des mécanismes de journalisation au niveau de l’application : au delà de la journalisation du serveur web et serveur d'application, l’application doit journaliser les événements applicatifs nécessaires : identification réussie, échouée, déconnexions, mises à jour de données sensibles, ....
B/ Recommandations et outils disponibles Outre les recommandations effectuées dans cet article, il est essentiel de maintenir les systèmes à jour en terme de correctifs de sécurité (applications, mais également système d'exploitation, réseau, garde-barrière, anti-virus). Il existe également des documents de type "check-list" donnant des recommandations sur les méthodes de programmation sécurisée des applications web. En voici une liste non exhaustive : Documents généraux :
Documents concernant les différents serveurs d’applications web :
Une liste Bugtraq dédiée à la sécurité permet de surveiller les dernières vulnérabilités et de s'informer sur la sécurisation web (http://www.securityfocus.com/archive/107). Des outils sont également disponibles afin d'aider les développeurs à sécuriser leurs applications et serveurs web :
C/ Pour plus d'information
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||