Typos et nouveau cours.
[hacks/simpleWebSlides.git] / prog_internet / prog_internet_09.xhtml
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"
4           >
5 <html xmlns="http://www.w3.org/1999/xhtml" >
6   <head>
7     <title>Notions de sécurité sur le Web</title>
8
9     <meta http-equiv="Content-Type"
10           content="text/html; charset=utf-8" />
11     <meta name="copyright"
12           content="Copyright &#169; 2013 Kim Nguyễn" />
13
14     <!-- Load jQuery -->
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>
19
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" />
24
25     <!-- Customize some templates and initialize -->
26
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;
31
32       //Ensures that we load SWS at the very end, after MathJax has
33       //been initialized
34
35       $(window).load(SWS.Presentation.init);
36     </script>
37   </head>
38   <body>
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>
42       <h1>Cours 9</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>
45     </div>
46
47     <h1>Faiblesses d'HTTP</h1>
48
49     <div class="sws-slide">
50       <h1><i>Disclaimer</i></h1>
51       <ul>
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>
55       </ul>
56       <p><b>&#8658;</b> Ça ne va pas faire de vous des <i>hackers</i>,
57       juste vous sensibiliser aux problèmes de sécurité…
58       </p>
59     </div>
60
61     <div class="sws-slide">
62       <h1>Élements de cryptographie (1)</h1>
63       <p>Alice et Bob veulent échanger des données
64       confidentielles.</p>
65       <ol style="list-style-type:none;">
66         <li>1.&nbsp;Chiffrement <s>symétrique</s>:
67           <ul>
68             <li>
69               Ils se mettent d'accord sur une <em>clé commune</em>
70             </li>
71             <li> Alice <em>chiffre</em> son message avec la clé et
72               l'envoie à Bob</li>
73             <li> Bob déchiffre le message avec <em>la clé</em>
74             </li>
75           </ul>
76           <p class="sws-pause">
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
80           clé).<br/>
81           <em>Efficace</em>: on peut implanter plusieurs algorithmes
82           de chiffrements en utilisant uniquement des opérations
83           logiques de bases
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é
87           reste secrète.
88           </p>
89         </li>
90       </ol>
91     </div>
92     <div class="sws-slide">
93       <h1>Élements de cryptographie (2)</h1>
94       <p>Alice et Bob veulent échanger des données
95       confidentielles.</p>
96       <ol style="list-style-type:none;">
97         <li>2.&nbsp; Chiffrement <em>assymétrique</em>:
98           <ul>
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                 &#8704;<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>))
106             = <i>msg</i>
107               </div>
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>.
111             </li>
112             <li> Alice <em>chiffre</em> son message <i><s>m</s></i> avec la <em>clé
113               publique</em> de Bob
114               (<i>K<sup>B</sup><sub>pub</sub></i>(<i>m</i>)) et l'envoie à Bob
115             </li>
116             <li> 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>
119             </li>
120           </ul>
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, …).
129           </p>
130         </li>
131       </ol>
132     </div>
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>
136       <ul>
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>))
140         </li>
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>))
143         </li>
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
147           conversation
148         </li>
149       </ul>
150       <p><b>&#8658;</b> Ceci est à la base de protocoles tels que HTTPS</p>
151     </div>
152
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>
157       <ul>
158         <li>Alice choisit un message secret aléatoire <i><s>m</s></i>,
159           sans le divulguer (appelé <i>challenge</i>)
160         </li>
161         <li>Alice
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
164         </li>
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 à
167           Alice.
168         </li>
169       </ul>
170       <p> <b>&#8658;</b> Comment garantir que la personne qui a généré
171         les clés <s>au départ</s> est bien Bob ?
172       </p>
173     </div>
174
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>
179     <ul>
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>)
185       </li>
186     </ul>
187   </div>
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>)
191      l'attaquante</p>
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).
195      </p>
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 &nbsp;
200            &nbsp; <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>
203
204          </div>
205        </li>
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>
215
216          </div>
217        </li>
218      </ul>
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>
222     </div>
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>
229    <body>
230        Bonjour,
231           veuillez vous connecter à votre banque en cliquant ici:
232            <a href=']]><s>mallory.com</s>' &gt;<em>www.bob.com</em><![CDATA[</a>
233     </body>
234 </html>]]></code>
235           </li>
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>
244          </div>
245           </li>
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)
250           </li>
251 </ol>
252     </div>
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
260         les données
261         </li>
262         <li>Suppose l'existence de <em>tiers de confiance</em> Alice
263         et Bob font confiance à Trent (<i>Trusted Third
264         Party</i>)</li>
265       </ol>
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>)
271       </p>
272     </div>
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>)
279         </div>
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 à
284         quelqu'un nommé Bob.
285       </p>
286       <ol>
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.
294         </li>
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
298         Bob.</li>
299       </ol>
300 </div>
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, …).
307       </p>
308       <div style="text-align:center"><img style="width:70%" src="ssl-cert.png" alt="ssl"/>
309       </div>
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>
312     </div>
313
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
322         navigateurs<br/>
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
328         de service.
329       </p>
330     </div>
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
338         (<em>ok</em>)</li>
339         <li>Empêcher un tiers de savoir quels sites ont été visités
340         (<em>pas ok</em>)</li>
341       </ol>
342       <ol>
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>   &lt;script src="http://marchand.com/pub.js"/&gt; </code>
346         </li>
347         <li class="sws-pause">A visite le site B. Le
348           code <tt>pub.js</tt> peut alors faire les choses suivantes:
349           <ol>
350             <li>Scanner le contenu de la page de B. Possible car le
351               script est « inclus »  dans une page fournie par B</li>
352             <li>Se connecter
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
359             </li>
360           </ol>
361         </li>
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.
365         </li>
366
367       </ol>
368     </div>
369     <div class="sws-slide">
370       <h1>Solutions</h1>
371       <ul>
372         <li>Désactiver les cookies de « tierce partie » (cookie dont
373           l'origine n'est pas celle de la page visitée)
374         </li>
375         <li> Effacer par défaut tous les cookies quand on quite le
376           navigateur</li>
377         <li>Rajouter des exceptions pour certains sites au cas par cas
378         </li>
379       </ul>
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>
384     </div>
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)
390       </p>
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
393       des disques dur)
394       </p>
395     </div>
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.
402       </p>
403       <ol>
404         <li>Une page Web utilise un formulaire pour permettre de
405         poster des commentaires sur un blog:
406           <code><![CDATA[
407    <form action="comment.php" method="post">
408      Commentaire: <br/>
409      ]]><em>&lt;textarea rows="20" cols="60"  name="zonetexte"/&gt;</em><![CDATA[
410     <br/>
411     <button type="submit">Envoyer</button>
412 </form>]]></code>
413           </li>
414         <li>Un bout de code PHP écrit le commentaire sur la page:
415           <code>    echo "Commentaire #$i: &lt;p&gt;";
416      <s>echo $_POST["zonetexte"];</s>
417      echo "&lt;/p&gt;";
418 </code>
419 </li>
420
421
422       </ol>
423     </div>
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>&lt;script type="text/javascript"&gt;</s>
431           ... //code javascript malicieux
432         <s>&lt;/script&gt;</s>
433         Fin du commentaire
434       </code>
435     </div>
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
442         cette chaîne:
443       </p>
444       <code>
445         echo eval ("1 + 2 * 3");  // affiche 7
446         echo eval ('$x = 4;');    // définit la variable $x
447         echo $x;                  // affiche 4
448       </code>
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
451         TP 9)</p>
452     </div>
453     <div class="sws-slide">
454       <h1>Solutions</h1>
455       <ul>
456         <li>Ne jamais <s>utiliser <tt>eval</tt></s></li>
457         <li>Utiliser la fonction <tt>htmlspecialchars</tt> qui
458         échappe les
459         caractères <tt>&lt;</tt>,  <tt>&gt;</tt>,  <tt>&amp;</tt>, <tt>&apos;</tt>,  <tt>&quot;</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>
463       </ul>
464     </div>
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
470         étudiant):
471       </p>
472       <code>
473         $Q = <em>"SELECT * FROM STUDENTS WHERE "</em>;
474         $Q = $Q . <em>"(NAME = '"</em> . $_POST["nom"] . <em>"');"</em>;
475         mysql_query($Q);
476         </code>
477       <p>Si l'utilisateur donne comme nom « Toto », la requête envoyée
478       à la base est: </p>
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>
482     </div>
483     <div class="sws-slide">
484       <h1>Jusqu'au jour où …</h1>
485       <p>©xkcd<br/>
486         <img style="width:90%" src="xkcd.png" alt=""/>
487       </p>
488       <code>          <em>SELECT * FROM STUDENTS WHERE (NAME ='</em><s>Robert');</s>
489           <s>DROP TABLE STUDENTS; --</s><em>');'</em>
490
491     </code>
492     </div>
493     <div class="sws-slide">
494       <h1>Ou bien…</h1>
495       <div style="text-align:center;">
496       <img style="width:70%" src="radar.jpg" />
497       </div>
498     </div>
499   </body>
500 </html>