mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 11:32:39 +02:00
218 lines
No EOL
15 KiB
HTML
218 lines
No EOL
15 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<title>
|
|
Avez vous confiance en <span class="caps">SSL</span>? - Alexis Métaireau </title>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<link rel="stylesheet"
|
|
href="https://blog.notmyidea.org/theme/css/main.css?v2"
|
|
type="text/css" />
|
|
<link href="https://blog.notmyidea.org/feeds/all.atom.xml"
|
|
type="application/atom+xml"
|
|
rel="alternate"
|
|
title="Alexis Métaireau ATOM Feed" />
|
|
</head>
|
|
<body>
|
|
<div id="content">
|
|
<section id="links">
|
|
<ul>
|
|
<li>
|
|
<a class="main" href="/">Alexis Métaireau</a>
|
|
</li>
|
|
<li>
|
|
<a class=""
|
|
href="https://blog.notmyidea.org/journal/index.html">Journal</a>
|
|
</li>
|
|
<li>
|
|
<a class="selected"
|
|
href="https://blog.notmyidea.org/code/">Code, etc.</a>
|
|
</li>
|
|
<li>
|
|
<a class=""
|
|
href="https://blog.notmyidea.org/weeknotes/">Notes hebdo</a>
|
|
</li>
|
|
<li>
|
|
<a class=""
|
|
href="https://blog.notmyidea.org/lectures/">Lectures</a>
|
|
</li>
|
|
<li>
|
|
<a class=""
|
|
href="https://blog.notmyidea.org/projets.html">Projets</a>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
<header>
|
|
<h1 class="post-title">Avez vous confiance en <span class="caps">SSL</span>?</h1>
|
|
<p>
|
|
<em>Tour d'horizon du fonctionnement de SSL et des solutions pour le sécuriser.</em>
|
|
</p>
|
|
<time datetime="2016-03-25T00:00:00+01:00">25 mars 2016</time>
|
|
</header>
|
|
<article>
|
|
<p>Dans le cadre <a href="http://autodefense-numerique.readthedocs.org/en/latest/">des ateliers d’autodéfense numérique</a>,
|
|
j’ai passé un peu de temps à creuser sur l’utilisation de <span class="caps">SSL</span> puisque
|
|
contrairement à ce que la plupart des personnes ont encore tendance à croire,
|
|
le petit cadenas (qui prouve qu’une connexion <span class="caps">SSL</span> est en cours) n’est
|
|
<strong>absolument</strong> pas suffisant.</p>
|
|
<p>Allez hop, c’est parti pour:</p>
|
|
<ul>
|
|
<li>un tour d’horizon du fonctionnement de SSl</li>
|
|
<li>quelques moyens contourner cette “protection” en faisant une attaque en pratique</li>
|
|
<li>un tour des solutions existantes actuellement et de pourquoi je ne les trouve
|
|
pas vraiment satisfaisantes.</li>
|
|
</ul>
|
|
<h2 id="comment-fonctionne-ssl">Comment fonctionne <span class="caps">SSL</span>?</h2>
|
|
<p>Pour expliquer les problèmes de <span class="caps">SSL</span>, j’ai d’abord besoin d’expliquer comment
|
|
tout ça fonctionne.</p>
|
|
<p><span class="caps">SSL</span> repose sur l’utilisation de certificats, qui sont générés par des autorités
|
|
de certification (<em>Certificate Authority</em> que je nomme <em><span class="caps">CA</span></em> dans la suite de l’article).</p>
|
|
<p>Les certificats <span class="caps">SSL</span> permettent deux choses:</p>
|
|
<ul>
|
|
<li>De garantir que les communications entre les navigateurs (vous) et les sites
|
|
Web ne sont connues que du détenteur du certificat du site et de vous même.</li>
|
|
<li>De garantir que le site sur lequel vous vous connectez est bien celui que
|
|
vous imaginez.</li>
|
|
</ul>
|
|
<p>Le navigateur, lors d’une visite d’un site, va télécharger le certificat
|
|
associé puis vérifier que le certificat en question a bien été généré par un
|
|
des <em><span class="caps">CA</span></em> en qui il a confiance.</p>
|
|
<p>Imaginons maintenant qu’une des <em><span class="caps">CA</span></em> essaye de savoir ce qui s’échange entre
|
|
mon navigateur et le site de ma banque (protégé par <span class="caps">SSL</span>). Comment cela se
|
|
passerait il ?</p>
|
|
<p>N’importe quel <em><span class="caps">CA</span></em> peut donc générer des certificats pour n’importe quel site,
|
|
et le navigateur vérifierait, lui, que le certificat a bien été généré par une
|
|
<em><span class="caps">CA</span></em>.</p>
|
|
<p>Tout cela ne poserait pas de soucis si les <em><span class="caps">CA</span></em> étaient gérés de manière fiable,
|
|
mais il s’agit d’un travail compliqué, et certains <em><span class="caps">CA</span></em> ont par le passé montré
|
|
des faiblesses.</p>
|
|
<p>Par exemple, <a href="https://en.wikipedia.org/wiki/DigiNotar">DigiNotar</a> (un <em><span class="caps">CA</span></em> des Pays-Bas)
|
|
a été compromise et les attaquant.e.s ont pu générer des certificats <span class="caps">SSL</span>
|
|
frauduleux, ce qui leur a permis d’attaquer des sites tels que Facebook ou GMail.</p>
|
|
<p>Vous pouvez retrouver une liste des risques et menaces autour des <em><span class="caps">CA</span></em> <a href="http://wiki.cacert.org/Risk/History">sur le
|
|
wiki de CACert</a>.</p>
|
|
<h2 id="attaque-de-lhomme-du-milieu-avec-ssl">Attaque de l’homme du milieu avec <span class="caps">SSL</span></h2>
|
|
<p>A force de dire que c’était très facile à faire, j’ai eu envie d’essayer
|
|
d’espionner des connections protégées par <span class="caps">SSL</span>, et effectivement c’est
|
|
carrément flippant tellement c’est simple.</p>
|
|
<p>En l’espace de quelques minutes, il est possible de faire une <em>attaque de
|
|
l’homme du milieu</em> en utilisant par exemple un outil nommé <a href="http://docs.mitmproxy.org/en/stable">mitm-proxy</a>.</p>
|
|
<p>Pour déchiffrer l’ensemble du trafic <span class="caps">SSL</span>, j’ai simplement eu à lancer quelques
|
|
commandes et avoir un <em><span class="caps">CA</span></em> dans lequel le navigateur de la victime a confiance.
|
|
Je l’ai ajouté dans le navigateur cible pour simuler que je l’avais déjà
|
|
(c’est le cas si un des 1200 <span class="caps">CA</span> se fait pirater, ce qui me semble une surface
|
|
d’attaque assez large).</p>
|
|
<p>Je les colle ici si ça vous intéresse:</p>
|
|
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>aptitude<span class="w"> </span>install<span class="w"> </span>mitmproxy
|
|
$<span class="w"> </span>mitm-proxy<span class="w"> </span>-T<span class="w"> </span>--host
|
|
</code></pre></div>
|
|
|
|
<p>Il faut faire croire à votre victime que vous êtes la passerelle vers
|
|
l’extérieur et à la passerelle que vous êtes la victime:</p>
|
|
<div class="highlight"><pre><span></span><code>arpspoof<span class="w"> </span>-i<span class="w"> </span>wlan0<span class="w"> </span>-t<span class="w"> </span>victime<span class="w"> </span>gateway
|
|
arpspoof<span class="w"> </span>-i<span class="w"> </span>wlan0<span class="w"> </span>-t<span class="w"> </span>gateway<span class="w"> </span>victime
|
|
</code></pre></div>
|
|
|
|
<p>Puis dire à notre fausse passerelle de rediriger le trafic des ports 80 et 443
|
|
vers notre proxy:</p>
|
|
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>sysctl<span class="w"> </span>-w<span class="w"> </span>net.ipv4.ip_forward<span class="o">=</span><span class="m">1</span>
|
|
sudo<span class="w"> </span>iptables<span class="w"> </span>-t<span class="w"> </span>nat<span class="w"> </span>-A<span class="w"> </span>PREROUTING<span class="w"> </span>-i<span class="w"> </span>wlan0<span class="w"> </span>-p<span class="w"> </span>tcp<span class="w"> </span>--dport<span class="w"> </span><span class="m">443</span><span class="w"> </span>-j<span class="w"> </span>REDIRECT<span class="w"> </span>--to-port<span class="w"> </span><span class="m">4443</span>
|
|
sudo<span class="w"> </span>iptables<span class="w"> </span>-t<span class="w"> </span>nat<span class="w"> </span>-A<span class="w"> </span>PREROUTING<span class="w"> </span>-i<span class="w"> </span>wlan0<span class="w"> </span>-p<span class="w"> </span>tcp<span class="w"> </span>--dport<span class="w"> </span><span class="m">80</span><span class="w"> </span>-j<span class="w"> </span>REDIRECT<span class="w"> </span>--to-port<span class="w"> </span><span class="m">4443</span>
|
|
</code></pre></div>
|
|
|
|
<p>Et paf, <strong>on voit tout ce qui passe entre la machine et le serveur <span class="caps">SSL</span></strong>. On peut
|
|
d’ailleurs même imaginer faire tourner ces quelques commandes sur un
|
|
raspberry pi, pour aller encore plus vite…</p>
|
|
<h3 id="key-pinning-dans-les-navigateurs">Key-pinning dans les navigateurs</h3>
|
|
<p>Actuellement, n’importe quel <em><span class="caps">CA</span></em> peut générer des certificats pour
|
|
n’importe quel site, et c’est en grande partie ce qui pose souci. Une des
|
|
manières de faire évoluer la situation est d’épingler les certificats de
|
|
certains sites directement dans les navigateurs.</p>
|
|
<p>Cette approche a le mérite de fonctionner très bien <a href="https://dxr.mozilla.org/mozilla-central/source/security/manager/ssl/StaticHPKPins.h?from=StaticHPKPins.h">pour un petit nombre de
|
|
sites critiques (Google, Facebook, etc)</a>.</p>
|
|
<h3 id="http-public-key-pinning-hpkp"><span class="caps">HTTP</span> Public Key Pinning (<span class="caps">HPKP</span>)</h3>
|
|
<p><a href="https://developer.mozilla.org/en/docs/Web/Security/Public_Key_Pinning"><em><span class="caps">HTTP</span> Public Key Pinning</em></a>
|
|
est également une solution de <em>pinning</em> qui permet d’établir une confiance lors
|
|
de la première connexion avec le site. C’est ce qu’on appelle du <em>Trust on First
|
|
Use</em> ou <em><span class="caps">TOFU</span></em>.</p>
|
|
<p>Le navigateur va alors mettre ces informations dans un cache et vérifiera que
|
|
les certificats correspondent bien lors des prochaines visites.</p>
|
|
<p><em><span class="caps">HPKP</span></em> est disponible dans Firefox depuis Janvier 2015 et dans Chrome
|
|
depuis Octobre 2015.</p>
|
|
<h3 id="certificate-transparency-des-journaux-auditables">Certificate transparency: des journaux auditables</h3>
|
|
<p>Une autre approche est celle proposée par <em>certificate transparency</em>:</p>
|
|
<blockquote>
|
|
<p>Certificate Transparency aims to remedy these certificate-based threats by
|
|
making the issuance and existence of <span class="caps">SSL</span> certificates open to scrutiny by
|
|
domain owners, CAs, and domain users.</p>
|
|
<p>— <a href="https://www.certificate-transparency.org/what-is-ct">Certificate Transparency</a></p>
|
|
</blockquote>
|
|
<p>Autrement dit, avec ce système les <em><span class="caps">CA</span></em> doivent rendre public le fait qu’ils
|
|
aient signé de nouveaux certificats intermédiaires. La signature est ajoutée à
|
|
un journal sur lequel il n’est possible que d’écrire.</p>
|
|
<p>Les navigateurs vont alors vérifier que les certificats utilisés sont bien des
|
|
certificats qui ont été ajoutés au journal.</p>
|
|
<p>Ici, toute l’intelligence est dans la vérification de ces journaux, qui
|
|
permettent donc de valider/invalider des certificats racines ou intermédiaires.</p>
|
|
<p>Il me semble donc qu’il serait possible d’ajouter un certificat frauduleux le
|
|
temps d’une attaque (et celui ci serait détecté et supprimé ensuite).</p>
|
|
<p><em>Certificate-Transparency</em> n’est donc pas une solution contre une écoute
|
|
globale mise en place par les gouvernements par exemple.</p>
|
|
<p>Si vous lisez bien l’anglais, je vous invite à aller lire
|
|
<a href="http://security.stackexchange.com/a/52838">cette description du problème et de la solution</a>
|
|
que je trouve très bien écrite.</p>
|
|
<h3 id="dane-dnssec"><span class="caps">DANE</span> + <span class="caps">DNSSEC</span></h3>
|
|
<blockquote>
|
|
<p>The <span class="caps">DANE</span> working group has developed a framework for securely
|
|
retrieving keying information from the <span class="caps">DNS</span> [<span class="caps">RFC6698</span>]. This
|
|
framework allows secure storing and looking up server public key
|
|
information in the <span class="caps">DNS</span>. This provides a binding between a domain
|
|
name providing a particular service and the key that can be used
|
|
to establish encrypted connection to that service.</p>
|
|
<p>— <a href="https://datatracker.ietf.org/wg/dane/charter/">Dane <span class="caps">WG</span></a></p>
|
|
</blockquote>
|
|
<p>Une autre solution est appelée “<span class="caps">DANE</span>” et repose par dessus le protocole
|
|
<em><span class="caps">DNSSEC</span></em>.</p>
|
|
<p>Je connais assez mal <em><span class="caps">DNSSEC</span></em> donc j’ai passé un peu de temps à lire des
|
|
documents. L’impression finale que ça me laisse est que le problème est
|
|
exactement le même que pour <span class="caps">SSL</span>: un certain nombre de personnes détiennent les
|
|
clés et toute la sécurité repose sur cette confiance. Or il est possible que
|
|
ces clés soient détenues par des personnes non dignes de confiance.</p>
|
|
<blockquote>
|
|
<p>Secure <span class="caps">DNS</span> (<span class="caps">DNSSEC</span>) uses cryptographic digital signatures signed with a
|
|
trusted public key certificate to determine the authenticity of data.
|
|
— https://en.wikipedia.org/wiki/DNS_spoofing</p>
|
|
</blockquote>
|
|
<p>Et aussi:</p>
|
|
<blockquote>
|
|
<p>It is widely believed[1] that securing the <span class="caps">DNS</span> is critically important for
|
|
securing the Internet as a whole, but deployment of <span class="caps">DNSSEC</span> specifically has
|
|
been hampered (As of 22 January 2010) by several difficulties:</p>
|
|
<ul>
|
|
<li>The need to design a backward-compatible standard that can scale to the
|
|
size of the Internet</li>
|
|
<li>Prevention of “zone enumeration” (see below) where desired</li>
|
|
<li>Deployment of <span class="caps">DNSSEC</span> implementations across a wide variety of <span class="caps">DNS</span> servers
|
|
and resolvers (clients)</li>
|
|
<li>Disagreement among implementers over who should own the top-level domain
|
|
root keys Overcoming the perceived complexity of <span class="caps">DNSSEC</span> and <span class="caps">DNSSEC</span> deployment</li>
|
|
</ul>
|
|
</blockquote>
|
|
<h2 id="solutions-basees-sur-la-blockchain">Solutions basées sur la blockchain</h2>
|
|
<p>Une dernière piste semble être l’utilisation de la <em>blockchain</em> pour distribuer
|
|
des clés par site.</p>
|
|
<p>La solution <em>DNSChain</em> me paraissait tout d’abord un bon point de départ mais
|
|
la lecture de <a href="https://www.indolering.com/okturtles-dnschain-unblock-us">quelques critiques</a>
|
|
et interventions du développeur du projet m’ont fait changer d’avis.</p>
|
|
<p>Reste encore la piste de <em>Namecoin Control</em> que je n’ai pas encore creusée.
|
|
Peut-être pour un prochain billet. Toute piste de réflexion est bien sur la
|
|
bienvenue sur ces sujets!</p>
|
|
</article>
|
|
<footer>
|
|
<a id="feed" href="/feeds/all.atom.xml">
|
|
<img alt="RSS Logo" src="/theme/rss.svg" />
|
|
</a>
|
|
</footer>
|
|
</div>
|
|
</body>
|
|
</html> |