Vendredi le 2 octobre 2009 à 15:45

CSP un nouveau système de protéction contre les XSS implementé par Firefox

Par Mohammed CHERIFI

MozillaContent Security Policy, baptisé CSP, est une nouvelle technologie créée par la fondation Mozilla dans le but de se protéger contre les attaques XSS!
Dans les trois dernière années, l’exploitation des attaques XSS et CSRF Injection a connu une très grande croissance, on a vu pas mal d’incidents et des hackages de sites populaires et de grands comptes comme facebook , imageshack, domaintools, godady…, les ingénieurs de mozilla security team ont pensé à une solution et nous ont inventé CSP!

CSP, c’est quoi au juste?

En principe, les attaques XSS sont possibles car toutes les données chargées depuis un serveur http sont interprétées par le navigateur avec les droits que le client possède, le code JavaScript et tout le contenu chargés (y compris les scripts externes) sont combinés dans un même conteste de sécurité (Policy) et permettent l’accès à la totalité du DOM. Content Security Policy nous apporte un mécanisme pour indiquer explicitement au navigateur quel contenu est légitime, de cette façon le navigateur pourra interrompre l’exécution et restreindre l’accès au DOM de tout contenu non autorisé et sans perdre des fonctionnalités dans le site!

CSP est destiné aux web designers et administrateurs système afin de designer la façon avec laquelle les données doivent interagir avec leurs sites, son implémentation permettra la détection des attaques de type XSS et injection de code HTML et minimiser les risques d’une potentielle exploitation d’un de ces deux vecteurs d’attaque

Comment ça marche ?

Le principe de CSP est d’appliquer un ensemble de restrictions sur l’exécution des scripts et les autoriser seulement à partir d’une liste blanche créée par le webmaster, ainsi tout exécution de script ou de code chargé depuis un site non figurant cette liste sera bloqué, on pourra par exemple autoriser seulement les scripts provenant de Google API, et Youtube et restreindre l’accès à tout autre domaine externe!

Voici une liste de quelques actions bloquées par CSP:

  • les balise <script>
  • les URI javascript:fonction()
  • les évènements placés dans les attribut (<a onclick= »return foo() »>)
  • les fonctions avec le constructeur var f = new Function(« code malveillant… »)
  • data URI genre : data:text/plain;base64,ZXZpbGNvZGU=

Une liste complète de restrictions est disponible sur le wiki officiel de mozilla

Comment activer CSP sur son site?

Pour activer cette protection sur votre site, il vous suffit d’ajouter X-Content-Security-Policy dans l’entête HTTP de vos pages, voici un exemple simple pour autoriser l’exécution des scripts seulement depuis le même domaine :

X-Content-Security-Policy: allow 'self'

Un exemple pour autoriser le chargement des images depuis tous les domaines et les scripts seulement depuis api.google.com:

X-Content-Security-Policy: allow 'self'; img-src *; \
script-src api.google.com

Notifications

L’avantage de CSP c’est qu’il possède un mécanisme de notification permettant de notifier le webmaster lors de la violation d’une règle, la notification est sous forme d’un rapport que le navigateur envoie via une requête HTTP POST en XML, et contient les entêtes HTTP de la requête effectuée par le client, l’url bloqué, la directive violée et le site de provenance! de cette façon administrateur du site pourra détecter les défaillances et d’éventuels problèmes de sécurité qui peuvent menacer son site!

Voici le schéma d’une requête de notification :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="csp-report">
<xs:complexType>
<xs:sequence>
<xs:element name="request" type="string" use="required" />
<xs:element name="request-headers" type="string" />
<xs:element name="blocked-uri" type="string" />
<xs:element name="violated-directive" type="string" use="required" />
<xs:element name="original-policy" type="string" use="required" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Exemple de rapport lors de l’appellation d’un script depuis un domaine non autorisé (attacker.ltd)

<csp-report>
<request>GET /page.php HTTP/1.1</request>
<request-headers><![CDATA[
Host: domain.ltd
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr-fr,fr;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
]]></request-headers>
<blocked-uri>http://attacker.ltd/evilscript.js</blocked-uri>
<violated-directive>script-src self</violated-directive>
<original-policy>allow none; script-src *, allow self; script-src self</original-policy>
</csp-report>

On peut placer l’entête dans une balise méta dans le <head>:

<meta http-equiv="X-Content-Security-Policy" content="listedesrestrictions" />

en PHP

Header("X-Content-Security-Policy: listedesrestrictions");

CSP est une très bonne initiative pour luter contre les attaques XSS, il est nativement implémenté dans la navigateur Firefox à partir de la version 3, c’est principalement conçu pour nous assurer une meilleure sécurité, tout de même il ne faut pas penser que c’est la fin des XSS! il y aura sans doute des méthodes pour le contourner CSP, sinon je trouve que c’est bien pensé de la part des équipes Mozilla, c’est du beau boulot!

