2012 03-01-ror security v01

Post on 03-Dec-2014

1.059 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Une introduction a la sécurité de ruby on rails.Présentation faite au Confoo 2012

TRANSCRIPT

The OWASP Foundationhttp://www.owasp.org

Ruby on Rails et la sécurité

(une introduction)

Sébastien GioriaOWASP France Leader

OWASP Global Education Committee

Confoo.ca 01 Mars 2012 - Montréal - Canada

Sunday, March 4, 12

CISA && ISO 27005 Risk Manager

2

http://www.google.fr/#q=sebastien gioria

‣OWASP France Leader & Founder - Evangéliste‣OWASP Global Education Comittee Member (sebastien.gioria@owasp.org)

‣Responsable de la branche Audit S.I et Sécurité au sein du cabinet Groupe Y

Twitter :@SPoint

‣+13 ans d’expérience en Sécurité des Systèmes d’Information‣Différents postes de manager SSI dans la banque, l’assurance et les télécoms‣Expertise Technique - PenTesting,- Secure-SDLC- Gestion du risque, Architectures fonctionnelles, Audits- Consulting et Formation en Réseaux et Sécurité

‣Responsable du Groupe Sécurité des Applications Web au CLUSIF

2

Sunday, March 4, 12

CISA && ISO 27005 Risk Manager

2

http://www.google.fr/#q=sebastien gioria

‣OWASP France Leader & Founder - Evangéliste‣OWASP Global Education Comittee Member (sebastien.gioria@owasp.org)

‣Responsable de la branche Audit S.I et Sécurité au sein du cabinet Groupe Y

Twitter :@SPoint

‣+13 ans d’expérience en Sécurité des Systèmes d’Information‣Différents postes de manager SSI dans la banque, l’assurance et les télécoms‣Expertise Technique - PenTesting,- Secure-SDLC- Gestion du risque, Architectures fonctionnelles, Audits- Consulting et Formation en Réseaux et Sécurité

‣Responsable du Groupe Sécurité des Applications Web au CLUSIF

2

Sunday, March 4, 12

Agenda•Introduction

•Injection

•Sessions

•XSS

•CSRF

•Fuite d’informations

•Et ensuite...3

Sunday, March 4, 12

Etude Verizon 2010

© Verizon 2010

4Sunday, March 4, 12

Etude Verizon 2010

© Verizon 2010

4Sunday, March 4, 12

Etude Verizon 2010

© Verizon 2010

4Sunday, March 4, 12

Etude Verizon 2010

© Verizon 2010

4Sunday, March 4, 12

© Verizon 2010

Etude Verizon 2010

5Sunday, March 4, 12

© Verizon 2010

Etude Verizon 2010

5Sunday, March 4, 12

© Verizon 2010

Etude Verizon 2010

5Sunday, March 4, 12

© Verizon 2010

Etude Verizon 2010

5Sunday, March 4, 12

© IBM X-Force 2009 - Extrait du rapport 2009

22

Sunday, March 4, 12

© IBM X-Force 2009 - Extrait du rapport 2009

23

Sunday, March 4, 12

Exposition à une vulnérabilité

26

Sunday, March 4, 12

Ce que dit le CIO : mais j’ai un Firewall !!!

27

Sunday, March 4, 12

Ce que dit le Commercial : J’ai un certificat SSL

28

Sunday, March 4, 12

Ce que dit le commercial : il faut être un expert pour hacker des sites Web

• Les outils sont simples d’emploi

• Cherchez juste sur Internet un outil nommé SQLInjector

• L’attaque d’un serveur Web coute de 100$ à 200$ sur le marché souterrain

• Les hackers “offrent” leur service directement sur Internet.

29

Sunday, March 4, 12

Offres

12Sunday, March 4, 12

Ce que dit l’utilisateur : Une vulnérabilité n’est pas importante sur un site Web

interne•Faut, vu que le web est partout, des attaques comme

CSRF ainsi que l’arrivée de HTML5 et CORS sont destructrices.

•Souvenez vous, et partagez cela :

• AJAX fait des choses sans que vous le sachiez...

•Sachez et partagez ceci:

• HTML5 introduit de bien belle facilités utilisateur, mais avec un impact important sur la sécurité (WebSocket, CORS, ...)

30

Sunday, March 4, 12

The OWASP Foundationhttp://www.owasp.org

Les risques !

Sunday, March 4, 12

‘OR 1==1 --’

15Sunday, March 4, 12

‘OR 1==1 --’

15

