BachelorWork/chapters/evaluation.tex
2021-05-24 23:19:47 +02:00

307 lines
21 KiB
TeX

% !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: \url{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<stdio.h>
#include<windows.h>
#include<ntstatus.h>
//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 <stdio.h>
#include <string.h>
//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<size){
if(string1[i]==string2[i])
counter++;
i++;
}
printf("MATCH in %.2f percent\n",
(double)(counter*100)/size);
}
return 0;
}
\end{lstlisting}
\end{minipage}\\
\subsection*{Experiment s knižnicou OpenSSL v.1.1.1k}
Po úspešnom prvom experimente so systémovými rozhraniami je overená aj knižnica OpenSSL. Pri generovaní náhodných dát je použitý ako zdroj náhodnosti výstup z CSPRNG API systému, na ktorom je naimplementová zvolená funkcionalita. Teda ak je niektorá z funkcií na RNG implementovaná v OS Windows, tak vstupom OpenSSL generátora je výstup funkcie BCryptGenRandom. Periodicky dochádza k reseed procesu, pričom prvotná inicializácia prebehne pri spustení.
Pri experimente boli aplikované rovnaké metódy ako pri softvérových rozhraniach.
Na generovanie bol použitý príkaz, s ktorým sa stretneme hlavne pri RSA \cite[kap. 7.5.3]{levicky} algoritme:
\verb|openssl genrsa -out myCA.key 2048|
Príkaz vytvorí súkromný kľúč s veľkosťou 2048 bajtov. Ten je možné uplatniť v TLS protokole, konkrétne pri distribúcií kľúčov s využitím certifikátov.
\section{Vyhodnotenie výsledkov testovania}
Vzhľadom k dobe, ktorá ubehla od uverejnenia článku \cite{vm1}, bolo očakávané úplné vyriešenie tohto bezpečnostného rizika. Počas experimentu sa podarilo vyvrátiť túto hypotézu. Dôkazom je videozáznam, ktorý demonštruje postup od 4. do 7 kroku experimentu. Je obsahom prenosného média prílohy A. Zároveň je možné ich vyhľadať na webovej platforme Youtube \cite{yt1}. Vďaka videu je zrejmé, že isté bezpečnostné riziko pretrváva. Obsahom uvedenej prílohy A sú aj použité zdrojové kódy s balíčkom makefile.
Obdobne sme overili aj vytváranie súkromného kľúča pomocou OpenSSL. Používatelia tejto knižnice nemusia byť veľmi znepokojený, pretože sa nám opísaným postupom nikdy nepodarilo vytvoriť rovnaký kľúč. Avšak maximálna dosiahnutá zhoda pomocou programu compare, bola 5,43\%. Táto hodnota zhody už sama o sebe nie je typická pre CSPRNG. Dôvodom je aktualizácia vnútorného stavu generátora pri každej inicializácií tejto knižnice. Tým sa zabezpečí pseudonáhodnosť aj v prípade, že bola použitá rovnaká entropia systému. Je potrebné si uvedomiť, že bezpečnosť takto vygenerovanej postupnosti je omnoho nižšia ako pri bežnom pracovnom postupe rozhrania.
Oplatí sa poukázať na skutočnosť, že zopakovať výstup generovania s rovnakým výsledkom si vyžaduje splnenie podmienok, ktoré užívateľ pri bežnej práci nevykonáva. Viď vyššie uvedený postup. Obdobne bolo potrebné počas testovania vykonať veľké množstvo pokusov. Niekedy bolo nutné počas generovaní konkrétnej sekvencie absolvovať reštart obrazu aj 20-krát.
V porovnaní s \cite{vm1}, je situácia v dnešnej dobe pravdepodobne nenapodobiteľná. Je nutné si uvedomiť, že istý potenciál na útočenie existuje. Ak Windows 10 beží prostredníctvom hypervízora, tzv. Hyper-V, tak po obnovení následne dochádza k obnoveniu vnútorných inicializačných hodnôt (z ang. reseed) stavov hlavného generátora systému. Týmto sa značne redukuje čas, kedy je možné uvedený bezpečnostný problém využiť. Jeho implementácia je dnes štandardná. Okrem toho väčšina softvérových hypervízorov pracuje aj v kooperácií s hardvérovými ako Intel VM-x a AMD-V. Jedinou podmienkou je ich povolenie v BIOS-e. Na dnešných počítačoch je však možnosť virtuálizácie hardvéru štandardne zapnutá. Používateľ teda nie je nútený zasahovať do týchto nastavení.
\subsection*{Aktualizácia softvérového vybavenia}
V čase tvorby práce došlo k aktualizáciám softvérov použitých v tejto kapitole.
Zmeny sa týkajú:
\begin{enumerate}
\item aktualizácia OS Windows -- 10, Pro, 64-bitová verzia, v20H2, 19042.985,
\item GCC prekladač -- Winlibs, 64-bitový, v11.1.0,
\item VirtualBox -- 6.1.22 (vrátane doplnkov).
\end{enumerate}
Testovanie bolo vykonané aj pomocou aktualizovaných nástrojov. Bezpečnostné riziko aj napriek uvedeným zmenám stále pretrváva. Aktualizovaný videozáznam (\cite{yt2}) spoločne s údajmi o nástrojoch je taktiež obsahom prílohy A.
Je nutné informovať čitateľa o možnom probléme pri realizácii vyššie uvedených skutočností. Ak je na natívnom OS Windows použitý Windows Subsystem pre Linux vo verzii 2 (WSL2), tak je vysoko pravdepodobné, že nedosiahnete výsledky uvedené v tejto publikácií. Pred aplikovaním metód je potrebné deaktivovať túto funkciu. Dôvodom je interferencia medzi Hyper-V a týmto systémom. Občasne môže spôsobovať aj pády, respektíve nespoľahlivý výkon systému.
Kapitola demonštruje aktuálny bezpečnostný problém v prostredí OS Windows na platforme VM. Teoreticky je teda možné použiť uvedenú chybu aj pri pokuse o sieťový útok. Tento problém je dlhodobo známy fakt. Vzhľadom k veľkej popularite a rozvoju VM očakávame v blízkej dobe úplne odstránenie uvedeného bezpečnostného rizika.
\chapter{Vyhodnotenie dosiahnutých výsledkov}
\label{evaluation}
Obsahom tejto kapitoly je vyhodnotenie dosiahnutých výsledkov, ktoré sme získali počas experimentálnych meraní a štatistického testovania náhodných dát. Následne pomocou týchto dát vytvoríme odporúčanie pre použitie funkcií v prostredí OS Windows.
\subsection*{Vyhodnotenie štatistického testovania dát}
V tabuľke \ref{vysledok2} je výsledné poradie určené zostupným usporiadaním podľa kvality funkcií. Pre účely usporiadania sme vykonali súčet p-hodnôt každého testu z výstupu sady NIST STS v súboroch FinalAnalysisReport.txt\footnote{Použili sme nástroj Magma. Dostupný na: http://magma.maths.usyd.edu.au/calc/}. Tieto dáta pre konkrétne funkcie sú obsahom prílohy A. Zároveň sme vypočítali celkovú úspešnosť na základe pomeru počtu úspešných a všetkých testov. Pomocou týchto dvoch hodnôt sme následne určili výsledné poradie uvedenej tabuľky, pričom prednosť dostali funkcie s väčšou úspešnosťou.
Pri spustení štatistickej sady na každý výstup náhodných dát testovanej funkcie sme použili rovnaké inicializačné parametre. Konkrétne, vstupná sekvencia -- 1 000 000 bitov, počet prúdov -- 4600 a pred definované hodnoty testov nezmenené. Pri uvedenej konfigurácii sady trvalo jedno testovanie okolo 10 hodín. Testy boli vykonané na počítači A. Špecifikácia tohto zariadenia je obsahom tabuľky \ref{pc}.
\begin{table}[h!]
\centering
\resizebox{\textwidth}{!}{%
\begin{tabular}{c|c|c|c|c|c|c}
\multirow{2}{*}{\bfseries Funkcia} &
\multicolumn{6}{|c}{\bfseries Hodnoty}
\\
& Poradie
& API
& Testy celkovo
& Úspešné testy
& Úspešnosť [\%]
& $\approx \sum\limits_{i=1}^{188}p_i$
\\\hline\hline
RAND\_priv\_bytes
& 1
& OpenSSL
& 188
& 188
& 100
& 98,348
\\
RtlGenRandom
& 2
& Windows
& 188
& 188
& 100
& 93,108
\\
RAND\_bytes
& 3
& OpenSSL
& 188
& 188
& 100
& 92,394
\\
RDSEED
& 4
& AMD
& 188
& 188
& 100
& 89,538
\\
BCryptGenRandom
& 5
& Windows
& 188
& 187
& 99,47
& 91,298
\\
CryptGenRandom
& 6
& Windows
& 188
& 186
& 98,94
& 89,566
\\
RDRAND
& 7
& AMD
& 188
& 186
& 98,94
& 87,767
\end{tabular}%
}
\caption{Vyhodnotenie kvality výstupov funkcií pomocou NIST STS}
\label{vysledok2}
\end{table}
\subsection*{Vyhodnotenie experimentálnych meraní}
Na základe označenia prvkov \ref{merania}. a priebežných experimentálnych meraní v 5. kapitole, je vytvorená tabuľka \ref{vysledok1}.
Poradie rozhraní v uvedenej tabuľke vzniklo nasledujúcim spôsobom. Vypočítali sme súčet \acrshort{anc} všetkých počítačov pri maximálnej možnej veľkosti $BS$. Takto vzniknuté číslo sme následne vydelili počtom meracích zariadení. Hodnoty jednotlivých rozhraní sme usporiadali vzostupne.
\begin{table}[ht!]
\centering
\resizebox{\textwidth}{!}{%
\begin{tabular}{c|c|c|c|c|c}
\multirow{2}{*}{\bfseries Funkcia} &
\multicolumn{5}{|c}{\bfseries Hodnoty}
\\
& Poradie
& API
& $NI$
& $BS$
& $\approx$ Priemer cyklov
\\\hline\hline
RAND\_bytes
& 1
& OpenSSL
& 16
& 32 GB
& 1,752 $*$ $10^9$
\\
RAND\_priv\_bytes
& 2
& OpenSSL
& 16
& 32 GB
& 1,753 $*$ $10^9$
\\
RtlGenRandom
& 3
& Windows
& 8
& 32 GB
& 3,925 $*$ $10^9$
\\
BCryptGenRandom
& 4
& Windows
& 8
& 32 GB
& 3,945 $*$ $10^9$
\\
CryptGenRandom
& 5
& Windows
& 8
& 32 GB
& 4,593 $*$ $10^9$
\\
RDRAND
& 6
& AMD
& 8
& 32 GB
& 1,445 $*$ $10^{12}$
\\
RDSEED
& 7
& AMD
& 8
& 32 GB
& 3,098 $*$ $10^{12}$
\\
\end{tabular}%
}
\caption{Vyhodnotenie funkcií podľa výsledkov meraní}
\label{vysledok1}
\end{table}
\subsection*{Celkové vyhodnotenie získaných výsledkov}
Na základe tabuliek \ref{vysledok2} a \ref{vysledok1} je očividné, že knižnica OpenSSL ponúka kvalitne spracované rozhranie na generovanie kryptograficky bezpečných náhodných čísel. Dominuje vo všetkých experimentoch, ktoré sú obsahom tejto práce. Ďalšími plusmi sú pravidelné aktualizácie, ľahká implementácia, možnosť použitia na rôznych typoch OS a voľná dostupnosť pre používateľa. Na základe uvedených faktov odporúčame používateľovi pri tvorbe kryptografický aplikácií na platforme Windows, použiť práve túto knižnicu. Pri kryptografických aplikáciach je výhodnejšie implementovať RAND\_priv\_bytes, pretože poskytla lepšie výsledky pri testovaní kvality ako funkcia RAND\_bytes. Toto odporúčanie dostala obdobne aj od vývojárov knižnice.
V prípade systémových rozhraní dosiahla najlepšie výsledky funkcia RtlGenRandom. Problémom však ostáva jej podpora systému v budúcnosti. Prí tvorbe kryptografickej aplikácie je nevyhnutne nutné ošetriť kompatibilitu systému pomocou funkcie BCryptGenRandom. V prostredí virtuálnych strojov s OS Windows však jej použitie neodporúčame vzhľadom k existujúcemu bezpečnostnému problému.
Používateľ má k dispozícií ešte procesorové inštrukcie RDSEED a RDRAND. Obidve poskytujú dostatočne kvalitné dáta. Najmä prvá z uvedených. Ich najväčšou nevýhodou je čas produkcie náhodných dát. Ak pri implementácií nie je proces náchylný na rýchlosť vykonávania tak odporúčame použitie funkcie RDSEED.