2012 03-01-ror security v01
DESCRIPTION
Une introduction a la sécurité de ruby on rails.Présentation faite au Confoo 2012TRANSCRIPT
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 ([email protected])
‣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 ([email protected])
‣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
A lire
39
Ressources OWASP
• https://www.owasp.org/index.php/Top10
• https://www.owasp.org/index.php/Project_Information:template_Ruby_on_Rails_Security_Guide_V2
• https://www.owasp.org/index.php/Esapi
ROR Security Project:
• http://www.rorsecurity.info/
Sunday, March 4, 12
Contact@SPoint
40Sunday, March 4, 12