diff --git a/figs/low-core-count.jpg b/figs/low-core-count.jpg new file mode 100644 index 0000000..46f571a Binary files /dev/null and b/figs/low-core-count.jpg differ diff --git a/main.tex b/main.tex index d8205f2..3f2b754 100644 --- a/main.tex +++ b/main.tex @@ -109,15 +109,39 @@ les modifications sont réécrites dans la mémoire DRAM. L'instruction \texttt{clflush} est accessible à tout utilisateur non privilégié sur les adresses mémoires auxquelles il a accès. -\subsubsection{\TODO{Flush+Reload}} - -\subsubsection{Flush+Flush} +\subsubsection{Flush+Reload} \TODO{2.2 \& 2.3 of \cite{flushflush}} +Le temps de chargement d'une donnée est largement influencé par sa présence en cache. +Mesurer le temps de chargement d'une adresse permet donc de déterminer aisément si la ligne de +cache associée était déjà présente en cache. + +Flush+Reload\cite{flushreload} propose donc la méthode suivante: + +\begin{algorithm}[ht] + \caption{Flush+Reload}\label{alg:flushreload} + \KwData{$x$ : addresse à surveiller} + \KwResult{Y a t-il eu un accès à $x$ ?} + $clflush(x)$ \Comment*[l]{$x$ n'est plus en cache} + $sleep(n)$ \Comment*[l]{Si un coeur accède à $x$, $x$ est à nouveau dans le L3} + $t \gets rdtsc()$\; + $read(x)$\; + $total\_time \gets rdtsc() - t$\; +\end{algorithm} + +La différence entre le temps de lecture depuis le cache et depuis la DRAM étant conséquent, +cette méthode permet de déterminer avec un faible taux d'erreur si un accès a été fait à une adresse, +le grand nombre de \ang{reload} effectués par les \texttt{clflush} et \texttt{read} successifs est +cependant visible via des compteurs de performance et donc détectable, +et ne permet pas une haute fréquence d'observation. + +\subsubsection{Flush+Flush} + Le temps d'exécution de l'instruction \texttt{clflush} dépendant de l'état de cohérence de la ligne -de cache concernée, la connaissance de son temps d'exécution permet de déterminer dans quel état était la ligne. -Flush+Flush \cite{flushflush} propose la méthode suivante : +de cache concernée, la connaissance de son temps d'exécution permet de la même manière +de déterminer dans quel état était la ligne. +Flush+Flush\cite{flushflush} propose la méthode suivante : \begin{algorithm}[ht] \caption{Flush+Flush}\label{alg:flushflush} @@ -130,7 +154,7 @@ Flush+Flush \cite{flushflush} propose la méthode suivante : $total\_time \gets rdtsc() - t$\; \end{algorithm} -Les avantages de cette méthode par rapport à Flush+Reload\cite{flushreload} sont multiples : +Les avantages de cette méthode par rapport à Flush+Reload sont multiples : \begin{itemize} \item Aucun accès mémoire n'est réalisé pour surveiller l'adresse, ce qui rend les méthodes de détection qui comptent le nombre de \ang{cache miss} inefficaces. @@ -154,7 +178,7 @@ Similairement à ces autres méthodes, Flush+Flush peut extraire des données du autres processus en regardant les accès mémoires faits dans les bibliothèques partagés, qui occupent les mêmes zones de la mémoire physique pour différents processus. -Daniel Gruss et al.\cite{cachetemplateattacks} propose par exemple de récupérer +Daniel Gruss et al.\cite{cachetemplateattacks} proposent par exemple de récupérer le nonce d'une clé OpenSSL avec Flush+Reload en regardant les zones mémoire accédées pendant le chiffrement de données. Un enregistreur de frappe (\ang{keylogger}) basé sur