Hi, On Mon, Nov 7, 2022 at 7:08 PM Mauro Matteo Cascella <mcasc...@redhat.com> wrote: > > On Mon, Nov 7, 2022 at 11:35 AM Mauro Matteo Cascella > <mcasc...@redhat.com> wrote: > > > > Make sure to reset data_count if it's equal to (or exceeds) block_size. > > This prevents an off-by-one read / write when accessing s->fifo_buffer > > in sdhci_read_dataport / sdhci_write_dataport, both called right after > > sdhci_buff_access_is_sequential. > > > > Fixes: CVE-2022-3872 > > Reported-by: RivenDell <xrivend...@outlook.com> > > Reported-by: Siqi Chen <coc.c...@gmail.com> > > Reported-by: ningqiang <ningqia...@huawei.com> > > Signed-off-by: Mauro Matteo Cascella <mcasc...@redhat.com> > > --- > > hw/sd/sdhci.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c > > index 306070c872..aa2fd79df2 100644 > > --- a/hw/sd/sdhci.c > > +++ b/hw/sd/sdhci.c > > @@ -978,6 +978,10 @@ static bool sdhci_can_issue_command(SDHCIState *s) > > static inline bool > > sdhci_buff_access_is_sequential(SDHCIState *s, unsigned byte_num) > > { > > + if (s->data_count >= (s->blksize & BLOCK_SIZE_MASK)) { > > + s->data_count = 0; > > + } > > + > > if ((s->data_count & 0x3) != byte_num) { > > trace_sdhci_error("Non-sequential access to Buffer Data Port > > register" > > "is prohibited\n"); > > -- > > 2.38.1 > > > > Reproducer: > > cat << EOF | ./qemu-system-x86_64 -machine accel=qtest \ > -nodefaults -drive if=none,index=0,file=null-co://,format=raw,id=mydrive \ > -device sdhci-pci -device sd-card,drive=mydrive -nographic -qtest stdio > outl 0xcf8 0x80001004 > outl 0xcfc 0x107 > outl 0xcf8 0x80001010 > outl 0xcfc 0xfebf1000 > writel 0xfebf102c 0x7 > writel 0xfebf1004 0x10200 > writel 0xfebf100c 0x200000 > writel 0xfebf1028 0x10000 > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1020 0xdeadbeef > writel 0xfebf1004 0x200 > writel 0xfebf100c 0x20 > writel 0xfebf1028 0x20000 > writel 0x00100000 0xfebf1021 > writel 0xfebf1058 0x00100000 > writel 0xfebf1028 0x8 > writel 0xfebf100c 0x200011 > writel 0xfebf1020 0xaabbccdd > EOF >
This reproducer does not crash my QEMU. Am I missing anything? Regards, Bin