Message ID | 20240803121817.383567-1-zhanghao1@kylinos.cn (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | nfc: nci: Fix uninit-value in nci_rx_work() | expand |
On Sat, Aug 03, 2024 at 08:18:17PM +0800, zhanghao wrote: > Commit e624e6c3e777 ("nfc: Add a virtual nci device driver") > calls alloc_skb() with GFP_KERNEL as the argument flags.The > allocated heap memory was not initialized.This causes KMSAN > to detect an uninitialized value. > > Reported-by: syzbot+3da70a0abd7f5765b6ea@syzkaller.appspotmail.com > Closes: https://syzkaller.appspot.com/bug?extid=3da70a0abd7f5765b6ea Hi, I wonder if the problem reported above is caused by accessing packet data which is past the end of what is copied in virtual_ncidev_write(). I.e. count is unusually short and this is not being detected. > Fixes: e624e6c3e777 ("nfc: Add a virtual nci device driver") > Link: https://lore.kernel.org/all/000000000000747dd6061a974686@google.com/T/ > Signed-off-by: zhanghao <zhanghao1@kylinos.cn> > --- > drivers/nfc/virtual_ncidev.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/nfc/virtual_ncidev.c b/drivers/nfc/virtual_ncidev.c > index 6b89d596ba9a..ae1592db131e 100644 > --- a/drivers/nfc/virtual_ncidev.c > +++ b/drivers/nfc/virtual_ncidev.c > @@ -117,7 +117,7 @@ static ssize_t virtual_ncidev_write(struct file *file, > struct virtual_nci_dev *vdev = file->private_data; > struct sk_buff *skb; > > - skb = alloc_skb(count, GFP_KERNEL); > + skb = alloc_skb(count, GFP_KERNEL|__GFP_ZERO); > if (!skb) > return -ENOMEM; I'm not sure this helps wrt initialising the memory as immediately below there is; if (copy_from_user(skb_put(skb, count), buf, count)) { ... Which I assume will initialise count bytes of skb data.
On 04/08/2024 12:57, Simon Horman wrote: > On Sat, Aug 03, 2024 at 08:18:17PM +0800, zhanghao wrote: >> Commit e624e6c3e777 ("nfc: Add a virtual nci device driver") >> calls alloc_skb() with GFP_KERNEL as the argument flags.The >> allocated heap memory was not initialized.This causes KMSAN >> to detect an uninitialized value. >> >> Reported-by: syzbot+3da70a0abd7f5765b6ea@syzkaller.appspotmail.com >> Closes: https://syzkaller.appspot.com/bug?extid=3da70a0abd7f5765b6ea > > Hi, > > I wonder if the problem reported above is caused by accessing packet > data which is past the end of what is copied in virtual_ncidev_write(). > I.e. count is unusually short and this is not being detected. > >> Fixes: e624e6c3e777 ("nfc: Add a virtual nci device driver") >> Link: https://lore.kernel.org/all/000000000000747dd6061a974686@google.com/T/ >> Signed-off-by: zhanghao <zhanghao1@kylinos.cn> >> --- >> drivers/nfc/virtual_ncidev.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/drivers/nfc/virtual_ncidev.c b/drivers/nfc/virtual_ncidev.c >> index 6b89d596ba9a..ae1592db131e 100644 >> --- a/drivers/nfc/virtual_ncidev.c >> +++ b/drivers/nfc/virtual_ncidev.c >> @@ -117,7 +117,7 @@ static ssize_t virtual_ncidev_write(struct file *file, >> struct virtual_nci_dev *vdev = file->private_data; >> struct sk_buff *skb; >> >> - skb = alloc_skb(count, GFP_KERNEL); >> + skb = alloc_skb(count, GFP_KERNEL|__GFP_ZERO); >> if (!skb) >> return -ENOMEM; > > I'm not sure this helps wrt initialising the memory as immediately below there > is; > > if (copy_from_user(skb_put(skb, count), buf, count)) { > ... > > Which I assume will initialise count bytes of skb data. Yeah, this looks like hiding the real issue. Best regards, Krzysztof
On 04/08/2024 12:57, Simon Horman wrote: > > On Sat, Aug 03, 2024 at 08:18:17PM +0800, zhanghao wrote: > >> Commit e624e6c3e777 ("nfc: Add a virtual nci device driver") > >> calls alloc_skb() with GFP_KERNEL as the argument flags.The > >> allocated heap memory was not initialized.This causes KMSAN > >> to detect an uninitialized value. > >> > >> Reported-by: syzbot+3da70a0abd7f5765b6ea@syzkaller.appspotmail.com > >> Closes: https://syzkaller.appspot.com/bug?extid=3da70a0abd7f5765b6ea > > > > Hi, > > > > I wonder if the problem reported above is caused by accessing packet > > data which is past the end of what is copied in virtual_ncidev_write(). > > I.e. count is unusually short and this is not being detected. > > Yes, you're right.I debug the kernel and find that skb->data is " ".The length is less than 2.Using nci_plen to access skb->data in nci_rx_work() triggers kmsan to detect access to uninitialized memory. I wonder if I can use skb->len to determine length in the nci_rx_work().I tested it and there was no problem. > >> Fixes: e624e6c3e777 ("nfc: Add a virtual nci device driver") > >> Link: https://lore.kernel.org/all/000000000000747dd6061a974686@google.com/T/ > >> Signed-off-by: zhanghao <zhanghao1@kylinos.cn> > >> --- > >> drivers/nfc/virtual_ncidev.c | 2 +- > >> 1 file changed, 1 insertion(+), 1 deletion(-) > >> > >> diff --git a/drivers/nfc/virtual_ncidev.c b/drivers/nfc/virtual_ncidev.c > >> index 6b89d596ba9a..ae1592db131e 100644 > >> --- a/drivers/nfc/virtual_ncidev.c > >> +++ b/drivers/nfc/virtual_ncidev.c > >> @@ -117,7 +117,7 @@ static ssize_t virtual_ncidev_write(struct file *file, > >> struct virtual_nci_dev *vdev = file->private_data; > >> struct sk_buff *skb; > >> > >> - skb = alloc_skb(count, GFP_KERNEL); > >> + skb = alloc_skb(count, GFP_KERNEL|__GFP_ZERO); > >> if (!skb) > >> return -ENOMEM; > > > > I'm not sure this helps wrt initialising the memory as immediately below there > > is; > > > > if (copy_from_user(skb_put(skb, count), buf, count)) { > > ... > > > > Which I assume will initialise count bytes of skb data. > > Yeah, this looks like hiding the real issue. > > Best regards, > Krzysztof
diff --git a/drivers/nfc/virtual_ncidev.c b/drivers/nfc/virtual_ncidev.c index 6b89d596ba9a..ae1592db131e 100644 --- a/drivers/nfc/virtual_ncidev.c +++ b/drivers/nfc/virtual_ncidev.c @@ -117,7 +117,7 @@ static ssize_t virtual_ncidev_write(struct file *file, struct virtual_nci_dev *vdev = file->private_data; struct sk_buff *skb; - skb = alloc_skb(count, GFP_KERNEL); + skb = alloc_skb(count, GFP_KERNEL|__GFP_ZERO); if (!skb) return -ENOMEM;
Commit e624e6c3e777 ("nfc: Add a virtual nci device driver") calls alloc_skb() with GFP_KERNEL as the argument flags.The allocated heap memory was not initialized.This causes KMSAN to detect an uninitialized value. Reported-by: syzbot+3da70a0abd7f5765b6ea@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=3da70a0abd7f5765b6ea Fixes: e624e6c3e777 ("nfc: Add a virtual nci device driver") Link: https://lore.kernel.org/all/000000000000747dd6061a974686@google.com/T/ Signed-off-by: zhanghao <zhanghao1@kylinos.cn> --- drivers/nfc/virtual_ncidev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) base-commit: 17712b7ea0756799635ba159cc773082230ed028