Re: Xen Security Advisory 424 v1 (CVE-2022-42328,CVE-2022-42329) - Guests can trigger deadlock in Linux netback driver
Juergen Gross <[email protected]> Thu, 8 Dec 2022 17:12:32 +0100
| Newsgroups | gmane.comp.emulators.xen.announce |
|---|---|
| Message-ID | <e22fcdce-f029-de46-81a6-60f5ffc9c9a2__47289.8487512552$1670516100$gmane$org@suse.com> |
On 08.12.22 16:59, Pratyush Yadav wrote: > > Hi, > > I noticed one interesting thing about this patch but I'm not familiar > enough with the driver to say for sure what the right thing is. > > On Tue, Dec 06 2022, Xen.org security team wrote: > > [...] >> >> From cfdf8fd81845734b6152b4617746c1127ec52228 Mon Sep 17 00:00:00 2001 >> From: Juergen Gross <[email protected]> >> Date: Tue, 6 Dec 2022 08:54:24 +0100 >> Subject: [PATCH] xen/netback: don't call kfree_skb() with interrupts disabled >> >> It is not allowed to call kfree_skb() from hardware interrupt >> context or with interrupts being disabled. So remove kfree_skb() >> from the spin_lock_irqsave() section and use the already existing >> "drop" label in xenvif_start_xmit() for dropping the SKB. At the >> same time replace the dev_kfree_skb() call there with a call of >> dev_kfree_skb_any(), as xenvif_start_xmit() can be called with >> disabled interrupts. >> >> This is XSA-424 / CVE-2022-42328 / CVE-2022-42329. >> >> Fixes: be81992f9086 ("xen/netback: don't queue unlimited number of packages") >> Reported-by: Yang Yingliang <[email protected]> >> Signed-off-by: Juergen Gross <[email protected]> >> Reviewed-by: Jan Beulich <[email protected]> >> --- >> drivers/net/xen-netback/common.h | 2 +- >> drivers/net/xen-netback/interface.c | 6 ++++-- >> drivers/net/xen-netback/rx.c | 8 +++++--- >> 3 files changed, 10 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h >> index 1545cbee77a4..3dbfc8a6924e 100644 >> --- a/drivers/net/xen-netback/common.h >> +++ b/drivers/net/xen-netback/common.h >> @@ -386,7 +386,7 @@ int xenvif_dealloc_kthread(void *data); >> irqreturn_t xenvif_ctrl_irq_fn(int irq, void *data); >> >> bool xenvif_have_rx_work(struct xenvif_queue *queue, bool test_kthread); >> -void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb); >> +bool xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb); >> >> void xenvif_carrier_on(struct xenvif *vif); >> >> diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c >> index 650fa180220f..f3f2c07423a6 100644 >> --- a/drivers/net/xen-netback/interface.c >> +++ b/drivers/net/xen-netback/interface.c >> @@ -254,14 +254,16 @@ xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) >> if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE) >> skb_clear_hash(skb); >> >> - xenvif_rx_queue_tail(queue, skb); >> + if (!xenvif_rx_queue_tail(queue, skb)) >> + goto drop; >> + >> xenvif_kick_thread(queue); >> >> return NETDEV_TX_OK; >> >> drop: >> vif->dev->stats.tx_dropped++; > > Now tx_dropped is incremented on packet drop... > >> - dev_kfree_skb(skb); >> + dev_kfree_skb_any(skb); >> return NETDEV_TX_OK; >> } >> >> diff --git a/drivers/net/xen-netback/rx.c b/drivers/net/xen-netback/rx.c >> index 932762177110..0ba754ebc5ba 100644 >> --- a/drivers/net/xen-netback/rx.c >> +++ b/drivers/net/xen-netback/rx.c >> @@ -82,9 +82,10 @@ static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue) >> return false; >> } >> >> -void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) >> +bool xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) >> { >> unsigned long flags; >> + bool ret = true; >> >> spin_lock_irqsave(&queue->rx_queue.lock, flags); >> >> @@ -92,8 +93,7 @@ void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) >> struct net_device *dev = queue->vif->dev; >> >> netif_tx_stop_queue(netdev_get_tx_queue(dev, queue->id)); >> - kfree_skb(skb); >> - queue->vif->dev->stats.rx_dropped++; > > ... but earlier rx_dropped was incremented. > > Which one is actually correct? This line was added by be81992f9086b > ("xen/netback: don't queue unlimited number of packages"), which was the > fix for XSA-392. I think incrementing tx_dropped is the right thing to > do, as was done before XSA-392 but it would be nice if someone else > takes a look at this as well. Yes, I think the XSA-392 patch was wrong in this regard. Juergen
OpenPGP_0xB0DE9DD628BF132F.asc
(application/pgp-keys, 3 KB)
-----BEGIN PGP PUBLIC KEY BLOCK----- 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 jR/i1DG86lem3iBDXzXsZDn8R38= =2wuH -----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature
(application/pgp-signature, 495 B) - not displayed