> On 16 Jul 2025, at 4:36 PM, Daniel Kiper <dki...@net-space.pl> wrote:
> 
> 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…
Will do it.
> 
>> +Verifies an appended signature on @var{file} against the trusted X.509 
>> certificates
> 
> s/file/<file>
Will do it.
> 
>> +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.
Will do it.
> 
>> @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.
Will do it.
> 
>> @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/…
Will do it.
> 
>> +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/…
Will do it.
> 
>> +@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…
Will do it.

Thank you Daniel.

Thanks,
Sudhakar
> 
> Daniel

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

Reply via email to