Update the report.
[crypto_lab1.git] / rapport / main.tex
1 \documentclass[a4paper,10pt]{article}
2
3 \usepackage[francais]{babel}
4 \usepackage[utf8]{inputenc}
5 \usepackage[T1]{fontenc}
6 \usepackage{lmodern}
7
8 \usepackage{graphicx}
9 \usepackage{listings}
10 \usepackage{url}
11
12 \title{ICR - Labo \#1 : \textit{MAC-and-Encrypt and Padding Oracles}}
13 \author{G.Burri}
14
15 \begin{document}
16
17 \lstset{language=C}
18 \nocite{*}
19
20 \maketitle
21
22
23 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24 \section{Introduction}
25
26 Le but de ce laboratoire est d'expérimenter le chiffrement symétrique \emph{AES} ainsi que l'authentification par \emph{MAC}, de mettre en évidence des problèmes de sécurité liés à un protocole choisi propre et de montrer des solutions afin de corriger ces problèmes.
27
28 Nous utiliseront \emph{AES-256} en mode \emph{CBC} pour chiffrer les données ainsi que \emph{HMAC-SHA256} pour l'authentification.
29
30
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 \section{Simulation du protocole}
33
34 \subsection{Utilisation du code}
35
36 \subsection{Structure du code}
37
38 \subsection{Quelle est la stratégie recommandée en pratique parmi les trois listées ci après ?}
39
40 \begin{itemize}
41 \item \emph{MAC-and-Encrypt} : $Enc(M)|MAC(M)$ ;
42 \item \emph{MAC-then-Encrypt} : $Enc(M|MAC(M))$ ;
43 \item \emph{Encrypt-then-MAC} : $Enc(M)|MAC(Enc(M))$.
44 \end{itemize}
45
46 \subsubsection{Quelle stratégie est utilisée par \emph{TLS} ?}
47
48 \emph{TSL} utilise la deuxième version (\emph{MAC-then-Encrypt}). À noté que le \emph{MAC} est optionnel.
49
50 Une proposition \footnote{https://tools.ietf.org/html/draft-ietf-tls-encrypt-then-mac-02} existe afin d'utiliser du \textit{Encrypt-then-MAC} pour \emph{TSL}.
51
52
53 \subsubsection{Quelle stratégie est utilisée par \emph{SSH} ?}
54
55 \emph{SSH} utilise la même méthode utilisée dans ce laboratoire, c'est à dire la première : \emph{MAC-and-Encrypt}.
56
57 \subsection{Quel est le rôle du timestamp en terme de sécurité ?}
58
59 Permet de minimiser certaines attaques comme l'attaque par rejeu (\emph{replay attack})\cite{wiki-replay-attack} où un attaquant réutilise tel-quel tout ou une partie d'un message intercepté au préalable.
60
61 Dans notre cas un attaquant ne pourra pas rejouer une commande tel quelle, elle serait rejetée par le serveur ayant un \emph{timestamp} supérieur. Si l'attaquant essaie de renvoyer un paquet avec un timestamp modifié, alors les données décodées ne seront plus validées par la \emph{MAC} car le vecteur d'initialisation utilisé (\emph{IV}) lors du déchiffrement est composé en partie par le \emph{timestamp}.
62
63
64 \subsection{Y a-t-il un moyen d'effectuer une attaque de type \emph{denial-of-service} sur notre dispositif ?}
65
66 Via une \emph{replay attack} en modifiant le \emph{timestamp} pour qu'il soit valide le dispositif va devoir déchiffrer les données puis calculer le \emph{MAC} avant de se rendre compte que le paquet est invalide et envoyer une réponse qui sera chiffrée et authentifiée. Dans ce cas on peut faire travailler énormément le dispositif en lui envoyant le plus de paquet à déchiffrer que le permet le débit du moyen de communication utilisé. Cela peut amener le dispositif a être surchargé.
67
68
69 \subsection{À la place d'utiliser un \emph{IV} aléatoire, le mode \emph{CBC} implémente une approche basée sur un \emph{nonce}. Que peut-on dire de sa sécurité ?}
70
71 TODO
72
73
74 \subsection{Remarques concernant la sécurité de notre protocole}
75
76 TODO
77
78
79 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 \section{Utilisation du serveur comme d'un oracle de déchiffrement}
81
82 \subsection{Historique de l'attaque par oracle à l'aide du remplissage}
83
84 TODO
85
86
87 \subsection{Explication de l'attaque pour notre cas}
88
89 Le but est de faire décoder tout ou une partie d'un message chiffré intercepté par un oracle. Le décryptage se fait par bloc de 16 octets et nécessite le bloc chiffré le précédant ou l'\emph{IV} dans le cas du premier bloc. Pour notre test nous partons du principe que l'attaquant a intercepté un paquet chiffré, qu'il en a compris la structure et qu'il a deviné que l'\emph{IV} correspondait au \emph{timestamp}.
90
91 Nous utilisons une attaque basé sur l'information renvoyé par l'oracle concernant la présence d'un bourrage valide. D'après le protocole un \emph{MAC} est calculé à partir des données non-bourrées puis le bourrage est ajouté pour obtenir une taille multiple de 16 et finalement les données et le bourrage sont chiffrés. Lors du déchiffrement par l'oracle, les données sont d'abord déchiffrées puis le bourrage est contrôlé, s'il n'est pas valide un paquet d'erreur et renvoyé au client (\emph{CryptError}). Si le bourrage est correct alors celui ci est retiré et les données restantes sont authentifiée à l'aide de la \emph{MAC}, si l'authentification échoue alors un paquet d'erreur et renvoyé au client (\emph{AuthError}).
92
93 La valeur des octets du bourrage correspond à sa taille, par exemple un bourrage de longueur trois est représenté par \emph{[0x03, 0x03, 0x03]}. Si les données avant bourrage sont déjà multiple de 16 alors un bourrage de longueur 16 est ajouté de sorte qu'un bourrage soit toujours présent.
94
95 \begin{figure}
96 \begin{center}
97 \includegraphics[scale=0.6]{diagramme_AES-CBC.eps}
98 \caption{\label{diagramme_AES-CBC} \textit{Décryptage par un oracle, AES-CBC.}}
99
100 \end{center}
101 \end{figure}
102
103 La figure \ref{diagramme_AES-CBC} illustre la structure de l'attaque. \emph{IV} et \emph{D} n'ont pas d'importance dans notre cas. \emph{X} est le bloc à décrypter, \emph{X'} est le bloc à décrypter après avoir été décodé par \emph{AES} mais avant d'avoir été \flqq xoré \frqq par \emph{F}. \emph{F} correspond à un bloc qui sera forgé par nos soins durant le décryptage de \emph{X}. De plus \emph{C}, qui n'est pas illustré sur le schéma, correspond au bloc précédent \emph{X} ou à l'\emph{IV} si \emph{X} est le premier bloc et \emph{R} correspond au message décrypté.
104
105 dans un premier temps nous allons chercher le premier octet $b$ de $F$ noté $F_{1}$ en itérant celui ci de 0 à 255. Pour chaque itération un paquet de commande est envoyé à l'oracle comprenant en guise de données chiffrée $F + X$, le paquet d'erreur renvoyé va nous indiquer si le bourrage est correct (\emph{AuthError}) ou s'il ne l'est pas (\emph{CryptError}). Pour le premier octet nous allons chercher le bourrage \emph{[0x01]}, pour le deuxième le bourrage \emph{[0x02, 0x02]} et ainsi de suite jusqu'à l'octet 16.
106
107 Dès qu'un paquet d'erreur \emph{AuthError} est reçu alors nous pouvons calculer $X'_{1} = F_{1} \oplus b$ puis le premier octet de notre message décrypté $R_{1} = X'_{1} \oplus C_{1}$. Avant de passer à l'octet suivant $b' = b + 1$ il faut s'assurer que les $b$ premiers octets de \emph{E} vaudront bien $b'$ lors du décryptage par l'oracle, pour ce faire on met à jour \emph{F} comme ceci : $\forall i \in [1, \ldots, b], F_{i} = b' \oplus X_{i}$.
108
109 Une subtilité existe pour la recherche du premier octet, il est possible que le paquet d'erreur \emph{AuthError} correspond, avec une faible probabilité, à un autre bourrage que \emph{[0x01]}. Pour prévenir ce cas il faut, pour ce premier octet, envoyer un paquet de commande pour toutes les valeurs de $F_{1}$ et compter le nombre de paquet d'erreur \emph{AuthError} reçu. Si ce nombre est égal à 1 alors on peut passer à $b'$, sinon il faut recommencer en modifiant $F_{2} = (F_{2} + 1) mod 256$.
110
111
112 \subsection{Calcul de la complexité moyenne de l'attaque en terme de nombre de requête effectué auprès de l'oracle}
113
114 Sans prendre en compte la particularité du premier octet illustré à la section précédente, la complexité moyenne pour le décryptage d'un bloc de 16 octets est de $16 * 256 / 2 = 2048$ requêtes.
115
116 Dans le cas présenté dans le code, le nombre de requête est de 1795.
117
118
119 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120 \section{Correction du protocole}
121
122 \subsection{Description}
123
124
125
126 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
127 \section{Conclusion}
128
129
130 %http://crypto.stackexchange.com/a/205
131 %https://en.wikipedia.org/wiki/Malleability_%28cryptography%29
132
133 \bibliographystyle{plain}
134 \bibliography{main}
135
136 \end{document}