In the Linux kernel, the following vulnerability has been resolved:
netfilter: ipset: enforce documented limit to prevent allocating huge memory
Daniel Xu reported that the hash:net,iface type of the ipset subsystem does not limit adding the same network with different interfaces to a set, which can lead to huge memory usage or allocation failure.
The quick reproducer is
$ ipset create ACL.IN.ALLPERMIT hash:net,iface hashsize 1048576 timeout 0 $ for i in $(seq 0 100); do /sbin/ipset add ACL.IN.ALLPERMIT 0.0.0.0/0,kaf_$i timeout 0 -exist; done
The backtrace when vmalloc fails:
[Tue Oct 25 00:13:08 2022] ipset: vmalloc error: size 1073741848, exceeds total pages
<...>
[Tue Oct 25 00:13:08 2022] Call Trace:
[Tue Oct 25 00:13:08 2022] <TASK>
[Tue Oct 25 00:13:08 2022] dump_stack_lvl+0x48/0x60
[Tue Oct 25 00:13:08 2022] warn_alloc+0x155/0x180
[Tue Oct 25 00:13:08 2022] __vmalloc_node_range+0x72a/0x760
[Tue Oct 25 00:13:08 2022] ? hash_netiface4_add+0x7c0/0xb20
[Tue Oct 25 00:13:08 2022] ? __kmalloc_large_node+0x4a/0x90
[Tue Oct 25 00:13:08 2022] kvmalloc_node+0xa6/0xd0
[Tue Oct 25 00:13:08 2022] ? hash_netiface4_resize+0x99/0x710
<...>
The fix is to enforce the limit documented in the ipset(8) manpage:
The internal restriction of the hash:net,iface set type is that the same network prefix cannot be stored with more than 64 different interfaces in a single set.
[
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"286171292446105440827641486287806580605",
"49117501602992039538609182098371855386",
"42798869906723895846316090984951149765",
"148873950651148610350953652222397192202",
"153873630163998766041685195413590154902",
"187936780717847131017417895557942191121",
"1612992750259221432447966365188670160",
"100513851010429209284056950939419194748",
"127199586730566230193569550586004780187",
"174464949266225202359134399345948040799",
"184324831566456584999605144131088544258",
"231580672529771810864472418639271347783",
"300759060331216776941457321591971075119",
"202582570410180055671069567069995150167",
"3151620934589059759794148131961661317",
"268296895340015555485740307562649130144",
"22864509175356029170601402582293277152",
"182997128819313712727037252889477357275",
"26466145208299805329516294576057447720",
"61106218980415297143621807000180023938"
]
},
"deprecated": false,
"signature_version": "v1",
"target": {
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@510841da1fcc16f702440ab58ef0b4d82a9056b7",
"id": "CVE-2022-49911-0756cee9"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "312394271324319372045108959172791664025",
"length": 4614.0
},
"deprecated": false,
"signature_version": "v1",
"target": {
"function": "mtype_add",
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a37ef32fe5956fe9248df68f6a61997845ba047e",
"id": "CVE-2022-49911-24dc95de"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "289225753293717211528116099393402898892",
"length": 196.0
},
"deprecated": false,
"signature_version": "v1",
"target": {
"function": "tune_bucketsize",
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@42d20d5e24575c9afa2d66d9a51e7386db9514f5",
"id": "CVE-2022-49911-3f26d73c"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "312394271324319372045108959172791664025",
"length": 4614.0
},
"deprecated": false,
"signature_version": "v1",
"target": {
"function": "mtype_add",
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@510841da1fcc16f702440ab58ef0b4d82a9056b7",
"id": "CVE-2022-49911-7d013f05"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"286171292446105440827641486287806580605",
"49117501602992039538609182098371855386",
"42798869906723895846316090984951149765",
"148873950651148610350953652222397192202",
"153873630163998766041685195413590154902",
"187936780717847131017417895557942191121",
"1612992750259221432447966365188670160",
"100513851010429209284056950939419194748",
"127199586730566230193569550586004780187",
"174464949266225202359134399345948040799",
"184324831566456584999605144131088544258",
"231580672529771810864472418639271347783",
"300759060331216776941457321591971075119",
"202582570410180055671069567069995150167",
"3151620934589059759794148131961661317",
"268296895340015555485740307562649130144",
"22864509175356029170601402582293277152",
"182997128819313712727037252889477357275",
"26466145208299805329516294576057447720",
"61106218980415297143621807000180023938"
]
},
"deprecated": false,
"signature_version": "v1",
"target": {
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@42d20d5e24575c9afa2d66d9a51e7386db9514f5",
"id": "CVE-2022-49911-91196d55"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "312394271324319372045108959172791664025",
"length": 4614.0
},
"deprecated": false,
"signature_version": "v1",
"target": {
"function": "mtype_add",
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@42d20d5e24575c9afa2d66d9a51e7386db9514f5",
"id": "CVE-2022-49911-98f6a55d"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "289225753293717211528116099393402898892",
"length": 196.0
},
"deprecated": false,
"signature_version": "v1",
"target": {
"function": "tune_bucketsize",
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a37ef32fe5956fe9248df68f6a61997845ba047e",
"id": "CVE-2022-49911-b2bcb266"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"286171292446105440827641486287806580605",
"49117501602992039538609182098371855386",
"42798869906723895846316090984951149765",
"148873950651148610350953652222397192202",
"153873630163998766041685195413590154902",
"187936780717847131017417895557942191121",
"1612992750259221432447966365188670160",
"100513851010429209284056950939419194748",
"127199586730566230193569550586004780187",
"174464949266225202359134399345948040799",
"184324831566456584999605144131088544258",
"231580672529771810864472418639271347783",
"300759060331216776941457321591971075119",
"202582570410180055671069567069995150167",
"3151620934589059759794148131961661317",
"268296895340015555485740307562649130144",
"22864509175356029170601402582293277152",
"182997128819313712727037252889477357275",
"26466145208299805329516294576057447720",
"61106218980415297143621807000180023938"
]
},
"deprecated": false,
"signature_version": "v1",
"target": {
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a37ef32fe5956fe9248df68f6a61997845ba047e",
"id": "CVE-2022-49911-d91a19aa"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "289225753293717211528116099393402898892",
"length": 196.0
},
"deprecated": false,
"signature_version": "v1",
"target": {
"function": "tune_bucketsize",
"file": "net/netfilter/ipset/ip_set_hash_gen.h"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@510841da1fcc16f702440ab58ef0b4d82a9056b7",
"id": "CVE-2022-49911-f4821abe"
}
]