Le jeu. 8 mai 2025, 20:04, Daniel Kiper via Grub-devel <grub-devel@gnu.org>
a écrit :

> From: Maxim Suhanov <dfirb...@gmail.com>
>
> This command examines a given diskfilter device, e.g., an LVM disk,
> and checks if underlying disks, physical volumes, are cryptodisks,
> e.g., LUKS disks, this layout is called "LVM-on-LUKS".
>
> The return value is 0 when all underlying disks (of a given device)
> are cryptodisks (1 if at least one disk is unencrypted or in an
> unknown state).
>
> Users are encouraged to include the relevant check before loading
> anything from an LVM disk that is supposed to be encrypted.
>
> This further supports the CLI authentication, blocking bypass
> attempts when booting from an encrypted LVM disk.
>
> Signed-off-by: Maxim Suhanov <dfirb...@gmail.com>
> Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
> ---
>  grub-core/disk/diskfilter.c | 75
> +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 75 insertions(+)
>
> diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
> index cc5062691..9eda22e3f 100644
> --- a/grub-core/disk/diskfilter.c
> +++ b/grub-core/disk/diskfilter.c
> @@ -20,6 +20,7 @@
>  #include <grub/dl.h>
>  #include <grub/disk.h>
>  #include <grub/mm.h>
> +#include <grub/command.h>
>  #include <grub/err.h>
>  #include <grub/misc.h>
>  #include <grub/diskfilter.h>
> @@ -1377,6 +1378,73 @@ grub_diskfilter_get_pv_from_disk (grub_disk_t disk,
>  }
>  #endif
>
> +static int
>
Please use bool if you want to return boolean or grub_err_t if you return
error codes. Int is undescriptive.

> +grub_diskfilter_check_pvs_encrypted (grub_disk_t disk, int *pvs_cnt)
> +{
> +  struct grub_diskfilter_lv *lv = disk->data;
> +  struct grub_diskfilter_pv *pv;
> +
> +  *pvs_cnt = 0;
> +
> +  if (lv->vg->pvs)
> +    for (pv = lv->vg->pvs; pv; pv = pv->next)
> +      {
> +        (*pvs_cnt)++;
> +
> +        if (pv->disk == NULL)
> +          {
> +            /* Can be a partially activated VG, bail out. */
> +            return GRUB_ERR_TEST_FAILURE;
> +          }
> +
> +        if (pv->disk->dev->id != GRUB_DISK_DEVICE_CRYPTODISK_ID)
> +          {
> +            /* All backing devices must be cryptodisks, stop. */
> +            return GRUB_ERR_TEST_FAILURE;
> +          }
> +      }
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +grub_cmd_cryptocheck (grub_command_t cmd __attribute__ ((unused)),
> +               int argc, char **args)
> +{
> +  grub_disk_t disk;
> +  int check_pvs_res;
> +  int namelen;
> +  int pvs_cnt;
> +
> +  if (argc != 1)
> +    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("disk name expected"));
> +
> +  namelen = grub_strlen (args[0]);
> +  if (namelen > 2 && (args[0][0] == '(') && (args[0][namelen - 1] == ')'))
> +    args[0][namelen - 1] = 0;
> +  else
> +    return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("invalid disk: %s"),
> +                       args[0]);
> +
> +  if (!is_valid_diskfilter_name (&args[0][1]))
> +    return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("unrecognized disk:
> %s"),
> +                       &args[0][1]);
> +
> +  disk = grub_disk_open (&args[0][1]);
> +  if (disk == NULL)
> +    return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("no such disk: %s"),
> +                       &args[0][1]);
> +
> +  check_pvs_res = grub_diskfilter_check_pvs_encrypted (disk, &pvs_cnt);
> +  grub_disk_close (disk);
> +
> +  grub_printf("%s is %sencrypted (%d pv%s examined)\n", &args[0][1],
> +              (check_pvs_res == GRUB_ERR_NONE) ? "" : "un",
> +              pvs_cnt,
> +              (pvs_cnt > 1) ? "s" : "");
>
Please make this translatable

> +
> +  return check_pvs_res;
>
Please set grub_errno properly

> +}
> +
>  static struct grub_disk_dev grub_diskfilter_dev =
>    {
>      .name = "diskfilter",
> @@ -1393,14 +1461,21 @@ static struct grub_disk_dev grub_diskfilter_dev =
>      .next = 0
>    };
>
> +static grub_command_t cmd;
> +
>
>  GRUB_MOD_INIT(diskfilter)
>  {
>    grub_disk_dev_register (&grub_diskfilter_dev);
> +  cmd = grub_register_command ("cryptocheck", grub_cmd_cryptocheck,
> +                                N_("DEVICE"),
> +                                N_("Check if a logical volume resides on
> encrypted disks."));
>  }
>
>  GRUB_MOD_FINI(diskfilter)
>  {
>    grub_disk_dev_unregister (&grub_diskfilter_dev);
> +  if (cmd != NULL)
> +    grub_unregister_command (cmd);
>    free_array ();
>  }
> --
> 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

Reply via email to