\documentclass{beamer}
%\documentclass[ignorenonframetext,handout]{beamer}
%\usepackage{pgfpages}
%\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]

\usetheme{JuanLesPins}
\usepackage[french]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{bortzmeyer-utils}

% https://cfp.capitoledulibre.org/cdl-2022/talk/P79YC7/
\title{Déboguer les applications réseau lorsque tout est chiffré (\insertframenumber/\inserttotalframenumber)}
\author{Stéphane Bortzmeyer\\\texttt{stephane+cdl@bortzmeyer.org}}
\date{Capitole du Libre, 19 novembre 2022}
\setlength{\parskip}{15pt plus 10pt minus 10pt} 
\newcommand{\of}{.6}

\begin{document}

\maketitle

\begin{frame}
  \frametitle{Avant}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Rien n'était chiffré,
     \item<3->Les bisounours et les licornes gambadaient ensemble dans
       des lacs de confiture de groseille,
     \item<4->On faisait confiance au réseau,
     \item<5->Et on déboguait avec tcpdump / Wireshark,
     \item<6->Remarquables outils pour apprendre le réseau, d'ailleurs.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Depuis}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Edward nous a prévenu que des méchants espionnaient,
     \item<3->Même les jenairiencacher ont compris,
     \item<4->On chiffre tout, et à juste titre,
     \item<5->Les derniers bastions du non-chiffrement cèdent :
       \begin{itemize}
       \item DNS avec DoT, DoH et DoQ,
       \item La couche transport, avec QUIC.
       \end{itemize}
     \item<6->Tout ce qui n'est pas chiffré pourra être utilisé contre
       vous\only<6>{ (RFC 8546 sur la \foreign{wire image})}.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Alors, comment on fait ?}
   \begin{overlayarea}{\textwidth}{\of\textheight}
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{On peut lutter contre le chiffrement}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Les gens qui réclament de la « visibilité »,\only<1>{,
       pour les \foreign{enterprise networks},}
     \item<3->Les affaiblissements délibérés\only<3>{ (comme le ETLS
       de l'ETSI)},
     \item<4->La diabolisation de DoH,
     \item<5->« Nous sommes pour le chiffrement, mais »\only<5>{ (discours de
       l'Internet Watch Foundation)},
     \item<6->Combat d'arrière-garde ?
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{On peut demander à l'application de donner ses clés}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Rappel de cryptographie « hybride » : la cryptographie
       asymétrique ne sert qu'à l'échange de clés, on fait de la
       cryptographie symétrique après, avec cette clé de session,
     \item<3->L'application peut exporter cette clé, un logiciel
       d'analyse du trafic peut ensuite l'utiliser pour déchiffrer,
     \item<4->\path{SSL_CTX_set_keylog_callback} avec OpenSSL, % https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_keylog_callback.html
     \item<5->Wireshark sait relire ces clés\only<5>{
       (\computer{tls.keylog\_file: /tmp/mykeys} dans la
       configuration)},% https://wiki.wireshark.org/TLS#using-the-pre-master-secret
     \item<6->Attention, c'est à l'application de faire ce qu'il faut,
       la bibliothèque TLS ne le fait pas (curl le fait mais pas
       openssl),
     \item<7->Moyen le plus courant de le demander : la variable
       d'environnement \computer{SSLKEYLOGFILE}.  
    \end{itemize} 
  \end{overlayarea}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Exemple de code Python}
% Dans Agunua/___init__.py: Le commit est https://framagit.org/bortzmeyer/agunua/-/commit/ea89f64d0aca20c3f9e252034a578a1e0a9c6b69
  \begin{info}
def write_keys(conn, keys):
    keylogfile.write(keys.decode() + "\n")

if os.environ["SSLKEYLOGFILE"]:
    keylogfile = open(os.environ["SSLKEYLOGFILE"], "a")
    context.set_keylog_callback(write_keys)
  \end{info}
\end{frame}

\begin{frame}
  \frametitle{Dans Wireshark}
   \includegraphics[scale=0.28]{wireshark-gemini.png}
\end{frame}

% cat /tmp/mykeys 
%SERVER_HANDSHAKE_TRAFFIC_SECRET e78bf5f82a26939a8eddebc832f0634c21f2b1816191a944b1a7951556520dd0 c2433b9eded0b637bfd87a0529d2fe942285a99fc9e8051855f59c79a737d0061f3cf6c901cba98784da70dc74ba8de0
%EXPORTER_SECRET e78bf5f82a26939a8eddebc832f0634c21f2b1816191a944b1a7951556520dd0 97ca75d2bd15087a749ecd003a991ad72d32ed86ceda4496b287ef5805ad07a517aa2536e68f4b6f4ef9816887f4ffb0
%SERVER_TRAFFIC_SECRET_0 e78bf5f82a26939a8eddebc832f0634c21f2b1816191a944b1a7951556520dd0 bdb59863749b63414ab3c454d673fc81a63b529013baa1f5397be8bc647189f5cbdeeb22e9e6d256cdc6cdae0f9c3283
%CLIENT_HANDSHAKE_TRAFFIC_SECRET e78bf5f82a26939a8eddebc832f0634c21f2b1816191a944b1a7951556520dd0 6cd2ab9621d3b854588b6c99c3f707f495fd2bf95d5490e3c1800c6fa9d1b80ac885b89d21b645a403124b82943591ab
%CLIENT_TRAFFIC_SECRET_0 e78bf5f82a26939a8eddebc832f0634c21f2b1816191a944b1a7951556520dd0 e6b91678b1231742565d7b8cf38c839e532c91bd5c1ff8bebe23636333eb315e7df78729ab3e1681f1c4cdf9652875a3

\begin{frame}
  \frametitle{On peut demander à l'application de dire ce qu'elle fait}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->L'application peut aussi aider, en étant bavarde,
     \item<3->\computer{curl -{}-verbose} est un modèle, \computer{curl
       -{}-trace}\only<3>{ (ou \computer{-{}-trace-ascii})} est encore
       plus détaillé,
     \item<4->Firefox et ses \foreign{Web Developer Tools} aussi.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

% Fait avec Programmation/Python/Quart
\begin{frame}
  \frametitle{Firefox nous aide}
  \includegraphics[scale=0.42]{firefox-developer.png}
\end{frame}

\begin{frame}
  \frametitle{Encore mieux si c'est normalisé}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Les solutions précédentes sont pour examen par un
       humain, et sont spécifiques à une application,
     \item<3->Il y a un format normalisé pour exporter dans un fichier
       le dialogue, qlog\only<3>{ (créé à l'origine pour QUIC)}.
       % draft-ietf-quic-qlog-main-schema
       % draft-ietf-quic-qlog-quic-events
       % draft-ietf-quic-qlog-h3-events
       % https://irtf.org/anrw/2020/anrw2020-final3.pdf Un
       % anonymiseur :
       % https://huitema.wordpress.com/2020/07/21/scrubbing-quic-logs-for-privacy/
       % Plein de qlogs en https://quant.eggert.org/ Exemple d'un
       % script de traitement :
       % https://github.com/private-octopus/qlogstats/
       % Autre outil de traitement : qvis https://daniel.haxx.se/blog/2022/11/02/http-workshop-2022-day-1/
     \item<4->qlog est un format abstrait, qui peut se retrouver
       instancié en, par exemple, JSON.
     \item<5->qlog est générique et peut s'appliquer à plusieurs protocoles.  
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Et avec une brosse à dents connectée ?}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Comment savoir ce que votre brosse à dents raconte à son
       maitre ?
     \item<3->(Ça a été utilisé comme argument anti-DoH.)
     \item<4->Le fond du problème est plutôt le logiciel privateur.  
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{En résumé}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Wireshark reste super, mais il faut aussi enseigner /
       pratiquer le déboguage par la coopération de l'application,
     \item<3->Toute application réseau devrait fournir des outils de
       déboguage du trafic,
     \item<4->Il faut évidemment exiger du logiciel libre,
     \item<5->Car sinon, on ne peut pas avoir confiance, même si le
       logiciel privateur produit une trace.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\end{document}