L’injection SQL fait beaucoup parler d’elle. Mais il existe d’autres formes d’injections :

•XML•XPath•LDAP•ORB(Hibernate)•...

Sunday, March 4, 12

‘OR 1==1 --’

15

L’injection SQL fait beaucoup parler d’elle. Mais il existe d’autres formes d’injections :

•XML•XPath•LDAP•ORB(Hibernate)•...

Sunday, March 4, 12

‘OR 1==1 --’

15

L’injection SQL fait beaucoup parler d’elle. Mais il existe d’autres formes d’injections :

•XML•XPath•LDAP•ORB(Hibernate)•...

A1  -­‐  Injec*on

Sunday, March 4, 12

‘OR 1==1 --’

15

L’injection SQL fait beaucoup parler d’elle. Mais il existe d’autres formes d’injections :

•XML•XPath•LDAP•ORB(Hibernate)•...

A1  -­‐  Injec*on

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

Imaginons un accès normal :

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Imaginons un accès différent :

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Imaginons un accès différent : http://www.example.com/Project.rb?name=me ‘ or ‘1’=’1

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

SELECT * FROM Project WHERE name = ‘me’ or ‘1’=’1’

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Imaginons un accès différent : http://www.example.com/Project.rb?name=me ‘ or ‘1’=’1

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

SELECT * FROM Project WHERE name = ‘me’ or ‘1’=’1’

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Imaginons un accès différent : http://www.example.com/Project.rb?name=me ‘ or ‘1’=’1

Voir un accès très différent :

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

SELECT * FROM Project WHERE name = ‘me’ or ‘1’=’1’

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Imaginons un accès différent : http://www.example.com/Project.rb?name=me ‘ or ‘1’=’1

Voir un accès très différent : http://www.example.com/Project.rb?name=me'; DELETE FROM PROJECTS; SELECT * from projects where '1'='1

Sunday, March 4, 12

Injec-on  de  données  -­‐  Exemple  de  code  vulnérable  SQL

Soit le code Suivant

16

Project.find(:all, :conditions => "name = '#{params[:name]}'")

SELECT * FROM Project WHERE name= ‘me’

SELECT * FROM Project WHERE name = ‘me’ or ‘1’=’1’

SELECT * FROM projects WHERE name = ''; DELETE FROM PROJECTS; SELECT * from projects where '1'='1'

http://www.example.com/Project.rb?name=meImaginons un accès normal :

Imaginons un accès différent : http://www.example.com/Project.rb?name=me ‘ or ‘1’=’1

Voir un accès très différent : http://www.example.com/Project.rb?name=me'; DELETE FROM PROJECTS; SELECT * from projects where '1'='1

Sunday, March 4, 12

Injection - Prévention★Valider les données

★Utiliser les mécanismes des requêtes paramétrées quand ils sont disponibles

★Minimiser les privilèges de connexion aux bases

★Minimiser les privilèges des utilisateurs de base

17Sunday, March 4, 12

Injection - Prévention1.Via une validation d’entrée propre

2.Via les requêtes paramétrées

Sunday, March 4, 12

19Sunday, March 4, 12

19Sunday, March 4, 12

19Sunday, March 4, 12

19Sunday, March 4, 12

19

http://codebutler.github.com/firesheep/

Sunday, March 4, 12

20Sunday, March 4, 12

20Sunday, March 4, 12

20

mabanque.com

Sunday, March 4, 12

20

mabanque.com

Sunday, March 4, 12

20

mabanque.comlogin.rb

Sunday, March 4, 12

20

Requete

mabanque.comlogin.rb

Sunday, March 4, 12

20

Requete

mabanque.comlogin.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

mabanque.comlogin.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

mabanque.com

mabanque.com

login.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

mabanque.com

mabanque.comImages

login.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

mabanque.com

mabanque.comImages

login.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

RequeteCookie : SESSIONID=4242

mabanque.com

mabanque.comImages

login.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

RequeteCookie : SESSIONID=4242

RéponseCookie : SESSIONID=4242

mabanque.com

mabanque.comImages

login.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

RequeteCookie : SESSIONID=4242

RéponseCookie : SESSIONID=4242

mabanque.com

mabanque.comImages

login.rb

Sunday, March 4, 12

20

Requete

RéponseSet-Cookie : SESSIONID=4242

RequeteCookie : SESSIONID=4242

RéponseCookie : SESSIONID=4242

mabanque.com

mabanque.comImages

login.rb

Sunday, March 4, 12

21Sunday, March 4, 12

