Small nitpick, otherwise Reviewed-by: Vladimir Serbinenko phco...@gmail.com
Le jeu. 8 mai 2025, 20:03, Daniel Kiper via Grub-devel <grub-devel@gnu.org> a écrit : > From: Maxim Suhanov <dfirb...@gmail.com> > > This allows users to restrict the "search" command's scope to > encrypted disks only. > > Typically, this command is used to "rebase" $root and $prefix > before loading additional configuration files via "source" or > "configfile". Unfortunately, this leads to security problems, > like CVE-2023-4001, when an unexpected, attacker-controlled > device is chosen by the "search" command. > > The --cryptodisk-only argument allows users to ensure that the > file system picked is encrypted. > > This feature supports the CLI authentication, blocking bypass > attempts. > > Signed-off-by: Maxim Suhanov <dfirb...@gmail.com> > Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com> > --- > grub-core/commands/search.c | 20 ++++++++++++++++++++ > grub-core/commands/search_wrap.c | 7 ++++++- > grub-core/normal/main.c | 3 ++- > include/grub/search.h | 7 ++++--- > 4 files changed, 32 insertions(+), 5 deletions(-) > > diff --git a/grub-core/commands/search.c b/grub-core/commands/search.c > index 263f1501c..f6bfef958 100644 > --- a/grub-core/commands/search.c > +++ b/grub-core/commands/search.c > @@ -86,6 +86,26 @@ iterate_device (const char *name, void *data) > grub_device_close (dev); > } > > + /* Limit to encrypted disks when requested. */ > + if (ctx->flags & SEARCH_FLAGS_CRYPTODISK_ONLY) > + { > + grub_device_t dev; > + > + dev = grub_device_open (name); > + if (dev == NULL) > + { > + grub_errno = GRUB_ERR_NONE; > + return 0; > + } > + if (dev->disk == NULL || dev->disk->dev->id != > GRUB_DISK_DEVICE_CRYPTODISK_ID) > + { > + grub_device_close (dev); > + grub_errno = GRUB_ERR_NONE; > I think this grub_errno setting is redundant as device_open succeeded > + return 0; > + } > + grub_device_close (dev); > + } > + > #ifdef DO_SEARCH_FS_UUID > #define compare_fn grub_strcasecmp > #else > diff --git a/grub-core/commands/search_wrap.c > b/grub-core/commands/search_wrap.c > index 318581f3b..5f536006c 100644 > --- a/grub-core/commands/search_wrap.c > +++ b/grub-core/commands/search_wrap.c > @@ -41,6 +41,7 @@ static const struct grub_arg_option options[] = > ARG_TYPE_STRING}, > {"no-floppy", 'n', 0, N_("Do not probe any floppy drive."), 0, > 0}, > {"efidisk-only", 0, 0, N_("Only probe EFI disks."), 0, 0}, > + {"cryptodisk-only", 0, 0, N_("Only probe encrypted disks."), > 0, 0}, > {"hint", 'h', GRUB_ARG_OPTION_REPEATABLE, > N_("First try the device HINT. If HINT ends in comma, " > "also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, > @@ -75,6 +76,7 @@ enum options > SEARCH_SET, > SEARCH_NO_FLOPPY, > SEARCH_EFIDISK_ONLY, > + SEARCH_CRYPTODISK_ONLY, > SEARCH_HINT, > SEARCH_HINT_IEEE1275, > SEARCH_HINT_BIOS, > @@ -189,6 +191,9 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, > char **args) > if (state[SEARCH_EFIDISK_ONLY].set) > flags |= SEARCH_FLAGS_EFIDISK_ONLY; > > + if (state[SEARCH_CRYPTODISK_ONLY].set) > + flags |= SEARCH_FLAGS_CRYPTODISK_ONLY; > + > if (state[SEARCH_LABEL].set) > grub_search_label (id, var, flags, hints, nhints); > else if (state[SEARCH_FS_UUID].set) > @@ -210,7 +215,7 @@ GRUB_MOD_INIT(search) > cmd = > grub_register_extcmd ("search", grub_cmd_search, > GRUB_COMMAND_FLAG_EXTRACTOR | > GRUB_COMMAND_ACCEPT_DASH, > - N_("[-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] > ...]" > + N_("[-f|-l|-u|-s|-n] [--cryptodisk-only] [--hint > HINT [--hint HINT] ...]" > " NAME"), > N_("Search devices by file, filesystem label" > " or filesystem UUID." > diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c > index 04d058f55..96abfda2f 100644 > --- a/grub-core/normal/main.c > +++ b/grub-core/normal/main.c > @@ -511,7 +511,8 @@ static const char *features[] = { > "feature_chainloader_bpb", "feature_ntldr", > "feature_platform_search_hint", > "feature_default_font_path", "feature_all_video_module", > "feature_menuentry_id", "feature_menuentry_options", > "feature_200_final", > - "feature_nativedisk_cmd", "feature_timeout_style" > + "feature_nativedisk_cmd", "feature_timeout_style", > + "feature_search_cryptodisk_only" > }; > > GRUB_MOD_INIT(normal) > diff --git a/include/grub/search.h b/include/grub/search.h > index ffd2411ca..3eabaf0cc 100644 > --- a/include/grub/search.h > +++ b/include/grub/search.h > @@ -21,9 +21,10 @@ > > enum search_flags > { > - SEARCH_FLAGS_NONE = 0, > - SEARCH_FLAGS_NO_FLOPPY = 1, > - SEARCH_FLAGS_EFIDISK_ONLY = 2 > + SEARCH_FLAGS_NONE = 0, > + SEARCH_FLAGS_NO_FLOPPY = 1, > + SEARCH_FLAGS_EFIDISK_ONLY = 2, > + SEARCH_FLAGS_CRYPTODISK_ONLY = 4 > }; > > void grub_search_fs_file (const char *key, const char *var, > -- > 2.11.0 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel