|
Introduction AJAX n'est pas une technologie, mais une architecture client/serveur qui consiste à découper une application web de la façon suivante :
Une architecture AJAX hérite donc des risques sécurité pesant sur ces technologies depuis quelques temps déjà. De ce fait, plutôt que de parler de nouvelles vulnérabilités, on parlera plutôt de vulnérabilités liées à une nouvelle utilisation de ces technologies sous-jacentes. Cette architecture est très prisée actuellement car elle offre des possibilités de traitement dynamique des pages HTML, et s’inscrit dans la mouvance du web 2.0. Nous vous présentons ci-dessous les points "critiques" en termes de sécurité d'une application AJAX. L'objet "XMLHttpRequest" et le langage JavaScript Cet
objet permet de faire des requêtes HTTP afin de récupérer des données au format
XML qui pourront être intégrées à une page HTML.
Les
vulnérabilités induites par ces deux approches sont donc naturellement
reconduites sous AJAX. Prenons l’exemple d’un formulaire HTML de saisie des données d’un véhicule automobile. En HTML "classique", le serveur peut :
Avec AJAX, la solution va pouvoir être plus souple et transparente pour l’utilisateur, et plus performante du point de vue du volume de données transférées : le choix de la marque va entraîner un échange transparent avec le serveur qui va renvoyer seulement les informations suivantes nécessaires (dans un format brut réduit aux seules informations utiles, sans mise en forme HTML), et la page va se remplir progressivement sans pour autant se recharger totalement. Tout
ceci est réalisé au moyen d'un code JavaScript contenu dans Ce
mode de fonctionnement est un des premiers problèmes potentiels de
sécurité : l'utilisateur final n'a pas la visibilité sur l'ensemble des
informations échangées avec le serveur. Il n’a même pas conscience des
opérations sous-jacentes, qui se font du coup à son insu.
Les contrôles coté client Le langage JavaScript permet la manipulation d'informations sur le poste client. Utilisé dans un flux HTTP classique, il peut manipuler les informations chargées dans une page HTML. Ces manipulations peuvent être effectuées dans le but d'améliorer l'affichage, de rendre une page plus vivante, ou pour effectuer des traitements "invisibles". Ce langage est souvent utilisé pour effectuer des contrôles des données entrées par l'utilisateur directement du côté client, en vue de ne pas envoyer inutilement vers le serveur des données trialement erronées (par exemple, contrôle du format d’une adresse IP). Cette architecture offre la possibilité de réaliser des applications plus complexes coté client (notion de "rich client"). Il y a donc fort à parier que beaucoup de développeurs vont naturellement tomber dans le travers d'effectuer aussi des contrôles de sécurité coté client. Ceci est une mauvaise pratique : les contrôles sécurité d’une application web doivent toujours être effectués du coté serveur (seul endroit pouvant être considéré comme "sûr", car "sous contrôle", à la différence du poste client, qui lui peut se trouver n'importe où et est donc "hors contôle"). Ce point est donc à surveiller car l'effet pervers de ce type de développement est que l'utilisateur croit avoir affaire à une application bien protégée, alors qu’en fait la sécurité de son application centrale est affaiblie. Un attaquant peut en effet contourner les contrôles de sécurité en désactivant l'interprétation du langage JavaScript, ou en forgeant une requête HTTP valide avec des informations erronées (et potentiellement dangereuses).
Les environnements ("frameworks") AJAX L'architecture
AJAX offre aussi la possibilité de générer des relais ("proxies") JavaScript
qui permettent à un code JavaScript coté client d'appeler directement des services
web ("web services") proposés par le serveur. En
général, sur une application basée sur les "web services"
(application "n-tiers"), une couche de sécurité est développée coté
serveur pour contrôler les accès aux "web services". L'injection de code SQL Des applications serveur sont aussi réalisées à base de solutions PHP/MySQL. Ce type de solution utilisant une base de données coté serveur doit alors bien tenir compte des risques d'injection SQL.
Le "Cross Site Scripting" Comme toutes les applications web, une application AJAX peut être vulnérable uax attaques de de type "Cross Site Scripting". Par contre, les conséquences d'une telle vulnérabilité est ici aggravée. En
fait, au cours des échanges AJAX propres (ceux qui sont effectués entre deux
requêtes HTTP standards), le serveur a la possibilité d'envoyer des morceaux de
code JavaScript. Le
client peut alors exécuter ce code grâce à Enfin, une autre vulnérabilité (remontée il y a peu par "Fortify Software" et "White Hat Security") est basée sur une faiblesse de la fonctionnalité "Same Origin Policy": le "JavaScript Hijacking" (voir la rubrique "Pour plus d'informations :" pour une description de cette vulnérabilité. De façon plus générale, si les navigateurs actuels surveillent bien que les requêtes et les réponses HTTP vont et viennent bien d'un même site (principe du contrôle "Same Origin Policy"), et si le "JavaScript Hijacking" est désormais corrigé, on ne peut pas exclure que de nouvelles vulnérabilités de ce type soient découvertes (en particulier parce que chaque navigateur implémente de sa propre façon le contrôler de "Same Origin Policy").
Conclusion En
conclusion, cet article n'a pas pour vocation de dénigrer l'architecture AJAX.
Elle est cependant potentiellement dangereuse et il faudra s'attacher à surveiller quelques points lors du développement d'une application utilisant ce type d'architecture. Les règles de bonne pratique communément utilisées dans le développement d'applications web sont ici à reconduire :
Coté client, il est important de surveiller les avis de vulnérabilité sur les navigateurs. Actuellement, il n'y a malheureusement pas de moyen de se prémunir contre les défauts (sécuritaires) de cette architecture. A moins d'interdire purement et simplement l'exécution du JavaScript (et des contrôles ActiveX pour certains navigateurs), mais, pour les internautes qui se sont habitués aux contenus dynamiques, un retour en arrière est difficile à imaginer. Pour finir, il faut être bien conscient que la présence d'un pare-feu ne protège en rien contre les risques énoncés dans cet article, étant donné que tout le trafic passe dans des échanges HTTP traditionnels. Coté client, il est toujours possible d'installer un antivirus qui bloque les scripts malveillants (comme celui d'un cheval de Troie par exemple). Mais pour qu'il soit efficace, il faut que la signature du code malveillant soit déjà référencée par l'éditeur. En tout état de cause, il est recommandé de ne pas utiliser une architecture AJAX pour transmettre des données confidentielles. Pour information, et pour les gens soucieux de vérifier les échanges HTTP, l’extension Firebug (http://extensions.geckozone.org/FireBug) pour les navigateurs Firefox permet, entre autres de vérifier l’objet "XMLHttpRequest". De plus, il semblerait que des ébauches de solution commencent à voir le jour : par exemple, le scanner "Sprajax". Pour plus d'informations :
Glossaire :
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||