Viva Firefox ;)

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap
Tags :, , , , ,

Articles similaires

Réagissez à ce billet

Categories

Derniers commentaires

  • Victor: Roseny : Pour avoir les mois en Français voici mon code : $dateWidget = new sfWidgetFormI18nDate(array(...
  • abdessamad: Salam, Salutation pour cet article, N.B :  » Un md5 est une chaine de caractère en hexadécimal...
  • 0x1337: Nice tuto bien structuré et synthétisé ! La question qui se pose est ce un attaquant peut faire un Privilege...
  • Roseny: Bonjour, comment fais-t’on pour mettre les mois en français?
  • Laurent: Bonjour Mohammed et merci pour ce tuto. Que faut-il modifier pour que le champ date soit en un seul bloc au...
  • Stack: dommage que le co.ma était hacké aussi
  • Technologix: Très bon article, gg ;)
  • Wail: très bien expliqué mon khoya, génial
  • UpDeL: Respect !
  • El King Zizou: trés bonne explication j’aimerai bien voir des autres articles des attaques sur le web :)...

Flickr PhotoStream

  • Au dessus des montagnes
  • Nuages
  • Insolite hopital marocain
  • Plage bouznika
  • Maroc Blog awars with vladimire
  • Linux Party 2010 - EMI (Maroc)
  • Mawazine 2008
  • Essaouira
  • Rabat Ville with baba mimoun
  • Fucking CowBoyz
  • Essaouira 2009 - En attente de l'arrivé du cheb khaled!
  • Linux Install party Mohammadia

Twitter Feed


Warning: fread() [function.fread]: Length parameter must be greater than 0 in /homepages/44/d193174039/htdocs/mcherifi/wp-content/plugins/wordpress-twitter/BiBTweets.php on line 199
  • mcherifi: Underground Parking System http://bit.ly/aI440T original! le 27 Jul 2010 10:58
  • mcherifi: @halflings un moment j'ai pensé qu'il s'agit d'une erreur, c'est en lisant bien que j'ai compris que ya aussi #freelansing lol le 27 Jul 2010 10:38 en réponse à halflings
  • mcherifi: Comment réaliser sa première photographie en freelensing? http://bit.ly/daZewv le 27 Jul 2010 09:45
  • mcherifi: Une nouvelle loi vient d’être adoptée en #Tunisie , elle intérdit les fessées données aux enfants! Qu'allez vous faire si c'était au #Maroc ? le 26 Jul 2010 16:57
  • mcherifi: Faut-il suivre ses passions ou s’orienter vers du lucratif ? http://bit.ly/99Nsiu le 26 Jul 2010 16:30
  • mcherifi: Safari v4 & v5 critical vulnerability in the AutoFill feature http://bit.ly/9yVKco #safari #security #autofill le 26 Jul 2010 14:41
  • mcherifi: RT: @agharass : Est ce que vous avez un compte http://meme.yahoo.com ? Plz RT le 24 Jul 2010 21:20
  • mcherifi: @A_T_J pas encore mon ami, la soirée vient à peine de commencer ;) ce n'est pas qu'on tweetant pas qu'on dors :P le 24 Jul 2010 03:06 en réponse à A_T_J
  • mcherifi: Trop drôle! Insultes de développeurs http://ping.fm/SKdvT #fordeveloppersonly le 20 Jul 2010 09:02
  • mcherifi: Si vous aimez les pentests voici un ISO pour s'entrainer avec l'OS le plus vulnérable au monde http://ping.fm/a5rKi #damnvulnerablelinux le 20 Jul 2010 08:58
  • mcherifi: Oulah! c'est mon 1000 tweet, Happy day à tous! le 20 Jul 2010 08:56
  • mcherifi: Frameworks PHP: Symfony vs CodeIgniter http://ping.fm/MnLvy le 14 Jul 2010 15:42
  • mcherifi: D'ici fin juillet, l'enveloppe annuelle de la compensation sera déjà épuisée ! Que va faire l'Etat ? http://ping.fm/t2ym2 le 14 Jul 2010 14:00
  • mcherifi: Real Social Dynamics Nation : Smart people http://ping.fm/g2zfw le 14 Jul 2010 11:26
  • mcherifi: just achieved all WabLab HackMe challenges http://bit.ly/dClKUj Actual Rank: Morocco 1, World 10, waiting for the next contests.. le 11 Jul 2010 16:52
  • mcherifi: le monde est fondé sur des conventions, ce que accepte la majorité est souvent ce qui est adopté même si il est faux! le 11 Jul 2010 10:49
  • mcherifi: Youpii, ma carte son Creative Sound Blaster Live marche à merveille sous Ubuntu Lucid lynx, VIVA LINUX <3 ! le 10 Jul 2010 22:20
  • mcherifi: si vous avez du mal avec les dns google voici une version standalone du chat audio/video dans gmail 3http://ping.fm/S76qv le 06 Jul 2010 15:32