public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: "'cedric.hombourger@siemens.com' via isar-users" <isar-users@googlegroups.com>
To: "isar-users@googlegroups.com" <isar-users@googlegroups.com>,
	"Vadivel, Arulpandiyan" <arulpandiyan.vadivel@siemens.com>,
	"MOESSBAUER, Felix" <felix.moessbauer@siemens.com>
Cc: "Kiszka, Jan" <jan.kiszka@siemens.com>
Subject: Re: [PATCH] meta-isar: add support to verify sha512 checksum for target image
Date: Thu, 9 Oct 2025 14:58:35 +0000	[thread overview]
Message-ID: <7e02c46a294768fd459208cb0989d91da2e5bc53.camel@siemens.com> (raw)
In-Reply-To: <8d487c2c05a0a9b0cdde1b0241642187f001941c.camel@siemens.com>

On Thu, 2025-10-09 at 14:46 +0000, Moessbauer, Felix (FT RPD CED OES-
DE) wrote:
> On Thu, 2025-10-09 at 13:59 +0000, Hombourger, Cedric (FT FDS CES LX)
> wrote:
> > On Thu, 2025-10-09 at 18:39 +0530, Arulpandiyan Vadivel wrote:
> > > In current approach, target images from installer is installed
> > > without any
> > > verifications and validations.
> > > Adding support of verifying image with sha512 checksum before
> > > installing image
> > > Currently during the image installation .bmap files also listed
> > > in
> > > the menu.
> > > Update to show only image name instead of showing supported
> > > artifacts
> > > like .bmap and .sha512.
> > > Added a class to support generating sha512 checksum for the
> > > images.
> 
> Hi, is there a particular reason why not rely on the checksums in the
> bmap? These are WAY better than checksums on compressed artifacts and
> are also correctly checked by the bmap tool (instead of an error
> prone
> custom implementation).
> 
> > > 
> > > Signed-off-by: Arulpandiyan Vadivel
> > > <arulpandiyan.vadivel@siemens.com>
> > > ---
> > >  .../classes/installer-add-rootfs.bbclass      |  6 +-
> > >  ...eploy-image_0.1.bb => deploy-image_0.2.bb} |  2 +-
> > >  .../files/usr/bin/deploy-image-wic.sh         | 56
> > > ++++++++++++++++++-
> > >  meta/classes/image-checksum.bbclass           | 14 +++++
> > >  meta/classes/image.bbclass                    |  1 +
> > >  5 files changed, 76 insertions(+), 3 deletions(-)
> > >  rename meta-isar/recipes-installer/deploy-image/{deploy-
> > > image_0.1.bb
> > > => deploy-image_0.2.bb} (96%)
> > >  create mode 100644 meta/classes/image-checksum.bbclass
> > > 
> > > diff --git a/meta-isar/classes/installer-add-rootfs.bbclass
> > > b/meta-
> > > isar/classes/installer-add-rootfs.bbclass
> > > index c738f690..185e4a3c 100644
> > > --- a/meta-isar/classes/installer-add-rootfs.bbclass
> > > +++ b/meta-isar/classes/installer-add-rootfs.bbclass
> > > @@ -19,7 +19,7 @@ IMAGE_DATA_POSTFIX ??= "wic.zst"
> > >  IMAGE_DATA_POSTFIX:buster ??= "wic.xz"
> > >  IMAGE_DATA_POSTFIX:bullseye ??= "wic.xz"
> > >  
> > > -ROOTFS_ADDITIONAL_FILES ??= "installer-target installer-target-
> > > bmap"
> > > +ROOTFS_ADDITIONAL_FILES ??= "installer-target installer-target-
> > > bmap
> > > installer-target-sha512"
> > >  
> > >  def get_installer_source(d, suffix):
> > >      installer_target_image = d.getVar('INSTALLER_TARGET_IMAGE')
> > > or
> > > ""
> > > @@ -49,4 +49,8 @@ ROOTFS_ADDITIONAL_FILE_installer-
> > > target[destination] = "${@ get_installer_destin
> > >  ROOTFS_ADDITIONAL_FILE_installer-target-bmap[source] = "${@
> > > get_installer_source(d, "wic.bmap")}"
> > >  ROOTFS_ADDITIONAL_FILE_installer-target-bmap[destination] = "${@
> > > get_installer_destination(d, "wic.bmap")}"
> > >  
> > > +# Add support for SHA512 checksum files
> > > +ROOTFS_ADDITIONAL_FILE_installer-target-sha512[source] = "${@
> > > get_installer_source(d, d.getVar('IMAGE_DATA_POSTFIX') +
> > > '.sha512')}"
> > > +ROOTFS_ADDITIONAL_FILE_installer-target-sha512[destination] =
> > > "${@
> > > get_installer_destination(d, d.getVar('IMAGE_DATA_POSTFIX') +
> > > '.sha512')}"
> > > +
> > >  do_rootfs_install[mcdepends] += "${@ get_mc_depends(d,
> > > "do_image_wic")}"
> > > diff --git a/meta-isar/recipes-installer/deploy-image/deploy-
> > > image_0.1.bb b/meta-isar/recipes-installer/deploy-image/deploy-
> > > image_0.2.bb
> > > similarity index 96%
> > > rename from meta-isar/recipes-installer/deploy-image/deploy-
> > > image_0.1.bb
> > > rename to meta-isar/recipes-installer/deploy-image/deploy-
> > > image_0.2.bb
> > > index b287a8d1..0259a5af 100644
> > > --- a/meta-isar/recipes-installer/deploy-image/deploy-
> > > image_0.1.bb
> > > +++ b/meta-isar/recipes-installer/deploy-image/deploy-
> > > image_0.2.bb
> > > @@ -1,5 +1,5 @@
> > >  # This software is a part of ISAR.
> > > -# Copyright (C) Siemens AG, 2024
> > > +# Copyright (C) Siemens AG, 2025
> > >  #
> > >  # SPDX-License-Identifier: MIT
> > >  
> > > diff --git a/meta-isar/recipes-installer/deploy-
> > > image/files/usr/bin/deploy-image-wic.sh b/meta-isar/recipes-
> > > installer/deploy-image/files/usr/bin/deploy-image-wic.sh
> > > index 333762f1..963f5756 100755
> > > --- a/meta-isar/recipes-installer/deploy-
> > > image/files/usr/bin/deploy-
> > > image-wic.sh
> > > +++ b/meta-isar/recipes-installer/deploy-
> > > image/files/usr/bin/deploy-
> > > image-wic.sh
> > > @@ -10,11 +10,65 @@ SCRIPT_DIR=$( dirname -- "$( readlink -f --
> > > "$0";
> > > )"; )
> > >  
> > >  . "${SCRIPT_DIR}/../lib/deploy-image-wic/handle-config.sh"
> > >  
> > > +verify_checksum() {
> > > +    checksum_file="$1"
> > > +    hash_image_file="$2"
> > > +
> > > +    # Get the extension from the checksum file
> > > +    algorithm=$(echo "$checksum_file" | awk -F. '{print $NF}')
> > > +
> > > +    #Read the expected checksum
> > inconsistency (missing space after #)
> > 
> > > +    expected_checksum=$(cut -d' ' -f1 "$checksum_file")
> > > +
> > > +    # Check if the checksum file was empty
> > > +    if [[ -z "$expected_checksum" ]]; then
> > > +        dialog --msgbox "Error: Checksum file is empty or
> > > unreadable, Installation aborted." 6 60
> > > +        exit 1
> > > +    fi
> > > +
> > > +    # Calculate the current checksum of the file
> > > +    local current_checksum
> > > +    case "$algorithm" in
> > > +        sha512)
> > could easily be changed to sha512|sha256|md5
> > > +            current_checksum=$("${algorithm}sum"
> > > "$hash_image_file"
> > 
> > this may take a while, use dialog to let the user abort the
> > verification while running in the background? or ask upfront if
> > integrity of the image should be checked (only if checksum files
> > were
> > found)
> > 
> > also sha512sum -c may be used and would greatly simply this
> > function
> 
> I'm wondering why you decided to use sha512 which is super slow. The
> checksums anyways just protect against bitflips as the checksum files
> are not signed. By that, a much faster checksum like sha1 or sha256
> can
> be used as well.
> 
> > 
> > > > awk '{print $1}')
> > > +            ;;
> > > +        *)
> > > +            dialog --msgbox "Error: Unsupported
> > > algorithm($algorithm), Installation aborted." 6 60
> > > +            exit 1
> > > +            ;;
> > > +    esac
> > > +
> > > +    # Compare the checksums
> > this comment does not add any value
> > > +    if [[ "$current_checksum" == "$expected_checksum" ]]; then
> > > +        echo "Checksum validation success for $checksum_file and
> > > $hash_image_file"
> > > +    else
> > > +        dialog --msgbox "Error: Checksum validation failure for
> > > $checksum_file and $hash_image_file, Installation aborted." 6 60
> > > +        exit 1
> > I would not mix backend and UI code in the same function. Return
> > well
> > defined error codes and display error messages in your UI code
> > > +    fi
> > > +}
> > > +
> > > +hash_files_uri=$(find "$installdata" -type f -iname "*.sha512")
> > 
> > you have above a mechanism to handle various algorithms but only
> > sha512
> > is considered here
> > 
> > > +if [ -n "$hash_files_uri" ]; then
> > > +    for hash_file in $hash_files_uri; do
> > > +        # extract the checksum / bmap file from signed files
> > > name
> > > +        hash_image_file="${hash_file%.*}"
> > > +        if [ -f "$hash_image_file" ] && [ -f "$hash_file" ];
> > > then
> > > +            verify_checksum "$hash_file" "$hash_image_file"
> > > +        else
> > > +            dialog --msgbox "[ERROR] Checksum file or image file
> > > is
> > > missing! Installation aborted" 6 60
> > > +            exit 1
> > > +        fi
> > > +    done
> > > +else
> > > +    dialog --msgbox "Error: No checksum file(s) found for image
> > > artifacts, Installation aborted." 6 60
> > > +    exit 1
> > 
> > this should only be fatal if the installer was configured to
> > generate
> > checksum files along image artifacts and if there are not there but
> > only in that case!
> 
> What would be valuable is to encode the checksum either in the initrd
> or a dm-verity container to sign this externally. By that, we could
> ensure that only "allowed" artifacts can be deployed. But then the
> question still remains, why not simply use a dm-verity container for
> cryptographic integrity and the bmap checksums to check if the
> artifact
> is written correctly.

