netfilter: nf_tables: don't skip expired elements during walk
In the Linux kernel, the following vulnerability has been resolved: netfilter: nf_tables: don't skip expired elements during walk There is an asymmetry between commit/abort and preparation phase if the following conditions are met: 1. set is a verdict map ("1.2.3.4 : jump foo") 2. timeouts are enabled In this case, following sequence is problematic: 1. element E in set S refers to chain C 2. userspace requests removal of set S 3. kernel does a set walk to decrement chain->use count for all elements from preparation phase 4. kernel does another set walk to remove elements from the commit phase (or another walk to do a chain->use increment for all elements from abort phase) If E has already expired in 1), it will be ignored during list walk, so its use count won't have been changed. Then, when set is culled, ->destroy callback will zap the element via nf_tables_set_elem_destroy(), but this function is only safe for elements that have been deactivated earlier from the preparation phase: lack of earlier deactivate removes the element but leaks the chain use count, which results in a WARN splat when the chain gets removed later, plus a leak of the nft_chain structure. Update pipapo_get() not to skip expired elements, otherwise flush command reports bogus ENOENT errors.
- Products
- Kernel
- Affected versions
- Not specified
- Fixed versions
- 4.19.316, 5.10.198, 5.15.134, 5.4.262, 6.1.56, 6.4.11
- CVEs
- CVE-2023-52924
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 4 Nov 2026, 16:18 UTC · Revision 1
Source evidence
netfilter: nf_tables: don't skip expired elements during walk
core-osv · Original sourcePublished 5 Feb 2025, 09:07 UTC
In the Linux kernel, the following vulnerability has been resolved: netfilter: nf_tables: don't skip expired elements during walk There is an asymmetry between commit/abort and preparation phase if the following conditions are met: 1. set is a verdict map ("1.2.3.4 : jump foo") 2. timeouts are enabled In this case, following sequence is problematic: 1. element E in set S refers to chain C 2. userspace requests removal of set S 3. kernel does a set walk to decrement chain->use count for all elements from preparation phase 4. kernel does another set walk to remove elements from the commit phase (or another walk to do a chain->use increment for all elements from abort phase) If E has already expired in 1), it will be ignored during list walk, so its use count won't have been changed. Then, when set is culled, ->destroy callback will zap the element via nf_tables_set_elem_destroy(), but this function is only safe for elements that have been deactivated earlier from the preparation phase: lack of earlier deactivate removes the element but leaks the chain use count, which results in a WARN splat when the chain gets removed later, plus a leak of the nft_chain structure. Update pipapo_get() not to skip expired elements, otherwise flush command reports bogus ENOENT errors.
osv:CVE-2023-52924
Kernel
Fixed versions: 4.19.316, 5.4.262, 5.10.198, 5.15.134, 6.1.56, 6.4.11
Complete source record
{
"id": "13f8ea3679ef4a5582806a483535fef72ef569c349f570db64f2b8267c51a157",
"url": "https://osv.dev/vulnerability/CVE-2023-52924",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "netfilter: nf_tables: don't skip expired elements during walk",
"summary": "In the Linux kernel, the following vulnerability has been resolved: netfilter: nf_tables: don't skip expired elements during walk There is an asymmetry between commit/abort and preparation phase if the following conditions are met: 1. set is a verdict map (\"1.2.3.4 : jump foo\") 2. timeouts are enabled In this case, following sequence is problematic: 1. element E in set S refers to chain C 2. userspace requests removal of set S 3. kernel does a set walk to decrement chain->use count for all elements from preparation phase 4. kernel does another set walk to remove elements from the commit phase (or another walk to do a chain->use increment for all elements from abort phase) If E has already expired in 1), it will be ignored during list walk, so its use count won't have been changed. Then, when set is culled, ->destroy callback will zap the element via nf_tables_set_elem_destroy(), but this function is only safe for elements that have been deactivated earlier from the preparation phase: lack of earlier deactivate removes the element but leaks the chain use count, which results in a WARN splat when the chain gets removed later, plus a leak of the nft_chain structure. Update pipapo_get() not to skip expired elements, otherwise flush command reports bogus ENOENT errors.",
"evidence": "osv:CVE-2023-52924",
"products": [
{
"name": {
"value": "Kernel",
"evidence": "/affected/1/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "4.19.316",
"evidence": "/affected/1/ranges"
},
{
"value": "5.4.262",
"evidence": "/affected/1/ranges"
},
{
"value": "5.10.198",
"evidence": "/affected/1/ranges"
},
{
"value": "5.15.134",
"evidence": "/affected/1/ranges"
},
{
"value": "6.1.56",
"evidence": "/affected/1/ranges"
},
{
"value": "6.4.11",
"evidence": "/affected/1/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "CVE-2023-52924",
"aliases": [
"CVE-2023-52924"
],
"affected": [
{
"ranges": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"type": "GIT",
"events": [
{
"introduced": "9d0982927e79049675cb6c6c04a0ebb3dad5a434"
},
{
"fixed": "94313a196b44184b5b52c1876da6a537701b425a"
},
{
"fixed": "1da4874d05da1526b11b82fc7f3c7ac38749ddf8"
},
{
"fixed": "b15ea4017af82011dd55225ce77cce3d4dfc169c"
},
{
"fixed": "7c7e658a36f8b1522bd3586d8137e5f93a25ddc5"
},
{
"fixed": "59dab3bf0b8fc08eb802721c0532f13dd89209b8"
},
{
"fixed": "bd156ce9553dcaf2d6ee2c825d1a5a1718e86524"
},
{
"fixed": "24138933b97b055d486e8064b4a1721702442a9b"
}
]
}
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2023-52924.json"
}
},
{
"ranges": [
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "4.1.0"
},
{
"fixed": "4.19.316"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "4.20.0"
},
{
"fixed": "5.4.262"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "5.5.0"
},
{
"fixed": "5.10.198"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "5.11.0"
},
{
"fixed": "5.15.134"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "5.16.0"
},
{
"fixed": "6.1.56"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.2.0"
},
{
"fixed": "6.4.11"
}
]
}
],
"package": {
"name": "Kernel",
"ecosystem": "Linux"
},
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2023-52924.json"
}
}
],
"modified": "2026-10-28T02:30:37.661654118Z",
"provider": "osv",
"references": [
"https://git.kernel.org/stable/c/1da4874d05da1526b11b82fc7f3c7ac38749ddf8",
"https://git.kernel.org/stable/c/24138933b97b055d486e8064b4a1721702442a9b",
"https://git.kernel.org/stable/c/59dab3bf0b8fc08eb802721c0532f13dd89209b8",
"https://git.kernel.org/stable/c/7c7e658a36f8b1522bd3586d8137e5f93a25ddc5",
"https://git.kernel.org/stable/c/94313a196b44184b5b52c1876da6a537701b425a",
"https://git.kernel.org/stable/c/b15ea4017af82011dd55225ce77cce3d4dfc169c",
"https://git.kernel.org/stable/c/bd156ce9553dcaf2d6ee2c825d1a5a1718e86524",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2023/52xxx/CVE-2023-52924.json",
"https://nvd.nist.gov/vuln/detail/CVE-2023-52924",
"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"
],
"provider_metadata": {
"cna_assigner": "Linux",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2023/52xxx/CVE-2023-52924.json"
}
},
"related_cves": [
{
"value": "CVE-2023-52924",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 504586,
"published_at": "2025-02-05T09:07:55.418+00:00"
}