a8e194ff6bfa4925182fbb01a2a5de29e6fc4677
[ach-master.git] / src / theory / RNGs.tex
1 \section{Random Number Generators}
2 \label{section:RNGs}
3
4 % This section was authored by Ralf Schlatterbeck (Ralf Schlatterbeck <rsc@runtux.com>)
5
6 \epigraph{``The generation of random numbers is too important to be left to chance.''}{Robert R. Coveyou}
7
8
9 \begin{figure}[h]
10   \centering
11   \includegraphics[width=0.4\textwidth]{img/random_number.png}
12   \caption{xkcd, source: \url{https://imgs.xkcd.com/comics/random_number.png}, license: CC-BY-NC}
13   \label{fig:dilbertRNG}
14 \end{figure}
15
16
17
18 A good source of random numbers is essential for many crypto
19 operations. The key feature of a good random number generator is the
20 non-predictability of the generated numbers. This means that hardware
21 support for generating entropy is essential.
22
23
24 Hardware random number generators in operating systems or standalone
25 components collect entropy from various random events mostly by using
26 the (low bits of the) time an event occurs as an entropy source. The
27 entropy is merged into an entropy pool and in some implementations there
28 is some bookkeeping about the number of random bits available.
29
30 \subsection{When random number generators fail}
31
32 Random number generators can fail -- returning predictable non-random
33 numbers -- if not enough entropy is available when random numbers should
34 be generated.
35
36 This typically occurs for embedded devices and virtual machines.
37 Embedded devices lack some entropy sources other devices have, e.g.:
38
39 \begin{itemize*}
40   \item No persistent clock, so boot-time is not contributing to the
41     initial RNG state
42   \item No hard-disk: No entropy from hard-disk timing, no way to store
43     entropy between reboots
44 \end{itemize*}
45
46 Virtual machines emulate some hardware components so that the
47 generated entropy is over-estimated. The most critical component that
48 has been shown to return wrong results in an emulated environment is the
49 timing source~\cite{Eng11,POL11}.
50
51 Typically the most vulnerable time where low-entropy situations occur is
52 shortly after a reboot. Unfortunately many operating system installers
53 create cryptographic keys shortly after a reboot~\cite{HDWH12}.
54
55 Another problem is that OpenSSL seeds its internal random generator only
56 seldomly from the hardware random number generator of the operating
57 system. This can lead to situations where a daemon that is started at a
58 time when entropy is low keeps this low-entropy situation for hours
59 leading to predictable session keys~\cite{HDWH12}.
60
61 \subsection{Linux}
62 \label{subsec:RNG-linux}
63
64 %\todo{Other architectures, BSD, Windows?}
65
66 On Linux there are two devices that return random bytes when read; the
67 \verb+/dev/random+ can block until sufficient entropy has been collected
68 while \verb+/dev/urandom+ will not block and return whatever (possibly
69 insufficient) entropy has been collected so far.
70
71 Unfortunately most crypto implementations are using \verb+/dev/urandom+
72 and can produce predictable random numbers if not enough entropy has
73 been collected~\cite{HDWH12}.
74
75 Linux supports the injection of additional entropy into the entropy pool
76 via the device \verb+/dev/random+. On the one hand this is used for
77 keeping entropy across reboots by storing output of /dev/random into a
78 file before shutdown and re-injecting the contents during the boot
79 process. On the other hand this can be used for running a secondary
80 entropy collector to inject entropy into the kernel entropy pool.
81
82 On Linux you can check how much entropy is available with the command:
83 \begin{lstlisting}
84 $ cat /proc/sys/kernel/random/entropy_avail
85 \end{lstlisting}
86
87 %% specifics for libraries
88 %% Openssl uses /dev/urandom. See the paper: https://factorable.net/weakkeys12.conference.pdf (section 5.2)
89 %% What about other libs? 
90 %% What about other OSes? 
91
92
93 \subsection{Recommendations}
94
95 To avoid situations where a newly deployed server doesn't have enough
96 entropy it is recommended to generate keys (e.g. for SSL or SSH) on
97 a system with a sufficient amount of entropy available and transfer the generated keys
98 to the server.  This is especially advisable for small embedded devices
99 or virtual machines.
100
101 For embedded devices and virtual machines deploying additional userspace
102 software that generates entropy and feeds this to kernel entropy pool
103 (e.g. by writing to \verb+/dev/random+ on Linux) is recommended. Note
104 that only a process with root rights can update the entropy counters in the
105 kernel; non-root or user processes can still feed entropy to the pool but
106 cannot update the counters~\cite{Wikipedia:/dev/random}.
107
108 For Linux the \verb+haveged+
109 implementation~\cite{HAV13a} based on the HAVEGE~\cite{SS03}
110 strong random number generator currently looks like the best choice. It
111 can feed its generated entropy into the kernel entropy pool and recently
112 has grown a mechanism to monitor the quality of generated random
113 numbers~\cite{HAV13b}. The memory footprint may be too high for small
114 embedded devices, though.
115
116 For systems where -- during the lifetime of the keys -- it is expected
117 that low-entropy situations occur, RSA keys should be preferred over DSA
118 keys: For DSA, if there is ever insufficient entropy at the time keys
119 are used for signing this may lead to repeated ephemeral keys. An
120 attacker who can guess an ephemeral private key used in such a signature
121 can compromise the DSA secret key.
122 For RSA this can lead to discovery of encrypted plaintext or forged
123 signatures but not to the compromise of the secret key~\cite{HDWH12}.