diff options
| author | Matthias Goergens <matthias.goergens@gmail.com> | 2026-09-24 01:52:03 +0800 |
|---|---|---|
| committer | Niklas Cassel <cassel@kernel.org> | 2026-09-23 21:05:55 +0200 |
| commit | 80320b278fea07ffcda3f57b67b61658e0a4e1ca (patch) | |
| tree | 3f200b99d36bd2611178e89a6b727f6f79adcebe /kernel | |
| parent | 88a0474d92ba102fff860db3cae9da87a0964fbf (diff) | |
| download | linux-next-80320b278fea07ffcda3f57b67b61658e0a4e1ca.tar.gz linux-next-80320b278fea07ffcda3f57b67b61658e0a4e1ca.zip | |
ata: libata-scsi: bound the ATA passthru sense descriptor writes
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
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Matthias Goergens <matthias.goergens@gmail.com>
Link: https://lore.kernel.org/r/20260923175203.1576825-1-matthias.goergens@gmail.com
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Diffstat (limited to 'kernel')
0 files changed, 0 insertions, 0 deletions
