Skip to content
Snippets Groups Projects
Commit 2aa0bbf8 authored by ricardo.dossanto1's avatar ricardo.dossanto1
Browse files

Systemd-detect-virt bypassed, first try to explain dmi/smbios, switching to vmaware

parent 95a4e08a
Branches
No related tags found
No related merge requests found
File added
......@@ -50,7 +50,7 @@ sorting=none
\definecolor{backgroundColour}{rgb}{0.95,0.95,0.92}
\lstdefinestyle{CStyle}{
backgroundcolor=\color{backgroundColour},
backgroundcolor=\color{backgroundcolor},
commentstyle=\color{mGreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{mGray},
......@@ -59,13 +59,13 @@ sorting=none
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
keepspaces=false,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2,
tabsize=1,
language=C
}
......@@ -90,17 +90,17 @@ sorting=none
escapeinside={(*@}{@*)}, % Escape to LaTeX between (*@ and @*)
}
\lstdefinestyle{AntoieStyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
\lstdefinestyle{AntoineStyle}{
backgroundcolor=\color{backgroundcolor},
commentstyle=\color{mGreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
numberstyle=\tiny\color{mGray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
basicstyle=\ttfamily\small\color{inputtextcolor},
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
keepspaces=false,
numbers=left,
numbersep=5pt,
showspaces=false,
......
No preview for this file type
No preview for this file type
......@@ -38,9 +38,12 @@
\section{Méthodes de détections}
\subsection{Table DMI (all plateform) + System Management BIOS Byte 2}
\subsubsection{Explication}
La Desktop Management Interface (DMI) est un framework afin de pouvoir tracker les composants d'un ordinateur.\cite{dmi}\\\\
Si le système est virtualisé, alors ces tables ont de fortes chances de contenir des strings identifiants la VMM utilisée.\\\\
Sous linux, Il est possible de détecter la virtualisation d'une OS en scannant des fichiers exposés dans le dossier \textit{/sys/class/dmi/id}:
La \textit{Desktop Management Interface}(DMI) était un framework qui servait de premier standard de management de bureau (\textit{desktop management}). Cela permettait de traquer les composants de nos ordinateurs.\cite{dmi}\\\\
Le développement actif de la DMI s'est arrêté le 31 décembre 2003 et la fin de vie du produit a été conclue définitivement en mars 2005.\cite{dmi_end_life}\\\\
Depuis, le nouveau standard est System Management BIOS (SMBIOS), repris par DMTF (développeur de la DMI) afin de permettre une communication simplifiée des composants matériels aux platformes qui souhaites récuperer les informations de ces derniers.\cite{dmi_smbios_spec}
\subsubsection{Méthode de détection}
Lorsqu'un système est virtualisé, si aucune option n'est spécifiée, alors QEMU charge le fichier binaire \textit{/usr/share/qemu/bios-256k.bin} qui est une implémentation de \textit{Legacy BIOS}.
Sous linux, Il est possible de détecter la virtualisation d'une OS en scannant des fichiers exposés dans le dossier \textit{/sys/class/dmi/id}, correspondant à certaines informations contenues dans les tables DMI/SMBIOS:
\begin{itemize}
\item Nom de produit, \textit{/sys/class/dmi/id/product\_name}
\item Vendeur du système, \textit{/sys/class/dmi/id/sys\_vendor}
......@@ -49,25 +52,33 @@
\item Spécifique aux VMs Hyper-V\cite{virt-c}, la version de produit \textit{/sys/class/dmi/id/product\_version}
\item Modalias, un formattage des informations système données précédemment \textit{/sys/class/dmi/id/modalias}
\end{itemize}
% NOTE, should I really talk about dmidecode ? maybe in the parade section
% Toujours sous Linux, il existe aussi la commande \textit{dmidecode}, qui permet de récuperer les informations contenues dans les fichiers ci-dessus, comme celles du reste des composants de l'ordinateur.\\\\
DMI et System Management BIOS (SMBIOS) proviennent de la même organisation, et accèdent aux mêmes informations. La différence est que DMI sert à lire les données et SMBIOS sert à présenter de manière standardisée ces mêmes données.\cite{lenovo_dmi}\\\\
Le fichier \textit{/sys/firmware/dmi/entries/0-0} expose les informations du SMBIOS et le 4ème bit indique la présence d'une VM, mais l'inverse n'est pas indicatif qu'une machine est réelle.\cite{virt-c}\cite{dmtf_smbios_doc} Un exemple donné par \textit{Systemd} est que QEMU ne met jamais ce bit à 1 et ce depuis la version 3.1.0.\cite{virt-c}\newpage
Chacun de ces fichiers contiendront des strings spécifiant la VMM utilisée, permettant la détection de virtualisation.\\\\
En plus de cela, dans la spécification de la SMBIOS, dans la table d'extension des caractéristiques byte 2, le 4ème bit signifique que le système est virtualisé, mais toujours dans cette même spécification, le bit n'étant pas mis à 1 ne doit rien inférer sur la virtualisation du système.
\subsubsection{Parades}
Il est possible de spécifier les valeurs à exposer au guest OS via le format suivant:\cite{dmi_git_readme}
\begin{lstlisting}[language=bash]
qemu-system-x86_64 [...] -smbios type=<type>,field=<value>[, ...]
\end{lstlisting}
Nous pouvons alors remplacer chaque information comme ceci:
Nous pouvons alors remplacer chaque information comme dans l'exemple ci-dessous:
\begin{lstlisting}[language=bash]
qemu-system-x86_64 [...] -smbios type=0,vendor=AMI [...]
\end{lstlisting}
L'exemple ci-dessus change ce qui est contenu dans \textit{/sys/class/dmi/id/bios\_vendor} par le string "AMI".\\\\
Ci-dessus, la valeur du vendeur BIOS est changée par le string "AMI". Pour trouver toutes les informations des tables DMI/SMBIOS afin de les passer à QEMU, nous pouvons utiliser l'outil \textit{dmidecode}.\\\\
Il est aussi possible de créer un binaire et de le transmettre à QEMU\cite{man_page_qemu}. De cette façon, il sufifrait d'écrire qu'une seule fois les informations par VMs et de les transmettre à QEMU via:
\begin{lstlisting}[language=bash]
qemu-system-x86_64 [...] -smbios file=<binary> [...]
\end{lstlisting}
Pour ce qui est du SMBIOS, la parade au bit 4 est de simplement utiliser QEMU avec une version égale ou supérieure à 3.1.0.
Pour ce qui est de la table d'extension des caractéristiques byte 2, nous avons deux solutions possibles pour contrer le 4ème bit de la table:
\begin{itemize}
\item Sans aucune option BIOS passée à QEMU, l'implémentation par défaut du \textit{legacy BIOS} ne met pas ce bit à 1.
\item Si nous souhaitons utiliser UEFI, alors nous devons passer un fichier de BIOS à QEMU, cependant aucune option ne permet explicitement de ne pas mettre ce bit à 1.\\\\
Alors il est possible de modifier le code source de QEMU (version 9.2.50), dans le fichier \textit{hw/smbios/smbios.c}. Dans ce fichier nous retrouvons le code suivant pour la construction de la table SMBIOS (type 0):\\\\
Dans la fonction \textit{smbios\_build\_type\_0\_table}, nous pouvons retrouver la valeur suivante:
\begin{lstlisting}[language=c,style=AntoineStyle]
t->bios_characteristics_extension_bytes[1] = 0x14;
\end{lstlisting}
Nous pouvons manuellement changer la valeur à \textit{0x04} afin que la virtualisation ne soit plus annoncée par SMBIOS (que ce soit UEFI ou Legacy BIOS)
\end{itemize}
\subsection{CPUID (x86\_64)}
\subsubsection{Explication}
%cpu 'host,-hypervisor,+kvm_pv_unhalt,+kvm_pv_eoi,hv_spinlocks=0x1fff,hv_vapic,hv_time,hv_reset,hv_vpindex,hv_runtime,hv_relaxed,kvm=off,hv_vendor_id=intel'
......@@ -84,6 +95,8 @@
% --hv_relaxed disable watchdog timeout
% THEY ARE PERFORMANCE RELATED, although noted here so I know what they are and which are actually important to hide a vm state
% https://www.qemu.org/docs/master/system/target-i386.html
% avec hyperviseur=off, peut toujours faire nested virtualisation
% Si pas cpu -host, lcomment changer les vendor_idà
CPUID est une instruction qui permet de recevoir les informations des CPUs x86\cite{intel_doc_2020}.\\\\
Ceci est fait en appelant la fonction assembleur \textit{cpuid} en utilisant les registres \textit{eax, ebx, ecx et edx}.\\\\
La valeur contenu dans \textit{eax} (et dans certains cas, ecx aussi), sert de paramètre pour savoir quelle catégorie d'information nous souhaitons recevoir, appelé communement \textit{leaf}.\\\\
......
......@@ -47,6 +47,21 @@ title = {Mappings for DMI/SMBIOS to Linux and dmidecode},
addendum = {{Accessed 10 December 2024}},
url = {https://gist.github.com/smoser/290f74c256c89cb3f3bd434a27b9f64c}
}
@online{dmi_smbios_spec,
title = {SMBIOS Specification},
date = {2024-08-05},
url = {https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.8.0.pdf},
addendum = {{Accessed 18 December 2024}},
organization = {DMTF},
version = {3.8.0}
}
@online{dmi_end_life,
title = {DMTF announces End of Life for DMI},
url = {https://www.dmtf.org/node/22},
addendum = {{Accessed 18 December 2024}},
organization = {DMTF},
}
@reference{man_page_qemu,
title = {Man page de QEMU},
date = {2016-05-08},
......
File added
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment