On Mon, Jul 14, 2025 at 11:05:05PM +0530, Sudhakar Kuppusamy wrote:
> From: Daniel Axtens <d...@axtens.net>
>
> This explains how appended signatures can be used to form part of
> a secure boot chain, and documents the commands and variables
> introduced.
>
> Signed-off-by: Daniel Axtens <d...@axtens.net>
> Signed-off-by: Sudhakar Kuppusamy <sudha...@linux.ibm.com>
> Reviewed-by: Stefan Berger <stef...@linux.ibm.com>
> Reviewed-by: Avnish Chouhan <avn...@linux.ibm.com>
> ---
>  docs/grub.texi | 189 +++++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 168 insertions(+), 21 deletions(-)
>
> diff --git a/docs/grub.texi b/docs/grub.texi
> index d594e29bd..494e2eada 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -3281,6 +3281,7 @@ These variables have special meaning to GRUB.
>
>  @menu
>  * biosnum::
> +* check_appended_signatures::
>  * check_signatures::
>  * chosen::
>  * cmdpath::
> @@ -3343,12 +3344,16 @@ this.
>  For an alternative approach which also changes BIOS drive mappings for the
>  chain-loaded system, @pxref{drivemap}.
>
> +@node check_appended_signatures
> +@subsection check_appended_signatures
> +This variable controls whether GRUB enforces appended signature validation on
> +loaded vmlinux file. @xref{Using appended signatures}.
>
>  @node check_signatures
>  @subsection check_signatures
>
> -This variable controls whether GRUB enforces digital signature
> -validation on loaded files. @xref{Using digital signatures}.
> +This variable controls whether GRUB enforces GPG-style digital signature
> +validation on loaded files. @xref{Using GPG-style digital signatures}.
>
>  @node chosen
>  @subsection chosen
> @@ -6414,6 +6419,10 @@ you forget a command, you can run the command 
> @command{help}
>  @menu
>  * [::                           Check file types and compare values
>  * acpi::                        Load ACPI tables
> +* append_add_db_cert::          Add an X.509 certificate to the db list
> +* append_list_db::              List trusted certificates from the db list
> +* append_rm_dbx_cert::          Remove a certificate from the db list
> +* append_verify::               Verify appended digital signature using db 
> list
>  * authenticate::                Check whether user is in user list
>  * background_color::            Set background color for active terminal
>  * background_image::            Load background image for active terminal
> @@ -6535,6 +6544,68 @@ Note: The command is not allowed when lockdown is 
> enforced (@pxref{Lockdown}).
>        unsigned code.
>  @end deffn
>
> +@node append_add_db_cert
> +@subsection append_add_db_cert
> +
> +@deffn Command append_add_db_cert X509_certificate
> +Read a DER-formatted X.509 certificate from the file @var{X509_certificate}
> +and add it to GRUB's internal db list of trusted X.509 certificates. These
> +certificates are used to validate appended signatures when the environment
> +variable @code{check_appended_signatures} is set to @code{enforce}.
> +
> +Note that if @code{check_appended_signatures} is set to @code{enforce}
> +when @command{append_add_db_cert} is executed, then @var{X509_certificate}
> +must itself bear an appended signature. (It is not sufficient that
> +@var{X509_certificate} be signed by a trusted certificate according to the
> +X.509 rules: GRUB does not include support for validating signatures within 
> X.509
> +certificates themselves.)
> +
> +See @xref{Using appended signatures} for more information.
> +@end deffn
> +
> +@node append_list_db
> +@subsection append_list_db
> +
> +@deffn Command append_list_db
> +List all X.509 certificates trusted by GRUB for validating appended 
> signatures.
> +The output is a numbered list of certificates, showing the certificate's 
> serial
> +number and Common Name.
> +
> +The certificate number can be used as an argument to
> +@command{append_rm_dbx_cert} (@pxref{append_rm_dbx_cert}).
> +
> +See @xref{Using appended signatures} for more information.
> +@end deffn
> +
> +@node append_rm_dbx_cert
> +@subsection append_rm_dbx_cert
> +
> +@deffn Command append_rm_dbx_cert cert_number
> +Remove the X.509 certificate numbered @var{cert_number} from GRUB's keyring 
> of
> +db for verifying appended signatures.
> +
> +@var{cert_number} is the certificate number as listed by
> +@command{append_list_db} (@pxref{append_list_db}).
> +
> +These certificates are used to validate appended signatures when environment
> +variable @code{check_appended_signatures} is set to @code{enforce}
> +(@pxref{check_appended_signatures}), and by @command{append_verify}
> +(@pxref{append_verify}). See @xref{Using appended signatures} for more
> +information.
> +@end deffn
> +
> +@node append_verify
> +@subsection append_verify
> +
> +@deffn Command append_verify file

I suggest to use "<>" to mark arguments which gets a value, e.g.: append_verify 
<file>
Please fix this in whole documentation...

> +Verifies an appended signature on @var{file} against the trusted X.509 
> certificates

s/file/<file>

> +known to GRUB (See @pxref{append_list_db}, @pxref{append_add_db_cert}, and
> +@pxref{append_rm_dbx_cert}).
> +Exit code @code{$?} is set to 0 if the signature validates
> +successfully.  If validation fails, it is set to a non-zero value.
> +
> +See @xref{Using appended signatures}, for more information.
> +@end deffn
>
>  @node authenticate
>  @subsection authenticate
> @@ -6854,7 +6925,7 @@ These keys are used to validate signatures when 
> environment variable
>  @code{check_signatures} is set to @code{enforce}
>  (@pxref{check_signatures}), and by some invocations of
>  @command{verify_detached} (@pxref{verify_detached}).  @xref{Using
> -digital signatures}, for more information.
> +GPG-style digital signatures}, for more information.
>  @end deffn
>
>  @node drivemap
> @@ -7250,7 +7321,6 @@ without any options, the @command{keystatus} command 
> returns true if and
>  only if checking key modifier status is supported.
>  @end deffn
>
> -
>  @node list_env
>  @subsection list_env
>
> @@ -7270,7 +7340,7 @@ The output is in GPG's v4 key fingerprint format (i.e., 
> the output of
>  @code{gpg --fingerprint}).  The least significant four bytes (last
>  eight hexadecimal digits) can be used as an argument to
>  @command{distrust} (@pxref{distrust}).
> -@xref{Using digital signatures}, for more information about uses for
> +@xref{Using GPG-style digital signatures}, for more information about uses 
> for
>  these keys.
>  @end deffn
>
> @@ -7305,8 +7375,11 @@ When used with care, @option{--skip-sig} and the 
> whitelist enable an
>  administrator to configure a system to boot only signed
>  configurations, but to allow the user to select from among multiple
>  configurations, and to enable ``one-shot'' boot attempts and
> -``savedefault'' behavior.  @xref{Using digital signatures}, for more
> +``savedefault'' behavior.  @xref{Using GPG-style digital signatures}, for 
> more
>  information.
> +Extra care should be taken when combining this command with appended 
> signatures
> +(@pxref{Using appended signatures}), as this file is not validated by an
> +appended signature and could set @code{check_appended_signatures=no}.
>  @end deffn
>
>
> @@ -7677,7 +7750,7 @@ read.  It is possible to modify a digitally signed 
> environment block
>  file from within GRUB using this command, such that its signature will
>  no longer be valid on subsequent boots.  Care should be taken in such
>  advanced configurations to avoid rendering the system
> -unbootable. @xref{Using digital signatures}, for more information.
> +unbootable. @xref{Using GPG-style digital signatures}, for more information.

I suggest to move all GPG documentation changes to separate patch.

>  @end deffn
>
>
> @@ -8167,11 +8240,10 @@ signatures when environment variable 
> @code{check_signatures} is set to
>  must itself be properly signed.  The @option{--skip-sig} option can be
>  used to disable signature-checking when reading @var{pubkey_file}
>  itself. It is expected that @option{--skip-sig} is useful for testing
> -and manual booting. @xref{Using digital signatures}, for more
> +and manual booting. @xref{Using GPG-style digital signatures}, for more

Ditto and below...

>  information.
>  @end deffn
>
> -

This and similar cleanups can be a part of GPG change set but they have
to be mentioned in the commit message.

>  @node unset
>  @subsection unset
>
> @@ -8190,7 +8262,6 @@ only on PC BIOS platforms.
>  @end deffn
>  @end ignore
>
> -

Ditto...

>  @node verify_detached
>  @subsection verify_detached
>
> @@ -8208,7 +8279,7 @@ tried.
>
>  Exit code @code{$?} is set to 0 if the signature validates
>  successfully.  If validation fails, it is set to a non-zero value.
> -@xref{Using digital signatures}, for more information.
> +@xref{Using GPG-style digital signatures}, for more information.
>  @end deffn
>
>  @node videoinfo
> @@ -8668,14 +8739,15 @@ environment variables and commands are listed in the 
> same order.
>  @chapter Security
>
>  @menu
> -* Authentication and authorisation:: Users and access control
> -* Using digital signatures::         Booting digitally signed code
> -* UEFI secure boot and shim::        Booting digitally signed PE files
> -* Secure Boot Advanced Targeting::   Embedded information for generation 
> number based revocation
> -* Measured Boot::                    Measuring boot components
> -* Lockdown::                         Lockdown when booting on a secure setup
> -* TPM2 key protector::               Managing disk key with TPM2 key 
> protector
> -* Signing GRUB itself::              Ensuring the integrity of the GRUB core 
> image
> +* Authentication and authorisation::   Users and access control
> +* Using GPG-style digital signatures:: Booting digitally signed code
> +* Using appended signatures::          An alternative approach to booting 
> digitally signed code
> +* UEFI secure boot and shim::          Booting digitally signed PE files
> +* Secure Boot Advanced Targeting::     Embedded information for generation 
> number based revocation
> +* Measured Boot::                      Measuring boot components
> +* Lockdown::                           Lockdown when booting on a secure 
> setup
> +* TPM2 key protector::                 Managing disk key with TPM2 key 
> protector
> +* Signing GRUB itself::                Ensuring the integrity of the GRUB 
> core image
>  @end menu
>
>  @node Authentication and authorisation
> @@ -8751,8 +8823,8 @@ generating configuration files with authentication.  
> You can use
>  adding @kbd{set superusers=} and @kbd{password} or @kbd{password_pbkdf2}
>  commands.
>
> -@node Using digital signatures
> -@section Using digital signatures in GRUB
> +@node Using GPG-style digital signatures
> +@section Using GPG-style digital signatures in GRUB
>
>  GRUB's @file{core.img} can optionally provide enforcement that all files
>  subsequently read from disk are covered by a valid digital signature.
> @@ -8835,6 +8907,81 @@ or BIOS) configuration to cause the machine to boot 
> from a different
>  (attacker-controlled) device.  GRUB is at best only one link in a
>  secure boot chain.
>
> +@node Using appended signatures
> +@section Using appended signatures in GRUB
> +
> +GRUB supports verifying Linux-style 'appended signatures' for secure boot.
> +Appended signatures are PKCS#7 messages containing a signature over the
> +contents of a file, plus some metadata, appended to the end of a file. A file
> +with an appended signature ends with the magic string:
> +
> +@example
> +~Module signature appended~\n
> +@end example
> +
> +where @code{\n} represents the line feed character, @code{0x0a}.
> +
> +To enable appended signature verification, load the appendedsig module and an
> +x509 certificate for verification. Building the appendedsig module into the
> +core grub image is recommended.

