All of lore.kernel.org
 help / color / mirror / Atom feed
From: Niklas Cassel <cassel@kernel.org>
To: Matthias Goergens <matthias.goergens@gmail.com>
Cc: Damien Le Moal <dlemoal@kernel.org>,
	linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org,
	stable@vger.kernel.org
Subject: Re: [PATCH] ata: libata-scsi: bound the ATA passthru sense descriptor writes
Date: Wed, 23 Sep 2026 18:36:57 +0200	[thread overview]
Message-ID: <arQAKYab-LWSIRfy@ryzen> (raw)
In-Reply-To: <20260922182655.2423663-1-matthias.goergens@gmail.com>

On Wed, Sep 23, 2026 at 02:26:55AM +0800, Matthias Goergens wrote:
> When an ATA PASS-THROUGH command to an ATAPI device fails, the sense
> buffer holds the device's REQUEST SENSE reply, and
> ata_scsi_set_passthru_sense_fields() trusts its additional length
> byte, sb[7], when adding the ATA Status Return descriptor.  A faulty
> or malicious device can use that to make the kernel read and write
> past the 96-byte buffer in three ways:
> 
> - scsi_sense_desc_find() is passed sb[7] + 8 as the buffer length, so
>   its clamp against sb[7] does nothing and the walk runs off the end.
> - A type-9 descriptor found near the end is filled in unchecked.
> - A new descriptor at sb[8 + len] needs len + 22 bytes, not len + 14,
>   so len 75..82 writes up to 8 bytes past the end.
> 
> Reproduced with KASAN under qemu, with the emulated ATAPI REQUEST SENSE
> reply patched:
> 
>   BUG: KASAN: slab-out-of-bounds in scsi_sense_desc_find+0x1a5/0x210
>   BUG: KASAN: slab-out-of-bounds in ata_scsi_qc_complete+0x1a15/0x1a50
> 
> Both are gone with this patch, and a valid descriptor is still filled
> in.
> 
> Fixes: 97981926224a ("ata: libata-scsi: Do not overwrite valid sense data when CK_COND=1")
> Cc: stable@vger.kernel.org
> Signed-off-by: Matthias Goergens <matthias.goergens@gmail.com>
> ---
>  drivers/ata/libata-scsi.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
> index 7e22bbc38238..40e56ff52f09 100644
> --- a/drivers/ata/libata-scsi.c
> +++ b/drivers/ata/libata-scsi.c
> @@ -261,12 +261,18 @@ static void ata_scsi_set_passthru_sense_fields(struct ata_queued_cmd *qc)
>  
>  		/* descriptor format */
>  		len = sb[7];
> -		desc = (char *)scsi_sense_desc_find(sb, len + 8, 9);
> +		desc = (char *)scsi_sense_desc_find(sb, SCSI_SENSE_BUFFERSIZE, 9);
>  		if (!desc) {
> -			if (SCSI_SENSE_BUFFERSIZE < len + 14)
> +			/*
> +			 * The descriptor is written at sb[8 + len] and is 14
> +			 * bytes long, so it needs len + 22 bytes of buffer.
> +			 */
> +			if (len + 22 > SCSI_SENSE_BUFFERSIZE)
>  				return;
>  			sb[7] = len + 14;
>  			desc = sb + 8 + len;
> +		} else if (desc + 14 > sb + SCSI_SENSE_BUFFERSIZE) {

desc + 14 can point past one-past-the-end before the comparison, which
strict C doesn't allow. The kernel builds with -fno-strict-overflow,
so in practice it's fine, but:

+               } else if (desc - sb > SCSI_SENSE_BUFFERSIZE - 14) {

should be equivalent and safer.


Kind regards,
Niklas

      parent reply	other threads:[~2026-09-23 16:37 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-22 18:26 [PATCH] ata: libata-scsi: bound the ATA passthru sense descriptor writes Matthias Goergens
2026-09-23  5:53 ` Damien Le Moal
2026-09-23 16:36 ` Niklas Cassel [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=arQAKYab-LWSIRfy@ryzen \
    --to=cassel@kernel.org \
    --cc=dlemoal@kernel.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthias.goergens@gmail.com \
    --cc=stable@vger.kernel.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.