mirror of
https://github.com/tianocore/edk2
synced 2026-08-27 00:23:19 -04:00
As reported in CVE-2024-13745 via oss-sec, DxeTpm2MeasureBootLib can measure a partition table that differs from the one parsed by the PartitionDxe driver. To address this, the more complete GPT parsing logic from PartitionDxe is extracted into a standalone GptLib library so it can be shared between PartitionDxe and DxeTpm2MeasureBootLib. This ensures that the exact same partition table measured into PCR[5] is the one parsed and used by the system. PartitionDxe behavior is unchanged. Ref: https://seclists.org/oss-sec/2026/q2/727 Signed-off-by: Richard Lyu <richard.lyu@suse.com>
97 lines
3.1 KiB
C
97 lines
3.1 KiB
C
/** @file
|
|
Shared GUID Partition Table (GPT) parsing and validation routines.
|
|
|
|
These routines decode and validate a disk partitioned with the GPT scheme
|
|
as described in the UEFI specification. They are shared between the
|
|
Partition driver (which installs child handles) and other consumers that
|
|
need to parse the same on-disk GPT layout.
|
|
|
|
Caution: These routines may receive untrusted input. The GPT partition
|
|
table is external input and must be validated carefully to avoid security
|
|
issues like buffer overflow and integer overflow.
|
|
|
|
Copyright (c) 2026, SUSE LLC. All rights reserved.<BR>
|
|
Copyright (c) 2018 Qualcomm Datacenter Technologies, Inc.
|
|
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#pragma once
|
|
|
|
#include <Uefi.h>
|
|
#include <Guid/Gpt.h>
|
|
#include <Protocol/BlockIo.h>
|
|
#include <Protocol/DiskIo.h>
|
|
|
|
//
|
|
// GPT Partition Entry Status
|
|
//
|
|
typedef struct {
|
|
BOOLEAN OutOfRange;
|
|
BOOLEAN Overlap;
|
|
BOOLEAN OsSpecific;
|
|
} EFI_PARTITION_ENTRY_STATUS;
|
|
|
|
/**
|
|
Read GPT partition table header from the given LBA and validate it.
|
|
|
|
Caution: This function may receive untrusted input.
|
|
The GPT partition table header is external input, so this routine
|
|
will do basic validation for GPT partition table header before return.
|
|
|
|
@param[in] BlockIo Parent BlockIo interface.
|
|
@param[in] DiskIo Disk Io protocol.
|
|
@param[in] Lba The starting Lba of the Partition Table.
|
|
@param[out] PartHeader Stores the partition table that is read.
|
|
|
|
@retval TRUE The partition table is valid.
|
|
@retval FALSE The partition table is not valid.
|
|
|
|
**/
|
|
BOOLEAN
|
|
PartitionValidGptTable (
|
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
|
IN EFI_LBA Lba,
|
|
OUT EFI_PARTITION_TABLE_HEADER *PartHeader
|
|
);
|
|
|
|
/**
|
|
Restore Partition Table to its alternate place
|
|
(Primary -> Backup or Backup -> Primary).
|
|
|
|
@param[in] BlockIo Parent BlockIo interface.
|
|
@param[in] DiskIo Disk Io Protocol.
|
|
@param[in] PartHeader Partition table header structure.
|
|
|
|
@retval TRUE Restoring succeeds.
|
|
@retval FALSE Restoring failed.
|
|
|
|
**/
|
|
BOOLEAN
|
|
PartitionRestoreGptTable (
|
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
|
IN EFI_PARTITION_TABLE_HEADER *PartHeader
|
|
);
|
|
|
|
/**
|
|
Check GPT partition entries and report the status of each entry.
|
|
|
|
Caution: This function may receive untrusted input.
|
|
The GPT partition entry is external input, so this routine
|
|
will do basic validation for GPT partition entry and report status.
|
|
|
|
@param[in] PartHeader Partition table header structure.
|
|
@param[in] PartEntry The partition entry array.
|
|
@param[out] PEntryStatus The partition entry status array
|
|
recording the status of each partition.
|
|
|
|
**/
|
|
VOID
|
|
PartitionCheckGptEntry (
|
|
IN EFI_PARTITION_TABLE_HEADER *PartHeader,
|
|
IN EFI_PARTITION_ENTRY *PartEntry,
|
|
OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus
|
|
);
|