s/grub/GRUB/...

> +Certificates can be managed at boot time using the 
> @pxref{append_add_db_cert},
> +@pxref{append_rm_dbx_cert} and @pxref{append_list_db} commands.
> +Certificates can also be built in to the core image using the @code{--x509}
> +parameter to @command{grub-install} or @command{grub-mkimage}.
> +A file can be explicitly verified using the @pxref{append_verify} command.
> +
> +Only signatures made with the SHA-256 or SHA-512 hash algorithm are 
> supported,
> +and only RSA signatures are supported.
> +
> +A file can be signed with the @command{sign-file} utility supplied with the
> +Linux kernel source. For example, if you have @code{signing.key} as the 
> private
> +key and @code{certificate.der} as the x509 certificate containing the public 
> key:
> +
> +@example
> +sign-file SHA256 signing.key certificate.der vmlinux vmlinux.signed
> +@end example
> +
> +Enforcement of signature verification is controlled by the
> +@code{check_appended_signatures} variable. Verification will only take place
> +when files are loaded if the variable is set to @code{enforce}. If a
> +certificate is built into the grub core image with the @code{--x509} 
> parameter,
> +the variable will be automatically set to @code{enforce} when the appendedsig
> +module is loaded.
> +
> +Unlike GPG-style signatures, not all files loaded by GRUB are required to be
> +signed. Once verification is turned on, the following file types must carry
> +appended signatures:
> +
> +@enumerate
> +@item Linux, Multiboot, BSD, XNU and Plan9 kernels
> +@item Grub modules, except those built in to the core image

s/Grub/GRUB/...

> +@item Any new certificate files to be trusted
> +@end enumerate
> +
> +ACPI tables and Device Tree images will not be checked for appended 
> signatures
> +but must be verified by another mechanism such as GPG-style signatures before
> +they will be loaded.
> +
> +No attempt is made to validate any other file type. In particular,
> +chain-loaded binaries are not verified - if your platform supports
> +chain-loading and this cannot be disabled, consider an alternative secure
> +boot mechanism.
> +
> +As with GPG-style appended signatures, signature checking does @strong{not}
> +stop an attacker with console access from dropping manually to the GRUB
> +console and executing:
> +
> +@example
> +set check_appended_signatures=no
> +@end example
> +
> +Refer to the section on password-protecting GRUB (@pxref{Authentication
> +and authorisation}) for more information on preventing this.
> +
> +Additionally, special care must be taken around the @command{loadenv} 
> command,
> +which can be used to turn off @code{check_appended_signature}.
> +
>  @node UEFI secure boot and shim
>  @section UEFI secure boot and shim support

May I ask you to put all documentation patches in one group at the end
of the patch set? Same applies to tests patches. I think they should land
before documentation patches...

Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to