% !TEX root = ../thesis.tex \chapter{Bezpečnostné riziko pri RNG v prostredí VM} Virtuálny stroj (ďalej \acrshort{vm}) je softvér, pomocou ktorého dokážeme vytvoriť abstraktné, respektíve virtuálne prostredie medzi našim počítačom a inou platformou. Celý tento proces je nezávislý od aktuálne použitého operačného systému (ďalej OS). Používateľ dokáže takto spustiť aj aplikačné sady, ktoré nie su určené práve pre jeho OS. \acrshort{vm} umožní inštaláciu virtuálneho OS na aktuálnom systéme pomocou zdieľania hardvérového vybavenia počítača. V dnešnej dobe je virtuálizácia vysoko populárna. Svoje uplatnenie našli v~rôznych sférach. Príkladom použitia sú spoločnosti zamerané na virtuálizáciu sieti. Prostredníctvom jednoduchej náhrady alebo rozšírenia softvéru dokážu poskytnúť väčšiu spoľahlivosť a flexibilitu svojich služieb, bez nutnosti nákupu viacerých zariadení. Obdobne zasahuje virtuálizácia aj do procesu vývoja a testovania aplikácií. Problematika VM je natoľko rozsiahla, že by mohla byť predmetom osobitnej práce. Avšak vzhľadom k aktuálnej problematike je opis základných princípov a metód týchto nástrojov vynechaný. Čitateľ má možnosť získať informácie prostredníctvom odkazu na video \cite{odkaz}. Autor v priebehu úvodných minút opisuje základné princípy virtuálizácie. Následne aj demonštruje spustenie konkrétneho linuxového operačného systému. V publikácií \cite{vm1}, autori zrealizovali úspešný útok vo virtuálnom prostredí s OS Windows. Dokument opisuje útok na implementáciu TLS protokolu pri štandardne zabezpečenej komunikácii medzi serverom a klientom. TLS (z~ang. \textit{Transport Secure Layer}) sa používa na zabezpečenie komunikácie s využitím certifikátov pri distribúcií verejného kľúča. Absolútnym základom útoku je vedomosť tzv. bezpečnostnej zraniteľnosti pri obnovení snímky obrazu (z ang. VM reset vulnerabilities). Následne autori dokázali pri opakovanom obnovení snímky extrahovať tajný kľúč servera. Ten vznikne deterministickým procesom pričom sa použijú náhodné dáta z generátorov náhodných čísel (z ang. Random Number Generator, ďalej RNG). Vlastník tohto údaju sa môže vydávať za server a klient nedokáže rozoznať rozdiel. Táto kapitola je opisom rovnakého bezpečnostného rizika avšak so zameraním na produkciu náhodných dát po obnovení snímky obrazu s OS Windows. Overenie aktuálnosti problému realizujeme experimentom. Použijú sa rozhrania systému Windows a nástroja OpenSSL, na generovanie kryptograficky bezpečných pseudo-náhodných čísel. \section{Opis bezpečnostného rizika} Pred opisom problému je nutné vysvetliť pojem snímka obrazu. Virtuálne stroje poskytujú možnosť spustiť ľubovoľný OS na počítači, bez nutnosti zmeny aktuálneho systému. Ďalšou z~vymožeností tohto prostredia je možnosť vytvorenia kópie aktuálneho stavu pomocou tzv. snímky obrazu (z~ang. \textit{snapshots}). Pri tomto úkone dochádza k úplnému uloženiu stavu daného systému. Výsledkom je súbor, vďaka ktorému je možné kedykoľvek obnoviť systém do stavu, aký bol počas vytvorenia snímky. Vrátane všetkých údajov v pamäti. Využitie je výhodné najmä pri spúštaní alebo inštalácií programov z neznámych zdrojov. Tie môžu poškodiť OS. Ďalším príkladom je aktualizácia systému. Po znehodnotení OS je takto možné obnoviť systém do bodu kedy bolo všetko v poriadku. Po načítaní snímky je možné ďalej pokračovať v práci avšak iba s dátami z obdobia vzniku snímky. \textit{VM reset vulnerabilities} pomenúva pôvodný anglický názov pre bezpečnostné riziko. Doslovný preklad do slovenčiny nie je celkom výstižný. Preto zavedieme pomenovanie problému ako -- Zraniteľnosť pri obnovení snímky obrazu VM. Po reštarte uvedeným spôsobom, je možné zreprodukovať aj výstupy systémových CSPRNG. Táto skutočnosť rapídne znižuje bezpečnosť algoritmov ako AES \cite[kap. 5]{levicky}, ktorý sa používa pri symetrickom šifrovaní, resp. dešifrovaní dát práve pomocou tajného kľúča. Ďalej DSA (z ang. \textit{Digital Signature Algorithm})\cite[kap. 11]{levicky}, používaný pri digitálnych podpisoch. Ak má útočník k dispozícií kľúče, s ktorými uvedené nástroje pracujú, ich použitie za účelom zabezpečenia komunikácie je bezvýznamné. Pri frekventovanom používaní rovnakej snímky obrazu si teda útočník môže všimnúť podobnosti kľúčov. \section{Experimentálne overenie uvedenej zraniteľnosti} Realizáciu experimentu zabezpečí prenosný počítať A. Jeho konfigurácia je obsahom tabuľky \ref{pc}. Pri tomto experimente je použitá iná metodika práce ako v \cite{vm1}. Vykonanie jedného z pokusov zabezpečí CSPRNG API operačného systému Windows 10. Konkrétne funkcia BCryptGenRandom \cite{bcrypt}. Výstupy následne odhalia bezpečnostné riziko. Prvé kroky sú spojené s voľbou hypervízora. Voľne dostupný nástroj je VirtualBox \cite{vbox}\footnote{Dostupný na: https://www.virtualbox.org/wiki/Downloads}. V čase experimentu je verziu 6.0.24. Nasleduje voľba OS. Použili sa 64-bitový systém. Konkrétne Windows 10 Pro vo verzii 1909 (zostava 18363.592). Konfigurácia systému prebieha podľa video návodu \cite{vmkonfig}. Dodatočne došlo k úprave možnosti zdieľania súborov na obojsmernú a navýšeniu počtu priradených procesorov (ďalej CPU) na počet 4. Dôvodom je samotný OS, ktorý sa v prípade použitej konfigurácie zdal pomalý na prácu dvoch CPU. Tieto zmeny však neovplyvnia výsledok experimentu. \subsection*{Prostredie Guest VM} Po úspešnej inštalácii obrazu a sprístupnení OS je nutná príprava prostredia. \subsubsection*{Vykonané inštalácie} \begin{itemize} \item GCC prekladač -- Winlibs GCC, 10.2.0, 64-bitová verzia, pre potreby prekladu programov do strojového kódu.\footnote{Dostupný na url: https://winlibs.com/} \item VirtualBox Extension Pack -- 6.0.24, zabezpečí ovládače pre VM, \item Visual Studio Code -- prostredie na úpravu, kompiláciu, a aj spustenie programov pomocou príkazového riadka. \end{itemize} \subsection{Postup pri realizácií experimentu } Pokus je síce realizovaný prostredníctvom odporúčaného rozhrania na generovanie náhodných čísel -- BCryptGenRandom\cite{bcrypt}. Avšak akékoľvek systémové RNG API dosahuje rovnaké výsledky. Podstata nášho experimentu spočíva v presnom zopakovaní tých istých krokov od načítania snímky obrazu v približne rovnakom čase. Grafický postup znázorňuje schéma \ref{vm}. V nasledujúcej časti je slovný opis. \begin{figure}[!ht] \centering \includegraphics[width=.8\textwidth]{figures/vm} \caption{Grafické znázornenie krokov postupu\label{vm}} \end{figure} Postup: \begin{enumerate} \item Príprava a preklad jednoduchého programu -- bcrypt. Jeho úlohou je generovanie náhodných čísel pomocou systémového rozhrania Windows. Viď. ukážku zdrojového kódu tohto programu \ref{vmbc}. Veľkosť výstupu vygenerovaných dát je v kóde stanovená na 1 920 B. Táto hodnota bola vykonaná pri poslednom experimente. Získaná je postupným navyšovaním od 15 bajtov. Teda 15 -- 30 -- 60 -- ... -- 1920. \noindent \begin{minipage}{\linewidth} %\section{Výpis kódu jazyka C} \begin{lstlisting}[frame=single, numbers=left, caption={Ukážka zdrojového kódu bcrypt.c},label=vmbc, basicstyle=\ttfamily\small, keywordstyle=\color{black}\bfseries,] #include #include #include //gcc bcrypt.c -o bcrypt -lbcrypt int main(){ int size= 1920;//size of data to generate in bytes BYTE pbData[size]; BCryptGenRandom(NULL,pbData,size, BCRYPT_USE_SYSTEM_PREFERRED_RNG); for( int i = 0; i < size;i++ ) printf("%02X",pbData[i]); //02X for same printing printf("\n"); return 0; } \end{lstlisting} \end{minipage}\\ \item Po príprave algoritmu je nutné aby sa používateľ presunul do bodu, tesne pred spustením programu bcrypt, v príkazovom riadku. Pri experimente je použitý Windows PowerShell, prostredníctvom editora Visual Studio Code. \item V uvedenom bode je nutné vytvoriť snímku obrazu. Operačný systém bežiaci vo virtuálnom prostredí je možné následne vypnúť. \item V tomto bode používateľ potrebuje pre dosiahnutie úspešnosti použivať merací nastroj, napríklad stopky. Meranie je potrebné začať v ľahko identifikovateľnom mieste. Pri pokuse je aktivácia stopiek vykonaná v okamihu spustenia obnovenej snímky OS. Po sprístupnení systému sme spustili program. V čase jeho spustenie sme zastavili meranie času. Dôležité pre úspešný experiment je vždy sa snažiť trafiť do tohto času. Tento krok nie je celkom jednoduchý a vyžaduje si zručnosť používateľa. Pri pokuse sme program spúšťali približne 2 sekundy po sprístupnení systému. V čase od začiatku načítavania obrazu až po zapnutie programu nebolo počas experimentu vykonané nič. Žiaden pohyb myši ani stlačenia klávesnice. Toto je aj dôvod, prečo je snímka obrazu zaznamenaná pred zapnutím programu bcrypt. \item Takto vzniknuté dáta je nutné uložiť mimo VM. Dôvodom je, že pri obnovení pomocou snímky dôjde k zahodeniu všetkých dát, ktoré nie sú jej obsahom. Vrátane dát vzniknutých v kroku 4. \item V prípade neúspešnej realizácií experimentu je potrebné opakovať tento proces od 4.kroku. Opakovanie je ukončené v prípade podozrenia, že daná sekvencia už bola vygenerovaná. Stačí ak sa používateľ zameria na prvé znaky výstupu. \item Hneď po zaznamenaní zhody v počiatočných hodnotách podrobíme dáta testovaniu zhody. Za účelom tohto procesu je vytvorený program compare. Jeho úlohou je kontrola zhody v~dvoch rovnako dlhých reťazcoch. Zdrojový kód je znázornený v ukážke \ref{vmcmp}. Program je nutné pri každej zmene kompilovať pomocou GCC prekladača. Za zhodu je považovaná rovnosť hodnoty a polohy vygenerovanej postupnosti. Výstup poskytuje hodnotu nájdenej zhody v~percentách. V prípade úplnej zhody je používateľ upozornený slovným výstupom. \end{enumerate} \noindent \begin{minipage}{\linewidth} %\section{Výpis kódu jazyka C} \begin{lstlisting}[frame=single, numbers=left, caption={Ukážka zdrojového kódu compare.c},label=vmcmp, basicstyle=\ttfamily\small, keywordstyle=\color{black}\bfseries,] #include #include //gcc compare.c -o compare /* place for generated data */ int main(){ char string1[]={"1.dataToCompare"}; char string2[]={"2.dataToCompare"}; int size=sizeof(string1)/sizeof(string1[0]); if(strcmp(string1, string2)==0){ printf("ABSOLUTE MATCH\n"); }else { int i=0,counter=0; while(i