[U-Boot] [PATCH] common, image-sig: [BUG?] if no valid signature node found, do not boot signed FIT image

Simon Glass sjg at chromium.org
Fri Jun 9 03:05:41 UTC 2017


Hi Heiko,

On 8 June 2017 at 03:52, Heiko Schocher <hs at denx.de> wrote:
> fit_image_verify_required_sigs() must return != 0, on error.
>
> When fit_image_verify_required_sigs() does not find a signature
> node, it returns 0, which leads in booting a signed FIT image.
>
> Fix this!
>
> Signed-off-by: Heiko Schocher <hs at denx.de>
> ---
>
> Found on an imx28 based board, with key dtb appended to u-boot.bin.
>
> Booting signed FIT image without an valid key dtb appended to u-boot.bin
> shows:
>
> Using FEC1 device
> TFTP from server 192.168.1.1; our IP address is 192.168.20.103
> Filename '/tftpboot/xxx/20170509/signed.fit'.
> Load address: 0x42000000
> Loading: #################################################################
> [...]
>          ###########
>          3.3 MiB/s
> done
> Bytes transferred = 12560801 (bfa9a1 hex)
>    Using 'conf at 1' configuration
>    Verifying Hash Integrity ... OK
>    Trying 'kernel at 1' kernel subimage
>      Description:  Linux kernel
>      Created:      2017-06-08   9:10:14 UTC
>      Type:         Kernel Image
>      Compression:  uncompressed
>      Data Start:   0x420000c0
>      Data Size:    4078928 Bytes = 3.9 MiB
>      Architecture: ARM
>      OS:           Linux
>      Load Address: 0x40008000
>      Entry Point:  0x40008000
>      Hash algo:    sha256
>      Hash value:   6d1dce3e08133ac4d34c0e07ce266f5cffc6f5a2713619c9ff76ca4b04df4a5b
>      Sign algo:    sha256,rsa4096:dev
>      Sign value:   xxx
>      Timestamp:    2017-06-08   9:10:15 UTC
>    Verifying Hash Integrity ... sha256+ sha256,rsa4096:dev- OK
>                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
>    Using 'conf at 1' configuration
>    Trying 'ramdisk at 1' ramdisk subimage
>      Description:  miro ramdisk
>      Created:      2017-06-08   9:10:14 UTC
>      Type:         RAMDisk Image
>      Compression:  gzip compressed
>      Data Start:   0x423e92b0
>      Data Size:    8457506 Bytes = 8.1 MiB
>      Architecture: ARM
>      OS:           Linux
>      Load Address: 0x00000000
>      Entry Point:  0x00000000
>      Hash algo:    sha256
>      Hash value:   da60884efa4373e7003940a56271c326f159ff74356ded28d8ebe108af807cda
>      Sign algo:    sha256,rsa4096:dev
>      Sign value:   xxx
>      Timestamp:    2017-06-08   9:10:15 UTC
>    Verifying Hash Integrity ... sha256+ sha256,rsa4096:dev- OK
>                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    Using 'conf at 1' configuration
>    Trying 'fdt at 1' fdt subimage
>      Description:  miro device tree
>      Created:      2017-06-08   9:10:14 UTC
>      Type:         Flat Device Tree
>      Compression:  uncompressed
>      Data Start:   0x423e41b4
>      Data Size:    19852 Bytes = 19.4 KiB
>      Architecture: ARM
>      Hash algo:    sha256
>      Hash value:   9b39c3ab6227bb8f0bcebc0bb64439248a6670dfe873bb1c6536764e0dc1623c
>      Sign algo:    sha256,rsa4096:dev
>      Sign value:   xxx
>      Timestamp:    2017-06-08   9:10:15 UTC
>    Verifying Hash Integrity ... sha256+ sha256,rsa4096:dev- OK
>                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    Booting using the fdt blob at 0x423e41b4
>    Loading Kernel Image ... OK
>    Loading Ramdisk to 47303000, end 47b13d22 ... OK
>    Loading Device Tree to 472fb000, end 47302d8b ... OK
>
> Starting kernel ...
>
> [    0.000000] Booting Linux on physical CPU 0x0
> [    0.000000] Linux version 4.11.0 (hs at hercules.denx.de) (gcc version 6.2.0 (GCC) ) #1 Tue May 16 07:31:30 CEST 2017
> [...]
>
> And linux boots ... which is bad, as we have no valid key appended
> to u-boot.bin ...
>
> With this patch it shows:
>
>    Using 'conf at 1' configuration
>    Verifying Hash Integrity ... OK
>    Trying 'kernel at 1' kernel subimage
>      Description:  Linux kernel
>      Created:      2017-06-08   9:34:28 UTC
>      Type:         Kernel Image
>      Compression:  uncompressed
>      Data Start:   0x420000c0
>      Data Size:    4078928 Bytes = 3.9 MiB
>      Architecture: ARM
>      OS:           Linux
>      Load Address: 0x40008000
>      Entry Point:  0x40008000
>      Hash algo:    sha256
>      Hash value:   6d1dce3e08133ac4d34c0e07ce266f5cffc6f5a2713619c9ff76ca4b04df4a5b
>      Sign algo:    sha256,rsa4096:dev
>      Sign value:   xxx
>      Timestamp:    2017-06-08   9:34:29 UTC
>    Verifying Hash Integrity ... error!
> Unable to verify required signature for '' hash node in 'kernel at 1' image node
> Bad Data Hash
> ERROR: can't get kernel image!
> =>
>
>
>  common/image-sig.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/common/image-sig.c b/common/image-sig.c
> index 455f2b9..646fb08 100644
> --- a/common/image-sig.c
> +++ b/common/image-sig.c
> @@ -265,7 +265,7 @@ int fit_image_verify_required_sigs(const void *fit, int image_noffset,
>         if (sig_node < 0) {
>                 debug("%s: No signature node found: %s\n", __func__,
>                       fdt_strerror(sig_node));
> -               return 0;
> +               return 1;

Thanks for finding/fixing this! I suggest returning -EPERM.

Also note that using image-based security is somewhat insecure since
people can mix and match them. Configuration signing is preferred if
you can do it.

As Tom said, can you add a test please?

>         }
>
>         fdt_for_each_subnode(noffset, sig_blob, sig_node) {
> --
> 2.7.4
>

Regards,
Simon


More information about the U-Boot mailing list