21

Les développeurs peuvent être tentés de créer leur propre gestionnaire de sessions et d'authentification, mais il s'agit d'une tâche complexe. Il en résulte souvent des implémentations contenant des faiblesses de sécurité dans des fonctions telles que: la déconnexion, la gestion des profils, etc. La diversité des implémentations rend la recherche de vulnérabilités complexe.

Sunday, March 4, 12

21

Les développeurs peuvent être tentés de créer leur propre gestionnaire de sessions et d'authentification, mais il s'agit d'une tâche complexe. Il en résulte souvent des implémentations contenant des faiblesses de sécurité dans des fonctions telles que: la déconnexion, la gestion des profils, etc. La diversité des implémentations rend la recherche de vulnérabilités complexe.

Sunday, March 4, 12

21

Les développeurs peuvent être tentés de créer leur propre gestionnaire de sessions et d'authentification, mais il s'agit d'une tâche complexe. Il en résulte souvent des implémentations contenant des faiblesses de sécurité dans des fonctions telles que: la déconnexion, la gestion des profils, etc. La diversité des implémentations rend la recherche de vulnérabilités complexe.

A3  -­‐  Mauvaise  ges*on  des  sessions et de

l’authentification

Sunday, March 4, 12

21

Les développeurs peuvent être tentés de créer leur propre gestionnaire de sessions et d'authentification, mais il s'agit d'une tâche complexe. Il en résulte souvent des implémentations contenant des faiblesses de sécurité dans des fonctions telles que: la déconnexion, la gestion des profils, etc. La diversité des implémentations rend la recherche de vulnérabilités complexe.

A3  -­‐  Mauvaise  ges*on  des  sessions et de

l’authentification

Sunday, March 4, 12

Session en Rails★HTTP est un protocole sans état

★Ne pas réécrire son mécanisme !

★ Par défaut les cookies de session sont utilisés avec une entropie suffisante.

★Protéger les ID lors du transfert

• Utiliser SSL

• Utiliser des cookies « secure »

• Utiliser des limitations de path

★Prévoir une seconde autorisation pour les transferts « sensibles »

22Sunday, March 4, 12

Sessions en Rails★Exemple de cookie propre :

23Sunday, March 4, 12

The OWASP Foundationhttp://www.owasp.org

DémoXSS

Sunday, March 4, 12

A vous ?Se connecter à :

•http://88.191.152.70:8080/ePoney-0.0.1-SNAPSHOT/pages/readReviews

•Choisir “Jack Daniels System” et Show Reviews

•Attendre 2mns30 :)

25Sunday, March 4, 12

26

XSS

Sunday, March 4, 12

26

Le Cross Site Scripting est souvent mal considéré. Sa puissance peut aller jusqu’a la prise de contrôle sur le poste client...

XSS

Sunday, March 4, 12

26

Le Cross Site Scripting est souvent mal considéré. Sa puissance peut aller jusqu’a la prise de contrôle sur le poste client...

XSS

Sunday, March 4, 12

26

Le Cross Site Scripting est souvent mal considéré. Sa puissance peut aller jusqu’a la prise de contrôle sur le poste client...

A2  -­‐  Cross  Site  Scrip*ng  (XSS)

XSS

Sunday, March 4, 12

26

Le Cross Site Scripting est souvent mal considéré. Sa puissance peut aller jusqu’a la prise de contrôle sur le poste client...

A2  -­‐  Cross  Site  Scrip*ng  (XSS)

XSS

Sunday, March 4, 12

27

XSS - Prevention★Valider les données en entrée

★Encoder les données de sortie

★N’accepter que les données attendues. Eviter le cas ‘default’.

★Nettoyer les données en entrée comme en sortie.

★N’utiliser que des données fortement typées. Eviter les ‘cast’ implicites ou explicites.

★Attention aux « clients », qui ne sont pas propres.

Sunday, March 4, 12

★Utilisation des échappements HTML (non suffisant)

★Utilisation des sanitizer HTML (mieux, mais non suffisant)

★Utilisation de OWASP ESAPI (beta)

28

http://rubydoc.info/gems/owasp-esapi-ruby

Sunday, March 4, 12

The OWASP Foundationhttp://www.owasp.org

DémoCSRF

Sunday, March 4, 12

CSRF

30Sunday, March 4, 12

CSRF

30

L’attaquant forge une requête HTTP et amène une victime à la soumettre via une balise d’image, XSS, ou de nombreuses autres techniques. Si l’utilisateur est authentifié , l’attaque est un succès.

Sunday, March 4, 12

CSRF

30

L’attaquant forge une requête HTTP et amène une victime à la soumettre via une balise d’image, XSS, ou de nombreuses autres techniques. Si l’utilisateur est authentifié , l’attaque est un succès.

Sunday, March 4, 12

CSRF

30

A5  -­‐  Cross  site  Request  Forgery  

(CSRF)

L’attaquant forge une requête HTTP et amène une victime à la soumettre via une balise d’image, XSS, ou de nombreuses autres techniques. Si l’utilisateur est authentifié , l’attaque est un succès.

Sunday, March 4, 12

CSRF

30

A5  -­‐  Cross  site  Request  Forgery  

(CSRF)

L’attaquant forge une requête HTTP et amène une victime à la soumettre via une balise d’image, XSS, ou de nombreuses autres techniques. Si l’utilisateur est authentifié , l’attaque est un succès.

Sunday, March 4, 12

CSRF le probleme★Le problème

• Les navigateurs Web incluent automatiquement la plupart des identifiants dans chaque requête.

• Que cela soit des requêtes venant d’un formulaire, d’une image ou d’un autre site.

• Tous les sites basés uniquement sur les identifiants automatiques sont vulnérables

• Approximativement 100% des sites le sont…

★C’est quoi un identifiant automatique?

• Cookie de session

• Une entête d’authentification HTTP

• Une adresse IP

• Les certificats SSL client

• L’authentification de domaine Windows.

31Sunday, March 4, 12

CSRF PreventionAjouter un jeton, non envoyé automatiquement, a toutes les requêtes

sensibles.• Cela rend impossible pour l’attaquant de soumettre une requête valide.

• (sauf si en plus il y a une faille XSS)• Ces jetons doivent être surs cryptographiquement.

Options• Stocker un seul jeton dans la session et l’ajouter a tous les formulaire et

liens• Champ caché: <input name="token" value="687965fdfaew87agrde"

type="hidden"/>• Utiliser un URL : /accounts/687965fdfaew87agrde

• Utiliser un jeton de formulaire: /accounts?auth=687965fdfaew87agrde …

• Attention a ne pas exposer le jeton dans l’entete “referer”• Utiliser de préférence un champ caché.

• Utiliser un jeton unique par fonction• Il est recommandé d’ajouter un second niveau d’authentification pour

une transaction sensible

32Sunday, March 4, 12

Par défaut le framework inclut le principe du jeton

CSRF Prévention en Rails

33Sunday, March 4, 12

The OWASP Foundationhttp://www.owasp.org

Fuite d’informations

Sunday, March 4, 12

35Sunday, March 4, 12

35

Une simple recherche google permettait d’avoir accès aux numéros de sécurité sociale des étudiants de Yale

Sunday, March 4, 12

35

Une simple recherche google permettait d’avoir accès aux numéros de sécurité sociale des étudiants de Yale

Sunday, March 4, 12

35

Une simple recherche google permettait d’avoir accès aux numéros de sécurité sociale des étudiants de Yale

A6  -­‐  Mauvaise  configura*on  

Sécurité

Sunday, March 4, 12

35

Une simple recherche google permettait d’avoir accès aux numéros de sécurité sociale des étudiants de Yale

A6  -­‐  Mauvaise  configura*on  

Sécurité

Sunday, March 4, 12

Prévention★Garder les outils a jour :

➡Serveurs

➡Frameworks

★Supprimer tous les éléments par défaut (en particulier les répertoire SVN ?)

★Customiser les messages d’erreurs36

Sunday, March 4, 12

The OWASP Foundationhttp://www.owasp.org

Conclusion

Sunday, March 4, 12

OWASP Top Ten 2010

http://www.owasp.org/index.php/Top_10

A1:  Injec*on A2:  Cross  Site  Scrip*ng  (XSS)

A3:  Mauvaise  ges*on  des  sessions  et  de  l’authen*fica*on

A4:Référence  directe  non  sécurisée  à  un  

objet

A5:  Cross  Site  Request  Forgery  (CSRF)  

A6:  Mauvaise  configura*on  sécurité

A8:  Mauvaise  restric*on  d’accès  à  

une  URL

A10:    Redirec*ons    et  transferts  non  validés

A7:  Mauvais  stockage  cryptographique

A9:  Protec*on  insuffisante  lors  du  

transport  des  données

Sunday, March 4, 12

Contact@SPoint

sebastien.gioria@owasp.org

40Sunday, March 4, 12

top related