Le magazine 01informatique vient de sortir un dossier complet sur la sécurité dans les sites AJAX (http://www.01net.com/01informatique/). Ayant entendu le teaser à la radio (les développeurs ont négligé la sécurité
!! oh mon dieu), je m’attendais à un article pour pinpins basé sur des vérités générales. Je dois avouer que j’ai été surpris de la qualité avec laquelle le dossier a été traité. Il ont même réussi à me faire peur et j’ai repassé dans ma tête tous les sites web que j’ai pu développer en me posant cette question : sont-ils sécurisés, y’a t-il des failles ?
Je me suis toutefois rassuré rapidement, ASP.NET est loin d’être un gruyère et j’ai toujours appliqué les grands principes de sécurité du Web :
- vérifier toutes les saisies utilisateurs (Cross-Site Scripting, SQL Injection, Overflow)
- faire attention à tout Cookie, les crypter si nécessaire
- limiter la surface d’exposition des API publiques (WS, Ajax, GET, etc.)
- utiliser des ID temporaires (token ou ticket), casser les séquences (IDENTITY)
Cependant, j’ai été interpellé dans l’article par une technique de piratage appelée : Cross-Site Request Forgery (CSRF ou XSRF pour les intimes). Ne connaissant pas cette technique, j’ai donc fait quelques recherches pour me documenter et je me suis monté un petit lab pour voir comment l’utiliser (et la contourner).
Je ne vais pas décrire dans le détail l’histoire et la description de cette faille donc je laisse la main a des spécialistes pour cette partie : http://www.cgisecurity.com/articles/csrf-faq.shtml
Le principe, c’est qu’une page, un site tiers, un mail, un document, etc. exécute une requête vers le site à pirater en utilisant l’identité « reconnue » de l’utilisateur. Cela paraît simple sur le papier mais bien évidemment il faut réunir de nombreuses circonstances pour réussir son coup. La principale étant que le site à pirater doit baser son authentification sur un cookie persistant.
Démonstration : Sur mon site, j’expose une fonctionnalité. On va prendre la plus simple à détourner, le GET : http://lab.djeepy1.net/CSRF/default.aspx?action=achat&article=123456. Supposons que dans le code behind, je vérifie uniquemement la présence d’un cookie pour sécuriser l’action.
if (Request.Cookies["UserId"] != null)
{
//on considère que l'utilisateur est OK
BusinessLayer.ShoppingMgr.Buy(Helper.Decrypt(Request.Cookies["UserId"].Value), Request["ArticleId"]);
}
Le site tiers a juste à faire une requête, mais comment peut-il récupèrer la bonne valeur de cookie ? Avec un Cross-Site Scripting (XSS) classique mais pour cela il doit pouvoir exécuter du Javascript sur votre site (cf. règle n° 1 plus haut). L’autre moyen est à la base du Cross-Site Request Forgery : on s’arrange pour que cette requête soit exécutée depuis le navigateur de l’utilisateur, ainsi, les cookies sont automatiquement envoyés au site à pirater avec la fausse requête. Par exemple, on vous envoie un message sur votre webmail avec une image pointant sur la fonctionnalité GET. Vous ne voyez qu’une image « cassée » et pourtant, l’action a eu lieu sur l’autre site.
<img src="http://site/?action=XX"/>
Pourquoi donc Ajax est-il pointé du doigt ? Cette faille est vieille comme le web (1998) mais très difficilement exploitable dans un monde fondé sur les Postback. Avec Ajax, de nombreuses API s’exposent sans pudeur sur le Web, bien souvent accessibles avec un simple GET.
Comment sécuriser son site ? Vérifiez toute l’API exposée et vérifiez que vous n’utilisez pas de cookie persistant pour authentifier une requête ou tout du moins que TOUTE votre sécurité ne soit pas basée sur cet unique moyen. Les Sessions ASP.NET sont protégées de cette faille car elles se basent sur un cookie dit « de session » (temporaire et lié à la navigation).
Cette faille fait la une car on assiste depuis quelques temps à un nouveau type de site Web : le site composite (ou mashup). Un site composite est un assemblage de modules provenant de différents autres sites. Exemple : mes dernières enchères depuis ebay, mes news depuis MSN, ma météo depuis meteoconsult et mon site de chat depuis googletalk. Tout étant exécuté avec le même contexte, un module peut potentiellement exploiter les fonctionnalités d’un autre (via son API Javascript).
En conclusion, ne cédez pas à la panique et suivez les conseils suivants (qui s’appliquent même au dela de l’informatique) :
- quels sont les risques (mobile du crime, conséquences) ?
- quelles sont les failles (ouvertures, exposition) ?
- comment je souhaite me protéger de ces risques ?
Pour cela, prévoyez toujours une phase d’audit de votre site web avant la mise en production.