Browse code

kernels: Improve error-handling of rdrand-rng kernel driver

Improve the rdrand-rng driver to be robust in the face of various
errors and edge cases. Specifically,

- arch_get_random_long() and arch_get_random_seed_long() can fail.
Check their return values to deal with this appropriately.

- The number of random bytes requested can be arbitrary; so fill in
the supplied buffer carefully.

- Prefer rdseed over rdrand whenever possible.

Thanks to Joao Lima and Lonnie Abelbeck (@abelbeck) for suggesting
some of these improvements.

Change-Id: If1e90e683bd4aaded097859669d87ec6c423e538
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5727
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Sharath George

Srivatsa S. Bhat authored on 2018/09/19 09:04:48
Showing 3 changed files
... ...
@@ -12,14 +12,15 @@ entropy-starved virtual machines.
12 12
 
13 13
 Signed-off-by: Srivatsa S. Bhat <srivatsa@csail.mit.edu>
14 14
 ---
15
- drivers/char/hw_random/Kconfig      | 14 +++++++++
15
+
16
+ drivers/char/hw_random/Kconfig      | 14 ++++++++
16 17
  drivers/char/hw_random/Makefile     |  1 +
17
- drivers/char/hw_random/rdrand-rng.c | 61 +++++++++++++++++++++++++++++++++++++
18
- 3 files changed, 76 insertions(+)
18
+ drivers/char/hw_random/rdrand-rng.c | 72 +++++++++++++++++++++++++++++++++++++
19
+ 3 files changed, 87 insertions(+)
19 20
  create mode 100644 drivers/char/hw_random/rdrand-rng.c
20 21
 
21 22
 diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
22
-index dbf2271..b4e558d 100644
23
+index dbf2271..32e6196 100644
23 24
 --- a/drivers/char/hw_random/Kconfig
24 25
 +++ b/drivers/char/hw_random/Kconfig
25 26
 @@ -62,6 +62,20 @@ config HW_RANDOM_AMD
... ...
@@ -32,7 +33,7 @@ index dbf2271..b4e558d 100644
32 32
 +	default HW_RANDOM
33 33
 +	---help---
34 34
 +	  This driver provides kernel-side support for a Random Number
35
-+	  Generator that uses the 'rdrand' instruction on modern Intel
35
++	  Generator that uses the RDRAND/RDSEED instructions on modern Intel
36 36
 +	  and AMD CPUs.
37 37
 +
38 38
 +	  To compile this driver as a module, choose M here: the
... ...
@@ -57,13 +58,13 @@ index 5ad3976..c186ddb 100644
57 57
  obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o
58 58
 diff --git a/drivers/char/hw_random/rdrand-rng.c b/drivers/char/hw_random/rdrand-rng.c
59 59
 new file mode 100644
60
-index 0000000..e1cf7f3
60
+index 0000000..ba017f3
61 61
 --- /dev/null
62 62
 +++ b/drivers/char/hw_random/rdrand-rng.c
63
-@@ -0,0 +1,61 @@
63
+@@ -0,0 +1,72 @@
64 64
 +// SPDX-License-Identifier: GPL-2.0
