mbox series

[SRU,N,0/1] CVE-2024-45016

Message ID 20240924154507.14124-1-ian.whitfield@canonical.com
Headers show
Series CVE-2024-45016 | expand

Message

Ian Whitfield Sept. 24, 2024, 3:45 p.m. UTC
[Impact]

netem: fix return value if duplicate enqueue fails

There is a bug in netem_enqueue() introduced by
commit 5845f706388a ("net: netem: fix skb length BUG_ON in __skb_to_sgvec")
that can lead to a use-after-free.

This commit made netem_enqueue() always return NET_XMIT_SUCCESS
when a packet is duplicated, which can cause the parent qdisc's q.qlen
to be mistakenly incremented. When this happens qlen_notify() may be
skipped on the parent during destruction, leaving a dangling pointer
for some classful qdiscs like DRR.

There are two ways for the bug happen:

- If the duplicated packet is dropped by rootq->enqueue() and then
  the original packet is also dropped.
- If rootq->enqueue() sends the duplicated packet to a different qdisc
  and the original packet is dropped.

In both cases NET_XMIT_SUCCESS is returned even though no packets
are enqueued at the netem qdisc.

The fix is to defer the enqueue of the duplicate packet until after
the original packet has been guaranteed to return NET_XMIT_SUCCESS.

[Backport]

The fix was cleanly applied.

[Fix]

Noble:  backport
Jammy:  fixed via stable
Focal:  fixed via stable
Bionic: fix sent to esm ML
Xenial: not affected
Trusty: not affected

[Test Case]

Compile and boot tested

[Where problems could occur]

This fix affects those who use netem, the Linux network emulator.
An issue with this fix would be visible to user via a use-after-free
under specific conditions, leading to a system crash or unexpected
behavior.


Stephen Hemminger (1):
  netem: fix return value if duplicate enqueue fails

 net/sched/sch_netem.c | 47 ++++++++++++++++++++++++++-----------------
 1 file changed, 29 insertions(+), 18 deletions(-)

Comments

Magali Lemes Sept. 24, 2024, 6:29 p.m. UTC | #1
Acked-by: Magali Lemes <magali.lemes@canonical.com>

On 24/09/2024 12:45, Ian Whitfield wrote:
> [Impact]
> 
> netem: fix return value if duplicate enqueue fails
> 
> There is a bug in netem_enqueue() introduced by
> commit 5845f706388a ("net: netem: fix skb length BUG_ON in __skb_to_sgvec")
> that can lead to a use-after-free.
> 
> This commit made netem_enqueue() always return NET_XMIT_SUCCESS
> when a packet is duplicated, which can cause the parent qdisc's q.qlen
> to be mistakenly incremented. When this happens qlen_notify() may be
> skipped on the parent during destruction, leaving a dangling pointer
> for some classful qdiscs like DRR.
> 
> There are two ways for the bug happen:
> 
> - If the duplicated packet is dropped by rootq->enqueue() and then
>    the original packet is also dropped.
> - If rootq->enqueue() sends the duplicated packet to a different qdisc
>    and the original packet is dropped.
> 
> In both cases NET_XMIT_SUCCESS is returned even though no packets
> are enqueued at the netem qdisc.
> 
> The fix is to defer the enqueue of the duplicate packet until after
> the original packet has been guaranteed to return NET_XMIT_SUCCESS.
> 
> [Backport]
> 
> The fix was cleanly applied.
> 
> [Fix]
> 
> Noble:  backport
> Jammy:  fixed via stable
> Focal:  fixed via stable
> Bionic: fix sent to esm ML
> Xenial: not affected
> Trusty: not affected
> 
> [Test Case]
> 
> Compile and boot tested
> 
> [Where problems could occur]
> 
> This fix affects those who use netem, the Linux network emulator.
> An issue with this fix would be visible to user via a use-after-free
> under specific conditions, leading to a system crash or unexpected
> behavior.
> 
> 
> Stephen Hemminger (1):
>    netem: fix return value if duplicate enqueue fails
> 
>   net/sched/sch_netem.c | 47 ++++++++++++++++++++++++++-----------------
>   1 file changed, 29 insertions(+), 18 deletions(-)
>
Jacob Martin Sept. 24, 2024, 7 p.m. UTC | #2
On Tue, Sep 24, 2024 at 08:45:06AM -0700, Ian Whitfield wrote:
> [Impact]
> 
> netem: fix return value if duplicate enqueue fails
> 
> There is a bug in netem_enqueue() introduced by
> commit 5845f706388a ("net: netem: fix skb length BUG_ON in __skb_to_sgvec")
> that can lead to a use-after-free.
> 
> This commit made netem_enqueue() always return NET_XMIT_SUCCESS
> when a packet is duplicated, which can cause the parent qdisc's q.qlen
> to be mistakenly incremented. When this happens qlen_notify() may be
> skipped on the parent during destruction, leaving a dangling pointer
> for some classful qdiscs like DRR.
> 
> There are two ways for the bug happen:
> 
> - If the duplicated packet is dropped by rootq->enqueue() and then
>   the original packet is also dropped.
> - If rootq->enqueue() sends the duplicated packet to a different qdisc
>   and the original packet is dropped.
> 
> In both cases NET_XMIT_SUCCESS is returned even though no packets
> are enqueued at the netem qdisc.
> 
> The fix is to defer the enqueue of the duplicate packet until after
> the original packet has been guaranteed to return NET_XMIT_SUCCESS.
> 
> [Backport]
> 
> The fix was cleanly applied.
> 
> [Fix]
> 
> Noble:  backport
> Jammy:  fixed via stable
> Focal:  fixed via stable
> Bionic: fix sent to esm ML
> Xenial: not affected
> Trusty: not affected
> 
> [Test Case]
> 
> Compile and boot tested
> 
> [Where problems could occur]
> 
> This fix affects those who use netem, the Linux network emulator.
> An issue with this fix would be visible to user via a use-after-free
> under specific conditions, leading to a system crash or unexpected
> behavior.
> 
> 
> Stephen Hemminger (1):
>   netem: fix return value if duplicate enqueue fails
> 
>  net/sched/sch_netem.c | 47 ++++++++++++++++++++++++++-----------------
>  1 file changed, 29 insertions(+), 18 deletions(-)

