qemu/hw/sd
Philippe Mathieu-Daudé a9bcedd15a hw/sd/sdcard: Do not allow invalid SD card sizes
QEMU allows to create SD card with unrealistic sizes. This could
work, but some guests (at least Linux) consider sizes that are not
a power of 2 as a firmware bug and fix the card size to the next
power of 2.

While the possibility to use small SD card images has been seen as
a feature, it became a bug with CVE-2020-13253, where the guest is
able to do OOB read/write accesses past the image size end.

In a pair of commits we will fix CVE-2020-13253 as:

    Read command is rejected if BLOCK_LEN_ERROR or ADDRESS_ERROR
    occurred and no data transfer is performed.

    Write command is rejected if BLOCK_LEN_ERROR or ADDRESS_ERROR
    occurred and no data transfer is performed.

    WP_VIOLATION errors are not modified: the error bit is set, we
    stay in receive-data state, wait for a stop command. All further
    data transfer is ignored. See the check on sd->card_status at the
    beginning of sd_read_data() and sd_write_data().

While this is the correct behavior, in case QEMU create smaller SD
cards, guests still try to access past the image size end, and QEMU
considers this is an invalid address, thus "all further data transfer
is ignored". This is wrong and make the guest looping until
eventually timeouts.

Fix by not allowing invalid SD card sizes (suggesting the expected
size as a hint):

  $ qemu-system-arm -M orangepi-pc -drive file=rootfs.ext2,if=sd,format=raw
  qemu-system-arm: Invalid SD card size: 60 MiB
  SD card size has to be a power of 2, e.g. 64 MiB.
  You can resize disk images with 'qemu-img resize <imagefile> <new-size>'
  (note that this will lose data if you make the image smaller than it currently is).

Cc: qemu-stable@nongnu.org
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20200713183209.26308-8-f4bug@amsat.org>
2020-07-14 15:46:07 +02:00
..
allwinner-sdhost.c hw/arm/allwinner: add SD/MMC host controller 2020-03-12 16:27:33 +00:00
aspeed_sdhci.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
bcm2835_sdhost.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
core.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
Kconfig hw/sd/sdhci: Move PCI-related code into a separate file 2019-03-12 07:49:04 +01:00
Makefile.objs hw/arm/allwinner: add SD/MMC host controller 2020-03-12 16:27:33 +00:00
milkymist-memcard.c sd/milkymist-memcard: Plug minor memory leak in realize 2020-07-02 06:25:29 +02:00
omap_mmc.c add device_legacy_reset function to prepare for reset api change 2020-01-30 16:02:03 +00:00
pl181.c add device_legacy_reset function to prepare for reset api change 2020-01-30 16:02:03 +00:00
pxa2xx_mmci.c sd/pxa2xx_mmci: Don't crash on pxa2xx_mmci_init() error 2020-06-23 16:07:07 +02:00
sd.c hw/sd/sdcard: Do not allow invalid SD card sizes 2020-07-14 15:46:07 +02:00
sdhci-internal.h sd: sdhci: Implement basic vendor specific register support 2020-06-16 10:32:29 +01:00
sdhci-pci.c sd: Use ERRP_GUARD() 2020-07-10 15:18:09 +02:00
sdhci.c sd: Use ERRP_GUARD() 2020-07-10 15:18:09 +02:00
sdmmc-internal.c sdcard: Display command name when tracing CMD/ACMD 2018-03-09 17:09:44 +00:00
sdmmc-internal.h Clean up header guards that don't match their file name 2019-05-13 08:58:55 +02:00
ssi-sd.c sd: Use ERRP_GUARD() 2020-07-10 15:18:09 +02:00
trace-events hw/arm/allwinner: add SD/MMC host controller 2020-03-12 16:27:33 +00:00