In the Linux kernel, the following vulnerability has been resolved:
mm: zswap: fix shrinker NULL crash with cgroup_disable=memory
Christian reports a NULL deref in zswap that he bisected down to the zswap shrinker. The issue also cropped up in the bug trackers of libguestfs [1] and the Red Hat bugzilla [2].
The problem is that when memcg is disabled with the boot time flag, the zswap shrinker might get called with sc->memcg == NULL. This is okay in many places, like the lruvec operations. But it crashes in memcgpagestate() - which is only used due to the non-node accounting of cgroup's the zswap memory to begin with.
Nhat spotted that the memcg can be NULL in the memcg-disabled case, and I was then able to reproduce the crash locally as well.
[1] https://github.com/libguestfs/libguestfs/issues/139 [2] https://bugzilla.redhat.com/show_bug.cgi?id=2275252
[
{
"id": "CVE-2024-35846-22e80ac6",
"signature_version": "v1",
"digest": {
"length": 768.0,
"function_hash": "313792707124014441775665697698662318596"
},
"target": {
"file": "mm/zswap.c",
"function": "zswap_shrinker_count"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@682886ec69d22363819a83ddddd5d66cb5c791e1",
"signature_type": "Function",
"deprecated": false
},
{
"id": "CVE-2024-35846-63bd2e95",
"signature_version": "v1",
"digest": {
"line_hashes": [
"31320358307480943522714044454517669314",
"105667438548058281119862502630043647145",
"198631359820699489229890603844375506835",
"186599191159509060398877935916570606635",
"177040662147074366523607477119818664588",
"17115152087149947053502085159906818537",
"273853182174037124249662304177979561163",
"255146030800121751758845196362346048314",
"262315502532770956995066627597741037583",
"60405212411895258345297702693221593248",
"229396549831501140605605125084556749380"
],
"threshold": 0.9
},
"target": {
"file": "mm/zswap.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@682886ec69d22363819a83ddddd5d66cb5c791e1",
"signature_type": "Line",
"deprecated": false
},
{
"id": "CVE-2024-35846-84470513",
"signature_version": "v1",
"digest": {
"length": 808.0,
"function_hash": "125432848045117945027301692755966706959"
},
"target": {
"file": "mm/zswap.c",
"function": "zswap_shrinker_count"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@b0fdabc908a7f81d12382c87ca9e46a9c2e14042",
"signature_type": "Function",
"deprecated": false
},
{
"id": "CVE-2024-35846-db0f168d",
"signature_version": "v1",
"digest": {
"line_hashes": [
"31320358307480943522714044454517669314",
"105667438548058281119862502630043647145",
"198631359820699489229890603844375506835",
"186599191159509060398877935916570606635",
"177040662147074366523607477119818664588",
"45556210578304250903000368019271980051",
"190517103271611961307481201298394604599",
"269257690071809553436690893547063054907",
"311864023625355022571964665296530005793",
"314814313361053750629698096693112826933",
"229396549831501140605605125084556749380"
],
"threshold": 0.9
},
"target": {
"file": "mm/zswap.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@b0fdabc908a7f81d12382c87ca9e46a9c2e14042",
"signature_type": "Line",
"deprecated": false
}
]