I am really liking the idea!

> 
> > 
> > > +fi
> > > +
> > >  if ! $installer_unattended; then
> > >      installer_image_uri=$(find "$installdata" -type f -iname
> > > "*.wic*" -a -not -iname "*.wic.bmap" -exec basename {} \;)
> > >      if [ -z "$installer_image_uri" ] || [ ! -f
> > > "$installdata/$installer_image_uri" ]; then
> > >          pushd "$installdata"
> > > -        for f in $(find . -type f); do
> > > +        for f in $(find . -type f -iname "*.wic.zst" -exec
> > > basename
> > > {} \;); do
> > >              array+=("$f" "$f")
> > >          done
> > >          popd
> > > diff --git a/meta/classes/image-checksum.bbclass
> > > b/meta/classes/image-checksum.bbclass
> > > new file mode 100644
> > > index 00000000..673235a0
> > > --- /dev/null
> > > +++ b/meta/classes/image-checksum.bbclass
> > > @@ -0,0 +1,14 @@
> > > +# This software is a part of ISAR.
> > > +# Copyright (C) 2025 Siemens AG
> > > +#
> > > +# SPDX-License-Identifier: MIT
> > > +
> > > +do_generate_checksum() {
> > > +    cd ${DEPLOY_DIR_IMAGE}
> > > +    for postfix in ${IMAGE_FSTYPES}; do
> > > +        [ -f "${IMAGE_FULLNAME}.$postfix" ] || continue
> > > +        sha512sum "${IMAGE_FULLNAME}.$postfix" >
> > > "${IMAGE_FULLNAME}.$postfix.sha512"
> > > +    done
> > > +}
> > > +
> > > +do_image_wic[postfuncs] += "do_generate_checksum"
> > > diff --git a/meta/classes/image.bbclass
> > > b/meta/classes/image.bbclass
> > > index bd1b8552..57216014 100644
> > > --- a/meta/classes/image.bbclass
> > > +++ b/meta/classes/image.bbclass
> > > @@ -141,6 +141,7 @@ IMAGE_CLASSES ??= ""
> > >  IMGCLASSES = "imagetypes imagetypes_wic imagetypes_vm
> > > imagetypes_container squashfs"
> > >  IMGCLASSES += "${IMAGE_CLASSES}"
> > >  inherit ${IMGCLASSES}
> > > +inherit image-checksum
> > not sure we want to always generate checksums (e.g. for development
> > builds, I don't need or want them but would for release builds)
> > >  
> > >  # convenience variables to be used by CMDs
> > >  IMAGE_FILE_HOST =
> > > "${DEPLOY_DIR_IMAGE}/${IMAGE_FULLNAME}.${type}"
> > 
> > While I believe the feature being added would be useful, I think we
> > should make it an opt-in and ensure that no changes are introduced
> > in
> > builds that do not require or want the feature
> 
> I would like to clarify the requirements first, mainly by defining a
> threat model.

Agreed. We should carefully document the why (something along the lines
providing a way to only permit installation images from trusted parties
and with a confirmation that they have not been tampered in some
fashion)

> 
> Felix
> 
> > 
> > tests using the Isar test suite are also missing.
> 
> -- 
> Siemens AG
> Linux Expert Center
> Friedrich-Ludwig-Bauer-Str. 3
> 85748 Garching, Germany
> 

-- 
You received this message because you are subscribed to the Google Groups "isar-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/isar-users/7e02c46a294768fd459208cb0989d91da2e5bc53.camel%40siemens.com.

      reply	other threads:[~2025-10-09 14:58 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-09 13:09 'Arulpandiyan Vadivel' via isar-users
2025-10-09 13:59 ` 'cedric.hombourger@siemens.com' via isar-users
2025-10-09 14:46   ` 'MOESSBAUER, Felix' via isar-users
2025-10-09 14:58     ` 'cedric.hombourger@siemens.com' via isar-users [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7e02c46a294768fd459208cb0989d91da2e5bc53.camel@siemens.com \
    --to=isar-users@googlegroups.com \
    --cc=arulpandiyan.vadivel@siemens.com \
    --cc=cedric.hombourger@siemens.com \
    --cc=felix.moessbauer@siemens.com \
    --cc=jan.kiszka@siemens.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox