From 8c8d2cfd4bc890acfc92ff0fd4269be05adfc5ef Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 20 Nov 2023 14:25:56 +0100 Subject: [PATCH 1/3] pcrlock: make sure we don't choke on empty records Follow-up for a43427013949 CID#1523832 --- src/pcrlock/pcrlock.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pcrlock/pcrlock.c b/src/pcrlock/pcrlock.c index 0469fc943f..9978ffe71a 100644 --- a/src/pcrlock/pcrlock.c +++ b/src/pcrlock/pcrlock.c @@ -1120,7 +1120,11 @@ static int event_log_load_userspace(EventLog *el) { continue; } - b[bn] = 0; + if (!GREEDY_REALLOC(b, bn + 1)) + return log_oom(); + + b[bn] = 0; /* Turn it into a string */ + r = json_parse(b, 0, &j, NULL, NULL); if (r < 0) return log_error_errno(r, "Failed to parse local TPM measurement log file: %m"); From c7da9e9a65aaeb7146674c86fbd4153cd5195c55 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 20 Nov 2023 14:26:18 +0100 Subject: [PATCH 2/3] pcrlock: check for embedded NUL bytes --- src/pcrlock/pcrlock.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pcrlock/pcrlock.c b/src/pcrlock/pcrlock.c index 9978ffe71a..dc48bc57e5 100644 --- a/src/pcrlock/pcrlock.c +++ b/src/pcrlock/pcrlock.c @@ -1125,6 +1125,11 @@ static int event_log_load_userspace(EventLog *el) { b[bn] = 0; /* Turn it into a string */ + if (memchr(b, 0, bn)) { + log_warning("Found record with embedded NUL byte, skipping."); + continue; + } + r = json_parse(b, 0, &j, NULL, NULL); if (r < 0) return log_error_errno(r, "Failed to parse local TPM measurement log file: %m"); From 42c1df5e2d7f24183635d2daf2a0045e99c5ceb8 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Mon, 20 Nov 2023 14:26:44 +0100 Subject: [PATCH 3/3] test: add simple test case for invalid userspace log records --- test/units/testsuite-70.pcrlock.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/units/testsuite-70.pcrlock.sh b/test/units/testsuite-70.pcrlock.sh index 415bfa8ff4..46060c1dc3 100755 --- a/test/units/testsuite-70.pcrlock.sh +++ b/test/units/testsuite-70.pcrlock.sh @@ -41,6 +41,15 @@ PCRS="1+2+3+4+5+16" # (as the PCR values simply won't match the log). rm -f /run/log/systemd/tpm2-measure.log +# Ensure a truncated log doesn't crash pcrlock +echo -n -e \\x1e >/tmp/borked +set +e +SYSTEMD_MEASURE_LOG_USERSPACE=/tmp/borked "$SD_PCRLOCK" cel --no-pager --json=pretty +ret=$? +set -e +# If it crashes the exit code will be 149 +test $ret -eq 1 + SYSTEMD_COLORS=256 "$SD_PCRLOCK" "$SD_PCRLOCK" cel --no-pager --json=pretty "$SD_PCRLOCK" log --pcr="$PCRS"