APPLIED: [SRU][N/M/J][PATCH 0/1] CVE-2024-26924
Roxana Nicolescu
roxana.nicolescu at canonical.com
Mon May 27 07:27:09 UTC 2024
On 23/05/2024 00:19, Bethany Jamison wrote:
> [Impact]
>
> netfilter: nft_set_pipapo: do not free live element
>
> Pablo reports a crash with large batches of elements with a
> back-to-back add/remove pattern. Quoting Pablo:
>
> add_elem("00000000") timeout 100 ms
> ...
> add_elem("0000000X") timeout 100 ms
> del_elem("0000000X") <---------------- delete one that was just added
> ...
> add_elem("00005000") timeout 100 ms
>
> 1) nft_pipapo_remove() removes element 0000000X
> Then, KASAN shows a splat.
>
> Looking at the remove function there is a chance that we will drop a
> rule that maps to a non-deactivated element.
>
> Removal happens in two steps, first we do a lookup for key k and return the
> to-be-removed element and mark it as inactive in the next generation.
> Then, in a second step, the element gets removed from the set/map.
>
> The _remove function does not work correctly if we have more than one
> element that share the same key.
>
> This can happen if we insert an element into a set when the set already
> holds an element with same key, but the element mapping to the existing
> key has timed out or is not active in the next generation.
>
> In such case its possible that removal will unmap the wrong element.
> If this happens, we will leak the non-deactivated element, it becomes
> unreachable.
>
> The element that got deactivated (and will be freed later) will
> remain reachable in the set data structure, this can result in
> a crash when such an element is retrieved during lookup (stale
> pointer).
>
> Add a check that the fully matching key does in fact map to the element
> that we have marked as inactive in the deactivation step.
> If not, we need to continue searching.
>
> Add a bug/warn trap at the end of the function as well, the remove
> function must not ever be called with an invisible/unreachable/non-existent
> element.
>
> v2: avoid uneeded temporary variable (Stefano)
>
> [Fix]
>
> Noble: Clean cherry-pick from linux.6.8.y
> Mantic: Noble patch applied cleanly
> Jammy: Noble patch applied cleanly
> Focal: not-affected
> Bionic: not-affected
> Xenial: not-affected
> Trusty: not-affected
>
> [Test Case]
>
> Compile and boot tested.
>
> [Where problems could occur]
>
> This fix affects those who use the Netfilter framework when setting
> PIPAPO (PIle PAcket POlicies), an issue with this fix would be
> visible to the user via a system crash.
>
> Florian Westphal (1):
> netfilter: nft_set_pipapo: do not free live element
>
> net/netfilter/nft_set_pipapo.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
Applied to noble:linux, mantic:linux, jammy:linux master-next branches.
Thanks!
More information about the kernel-team
mailing list