Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

journalctl: verify that old entries are not sealed with too recent key #28885

Merged
merged 2 commits into from Oct 6, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 26 additions & 2 deletions src/libsystemd/sd-journal/journal-verify.c
Expand Up @@ -818,9 +818,9 @@ int journal_file_verify(
Object *o;
uint64_t p = 0, last_epoch = 0, last_tag_realtime = 0, last_sealed_realtime = 0;

uint64_t entry_seqnum = 0, entry_monotonic = 0, entry_realtime = 0;
uint64_t entry_seqnum = 0, entry_monotonic = 0, entry_realtime = 0, min_entry_realtime = 0, max_entry_realtime = 0;
felixdoerre marked this conversation as resolved.
Show resolved Hide resolved
sd_id128_t entry_boot_id = {}; /* Unnecessary initialization to appease gcc */
bool entry_seqnum_set = false, entry_monotonic_set = false, entry_realtime_set = false, found_main_entry_array = false;
bool entry_seqnum_set = false, entry_monotonic_set = false, entry_realtime_set = false, min_entry_realtime_set = false, found_main_entry_array = false;
felixdoerre marked this conversation as resolved.
Show resolved Hide resolved
uint64_t n_objects = 0, n_entries = 0, n_data = 0, n_fields = 0, n_data_hash_tables = 0, n_field_hash_tables = 0, n_entry_arrays = 0, n_tags = 0;
usec_t last_usec = 0;
_cleanup_close_ int data_fd = -EBADF, entry_fd = -EBADF, entry_array_fd = -EBADF;
Expand Down Expand Up @@ -1070,6 +1070,13 @@ int journal_file_verify(
entry_realtime = le64toh(o->entry.realtime);
entry_realtime_set = true;

if (max_entry_realtime < le64toh(o->entry.realtime))
max_entry_realtime = le64toh(o->entry.realtime);
if (!min_entry_realtime_set || min_entry_realtime > le64toh(o->entry.realtime)) {
min_entry_realtime = le64toh(o->entry.realtime);
min_entry_realtime_set = true;
}
felixdoerre marked this conversation as resolved.
Show resolved Hide resolved

n_entries++;
break;

Expand Down Expand Up @@ -1148,6 +1155,23 @@ int journal_file_verify(
r = -EBADMSG;
goto fail;
}
if (max_entry_realtime >= rt + f->fss_interval_usec) {
felixdoerre marked this conversation as resolved.
Show resolved Hide resolved
error(p,
"entry realtime timestamp too late with respect to tag (%"PRIu64" < %"PRIu64")",
felixdoerre marked this conversation as resolved.
Show resolved Hide resolved
max_entry_realtime,
rt + f->fss_interval_usec);
r = -EBADMSG;
goto fail;
}
if (min_entry_realtime_set && min_entry_realtime < rt) {
error(p,
"entry realtime timestamp too early with respect to tag out of synchronization (%"PRIu64" >= %"PRIu64")",
felixdoerre marked this conversation as resolved.
Show resolved Hide resolved
min_entry_realtime,
rt);
r = -EBADMSG;
goto fail;
}
min_entry_realtime_set = false;

/* OK, now we know the epoch. So let's now set
* it, and calculate the HMAC for everything
Expand Down