]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pcrlock: reject device path node shorter than its header
authorSyed Mohammed Nayyar <jmestwa@gmail.com>
Thu, 25 Jun 2026 16:46:03 +0000 (22:16 +0530)
committerLennart Poettering <lennart@poettering.net>
Thu, 25 Jun 2026 20:11:12 +0000 (22:11 +0200)
event_log_record_extract_firmware_description() walks the device path
of a UEFI_IMAGE_LOAD_EVENT taken from the firmware TPM2 measurement log.
The per-node loop checks the remaining bytes against the node and its
declared length, but never that dp->length covers the 4-byte node header
offsetof(packed_EFI_DEVICE_PATH, path).

For a Media/File-Path node with length 3, the file-name extraction
computes dp->length - offsetof(packed_EFI_DEVICE_PATH, path) == 3 - 4,
which wraps to SIZE_MAX. utf16_to_utf8() treats SIZE_MAX as unbounded
and runs char16_strlen() over dp->path, reading past the log buffer; a
length of 0 also leaves dp non-advancing.

efi_get_boot_option() in src/shared/efi-api.c already rejects such nodes
with "if (dpath->length < 4) break;"; do the same here.

src/pcrlock/pcrlock.c

index 53b9b8a1551ed1fd225de2e086e0a9804c9098ed..8b4ebceeb65b717513480f0be24b7fcac3b79655 100644 (file)
@@ -837,7 +837,9 @@ static int event_log_record_extract_firmware_description(EventLogRecord *rec) {
                                 goto invalid;
                         }
 
-                        if (left < offsetof(packed_EFI_DEVICE_PATH, path) || left < dp->length) {
+                        if (left < offsetof(packed_EFI_DEVICE_PATH, path) ||
+                            dp->length < offsetof(packed_EFI_DEVICE_PATH, path) ||
+                            left < dp->length) {
                                 log_warning("Device path element too short, ignoring.");
                                 goto invalid;
                         }