1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
5 <html xmlns="http://www.w3.org/1999/xhtml" >
7 <title>Notions de sécurité sur le Web</title>
9 <meta http-equiv="Content-Type"
10 content="text/html; charset=utf-8" />
11 <meta name="copyright"
12 content="Copyright © 2013 Kim Nguyễn" />
15 <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
16 <script src="../libs/raphael-min.js" type="text/javascript" ></script>
17 <!-- Load the library -->
18 <script src="../simpleWebSlides.js" type="text/javascript" ></script>
20 <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css" media="all" />
21 <!-- Load a custom Theme, the class-element marks this style-sheet
22 a "theme" that can be swtiched dynamicaly -->
23 <link class="sws-theme" rel="stylesheet" title="U-Psud style" href="../themes/uPsud.css" type="text/css" />
25 <!-- Customize some templates and initialize -->
27 <script type="text/javascript">
28 SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
29 SWS.Config['sws-object-deactivate'] = SWS.Effects.objectDeactivateFadeOut;
30 SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
32 //Ensures that we load SWS at the very end, after MathJax has
35 $(window).load(SWS.Presentation.init);
39 <a href="prog_internet_08.xhtml" class="sws-previous"/>
40 <div class="sws-slide sws-cover sws-option-nofooter">
41 <h1>Programmation Internet</h1>
43 <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
44 <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
47 <h1>Faiblesses d'HTTP</h1>
49 <div class="sws-slide">
50 <h1><i>Disclaimer</i></h1>
52 <li>Aborde juste quelques aspects de sécurité</li>
53 <li>Essaye de montrer quelques principes fondamentaux</li>
54 <li>Uniquement axé sur le Web</li>
56 <p><b>⇒</b> Ça ne va pas faire de vous des <i>hackers</i>,
57 juste vous sensibiliser aux problèmes de sécurité…
61 <div class="sws-slide">
62 <h1>Élements de cryptographie (1)</h1>
63 <p>Alice et Bob veulent échanger des données
65 <ol style="list-style-type:none;">
66 <li>1. Chiffrement <s>symétrique</s>:
69 Ils se mettent d'accord sur une <em>clé commune</em>
71 <li> Alice <em>chiffre</em> son message avec la clé et
73 <li> Bob déchiffre le message avec <em>la clé</em>
77 <s>Non sûr</s> (Alice et Bob doivent se mettre d'accord sur une clé en
78 « clair », par email par exemple) ou <s>non pratique</s>
79 (ils doivent se rencontrer physiquement pour échanger la
81 <em>Efficace</em>: on peut implanter plusieurs algorithmes
82 de chiffrements en utilisant uniquement des opérations
84 (<tt>AND</tt>, <tt>OR</tt>, <tt>XOR</tt>). Il est facile de
85 les implanter sur des puces dédiées (cartes de crédit,
86 processeurs mobiles). Ils sont « sûrs » tant que la clé
92 <div class="sws-slide">
93 <h1>Élements de cryptographie (2)</h1>
94 <p>Alice et Bob veulent échanger des données
96 <ol style="list-style-type:none;">
97 <li>2. Chiffrement <em>assymétrique</em>:
99 <li>Bob crée une <em>clé
100 publique</em> <i>K<sup>B</sup><sub>pub</sub></i>
101 et une <em style="color:orange;">clé
102 secrète</em> <i>K<sup>B</sup><sub>priv</sub></i>, telle
103 que<div style="text-align:center">
104 ∀<i>msg</i>, <i>K<sup>B</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>(<i>msg</i>))
105 = <i>K<sup>B</sup><sub>pub</sub></i>(<i>K<sup>B</sup><sub>priv</sub></i>(<i>msg</i>))
108 Bob <em>diffuse</em> sa clé publique (sur sa page Web
109 par exemple, ou dans un annuaire de clé) et garde sa clé
110 privée <em style="color:orange;">secrète</em>.
112 <li> Alice <em>chiffre</em> son message <i><s>m</s></i> avec la <em>clé
114 (<i>K<sup>B</sup><sub>pub</sub></i>(<i>m</i>)) et l'envoie à Bob
117 déchiffre le message avec sa clé
118 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>
121 <p class="sws-pause">
122 <s>Sûr et pratique</s> (Bob a généré une paire de clé, et a
123 déposé la clé publique sur une page Web)<br/>
124 <em>Peu efficace</em>: repose sur des problèmes
125 mathématiques difficiles (factorisation de grands entiers,
126 courbes eliptiques sur les corps finis). Chiffrer et
127 déchiffrer un message n'est pas réaliste pour des grands
128 messages (vidéo en streaming, requêtes Web, …).
133 <div class="sws-slide">
134 <h1>Élements de cryptographie (3)</h1>
135 <p>On combine les deux méthodes. (Alice envoie un message à Bob)</p>
137 <li>Alice choisit une <s>clé symétrique secrète <i>s</i></s></li>
138 <li>Elle l'envoie à Bob en utilisant la clé publique de ce
139 dernier (<i>K<sup>B</sup><sub>pub</sub></i>(<i>s</i>))
141 <li>Bob décrypte le message et
142 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>))
144 <li>Bob et Alice se sont mis d'accord <em>de manière sûre</em>
145 sur une clé commune <s>s</s>! Ils peuvent utiliser un
146 algorithme de chiffrement symétrique pour le reste de la
150 <p><b>⇒</b> Ceci est à la base de protocoles tels que HTTPS</p>
153 <div class="sws-slide">
154 <h1>Éléments de cryptographie (4)</h1>
155 <p>Le chiffrement assymétrique permet aussi d'avoir <em>la
156 preuve</em> que quelqu'un est bien Bob!</p>
158 <li>Alice choisit un message secret aléatoire <i><s>m</s></i>,
159 sans le divulguer (appelé <i>challenge</i>)
162 calcule <i>K<sup>B</sup><sub>pub</sub>(<i>s</i>)</i> et
163 l'envoie à la personne qui prétend être Bob
165 <li>Seule la personne qui possède la clé privée de Bob (donc
166 Bob …) peut déchiffrer le message et renvoyer l'original à
170 <p> <b>⇒</b> Comment garantir que la personne qui a généré
171 les clés <s>au départ</s> est bien Bob ?
175 <div class="sws-slide">
176 <h1>HTTP: protocole texte « en clair »</h1>
177 <p>HTTP est un protocole <em>texte</em>, les données ne sont
178 pas chiffrées (cf. TP3) et <em>sans identification</em></p>
180 <li><em>Confidentialité</em> : n'importe qui (avec les
181 privilèges nécessaires) peut lire ce qui transite entre un client
182 et un serveur Web</li>
183 <li><em>Authenticité</em> : n'importe qui peut se faire passer
184 pour un serveur Web (attaque <i>man in the middle</i>)
188 <div class="sws-slide">
189 <h1>Espionnage de connexion</h1>
190 <p>Alice représente le client, Bob le serveur et Eve (<i>Eavesdropper</i>)
192 <p>On suppose que <s>Eve</s> est <s>root</s> sur la
193 machine. Il suffit de lire les paquets qui transitent par la
194 carte réseau (<tt>tcpdump</tt> sous Linux).
196 <ul><li>Eve et Alice sont sur la même machine (démo):
197 <div style="text-align:center;vertical-align:middle;"><br/>
198 <span style="border:1pt solid gray;border-radius:
199 5pt;padding:5pt;font-size:larger;">A
200 <s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
201 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
202 5pt;padding:5pt;font-size:larger;">B</span>
206 <li>Fonctionne aussi si Eve est sur une machine se trouvant
207 sur la route entre Alice et Bob:
208 <div style="text-align:center;vertical-align:middle;"><br/>
209 <span style="border:1pt solid gray;border-radius:
210 5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
211 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
212 5pt;padding:5pt;font-size:larger;"><s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
213 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
214 5pt;padding:5pt;font-size:larger;">B</span>
219 <p>Ce problème touche tous les protocoles en clair: HTTP, POP,
220 IMAP, FTP, …. Il peut être résolu grace au <em>chiffrement</em>
221 de toute la connexion.</p>
223 <div class="sws-slide">
224 <h1>Attaque <i>Man in the middle</i></h1>
225 <p><s>Mallory</s> se place entre Alice (cliente) et Bob (banque), par exemple au
226 moyen d'un <em>e-mail</em> frauduleux en HTML:</p>
227 <ol> <li> L'émail contient:
228 <code><![CDATA[ <html>
231 veuillez vous connecter à votre banque en cliquant ici:
232 <a href=']]><s>mallory.com</s>' ><em>www.bob.com</em><![CDATA[</a>
236 <li>Alice, insouciante, clique sur le lien
237 <div style="text-align:center;vertical-align:middle;"><br/>
238 <span style="border:1pt solid gray;border-radius:
239 5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
240 0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
241 5pt;padding:5pt;font-size:larger;"><s>M</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
242 0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
243 5pt;padding:5pt;font-size:larger;">B</span>
246 <li>Mallory peut retransmettre les requêtes entre Bob et
247 Alice, en les modifiant au passage. Le problème est causé
248 par un manque d'authentification (Mallory n'a pas a
249 prouver à Alice qu'il est Bob)
253 <div class="sws-slide">
254 <h1>Solution: HTTPS</h1>
255 <p>HTTP <em>Secure</em></p>
256 <ol> <li>Respose sur de la cryptographie assymétrique (pour
257 l'authentification et le partage de clé) et symétrique (pour le
258 chiffrement de connexion)</li>
259 <li>Permet d'authentifier les correspondants et de protéger
262 <li>Suppose l'existence de <em>tiers de confiance</em> Alice
263 et Bob font confiance à Trent (<i>Trusted Third
266 <p>Bob possède des clés publiques et privées
267 (<i>K<sup>B</sup><sub>pub</sub></i>
268 et <i>K<sup>B</sup><sub>priv</sub></i>), Trent possède des clés
269 publiques et privées (<i>K<sup>T</sup><sub>pub</sub></i>
270 et <i>K<sup>T</sup><sub>priv</sub></i>)
273 <div class="sws-slide">
274 <h1>HTTPS (détail du protocole)</h1>
275 <p>Bob et Trent <em>se rencontrent</em>. Trent <em>signe</em>
276 la clé publique de Bob en calculant
277 <div style="text-align:center">
278 <i>S<sup>B</sup></i>=<i>K<sup>T</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>)
280 Comme Trent utilise sa clé <em>privée</em> on sait que seul
281 Trent a pu générer cette signature. De plus, Trent
282 a <em>rencontré</em> Bob donc il <em>certifie</em> que la
283 clé <i>K<sup>B</sup><sub>pub</sub></i> appartient bien à
287 <li>Alice (client) veut se connecter à Bob. Bob fournit sa
288 clé publique <i>K<sup>B</sup><sub>pub</sub></i> et la
289 signature <i>S<sup>B</sup></i></li>
290 <li> Alice contacte Trent (en qui elle a confiance) et récupère sa clé
291 publique <i>K<sup>T</sup><sub>pub</sub></i>. Elle déchiffre la
292 signature: <i>K<sup>T</sup><sub>pub</sub></i>(<i>S<sup>B</sup></i>)
293 et vérifie qu'elle retombe bien sur la clé publique de Bob.
295 <li>Elle peut alors choisir une clé symétrique, la chiffrer
296 avec <i>K<sup>B</sup><sub>pub</sub></i> et entammer une
297 communication <em>chiffrée</em> et <em>authentifiée</em> avec
301 <div class="sws-slide">
302 <h1>Tiers de confiance</h1>
303 <p>Les tiers de confiance sont des entités (états, associations,
304 compagnies privées) qui se chargent de vérifier les clés
305 publiques d'autres entitées. C'est une
306 vérification <em>physique</em> (documents administratifs, …).
308 <div style="text-align:center"><img style="width:70%" src="ssl-cert.png" alt="ssl"/>
310 <p style="background:white">Cette erreur s'affiche quand une signature n'est pas conforme
311 ou n'a pas pu être vérifiée</p>
314 <div class="sws-slide">
315 <h1>Tiers de confiance</h1>
316 <p>Attaques contre les <em>authorités de certifications</em>
317 (tiers de confiance): difficiles, mais pas impossible. Certains
318 tiers de confiance sont douteux (états voyous, compagnie
319 piratées dont les clées <s>privées</s> sont compromises,…)<br/>
320 <s>Attaques d'implémentation</s> (plus probables) : on
321 exploite un <s>bug</s> dans le code des serveurs web ou des
323 <s>Autres faiblesses</s>: HTTPS est en « haut » dans la pile
324 IP (application). On peut donc avoir connaissance du nombre de
325 paquet échangés, des adresses IP des participants, la taille
326 et la fréquence des paquets… (même si on n'en connait pas le
327 contenu). Cela permet certaines attaques statisties ou de deni
331 <h1>Confidentialité, traîtement des <i>cookies</i></h1>
332 <div class="sws-slide">
333 <h1>Traçage par cookies</h1>
334 <p><i>Normalement</i>, un <em>cookie</em> ne peut être
335 lu <em>que</em> que par le site émetteur (cf. cours 8). But:</p>
336 <ol class="sws-pause">
337 <li>Empêcher un tiers de lire des données personnelles
339 <li>Empêcher un tiers de savoir quels sites ont été visités
340 (<em>pas ok</em>)</li>
343 <li class="sws-pause">Un site B utilise des publicités pour se rémunérer. Le
344 site marchand <s>M</s> fournit du code HTML:
345 <code> <script src="http://marchand.com/pub.js"/> </code>
347 <li class="sws-pause">A visite le site B. Le
348 code <tt>pub.js</tt> peut alors faire les choses suivantes:
350 <li>Scanner le contenu de la page de B. Possible car le
351 script est « inclus » dans une page fournie par B</li>
353 à<s><tt>http://marchand.com/collecte.php</tt></s> et
354 passer en paramètre <tt>post</tt> ou <tt>get</tt> le
355 contenu de la récolte</li>
356 <li><tt>http://marchand.com</tt> peut alors stocker un
357 cookie valide <em>pour son domaine</em> avec le contenu de
358 la récolte d'information
362 <li class="sws-pause">
363 Lorsque A visite le site marchand <s>M</s>, ce dernier
364 relit son cookie et fait des propositions ciblées.
369 <div class="sws-slide">
372 <li>Désactiver les cookies de « tierce partie » (cookie dont
373 l'origine n'est pas celle de la page visitée)
375 <li> Effacer par défaut tous les cookies quand on quite le
377 <li>Rajouter des exceptions pour certains sites au cas par cas
380 <p>Nouveau standard du W3C en préparation pour signifier à un
381 site qu'on ne souhaite pas être suivi (méthode « volontariste
382 » qui suppose que les sites commerciaux sont gentils et
383 respectent le protocole)</p>
385 <div class="sws-slide">
386 <h1>Sécurité des cookies de session</h1>
387 <p>On a vu que les sessions PHP (vrai aussi pour les autres
388 langages côté serveur) stockent dans un cookie un identifiant
389 unique. Que se passe-t-il si on vole ce cookie ? (démo)
391 <p class="sws-pause">Pas d'autre solution que de faire confiance
392 au <s>root</s> (solutions partielles basées sur le chiffrement
396 <h1>Attaques par injection de code</h1>
397 <div class="sws-slide">
398 <h1>Injection de code Javascript/HTML</h1>
399 <p>Vulnérabilité: on exploite le fait qu'un site <s>utilise
400 directement</s> les entrées fournies par l'utilisateur.<br/>
401 Exemple: commentaires sur un blog.
404 <li>Une page Web utilise un formulaire pour permettre de
405 poster des commentaires sur un blog:
407 <form action="comment.php" method="post">
409 ]]><em><textarea rows="20" cols="60" name="zonetexte"/></em><![CDATA[
411 <button type="submit">Envoyer</button>
414 <li>Un bout de code PHP écrit le commentaire sur la page:
415 <code> echo "Commentaire #$i: <p>";
416 <s>echo $_POST["zonetexte"];</s>
424 <div class="sws-slide">
425 <h1>Injection de code Javascript/HTML</h1>
426 <s>Problème</s> tout ce qui est dans la zone de texte est copié
427 dans la page HTML de chaque client qui consulte la page
428 et <s>interprété</s> par son navigateur:
429 <code>Debut du commentaire
430 <s><script type="text/javascript"></s>
431 ... //code javascript malicieux
432 <s></script></s>
436 <div class="sws-slide">
437 <h1>Injection de code PHP</h1>
438 <p><s>Problème</s> lié à l'utilisation de la fonction
439 <code> <s>eval</s>(command)</code>
440 <tt><em>command</em></tt> est une chaîne de caractères
441 considérée comme étant du code PHP et <tt>eval</tt> exécute
445 echo eval ("1 + 2 * 3"); // affiche 7
446 echo eval ('$x = 4;'); // définit la variable $x
447 echo $x; // affiche 4
449 <p>Il ne faut <s>jamais donner une chaine de caractère de
450 l'utilisateur comme argument à <tt>eval</tt></s> (sauf durant le
453 <div class="sws-slide">
456 <li>Ne jamais <s>utiliser <tt>eval</tt></s></li>
457 <li>Utiliser la fonction <tt>htmlspecialchars</tt> qui
459 caractères <tt><</tt>, <tt>></tt>, <tt>&</tt>, <tt>'</tt>, <tt>"</tt></li>
460 <li>Utiliser la fonction <tt>striptags</tt> qui supprime tout
461 ce qui est une balise</li>
462 <li>Toujours valider les entrées d'un utilisateur</li>
465 <div class="sws-slide">
466 <h1>Injection de code SQL</h1>
467 <p>SQL: language de requête permettant d'interroger des bases de
468 données. Utilisation classique depuis PHP (on suppose un
469 formulaire qui met dans le champ <tt>"nom"</tt> le nom d'un
473 $Q = <em>"SELECT * FROM STUDENTS WHERE "</em>;
474 $Q = $Q . <em>"(NAME = '"</em> . $_POST["nom"] . <em>"');"</em>;
477 <p>Si l'utilisateur donne comme nom « Toto », la requête envoyée
479 <code> SELECT * FROM STUDENTS WHERE (NAME = 'Toto');</code>
480 <p>Affiche toutes les lignes de la table <tt>STUDENTS</tt> pour
481 lesquel le nom est <tt>Toto</tt></p>
483 <div class="sws-slide">
484 <h1>Jusqu'au jour où …</h1>
486 <img style="width:90%" src="xkcd.png" alt=""/>
488 <code> <em>SELECT * FROM STUDENTS WHERE (NAME ='</em><s>Robert');</s>
489 <s>DROP TABLE STUDENTS; --</s><em>');'</em>
493 <div class="sws-slide">
495 <div style="text-align:center;">
496 <img style="width:70%" src="radar.jpg" />