Plongée dans les CSP

BreizhCamp - 9Ăšme Ă©dition

Plongée dans les CSP

BreizhCamp - 9Ăšme Ă©dition - Laurent Brunet - 21 mars 2019

Laurent BRUNET

@lbrunet_com

BreizhCamp - 9Ăšme Ă©dition

CSP, c'est quoi ?

CSP Content Security Policy

C'est une couche de sécurité supplémentaire qui permet de détecter et d'atténuer certains types d'attaques, notamment les attaques XSS (Cross Site Scripting) et les attaques par injection de données.

Ces attaques peuvent ĂȘtre utilisĂ©es dans divers buts, comme le vol de donnĂ©es, le dĂ©facement de site ou la diffusion de malware.

Aujourd'hui, CSP est l’une des contre-mesures les plus prometteuses contre XSS.

https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

Plusieurs niveaux 1/2

Plusieurs niveaux 2/2

Comment activer les CSP 1/2 ?

GrĂące Ă  une en-tĂȘte HTTP Content-Security-Policy

Nous avons plusieurs maniĂšres de le faire :

⚠ Pour le mode Meta, on ne peut pas utiliser la directive frame-ancestors, report-uri, ou sandbox.

Comment activer les CSP 2/2 ?

Content Security Policy level 1

CSP Niveau 1

⚠ Entre la directive default-src et les autres directives *-src, il n'y a pas d'hĂ©ritage.

Content Security Policy level 2

CSP Niveau 2

đŸ€˜ Utilisation des nonces ou des hashes sur les scripts ou styles.

Toutes les directives prennent en charge des valeurs similaires. Chaque valeur sera sĂ©parĂ©e par un espace, Ă  l'exception de none qui devrait ĂȘtre la seule valeur dĂ©finie.

ContentSecurityPolicy3_diagram

DĂ©monstration

Exemple

            content-security-policy:
              default-src 'none' ; 
              style-src 'self' https://example.com 'report-sample' ; 
              script-src 'self' 'report-sample' 
              base-uri 'self' ;
              object-src 'none' ;
              img-src 'self' www.google.com data: ;
        

Mes scripts ou styles inline ?

Nonces et Hashes

nonces et hashes autorisent le dĂ©veloppeur Ă  annoter explicitement chaque script approuvĂ© (en ligne et externe), tout en empĂȘchant l'exĂ©cution des scripts injectĂ©s par une tierce personne.

            content-security-policy:
              style-src  'self' 'https://example.com' 'report-sample'; 
              script-src 'self' 'nonce-rfOHm1spSuNZWnfsKipedA=='
             'sha256-qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng='
             'report-sample';
            
              object-src 'none'; 
        

Nonces

Cela revient Ă  dire au navigateur de ne rien bloquer pour ce qui correspond Ă  ce nonce.

⚠ Un nonce doit ĂȘtre unique, re-gĂ©nĂ©rĂ© Ă  chaque fois, et bien entendu secret !
(Variable d'environnement par exemple)

Hashes

⚠ Le moindre espace change le hash !

Nonces ou Hashes ?

DĂ©monstration

Reporting

Reporting

Une directive CSP est conçue pour bloquer le contenu qui n’a pas Ă©tĂ© explicitement inscrit sur la liste blanche, par un nom d’hĂŽte, un nonce ou un hashage.

La directive report-uri va nous aider à enregistrer les rapports en violation selon notre liste blanche définie.

Reporting (only)

Exemple

Outils de reporting 1/2

Outils de reporting 2/2

Content Security Policy level 3

CSP Niveau 3

Sécurité du CSP en général 1/3

CSP est mort, vive le CSP !
Sur l'insécurité des listes blanches et l'avenir de la politique de sécurité du contenu.

Google

https://ai.google/research/pubs/pub45542

Sécurité du CSP en général 2/3

Parmi les stratégies de protection XSS :

https://ai.google/research/pubs/pub45542

Sécurité du CSP en général 3/3

            script-src 'self' https://example.org;
            object-src 'none';
            <script src="//example.org/script.js"></script>
        

L'attaquant pourrait abuser du point de terminaison JSONP en injectant un script avec l'URL suivante : <script src=”https://example.org/jsonp?callback=alert (1); //”></ script>

            <script 
              nonce="rfOHm1spSuNZWnfsKipedA=="
              src="//example.org/script.js">
            </script>
        

Mode CSP strict 1/3

Pour mettre en place une stratégie CSP strict, il faudra:

Mode CSP strict 2/3

DĂ©monstration

Mode CSP strict 3/3

RĂ©capitulatif

Merci 👏

Twitter @lbrunet_com

Github https://github.com/lbrunet

Site https://lbrunet.com