diff options
author | Anna Henningsen <anna@addaleax.net> | 2022-04-03 14:00:27 +0200 |
---|---|---|
committer | Juan José Arboleda <soyjuanarbol@gmail.com> | 2022-04-06 12:25:53 -0500 |
commit | e798e26dfd2e636b9d335747f89d2539ae7e5e16 (patch) | |
tree | a6847b841a4c8fe28b424fc006d8125cdfca1b7b | |
parent | a2f07380eac980d69cd09946b8fc1a4d6e588df4 (diff) | |
download | node-new-e798e26dfd2e636b9d335747f89d2539ae7e5e16.tar.gz |
src: add proper mutexes for accessing FIPS state
The FIPS state handling and OpenSSL initialization code makes
accesses to global OpenSSL state without any protection against
parallel modifications from multiple threads.
This commit adds such protections.
PR-URL: https://github.com/nodejs/node/pull/42278
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: Richard Lau <rlau@redhat.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
-rw-r--r-- | src/crypto/crypto_util.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/crypto/crypto_util.cc b/src/crypto/crypto_util.cc index e93edd4b2f..bbc86e6d88 100644 --- a/src/crypto/crypto_util.cc +++ b/src/crypto/crypto_util.cc @@ -136,7 +136,13 @@ bool InitCryptoOnce(Isolate* isolate) { return true; } +// Protect accesses to FIPS state with a mutex. This should potentially +// be part of a larger mutex for global OpenSSL state. +static Mutex fips_mutex; + void InitCryptoOnce() { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + Mutex::ScopedLock fips_lock(fips_mutex); #ifndef OPENSSL_IS_BORINGSSL OPENSSL_INIT_SETTINGS* settings = OPENSSL_INIT_new(); @@ -196,6 +202,9 @@ void InitCryptoOnce() { } void GetFipsCrypto(const FunctionCallbackInfo<Value>& args) { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + Mutex::ScopedLock fips_lock(fips_mutex); + #if OPENSSL_VERSION_MAJOR >= 3 args.GetReturnValue().Set(EVP_default_properties_is_fips_enabled(nullptr) ? 1 : 0); @@ -205,8 +214,13 @@ void GetFipsCrypto(const FunctionCallbackInfo<Value>& args) { } void SetFipsCrypto(const FunctionCallbackInfo<Value>& args) { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + Mutex::ScopedLock fips_lock(fips_mutex); + CHECK(!per_process::cli_options->force_fips_crypto); Environment* env = Environment::GetCurrent(args); + // TODO(addaleax): This should not be possible to set from worker threads. + // CHECK(env->owns_process_state()); bool enable = args[0]->BooleanValue(env->isolate()); #if OPENSSL_VERSION_MAJOR >= 3 @@ -227,6 +241,9 @@ void SetFipsCrypto(const FunctionCallbackInfo<Value>& args) { } void TestFipsCrypto(const v8::FunctionCallbackInfo<v8::Value>& args) { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + Mutex::ScopedLock fips_lock(fips_mutex); + #ifdef OPENSSL_FIPS #if OPENSSL_VERSION_MAJOR >= 3 OSSL_PROVIDER* fips_provider = nullptr; |