summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle Huey <khuey@kylehuey.com>2020-09-23 23:19:09 +0200
committerLennart Poettering <lennart@poettering.net>2020-09-24 09:22:45 +0200
commitfbccb980e5b48375047114777d203401a9e33c6c (patch)
treef7da1fa0e018f29462d97f082f4b3415d15fe5f1
parentMerge pull request #17142 from poettering/catalog-fix-de (diff)
downloadsystemd-fbccb980e5b48375047114777d203401a9e33c6c.tar.xz
systemd-fbccb980e5b48375047114777d203401a9e33c6c.zip
random-util: Add an environment variable to disable RDRAND.
SYSTEMD_RDRAND=0 will prevent using RDRAND even on systems whose CPUID claims to support it. All other values have no effect. Fixes: #17112
-rw-r--r--docs/ENVIRONMENT.md3
-rw-r--r--src/basic/random-util.c10
2 files changed, 13 insertions, 0 deletions
diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md
index ea433a497a..38752c9169 100644
--- a/docs/ENVIRONMENT.md
+++ b/docs/ENVIRONMENT.md
@@ -80,6 +80,9 @@ All tools:
honoured on systems built with libxcrypt and is ignored on systems using
glibc's original, internal crypt() implementation.)
+* `$SYSTEMD_RDRAND=0` — if set, the RDRAND instruction will never be used,
+ even if the CPU supports it.
+
systemctl:
* `$SYSTEMCTL_FORCE_BUS=1` — if set, do not connect to PID1's private D-Bus
diff --git a/src/basic/random-util.c b/src/basic/random-util.c
index 6eeed9af34..2031262389 100644
--- a/src/basic/random-util.c
+++ b/src/basic/random-util.c
@@ -21,6 +21,7 @@
#endif
#include "alloc-util.h"
+#include "env-util.h"
#include "errno-util.h"
#include "fd-util.h"
#include "fileio.h"
@@ -116,6 +117,15 @@ int rdrand(unsigned long *ret) {
#endif
have_rdrand = !!(ecx & bit_RDRND);
+
+ if (have_rdrand > 0) {
+ /* Allow disabling use of RDRAND with SYSTEMD_RDRAND=0
+ If it is unset getenv_bool_secure will return a negative value. */
+ if (getenv_bool_secure("SYSTEMD_RDRAND") == 0) {
+ have_rdrand = false;
+ return -EOPNOTSUPP;
+ }
+ }
}
if (have_rdrand == 0)