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="unix_prog_web_08.xhtml" class="sws-previous"/>
40 <div class="sws-slide sws-cover sws-option-nofooter">
41 <h1>Unix et Programmation Web</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 ?
174 <div class="sws-slide">
175 <h1>Une analogie</h1>
176 <p>La cryptographie assymétrique fonctionne exactement comme
177 l'analogie de la boîte aux
180 <ul class="sws-pause">
181 <li>La clé publique est la boîte aux lettres</li>
182 <li>La clé privée est la clé de la boîte aux lettres</li>
183 <li>Tout le monde peut «crypter» un message en le glissant
184 dans ma boîte aux lettres</li>
185 <li>Une fois le message crypté (<i>i.e.</i> dans la boîte) il
186 est difficile de le récupérer sans avoir la clé</li>
187 <li>Il est facile pour moi d'ouvrir la boîte avec ma clé</li>
191 <div class="sws-slide">
192 <h1>HTTP: protocole texte « en clair »</h1>
193 <p>HTTP est un protocole <em>texte</em>, les données ne sont
194 pas chiffrées (cf. TP3) et <em>sans identification</em></p>
196 <li><em>Confidentialité</em> : n'importe qui (avec les
197 privilèges nécessaires) peut lire ce qui transite entre un client
198 et un serveur Web</li>
199 <li><em>Authenticité</em> : n'importe qui peut se faire passer
200 pour un serveur Web (attaque <i>man in the middle</i>)
204 <div class="sws-slide">
205 <h1>Espionnage de connexion</h1>
206 <p>Alice représente le client, Bob le serveur et Eve (<i>Eavesdropper</i>)
208 <p>On suppose que <s>Eve</s> est <s>root</s> sur la
209 machine. Il suffit de lire les paquets qui transitent par la
210 carte réseau (<tt>tcpdump</tt> sous Linux).
212 <ul><li>Eve et Alice sont sur la même machine (démo):
213 <div style="text-align:center;vertical-align:middle;"><br/>
214 <span style="border:1pt solid gray;border-radius:
215 5pt;padding:5pt;font-size:larger;">A
216 <s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
217 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
218 5pt;padding:5pt;font-size:larger;">B</span>
222 <li>Fonctionne aussi si Eve est sur une machine se trouvant
223 sur la route entre Alice et Bob:
224 <div style="text-align:center;vertical-align:middle;"><br/>
225 <span style="border:1pt solid gray;border-radius:
226 5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
227 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
228 5pt;padding:5pt;font-size:larger;"><s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
229 0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
230 5pt;padding:5pt;font-size:larger;">B</span>
235 <p>Ce problème touche tous les protocoles en clair: HTTP, POP,
236 IMAP, FTP, …. Il peut être résolu grace au <em>chiffrement</em>
237 de toute la connexion.</p>
239 <div class="sws-slide">
240 <h1>Attaque <i>Man in the middle</i></h1>
241 <p><s>Mallory</s> se place entre Alice (cliente) et Bob (banque), par exemple au
242 moyen d'un <em>e-mail</em> frauduleux en HTML:</p>
243 <ol> <li> L'émail contient:
244 <code><![CDATA[ <html>
247 veuillez vous connecter à votre banque en cliquant ici:
248 <a href=']]><s>mallory.com</s>' ><em>www.bob.com</em><![CDATA[</a>
252 <li>Alice, insouciante, clique sur le lien
253 <div style="text-align:center;vertical-align:middle;"><br/>
254 <span style="border:1pt solid gray;border-radius:
255 5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
256 0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
257 5pt;padding:5pt;font-size:larger;"><s>M</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
258 0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
259 5pt;padding:5pt;font-size:larger;">B</span>
262 <li>Mallory peut retransmettre les requêtes entre Bob et
263 Alice, en les modifiant au passage. Le problème est causé
264 par un manque d'authentification (Mallory n'a pas a
265 <em>prouver</em> à Alice qu'il est Bob)
269 <div class="sws-slide">
270 <h1>Solution: HTTPS</h1>
271 <p>HTTP <em>Secure</em></p>
272 <ol> <li>Respose sur de la cryptographie assymétrique (pour
273 l'authentification et le partage de clé) et symétrique (pour le
274 chiffrement de connexion)</li>
275 <li>Permet d'authentifier les correspondants et de protéger
278 <li>Suppose l'existence de <em>tiers de confiance</em> Alice
279 et Bob font confiance à Trent (<i>Trusted Third
282 <p>Bob possède des clés publiques et privées
283 (<i>K<sup>B</sup><sub>pub</sub></i>
284 et <i>K<sup>B</sup><sub>priv</sub></i>), Trent possède des clés
285 publiques et privées (<i>K<sup>T</sup><sub>pub</sub></i>
286 et <i>K<sup>T</sup><sub>priv</sub></i>)
289 <div class="sws-slide">
290 <h1>HTTPS (détail du protocole)</h1>
291 <p>Bob et Trent <em>se rencontrent</em>. Trent <em>signe</em>
292 la clé publique de Bob en calculant
293 <div style="text-align:center">
294 <i>S<sup>B</sup></i>=<i>K<sup>T</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>)
296 Comme Trent utilise sa clé <em>privée</em> on sait que seul
297 Trent a pu générer cette signature. De plus, Trent
298 a <em>rencontré</em> Bob donc il <em>certifie</em> que la
299 clé <i>K<sup>B</sup><sub>pub</sub></i> appartient bien à
303 <li>Alice (client) veut se connecter à Bob. Bob fournit sa
304 clé publique <i>K<sup>B</sup><sub>pub</sub></i> et la
305 signature <i>S<sup>B</sup></i></li>
306 <li> Alice contacte Trent (en qui elle a confiance) et récupère sa clé
307 publique <i>K<sup>T</sup><sub>pub</sub></i>. Elle déchiffre la
308 signature: <i>K<sup>T</sup><sub>pub</sub></i>(<i>S<sup>B</sup></i>)
309 et vérifie qu'elle retombe bien sur la clé publique de Bob.
311 <li>Elle peut alors choisir une clé symétrique, la chiffrer
312 avec <i>K<sup>B</sup><sub>pub</sub></i> et entammer une
313 communication <em>chiffrée</em> et <em>authentifiée</em> avec
317 <div class="sws-slide">
318 <h1>Tiers de confiance</h1>
319 <p>Les tiers de confiance sont des entités (états, associations,
320 compagnies privées) qui se chargent de vérifier les clés
321 publiques d'autres entitées. C'est une
322 vérification <em>physique</em> (documents administratifs, …).
324 <div style="text-align:center"><img style="width:70%" src="ssl-cert.png" alt="ssl"/>
326 <p style="background:white">Cette erreur s'affiche quand une signature n'est pas conforme
327 ou n'a pas pu être vérifiée</p>
330 <div class="sws-slide">
331 <h1>Tiers de confiance</h1>
332 <p>Attaques contre les <em>authorités de certifications</em>
333 (tiers de confiance): difficiles, mais pas impossible. Certains
334 tiers de confiance sont douteux (états voyous, compagnie
335 piratées dont les clées <s>privées</s> sont compromises,…)<br/>
336 <s>Attaques d'implémentation</s> (plus probables) : on
337 exploite un <s>bug</s> dans le code des serveurs web ou des
339 <s>Autres faiblesses</s>: HTTPS est en « haut » dans la pile
340 IP (application). On peut donc avoir connaissance du nombre de
341 paquet échangés, des adresses IP des participants, la taille
342 et la fréquence des paquets… (même si on n'en connait pas le
343 contenu). Cela permet certaines attaques statistiques ou de deni
347 <div class="sws-slide">
348 <h1>Bug dans HTTPS: <i>Heartblead</i></h1>
349 <p><i>Heartblead</i> est un bug découvert en 2014 dans la
350 bibliothèque OpenSSL (Bibliothèque qui implémente toutes les
351 primitives cryptographiques de bas niveau nécessaire à HTTPS,
352 entre-autres, et utilisée par tout le monde). Cette attaque
353 touche la partie <i>heartbeat</i> du
354 protocole. Le <i>heartbeat</i> est un message périodique
355 envoyé par le client au serveur pour lui demander si la
356 connexion/session est toujours active (ou pour lui signaler de
360 <li class="sws-pause">Serveur, es-tu vivant ? si oui répond 'Bonjour' (6
362 <li class="sws-pause">Bonjour</li>
363 <li class="sws-pause">Serveur, es-tu vivant ? si oui répond
364 'Je suis là' (10 lettres)</li>
365 <li class="sws-pause">Je suis là</li>
366 <li class="sws-pause">Serveur, es-tu vivant ? si oui répond
367 'Oui' (1024 lettres)</li>
368 <li class="sws-pause">Oui<span class="sws-pause"
369 style="color:gray;"><tt>....Serveur, je suis l'admin, modifie le
370 mot de passe à '1023hasd834!' ... Tiens, autre client, je
371 t'envoie la page que tu m'as demandée ... <html><body ....</tt></span></li>
374 <h1>Confidentialité, traîtement des <i>cookies</i></h1>
375 <div class="sws-slide">
376 <h1>Traçage par cookies</h1>
377 <p><i>Normalement</i>, un <em>cookie</em> ne peut être
378 lu <em>que</em> que par le site émetteur (cf. cours 8). But:</p>
379 <ol class="sws-pause">
380 <li>Empêcher un tiers de lire des données personnelles
382 <li>Empêcher un tiers de savoir quels sites ont été visités
383 (<em>pas ok</em>)</li>
386 <li class="sws-pause">Un site B utilise des publicités pour se rémunérer. Le
387 site marchand <s>M</s> fournit du code HTML:
388 <code> <script src="http://marchand.com/pub.js"/> </code>
390 <li class="sws-pause">A visite le site B. Le
391 code <tt>pub.js</tt> peut alors faire les choses suivantes:
393 <li>Scanner le contenu de la page de B. Possible car le
394 script est « inclus » dans une page fournie par B</li>
396 à<s><tt>http://marchand.com/collecte.php</tt></s> et
397 passer en paramètre <tt>post</tt> ou <tt>get</tt> le
398 contenu de la récolte</li>
399 <li><tt>http://marchand.com</tt> peut alors stocker un
400 cookie valide <em>pour son domaine</em> avec le contenu de
401 la récolte d'information
405 <li class="sws-pause">
406 Lorsque A visite le site marchand <s>M</s>, ce dernier
407 relit son cookie et fait des propositions ciblées.
412 <div class="sws-slide">
415 <li>Désactiver les cookies de « tierce partie » (cookie dont
416 l'origine n'est pas celle de la page visitée)
418 <li> Effacer par défaut tous les cookies quand on quite le
420 <li>Rajouter des exceptions pour certains sites au cas par cas
423 <p>Nouveau standard du W3C en préparation pour signifier à un
424 site qu'on ne souhaite pas être suivi (méthode « volontariste
425 » qui suppose que les sites commerciaux sont gentils et
426 respectent le protocole)</p>
428 <div class="sws-slide">
429 <h1>Sécurité des cookies de session</h1>
430 <p>On a vu que les sessions PHP (vrai aussi pour les autres
431 langages côté serveur) stockent dans un cookie un identifiant
432 unique. Que se passe-t-il si on vole ce cookie ? (démo)
434 <p class="sws-pause">Pas d'autre solution que de faire confiance
435 au <s>root</s> (solutions partielles basées sur le chiffrement
439 <h1>Attaques par injection de code</h1>
440 <div class="sws-slide">
441 <h1>Injection de code Javascript/HTML</h1>
442 <p>Vulnérabilité: on exploite le fait qu'un site <s>utilise
443 directement</s> les entrées fournies par l'utilisateur.<br/>
444 Exemple: commentaires sur un blog.
447 <li>Une page Web utilise un formulaire pour permettre de
448 poster des commentaires sur un blog:
450 <form action="comment.php" method="post">
452 ]]><em><textarea rows="20" cols="60" name="zonetexte"/></em><![CDATA[
454 <button type="submit">Envoyer</button>
457 <li>Un bout de code PHP écrit le commentaire sur la page:
458 <code> echo "Commentaire #$i: <p>";
459 <s>echo $_POST["zonetexte"];</s>
467 <div class="sws-slide">
468 <h1>Injection de code Javascript/HTML</h1>
469 <s>Problème</s> tout ce qui est dans la zone de texte est copié
470 dans la page HTML de chaque client qui consulte la page
471 et <s>interprété</s> par son navigateur:
472 <code>Debut du commentaire
473 <s><script type="text/javascript"></s>
474 ... //code javascript malicieux
475 <s></script></s>
479 <div class="sws-slide">
480 <h1>Injection de code PHP</h1>
481 <p><s>Problème</s> lié à l'utilisation de la fonction
482 <code> <s>eval</s>($code)</code>
483 <tt><em>$code</em></tt> est une chaîne de caractères
484 considérée comme étant du code PHP et <tt>eval</tt> exécute
488 echo eval ("1 + 2 * 3"); // affiche 7
489 echo eval ('$x = 4;'); // définit la variable $x
490 echo $x; // affiche 4
492 <p>Il ne faut <s>jamais donner une chaine de caractère de
493 l'utilisateur comme argument à <tt>eval</tt></s> (sauf durant le
496 <div class="sws-slide">
499 <li>Ne jamais <s>utiliser <tt>eval</tt></s></li>
500 <li>Utiliser la fonction <tt>htmlspecialchars</tt> qui
502 caractères <tt><</tt>, <tt>></tt>, <tt>&</tt>, <tt>'</tt>, <tt>"</tt></li>
503 <li>Utiliser la fonction <tt>striptags</tt> qui supprime tout
504 ce qui est une balise</li>
505 <li>Toujours valider les entrées d'un utilisateur</li>
508 <div class="sws-slide">
509 <h1>Injection de code SHELL (en PHP)</h1>
510 <p><s>Problème</s> lié à l'utilisation de la fonction
511 <code> <s>exec</s>($command, &$output)</code>
512 Cette fonction exécute dans un SHELL la
513 commande <tt>$command</tt>. Les lignes de la sortie standard
514 de la commande sont placées dans le table <tt>$output</tt>
515 passé en référence. (Démo avec <tt>unzip -l</tt>).<br/>
519 <li>Ne jamais passer à exec directement une chaîne crée par
521 <li>Recréer sois-même la chaîne de caractères, échapper les
522 caractères spéciaux et remettre le tout dans une chaîne pour
523 éviter les expansions du SHELL</li>
524 <li>Utiliser des fonctions de la bibliothèque standar quand
525 elle existes (par exemple <tt>rename</tt> plutot
526 que <tt>exec('mv ...')</tt>).</li>
529 <div class="sws-slide">
530 <h1>Injection de code SQL</h1>
531 <p>SQL: language de requête permettant d'interroger des bases de
532 données. Utilisation classique depuis PHP (on suppose un
533 formulaire qui met dans le champ <tt>"nom"</tt> le nom d'un
537 $Q = <em>"SELECT * FROM STUDENTS WHERE "</em>;
538 $Q = $Q . <em>"(NAME = '"</em> . $_POST["nom"] . <em>"');"</em>;
541 <p>Si l'utilisateur donne comme nom « Toto », la requête envoyée
543 <code> SELECT * FROM STUDENTS WHERE (NAME = 'Toto');</code>
544 <p>Affiche toutes les lignes de la table <tt>STUDENTS</tt> pour
545 lesquel le nom est <tt>Toto</tt></p>
547 <div class="sws-slide">
548 <h1>Jusqu'au jour où …</h1>
550 <img style="width:90%" src="xkcd.png" alt=""/>
552 <code> <em>SELECT * FROM STUDENTS WHERE (NAME ='</em><s>Robert');</s>
553 <s>DROP TABLE STUDENTS; --</s><em>');'</em>
557 <div class="sws-slide">
559 <div style="text-align:center;">
560 <img style="width:70%" src="radar.jpg" />