65 65
 +/*
66
-+ * RNG driver that uses the 'rdrand' instruction (found on modern
66
++ * RNG driver that uses the RDRAND/RDSEED instructions (found on modern
67 67
 + * Intel and AMD CPUs).
68 68
 + *
69 69
 + * Author: Srivatsa S. Bhat <srivatsa@csail.mit.edu>
... ...
@@ -77,18 +78,27 @@ index 0000000..e1cf7f3
77 77
 +
78 78
 +#define PFX	KBUILD_MODNAME ": "
79 79
 +
80
-+static int rdrand_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
80
++static int rdrand_rng_read(struct hwrng *rng, void *buf, size_t max_bytes, bool wait)
81 81
 +{
82
-+	unsigned long *data = buf;
83
-+	size_t read = 0;
84
-+
85
-+	while (read < max) {
86
-+		arch_get_random_long(data);
87
-+		data++;
88
-+		read += sizeof(unsigned long);
82
++	char *p = buf;
83
++	size_t read_bytes = 0;
84
++
85
++	while (max_bytes) {
86
++		unsigned long v;
87
++		size_t chunk = min(max_bytes, (int)sizeof(unsigned long));
88
++
89
++		if (unlikely(!arch_get_random_seed_long(&v)) &&
90
++		    unlikely(!arch_get_random_long(&v))) {
91
++			break;
92
++		}
93
++
94
++		memcpy(p, &v, chunk);
95
++		p += chunk;
96
++		max_bytes -= chunk;
97
++		read_bytes += chunk;
89 98
 +	}
90 99
 +
91
-+	return read;
100
++	return read_bytes;
92 101
 +}
93 102
 +
94 103
 +static struct hwrng rdrand_rng = {
... ...
@@ -101,8 +111,10 @@ index 0000000..e1cf7f3
101 101
 +{
102 102
 +	int err = -ENODEV;
103 103
 +
104
-+	if (!arch_has_random())
105
-+		return err; /* rdrand not available. */
104
++	if (!arch_has_random_seed() && !arch_has_random()) {
105
++		pr_err(PFX "Neither RDSEED nor RDRAND is available.\n");
106
++		return err;
107
++	}
106 108
 +
107 109
 +	err = hwrng_register(&rdrand_rng);
108 110
 +	if (err)
... ...
@@ -120,7 +132,7 @@ index 0000000..e1cf7f3
120 120
 +module_exit(mod_exit);
121 121
 +
122 122
 +MODULE_AUTHOR("Srivatsa S. Bhat <srivatsa@csail.mit.edu>");
123
-+MODULE_DESCRIPTION("H/W RNG driver for x86 CPUs that support rdrand");
123
++MODULE_DESCRIPTION("H/W RNG driver for x86 CPUs that support RDRAND/RDSEED");
124 124
 +MODULE_LICENSE("GPL");
125 125
 -- 
126 126
 2.7.4
... ...
@@ -2,7 +2,7 @@
2 2
 Summary:       Kernel
3 3
 Name:          linux-esx
4 4
 Version:       4.4.153
5
-Release:       2%{?dist}
5
+Release:       3%{?dist}
6 6
 License:       GPLv2
7 7
 URL:           http://www.kernel.org/
8 8
 Group:         System Environment/Kernel
... ...
@@ -238,6 +238,8 @@ ln -sf linux-%{uname_r}.cfg /boot/photon.cfg
238 238
 /usr/src/linux-headers-%{uname_r}
239 239
 
240 240
 %changelog
241
+*   Tue Sep 18 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-3
242
+-   Improve error-handling of rdrand-rng kernel driver.
241 243
 *   Fri Sep 07 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-2
242 244
 -   Fix CVE-2018-13053
243 245
 *   Tue Sep 04 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-1
... ...
@@ -2,7 +2,7 @@
2 2
 Summary:        Kernel
3 3
 Name:           linux
4 4
 Version:    	4.4.153
5
-Release:        2%{?kat_build:.%kat_build}%{?dist}
5
+Release:        3%{?kat_build:.%kat_build}%{?dist}
6 6
 License:    	GPLv2
7 7
 URL:        	http://www.kernel.org/
8 8
 Group:        	System Environment/Kernel
... ...
@@ -339,6 +339,8 @@ ln -sf %{name}-%{uname_r}.cfg /boot/photon.cfg
339 339
 /usr/share/perf-core
340 340
 
341 341
 %changelog
342
+*   Tue Sep 18 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-3
343
+-   Improve error-handling of rdrand-rng kernel driver.
342 344
 *   Fri Sep 07 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-2
343 345
 -   Fix CVE-2018-13053
344 346
 *   Tue Sep 04 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-1