+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+ >
+<html xmlns="http://www.w3.org/1999/xhtml" >
+ <head>
+ <title>Notions de sécurité sur le Web</title>
+
+ <meta http-equiv="Content-Type"
+ content="text/html; charset=utf-8" />
+ <meta name="copyright"
+ content="Copyright © 2013 Kim Nguyễn" />
+
+ <!-- Load jQuery -->
+ <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
+ <script src="../libs/raphael-min.js" type="text/javascript" ></script>
+ <!-- Load the library -->
+ <script src="../simpleWebSlides.js" type="text/javascript" ></script>
+
+ <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css" media="all" />
+ <!-- Load a custom Theme, the class-element marks this style-sheet
+ a "theme" that can be swtiched dynamicaly -->
+ <link class="sws-theme" rel="stylesheet" title="U-Psud style" href="../themes/uPsud.css" type="text/css" />
+
+ <!-- Customize some templates and initialize -->
+
+ <script type="text/javascript">
+ SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
+ SWS.Config['sws-object-deactivate'] = SWS.Effects.objectDeactivateFadeOut;
+ SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
+
+ //Ensures that we load SWS at the very end, after MathJax has
+ //been initialized
+
+ $(window).load(SWS.Presentation.init);
+ </script>
+ </head>
+ <body>
+ <a href="prog_internet_08.xhtml" class="sws-previous"/>
+ <div class="sws-slide sws-cover sws-option-nofooter">
+ <h1>Programmation Internet</h1>
+ <h1>Cours 9</h1>
+ <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
+ <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
+ </div>
+
+ <h1>Faiblesses d'HTTP</h1>
+
+ <div class="sws-slide">
+ <h1><i>Disclaimer</i></h1>
+ <ul>
+ <li>Aborde juste quelques aspects de sécurité</li>
+ <li>Essaye de montrer quelques principes fondamentaux</li>
+ <li>Uniquement axé sur le Web</li>
+ </ul>
+ <p><b>⇒</b> Ça ne va pas faire de vous des <i>hackers</i>,
+ juste vous sensibiliser aux problèmes de sécurité…
+ </p>
+ </div>
+
+ <div class="sws-slide">
+ <h1>Élements de cryptographie (1)</h1>
+ <p>Alice et Bob veulent échanger des données
+ confidentielles.</p>
+ <ol style="list-style-type:none;">
+ <li>1. Chiffrement <s>symétrique</s>:
+ <ul>
+ <li>
+ Ils se mettent d'accord sur une <em>clé commune</em>
+ </li>
+ <li> Alice <em>chiffre</em> son message avec la clé et
+ l'envoie à Bob</li>
+ <li> Bob déchiffre le message avec <em>la clé</em>
+ </li>
+ </ul>
+ <p class="sws-pause">
+ <s>Non sûr</s> (Alice et Bob doivent se mettre d'accord sur une clé en
+ « clair », par email par exemple) ou <s>non pratique</s>
+ (ils doivent se rencontrer physiquement pour échanger la
+ clé).<br/>
+ <em>Efficace</em>: on peut implanter plusieurs algorithmes
+ de chiffrements en utilisant uniquement des opérations
+ logiques de bases
+ (<tt>AND</tt>, <tt>OR</tt>, <tt>XOR</tt>). Il est facile de
+ les implanter sur des puces dédiées (cartes de crédit,
+ processeurs mobiles). Ils sont « sûrs » tant que la clé
+ reste secrète.
+ </p>
+ </li>
+ </ol>
+ </div>
+ <div class="sws-slide">
+ <h1>Élements de cryptographie (2)</h1>
+ <p>Alice et Bob veulent échanger des données
+ confidentielles.</p>
+ <ol style="list-style-type:none;">
+ <li>2. Chiffrement <em>assymétrique</em>:
+ <ul>
+ <li>Bob crée une <em>clé
+ publique</em> <i>K<sup>B</sup><sub>pub</sub></i>
+ et une <em style="color:orange;">clé
+ secrète</em> <i>K<sup>B</sup><sub>priv</sub></i>, telle
+ que<div style="text-align:center">
+ ∀<i>msg</i>, <i>K<sup>B</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>(<i>msg</i>))
+ = <i>K<sup>B</sup><sub>pub</sub></i>(<i>K<sup>B</sup><sub>priv</sub></i>(<i>msg</i>))
+ = <i>msg</i>
+ </div>
+ Bob <em>diffuse</em> sa clé publique (sur sa page Web
+ par exemple, ou dans un annuaire de clé) et garde sa clé
+ privée <em style="color:orange;">secrète</em>.
+ </li>
+ <li> Alice <em>chiffre</em> son message <i><s>m</s></i> avec la <em>clé
+ publique</em> de Bob
+ (<i>K<sup>B</sup><sub>pub</sub></i>(<i>m</i>)) et l'envoie à Bob
+ </li>
+ <li> Bob
+ déchiffre le message avec sa clé
+ privée: <i>K<sup>B</sup><sub>priv</sub>(K<sup>B</sup><sub>pub</sub></i>(<i>m</i>))=<s><i>m</i></s>
+ </li>
+ </ul>
+ <p class="sws-pause">
+ <s>Sûr et pratique</s> (Bob a généré une paire de clé, et a
+ déposé la clé publique sur une page Web)<br/>
+ <em>Peu efficace</em>: repose sur des problèmes
+ mathématiques difficiles (factorisation de grands entiers,
+ courbes eliptiques sur les corps finis). Chiffrer et
+ déchiffrer un message n'est pas réaliste pour des grands
+ messages (vidéo en streaming, requêtes Web, …).
+ </p>
+ </li>
+ </ol>
+ </div>
+ <div class="sws-slide">
+ <h1>Élements de cryptographie (3)</h1>
+ <p>On combine les deux méthodes. (Alice envoie un message à Bob)</p>
+ <ul>
+ <li>Alice choisit une <s>clé symétrique secrète <i>s</i></s></li>
+ <li>Elle l'envoie à Bob en utilisant la clé publique de ce
+ dernier (<i>K<sup>B</sup><sub>pub</sub></i>(<i>s</i>))
+ </li>
+ <li>Bob décrypte le message et
+ obtient <s><i>s</i></s>=<i>K<sup>B</sup><sub>priv</sub>(K<sup>B</sup><sub>pub</sub></i>(<i>s</i>))
+ </li>
+ <li>Bob et Alice se sont mis d'accord <em>de manière sûre</em>
+ sur une clé commune <s>s</s>! Ils peuvent utiliser un
+ algorithme de chiffrement symétrique pour le reste de la
+ conversation
+ </li>
+ </ul>
+ <p><b>⇒</b> Ceci est à la base de protocoles tels que HTTPS</p>
+ </div>
+
+ <div class="sws-slide">
+ <h1>Éléments de cryptographie (4)</h1>
+ <p>Le chiffrement assymétrique permet aussi d'avoir <em>la
+ preuve</em> que quelqu'un est bien Bob!</p>
+ <ul>
+ <li>Alice choisit un message secret aléatoire <i><s>m</s></i>,
+ sans le divulguer (appelé <i>challenge</i>)
+ </li>
+ <li>Alice
+ calcule <i>K<sup>B</sup><sub>pub</sub>(<i>s</i>)</i> et
+ l'envoie à la personne qui prétend être Bob
+ </li>
+ <li>Seule la personne qui possède la clé privée de Bob (donc
+ Bob …) peut déchiffrer le message et renvoyer l'original à
+ Alice.
+ </li>
+ </ul>
+ <p> <b>⇒</b> Comment garantir que la personne qui a généré
+ les clés <s>au départ</s> est bien Bob ?
+ </p>
+ </div>
+
+ <div class="sws-slide">
+ <h1>HTTP: protocole texte « en clair »</h1>
+ <p>HTTP est un protocole <em>texte</em>, les données ne sont
+ pas chiffrées (cf. TP3) et <em>sans identification</em></p>
+ <ul>
+ <li><em>Confidentialité</em> : n'importe qui (avec les
+ privilèges nécessaires) peut lire ce qui transite entre un client
+ et un serveur Web</li>
+ <li><em>Authenticité</em> : n'importe qui peut se faire passer
+ pour un serveur Web (attaque <i>man in the middle</i>)
+ </li>
+ </ul>
+ </div>
+ <div class="sws-slide">
+ <h1>Espionnage de connexion</h1>
+ <p>Alice représente le client, Bob le serveur et Eve (<i>Eavesdropper</i>)
+ l'attaquante</p>
+ <p>On suppose que <s>Eve</s> est <s>root</s> sur la
+ machine. Il suffit de lire les paquets qui transitent par la
+ carte réseau (<tt>tcpdump</tt> sous Linux).
+ </p>
+ <ul><li>Eve et Alice sont sur la même machine (démo):
+ <div style="text-align:center;vertical-align:middle;"><br/>
+ <span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;">A
+ <s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
+ 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;">B</span>
+
+ </div>
+ </li>
+ <li>Fonctionne aussi si Eve est sur une machine se trouvant
+ sur la route entre Alice et Bob:
+ <div style="text-align:center;vertical-align:middle;"><br/>
+ <span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
+ 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;"><s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
+ 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;">B</span>
+
+ </div>
+ </li>
+ </ul>
+ <p>Ce problème touche tous les protocoles en clair: HTTP, POP,
+ IMAP, FTP, …. Il peut être résolu grace au <em>chiffrement</em>
+ de toute la connexion.</p>
+ </div>
+ <div class="sws-slide">
+ <h1>Attaque <i>Man in the middle</i></h1>
+ <p><s>Mallory</s> se place entre Alice (cliente) et Bob (banque), par exemple au
+ moyen d'un <em>e-mail</em> frauduleux en HTML:</p>
+ <ol> <li> L'émail contient:
+ <code><![CDATA[ <html>
+ <body>
+ Bonjour,
+ veuillez vous connecter à votre banque en cliquant ici:
+ <a href=']]><s>mallory.com</s>' ><em>www.bob.com</em><![CDATA[</a>
+ </body>
+</html>]]></code>
+ </li>
+ <li>Alice, insouciante, clique sur le lien
+ <div style="text-align:center;vertical-align:middle;"><br/>
+ <span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
+ 0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;"><s>M</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
+ 0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
+ 5pt;padding:5pt;font-size:larger;">B</span>
+ </div>
+ </li>
+ <li>Mallory peut retransmettre les requêtes entre Bob et
+ Alice, en les modifiant au passage. Le problème est causé
+ par un manque d'authentification (Mallory n'a pas a
+ prouver à Alice qu'il est Bob)
+ </li>
+</ol>
+ </div>
+ <div class="sws-slide">
+ <h1>Solution: HTTPS</h1>
+ <p>HTTP <em>Secure</em></p>
+ <ol> <li>Respose sur de la cryptographie assymétrique (pour
+ l'authentification et le partage de clé) et symétrique (pour le
+ chiffrement de connexion)</li>
+ <li>Permet d'authentifier les correspondants et de protéger
+ les données
+ </li>
+ <li>Suppose l'existence de <em>tiers de confience</em> Alice
+ et Bob font confiance à Trent (<i>Trusted Third
+ Party</i>)</li>
+ </ol>
+ <p>Bob possède des clés publiques et privées
+ (<i>K<sup>B</sup><sub>pub</sub></i>
+ et <i>K<sup>B</sup><sub>priv</sub></i>), Trent possède des clés
+ publiques et privées (<i>K<sup>T</sup><sub>pub</sub></i>
+ et <i>K<sup>T</sup><sub>priv</sub></i>)
+ </p>
+ </div>
+ <div class="sws-slide">
+ <h1>HTTPS (détail du protocole)</h1>
+ <p>Bob et Trent <em>se rencontrent</em>. Trent <em>signe</em>
+ la clé publique de Bob en calculant
+ <div style="text-align:center">
+ <i>S<sup>B</sup></i>=<i>K<sup>T</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>)
+ </div>
+ Comme Trent utilise sa clé <em>privée</em> on sait que seul
+ Trent a pu générer cette signature. De plus, Trent
+ a <em>rencontré</em> Bob donc il <em>certifie</em> que la
+ clé <i>K<sup>B</sup><sub>pub</sub></i> appartient bien à
+ quelqu'un nommé Bob.
+ </p>
+ <ol>
+ <li>Alice (client) veut se connecter à Bob. Bob fournit sa
+ clé publique <i>K<sup>B</sup><sub>pub</sub></i> et la
+ signature <i>S<sup>B</sup></i></li>
+ <li> Alice contacte Trent (en qui elle a confiance) et récupère sa clé
+ publique <i>K<sup>T</sup><sub>pub</sub></i>. Elle déchiffre la
+ signature: <i>K<sup>T</sup><sub>pub</sub></i>(<i>S<sup>B</sup></i>)
+ et vérifie qu'elle retombe bien sur la clé publique de Bob.
+ </li>
+ <li>Elle peut alors choisir une clé symétrique, la chiffrer
+ avec <i>K<sup>B</sup><sub>pub</sub></i> et entammer une
+ communication <em>chiffrée</em> et <em>authentifiée</em> avec
+ Bob.</li>
+ </ol>
+</div>
+ <div class="sws-slide">
+ <h1>Tiers de confience</h1>
+ <p>Les tiers de confience sont des entités (états, associations,
+ compagnies privées) qui se chargent de vérifier les clés
+ publiques d'autres entitées. C'est une
+ vérification <em>physique</em> (documents administratifs, …).
+ </p>
+ <div style="text-align:center"><img style="width:70%" src="ssl-cert.png" alt="ssl"/>
+ </div>
+ <p style="background:white">Cette erreur s'affiche quand une signature n'est pas conforme
+ ou n'a pas pu être vérifiée</p>
+ </div>
+
+ <div class="sws-slide">
+ <h1>Tiers de confience</h1>
+ <p>Attaques contre les <em>authorités de certifications</em>
+ (tiers de confience): difficiles, mais pas impossible. Certains
+ tiers de confience sont douteux (états voyous, compagnie
+ piratées dont les clées <s>privées</s> sont compromises,…)<br/>
+ <s>Attaques d'implémentation</s> (plus probables) : on
+ exploite un <s>bug</s> dans le code des serveurs web ou des
+ navigateurs<br/>
+ <s>Autres faiblesses</s>: HTTPS est en « haut » dans la pile
+ IP (application). On peut donc avoir connaissance du nombre de
+ paquet échangés, des adresses IP des participants, la taille
+ et la fréquence des paquets… (même si on n'en connait pas le
+ contenu). Cela permet certaines attaques statisties ou de deni
+ de service.
+ </p>
+ </div>
+ <h1>Confidentialité, traîtement des <i>cookies</i></h1>
+ <div class="sws-slide">
+ <h1>Traçage par cookies</h1>
+ <p><i>Normalement</i>, un <em>cookie</em> ne peut être
+ lu <em>que</em> que par le site émetteur (cf. cours 8). But:</p>
+ <ol class="sws-pause">
+ <li>Empêcher un tiers de lire des données personnelles
+ (<em>ok</em>)</li>
+ <li>Empêcher un tiers de savoir quels sites ont été visités
+ (<em>pas ok</em>)</li>
+ </ol>
+ <ol>
+ <li class="sws-pause">Un site B utilise des publicités pour se rémunérer. Le
+ site marchand <s>M</s> fournit du code HTML:
+ <code> <script src="http://marchand.com/pub.js"/> </code>
+ </li>
+ <li class="sws-pause">A visite le site B. Le
+ code <tt>pub.js</tt> peut alors faire les choses suivantes:
+ <ol>
+ <li>Scanner le contenu de la page de B. Possible car le
+ script est « inclus » dans une page fournie par B</li>
+ <li>Se connecter
+ à<s><tt>http://marchand.com/collecte.php</tt></s> et
+ passer en paramètre <tt>post</tt> ou <tt>get</tt> le
+ contenu de la récolte</li>
+ <li><tt>http://marchand.com</tt> peut alors stocker un
+ cookie valide <em>pour son domaine</em> avec le contenu de
+ la récolte d'information
+ </li>
+ </ol>
+ </li>
+ <li class="sws-pause">
+ Lorsque A visite le site marchand <s>M</s>, ce dernier
+ relit son cookie et fait des propositions ciblées.
+ </li>
+
+ </ol>
+ </div>
+ <div class="sws-slide">
+ <h1>Solutions</h1>
+ <ul>
+ <li>Désactiver les cookies de « tierce partie » (cookie dont
+ l'origine n'est pas celle de la page visitée)
+ </li>
+ <li> Effacer par défaut tous les cookies quand on quite le
+ navigateur</li>
+ <li>Rajouter des exceptions pour certains sites au cas par cas
+ </li>
+ </ul>
+ <p>Nouveau standard du W3C en préparation pour signifier à un
+ site qu'on ne souhaite pas être suivi (méthode « volontariste
+ » qui suppose que les sites commerciaux sont gentils et
+ respectent le protocole)</p>
+ </div>
+ <div class="sws-slide">
+ <h1>Sécurité des cookies de session</h1>
+ <p>On a vu que les sessions PHP (vrai aussi pour les autres
+ langages côté serveur) stockent dans un cookie un identifiant
+ unique. Que se passe-t-il si on vole ce cookie ? (démo)
+ </p>
+ <p class="sws-pause">Pas d'autre solution que de faire confiance
+ au <s>root</s> (solutions partielles basées sur le chiffrement
+ des disques dur)
+ </p>
+ </div>
+ <h1>Attaques par injection de code</h1>
+ <div class="sws-slide">
+ <h1>Injection de code Javascript/HTML</h1>
+ <p>Vulnérabilité: on exploite le fait qu'un site <s>utilise
+ directement</s> les entrées fournies par l'utilisateur.<br/>
+ Exemple: commentaires sur un blog.
+ </p>
+ <ol>
+ <li>Une page Web utilise un formulaire pour permettre de
+ poster des commentaires sur un blog:
+ <code><![CDATA[
+ <form action="comment.php" method="post">
+ Commentaire: <br/>
+ ]]><em><textarea rows="20" cols="60" name="zonetexte"/></em><![CDATA[
+ <br/>
+ <button type="submit">Envoyer</button>
+</form>]]></code>
+ </li>
+ <li>Un bout de code PHP écrit le commentaire sur la page:
+ <code> echo "Commentaire #$i: <p>";
+ <s>echo $_POST["zonetexte"];</s>
+ echo "</p>";
+</code>
+</li>
+
+
+ </ol>
+ </div>
+ <div class="sws-slide">
+ <h1>Injection de code Javascript/HTML</h1>
+ <s>Problème</s> tout ce qui est dans la zone de texte est copié
+ dans la page HTML de chaque client qui consulte la page
+ et <s>interprété</s> par son navigateur:
+ <code>Debut du commentaire
+ <s><script type="text/javascript"></s>
+ ... //code javascript malicieux
+ <s></script></s>
+ Fin du commentaire
+ </code>
+ </div>
+ <div class="sws-slide">
+ <h1>Injection de code PHP</h1>
+ <p><s>Problème</s> lié à l'utilisation de la fonction
+ <code> <s>eval</s>(command)</code>
+ <tt><em>command</em></tt> est une chaîne de caractères
+ considérée comme étant du code PHP et <tt>eval</tt> exécute
+ cette chaîne:
+ </p>
+ <code>
+ echo eval ("1 + 2 * 3"); // affiche 7
+ echo eval ('$x = 4;'); // définit la variable $x
+ echo $x; // affiche 4
+ </code>
+ <p>Il ne faut <s>jamais donner une chaine de caractère de
+ l'utilisateur comme argument à <tt>eval</tt></s> (sauf durant le
+ TP 9)</p>
+ </div>
+ <div class="sws-slide">
+ <h1>Solutions</h1>
+ <ul>
+ <li>Ne jamais <s>utiliser <tt>eval</tt></s></li>
+ <li>Utiliser la fonction <tt>htmlspecialchars</tt> qui
+ échappe les
+ caractères <tt><</tt>, <tt>></tt>, <tt>&</tt>, <tt>'</tt>, <tt>"</tt></li>
+ <li>Utiliser la fonction <tt>striptags</tt> qui supprime tout
+ ce qui est une balise</li>
+ <li>Toujours valider les entrées d'un utilisateur</li>
+ </ul>
+ </div>
+ <div class="sws-slide">
+ <h1>Injection de code SQL</h1>
+ <p>SQL: language de requête permettant d'interroger des bases de
+ données. Utilisation classique depuis PHP (on suppose un
+ formulaire qui met dans le champ <tt>"nom"</tt> le nom d'un
+ étudiant):
+ </p>
+ <code>
+ $Q = <em>"SELECT * FROM STUDENTS WHERE "</em>;
+ $Q = $Q . <em>"(NAME = '"</em> . $_POST["nom"] . <em>"');"</em>;
+ mysql_query($Q);
+ </code>
+ <p>Si l'utilisateur donne comme nom « Toto », la requête envoyée
+ à la base est: </p>
+ <code> SELECT * FROM STUDENTS WHERE (NAME = 'Toto');</code>
+ <p>Affiche toutes les lignes de la table <tt>STUDENTS</tt> pour
+ lesquel le nom est <tt>Toto</tt></p>
+ </div>
+ <div class="sws-slide">
+ <h1>Jusqu'au jour où …</h1>
+ <p>©xkcd<br/>
+ <img style="width:90%" src="xkcd.png" alt=""/>
+ </p>
+ <code> <em>SELECT * FROM STUDENTS WHERE (NAME ='</em><s>Robert');</s>
+ <s>DROP TABLE STUDENTS; --</s><em>');'</em>
+
+ </code>
+ </div>
+ <div class="sws-slide">
+ <h1>Ou bien…</h1>
+ <div style="text-align:center;">
+ <img style="width:70%" src="radar.jpg" />
+ </div>
+ </div>
+ </body>
+</html>