% !TEX root = ../thesis.tex \chapter{Bezpečnostný problém 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. 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\footnote{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\footnote{Z ang. \textit{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 \acrshort{rng}. Vlastník kľúča sa môže vydávať za~server a klient nedokáže rozoznať rozdiel. Táto kapitola demonštruje aktuálny bezpečnostný problém v prostredí OS Windows na platforme VM, avšak so zameraním na proces generovania náhodných dát po obnovení snímky obrazu s uvedeným OS. Vzhľadom na využitie výstupov z RNG je teda teoreticky možné použiť uvedenú chybu aj pri pokuse o sieťový útok. Overenie aktuálnosti problému realizujeme experimentom. Použijú sa \acrshort{rng} rozhrania systému Windows\footnote{Funkcia \textit{BCryptGenRandom}.} a knižnice OpenSSL\footnote{\textit{Rand} príkaz v prostredí príkazového riadku.}, na generovanie kryptograficky bezpečných pseudo-náhodných čísel. \section{Opis bezpečnostného problému pri generovaní náhodných čísel po obnovení snímky obrazu VM s OS Windows} Pred opisom problému je nutné vysvetliť pojem snímka obrazu \acrshort{vm}. 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\footnote{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 operačnej 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. Ďalším príkladom je DSA\footnote{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 častom používaní rovnakej snímky obrazu si teda útočník môže všimnúť podobnosti kľúčov. \section{Experimentálne overenie 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. Tento proces je vykonaný pomocou funkcia BCryptGenRandom \cite{bcrypt}. Výstupy následne potvrdia bezpečnostné riziko. Prvé kroky sú spojené s voľbou hypervízora. Voľne dostupný nástroj je VirtualBox \cite{vbox}\footnote{Dostupný na: \url{https://www.virtualbox.org/wiki/Downloads}.}. V čase experimentu je dostupná 64-bitová verziu 6.0.24 (14. 07. 2020). 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}. V tomto návode autor priradil OS v prostredí VM 2 procesory (ďalej \acrshort{cpu}\footnote{Z ang. \textit{Central Processing Unit}.}) My sme navýšili počet CPU na 4. Dôvodom je samotný OS, ktorý sa v prípade použitia konfigurácie so 4 CPU zdal rýchlejší. Následne sme ešte vykonali úpravu možnosti zdieľania súborov na obojsmernú. 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\footnote{Dostupný na: \url{ https://winlibs.com/}.} GCC, 10.2.0, 64-bitová verzia, pre potreby prekladu programov do strojového kódu. \item VirtualBox Extension Pack -- 6.0.24, zabezpečí ovládače pre VM. \item Visual Studio Code \cite{vsc} -- voľne dostupné 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 -- \verb|BCryptGenRandom| \cite{bcrypt}. Avšak akékoľvek systémové RNG API (\verb|CryptGenRandom| i \verb|RtlGenRandom|) dosahuje rovnaké výsledky. Toto tvrdenie sme aj úspešne overili. 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=\textwidth]{figures/vm} \caption{Grafické znázornenie krokov postupu\label{vm}} \end{figure} \textbf{Postup:} \begin{enumerate} \item Príprava a preklad jednoduchého programu \verb|bcgr.exe| (\verb|BCryptGenRandom|). 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 násobením dvomi od veľkosti buffer-a 15 bajtov. Teda 15-30-60-120-...-1920. Pri hodnote 1920 B sme s navyšovaním skončili. \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 \verb|bcgr|, v príkazovom riadku. Pri experimente je použitý Windows PowerShell, prostredníctvom editora Visual Studio Code \cite{vsc}, v~ktorom sme vykonali prípravu aj preklad programu. \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 \verb|bcgr.exe|. V čase spustenie sme zastavili meranie času. Dôležité pre~úspešný experiment je dosiahnuť spustenie \verb|bcgr.exe| vždy v rovnakom čase. Tento krok nie je celkom jednoduchý a vyžaduje 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 \verb|bcgr.exe|. \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 kroku 4. Opakovanie je ukončené v prípade, že daná postupnosť už bola vygenerovaná. Stačí, ak sa používateľ zameria na prvé znaky výstupu. Dôvodom je, že ak by došlo k zmene len jedného bitu pred generovaním, tak výsledná postupnosť bude úplne iná. Tato vlastnosť je charakteristická pre generátor \acrshort{aes}, ktorý OS Windows používa. \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 \\\verb|compare.exe|. Jeho úlohou je kontrola zhody v~dvoch rovnako dlhých reťazcoch. Zdrojový kód je znázornený v ukážke \ref{vmcmp}. Program \verb|compare.exe| je nutné pri každej zmene kompilovať pomocou \acrshort{gcc} prekladača. Za zhodu je považovaná rovnosť hodnoty a polohy vo 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