Acked-by: Jacob Martin <jacob.martin@canonical.com>
Stefan Bader Sept. 25, 2024, noon UTC | #3
On 24.09.24 17:45, Ian Whitfield wrote:
> [Impact]
> 
> netem: fix return value if duplicate enqueue fails
> 
> There is a bug in netem_enqueue() introduced by
> commit 5845f706388a ("net: netem: fix skb length BUG_ON in __skb_to_sgvec")
> that can lead to a use-after-free.
> 
> This commit made netem_enqueue() always return NET_XMIT_SUCCESS
> when a packet is duplicated, which can cause the parent qdisc's q.qlen
> to be mistakenly incremented. When this happens qlen_notify() may be
> skipped on the parent during destruction, leaving a dangling pointer
> for some classful qdiscs like DRR.
> 
> There are two ways for the bug happen:
> 
> - If the duplicated packet is dropped by rootq->enqueue() and then
>    the original packet is also dropped.
> - If rootq->enqueue() sends the duplicated packet to a different qdisc
>    and the original packet is dropped.
> 
> In both cases NET_XMIT_SUCCESS is returned even though no packets
> are enqueued at the netem qdisc.
> 
> The fix is to defer the enqueue of the duplicate packet until after
> the original packet has been guaranteed to return NET_XMIT_SUCCESS.
> 
> [Backport]
> 
> The fix was cleanly applied.
> 
> [Fix]
> 
> Noble:  backport
> Jammy:  fixed via stable
> Focal:  fixed via stable
> Bionic: fix sent to esm ML
> Xenial: not affected
> Trusty: not affected
> 
> [Test Case]
> 
> Compile and boot tested
> 
> [Where problems could occur]
> 
> This fix affects those who use netem, the Linux network emulator.
> An issue with this fix would be visible to user via a use-after-free
> under specific conditions, leading to a system crash or unexpected
> behavior.
> 
> 
> Stephen Hemminger (1):
>    netem: fix return value if duplicate enqueue fails
> 
>   net/sched/sch_netem.c | 47 ++++++++++++++++++++++++++-----------------
>   1 file changed, 29 insertions(+), 18 deletions(-)
> 

Applied to noble:linux/master-next. Thanks.

-Stefan