JavaScript Object Notation et sécurité
publié par pampryl, le mardi 21 avril 2009 à 11:54, dans la catégorie Actualité informatique.
Le JSON
Le JSON (ou JavaScript Object Notation) est un format de données au format texte qui est décrit dans la RFC 4627. Très utilisé avec le cadre des applications Web2.0 et AJAX, il présente plusieurs avantages:
- Lisibilité : Peu verbeux, il est facilement lisible pas un être humain.
- Performances : Comme il utilise une représentation d'objets et une notation empruntés à JavaScript, il s'avère plus facilement et rapidement utilisable dans le contexte d'un traitement par ce langage.
- Simple : La syntaxe réduite et les types de donnés simples en font un format de données facile à apprendre.
Voici un exemple de données (un menu sous forme de liste d'actions simples):
{"liste": { "id": "liste", "value": "Menu", "popup": { "menuitem": [ {"value": "action 1", "onclick": "MyFunction1()"}, {"value": "action 2", "onclick": "MyFunction2()"}, {"value": "action 3", "onclick": "MyFunction3()"} ] } }}
Et la sécurité dans tous ça
L'utilisation d'une structure de données JSON dans un corps de programme JavaScript est faite par l'utilisation de la fonction :
eval('('+donnees_json+')');
Avec cette méthde, les données sont transformées en objet(s) natif(s) et ainsi utilisables. Mais les données peuvent aussi contenir du code JavaScript et ainsi, celui-ci risque de s'exécuter lors de l'évaluation des données. C'est un problème de sécurité très grâve qui entrave encore bien souvent le déployement de ce format de données en remplacement du concurrent XML.
Des remèdes
La démocratisation et le formidable essor des Frameworks dits Web2.0 au cours de ces dernières années ont contribué à proposer des solutions pour contourner les problèmes de sécurité de ce format pourtant bien utile au demeurant.
Pour ma part j'ai suivi un peu le développement du framework Dojo Toolkit et les essais plus ou moins fructueux pour combattre cette limitation.
On commente
Une des recommandations utilisées notamment pour la version 1.0 de Dojo, était de commenter les données afin d'éviter l'exécution du code qui pouvait y être inclus :
/* {"liste": { "id": "liste", "value": "Menu", "popup": { "menuitem": [ {"value": "action 1", "onclick": "MyFunction1()"}, {"value": "action 2", "onclick": "MyFunction2()"}, {"value": "action 3", "onclick": "MyFunction3()"} ] } }} */
Il s'avère que cette solution est facilement contournable puisqu'il suffit à un attaquant d'injecter des données qui referme ce commentaire avant d'inclure du code à exécuter et de réouvrir un commentaire pour rendre le contenu valide. Ce point a été soulevé et très clairement expliqué dans un ticket du Trac Dojo par Kriszyp.
On préfixe à présent
Kriszyp lors de son explication de la vulnérabilité de la méthode "json-commenting", propose de préfixer les données à l'aide d'une simple petite chaine:
{} &&
Ce préfixe a pour but de rendre invalide (du point de vue de la syntaxe) un éventuel script au sein des données JSON et de ne pas contraindre de trop l'utilisation des données (éviter un parsing).
Du coup, depuis la version 1.2 de Dojo, la recommandation est d'utiliser cette syntaxe :
{} && {"liste": { "id": "liste", "value": "Menu", "popup": { "menuitem": [ {"value": "action 1", "onclick": "MyFunction1()"}, {"value": "action 2", "onclick": "MyFunction2()"}, {"value": "action 3", "onclick": "MyFunction3()"} ] } }}
Conclusion
Il semble que cette méthode est la plus fiable et efficace connue à présent pour éviter le détournement ("hijacking" en anglais) de ce format de données qui a une place au soleil dans le monde du Web 2.0 en plein développement. Reste à surveiller l'émergence d'une réponse ou de technique de contournement afin de conserver la sécurité des applications et des données.