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