virt: tdx-guest: Fix handling of host controlled 'quote' buffer length
Validate host controlled value `quote_buf->out_len` that determines how
many bytes of the quote are copied out to guest userspace. In TDX
environments with remote attestation, quotes are not considered private,
and can be forwarded to an attestation server.
Catch scenarios where the host specifies a response length larger than
the guest's allocation, or otherwise races modifying the response while
the guest consumes it.
This prevents contents beyond the pages allocated for `quote_buf`
(up to TSM_REPORT_OUTBLOB_MAX) from being read out to guest userspace,
and possibly forwarded in attestation requests.
Recall that some deployments want per-container configs-tsm-report
interfaces, so the leak may cross container protection boundaries, not
just local root.
Fixes: f4738f56d1 ("virt: tdx-guest: Add Quote generation support using TSM_REPORTS")
Cc: stable@vger.kernel.org
Signed-off-by: Zubin Mithra <zsm@google.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Kiryl Shutsemau (Meta) <kas@kernel.org>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
f338e77383
commit
c3fd16c3b9
|
|
@ -171,6 +171,8 @@ static void tdx_mr_deinit(const struct attribute_group *mr_grp)
|
|||
#define GET_QUOTE_SUCCESS 0
|
||||
#define GET_QUOTE_IN_FLIGHT 0xffffffffffffffff
|
||||
|
||||
#define TDX_QUOTE_MAX_LEN (GET_QUOTE_BUF_SIZE - sizeof(struct tdx_quote_buf))
|
||||
|
||||
/* struct tdx_quote_buf: Format of Quote request buffer.
|
||||
* @version: Quote format version, filled by TD.
|
||||
* @status: Status code of Quote request, filled by VMM.
|
||||
|
|
@ -269,6 +271,7 @@ static int tdx_report_new_locked(struct tsm_report *report, void *data)
|
|||
u8 *buf;
|
||||
struct tdx_quote_buf *quote_buf = quote_data;
|
||||
struct tsm_report_desc *desc = &report->desc;
|
||||
u32 out_len;
|
||||
int ret;
|
||||
u64 err;
|
||||
|
||||
|
|
@ -306,12 +309,17 @@ static int tdx_report_new_locked(struct tsm_report *report, void *data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
buf = kvmemdup(quote_buf->data, quote_buf->out_len, GFP_KERNEL);
|
||||
out_len = READ_ONCE(quote_buf->out_len);
|
||||
|
||||
if (out_len > TDX_QUOTE_MAX_LEN)
|
||||
return -EFBIG;
|
||||
|
||||
buf = kvmemdup(quote_buf->data, out_len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
report->outblob = buf;
|
||||
report->outblob_len = quote_buf->out_len;
|
||||
report->outblob_len = out_len;
|
||||
|
||||
/*
|
||||
* TODO: parse the PEM-formatted cert chain out of the quote buffer when
|
||||
|
|
|
|||
Loading…
Reference in New Issue