NetworkPkg: SECURITY PATCH CVE-2023-45237
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4542 Bug Overview: PixieFail Bug #9 CVE-2023-45237 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) Use of a Weak PseudoRandom Number Generator Change Overview: Updates all Instances of NET_RANDOM (NetRandomInitSeed ()) to either > > EFI_STATUS > EFIAPI > PseudoRandomU32 ( > OUT UINT32 *Output > ); > or (depending on the use case) > > EFI_STATUS > EFIAPI > PseudoRandom ( > OUT VOID *Output, > IN UINTN OutputLength > ); > This is because the use of Example: The following code snippet PseudoRandomU32 () function is used: > > UINT32 Random; > > Status = PseudoRandomU32 (&Random); > if (EFI_ERROR (Status)) { > DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > return Status; > } > This also introduces a new PCD to enable/disable the use of the secure implementation of algorithms for PseudoRandom () and instead depend on the default implementation. This may be required for some platforms where the UEFI Spec defined algorithms are not available. > > PcdEnforceSecureRngAlgorithms > If the platform does not have any one of the UEFI defined secure RNG algorithms then the driver will assert. Cc: Saloni Kasbekar <saloni.kasbekar@intel.com> Cc: Zachary Clark-williams <zachary.clark-williams@intel.com> Signed-off-by: Doug Flick [MSFT] <doug.edk2@gmail.com> Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
It provides basic functions for the UEFI network stack.
|
||||
|
||||
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) Microsoft Corporation
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
@@ -539,8 +540,6 @@ extern EFI_IPv4_ADDRESS mZeroIp4Addr;
|
||||
#define TICKS_PER_MS 10000U
|
||||
#define TICKS_PER_SECOND 10000000U
|
||||
|
||||
#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
|
||||
|
||||
/**
|
||||
Extract a UINT32 from a byte stream.
|
||||
|
||||
@@ -580,19 +579,40 @@ NetPutUint32 (
|
||||
);
|
||||
|
||||
/**
|
||||
Initialize a random seed using current time and monotonic count.
|
||||
Generate a Random output data given a length.
|
||||
|
||||
Get current time and monotonic count first. Then initialize a random seed
|
||||
based on some basic mathematics operation on the hour, day, minute, second,
|
||||
nanosecond and year of the current time and the monotonic count value.
|
||||
@param[out] Output - The buffer to store the generated random data.
|
||||
@param[in] OutputLength - The length of the output buffer.
|
||||
|
||||
@return The random seed initialized with current time.
|
||||
@retval EFI_SUCCESS On Success
|
||||
@retval EFI_INVALID_PARAMETER Pointer is null or size is zero
|
||||
@retval EFI_NOT_FOUND RNG protocol not found
|
||||
@retval Others Error from RngProtocol->GetRNG()
|
||||
|
||||
@return Status code
|
||||
**/
|
||||
UINT32
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NetRandomInitSeed (
|
||||
VOID
|
||||
PseudoRandom (
|
||||
OUT VOID *Output,
|
||||
IN UINTN OutputLength
|
||||
);
|
||||
|
||||
/**
|
||||
Generate a 32-bit pseudo-random number.
|
||||
|
||||
@param[out] Output - The buffer to store the generated random number.
|
||||
|
||||
@retval EFI_SUCCESS On Success
|
||||
@retval EFI_NOT_FOUND RNG protocol not found
|
||||
@retval Others Error from RngProtocol->GetRNG()
|
||||
|
||||
@return Status code
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PseudoRandomU32 (
|
||||
OUT UINT32 *Output
|
||||
);
|
||||
|
||||
#define NET_LIST_USER_STRUCT(Entry, Type, Field) \
|
||||
|
Reference in New Issue
Block a user