All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Roger Pau Monné" <roger@xenproject.org>
To: Stefano Stabellini <stefano.stabellini@amd.com>
Cc: xen-devel@lists.xenproject.org, jbeulich@suse.com,
	andrew.cooper3@citrix.com, jason.andryuk@amd.com,
	teddy.astie@vates.tech
Subject: Re: [PATCH] x86/bzimage: Check that the payload lies within the image
Date: Wed, 21 Oct 2026 11:30:48 +0200	[thread overview]
Message-ID: <atiGSMp-Yy0SXB9-@Mac.lan> (raw)
In-Reply-To: <20261020214825.3655848-1-stefano.stabellini@amd.com>

On Tue, Oct 20, 2026 at 02:48:25PM -0700, Stefano Stabellini wrote:
> bzimage_check() doesn't validate setup_sects, payload_offset or
> payload_length against the image size.  A truncated or malformed bzImage
> therefore makes bzimage_headroom() and bzimage_parse() read beyond the
> end of the boot module, which shows up as a fatal page fault, a bogus
> headroom, or a decompression failure, rather than as a bad image.
> 
> Reject such a header up front.  bzimage_parse() passes bzimage_check() a
> length which includes the decompression headroom in front of the image,
> so subtract it to check against the image alone.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
> ---
>  xen/arch/x86/bzimage.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/x86/bzimage.c b/xen/arch/x86/bzimage.c
> index 66f648f311..a5c48755b6 100644
> --- a/xen/arch/x86/bzimage.c
> +++ b/xen/arch/x86/bzimage.c
> @@ -54,6 +54,8 @@ struct __packed setup_header {
>  
>  static __init int bzimage_check(struct setup_header *hdr, unsigned long len)
>  {
> +    unsigned long payload_start;
> +
>      if ( len < sizeof(struct setup_header) )
>          return 0;
>  
> @@ -65,6 +67,15 @@ static __init int bzimage_check(struct setup_header *hdr, unsigned long len)
>             hdr->version >> 8, hdr->version & 0xff);
>          return -EINVAL;
>      }
> +
> +    payload_start = (hdr->setup_sects + 1) * 512UL + hdr->payload_offset;

Do you really need the UL, doesn't it get auto-promoted to unsigned long
already?

If there's some issue with the types, that requires the calculation to
be promoted top unsigned long, the other instances of this calculation
should also be adjusted.

> +    if ( payload_start > len || hdr->payload_length > len - payload_start )
> +    {
> +        printk("bzImage payload %#x@%#lx exceeds the %#lx byte image\n",

Maybe best wqorded as:

"... payload XXX past the image size (%#lx)"

I think the "byte image" wording is not very clear IMO.

> +               hdr->payload_length, payload_start, len);
> +        return -EINVAL;
> +    }
> +
>      return 1;
>  }
>  
> @@ -107,7 +118,8 @@ int __init bzimage_parse(void *image_base, void **image_start,
>                           unsigned long *image_len)
>  {
>      struct setup_header *hdr = (struct setup_header *)(*image_start);
> -    int err = bzimage_check(hdr, *image_len);
> +    /* *image_len also counts the headroom ahead of *image_start. */

IMO you can remove the dereferences from the variable names, it just
makes the comment harder to reads for no real benefit, readers already
know by context you are referencing the contents, not the pointer
address.

Thanks, Roger.


  reply	other threads:[~2026-10-21  9:31 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-20 21:48 [PATCH] x86/bzimage: Check that the payload lies within the image Stefano Stabellini
2026-10-21  9:30 ` Roger Pau Monné [this message]
2026-10-26 12:23   ` Jan Beulich
2026-10-26 22:10 ` [PATCH v2] " Stefano Stabellini
2026-10-27 10:51   ` Jan Beulich
2026-10-27 19:43     ` Stefano Stabellini
2026-10-28  7:05       ` Jan Beulich

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=atiGSMp-Yy0SXB9-@Mac.lan \
    --to=roger@xenproject.org \
    --cc=andrew.cooper3@citrix.com \
    --cc=jason.andryuk@amd.com \
    --cc=jbeulich@suse.com \
    --cc=stefano.stabellini@amd.com \
    --cc=teddy.astie@vates.tech \
    --cc=xen-devel@lists.xenproject.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.