From: "Ceraolo Spurio, Daniele" <daniele.ceraolospurio@intel.com>
To: Lucas De Marchi <lucas.demarchi@intel.com>,
<intel-gfx@lists.freedesktop.org>
Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
Subject: Re: [Intel-gfx] [PATCH] drm/i915/gt: Avoid out-of-bounds access when loading HuC
Date: Thu, 13 Apr 2023 14:50:54 -0700 [thread overview]
Message-ID: <c8b9ffb8-865b-c593-4458-07edb0ee482e@intel.com> (raw)
In-Reply-To: <20230413200349.3492571-1-lucas.demarchi@intel.com>
On 4/13/2023 1:03 PM, Lucas De Marchi wrote:
> When HuC is loaded by GSC, there is no header definition for the kernel
> to look at and firmware is just handed to GSC. However when reading the
> version, it should still check the size of the blob to guarantee it's not
> incurring into out-of-bounds array access.
>
> If firmware is smaller than expected, the following message is now
> printed:
>
> # echo boom > /lib/firmware/i915/dg2_huc_gsc.bin
> # dmesg | grep -i huc
> [drm] GT0: HuC firmware i915/dg2_huc_gsc.bin: invalid size: 5 < 184
> [drm] *ERROR* GT0: HuC firmware i915/dg2_huc_gsc.bin: fetch failed -ENODATA
> ...
>
> Even without this change the size, header and signature are still
> checked by GSC when loading, so this only avoids the out-of-bounds array
> access.
>
> Fixes: a7b516bd981f ("drm/i915/huc: Add fetch support for gsc-loaded HuC binary")
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Daniele
> ---
> drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
> index 1ac6f9f340e3..a82a53dbbc86 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
> @@ -489,12 +489,25 @@ static void __force_fw_fetch_failures(struct intel_uc_fw *uc_fw, int e)
> }
> }
>
> -static int check_gsc_manifest(const struct firmware *fw,
> +static int check_gsc_manifest(struct intel_gt *gt,
> + const struct firmware *fw,
> struct intel_uc_fw *uc_fw)
> {
> u32 *dw = (u32 *)fw->data;
> - u32 version_hi = dw[HUC_GSC_VERSION_HI_DW];
> - u32 version_lo = dw[HUC_GSC_VERSION_LO_DW];
> + u32 version_hi, version_lo;
> + size_t min_size;
> +
> + /* Check the size of the blob before examining buffer contents */
> + min_size = sizeof(u32) * (HUC_GSC_VERSION_LO_DW + 1);
> + if (unlikely(fw->size < min_size)) {
> + gt_warn(gt, "%s firmware %s: invalid size: %zu < %zu\n",
> + intel_uc_fw_type_repr(uc_fw->type), uc_fw->file_selected.path,
> + fw->size, min_size);
> + return -ENODATA;
> + }
> +
> + version_hi = dw[HUC_GSC_VERSION_HI_DW];
> + version_lo = dw[HUC_GSC_VERSION_LO_DW];
>
> uc_fw->file_selected.ver.major = FIELD_GET(HUC_GSC_MAJOR_VER_HI_MASK, version_hi);
> uc_fw->file_selected.ver.minor = FIELD_GET(HUC_GSC_MINOR_VER_HI_MASK, version_hi);
> @@ -665,7 +678,7 @@ static int check_fw_header(struct intel_gt *gt,
> return 0;
>
> if (uc_fw->loaded_via_gsc)
> - err = check_gsc_manifest(fw, uc_fw);
> + err = check_gsc_manifest(gt, fw, uc_fw);
> else
> err = check_ccs_header(gt, fw, uc_fw);
> if (err)
next prev parent reply other threads:[~2023-04-13 21:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-13 20:03 [Intel-gfx] [PATCH] drm/i915/gt: Avoid out-of-bounds access when loading HuC Lucas De Marchi
2023-04-13 21:50 ` Ceraolo Spurio, Daniele [this message]
2023-04-13 22:25 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2023-04-13 22:36 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2023-04-14 4:59 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
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=c8b9ffb8-865b-c593-4458-07edb0ee482e@intel.com \
--to=daniele.ceraolospurio@intel.com \
--cc=alan.previn.teres.alexis@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=lucas.demarchi@intel.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