In the Linux kernel, the following vulnerability has been resolved:
cachefiles: fix slab-use-after-free in cachefileswithdrawcookie()
We got the following issue in our fault injection stress test:
================================================================== BUG: KASAN: slab-use-after-free in cachefileswithdrawcookie+0x4d9/0x600 Read of size 8 at addr ffff888118efc000 by task kworker/u78:0/109
CPU: 13 PID: 109 Comm: kworker/u78:0 Not tainted 6.8.0-dirty #566 Call Trace: <TASK> kasanreport+0x93/0xc0 cachefileswithdrawcookie+0x4d9/0x600 fscachecookiestatemachine+0x5c8/0x1230 fscachecookieworker+0x91/0x1c0 processonework+0x7fa/0x1800 [...]
Allocated by task 117: kmalloctrace+0x1b3/0x3c0 cachefilesacquirevolume+0xf3/0x9c0 fscachecreatevolumework+0x97/0x150 processonework+0x7fa/0x1800 [...]
Freed by task 120301: kfree+0xf1/0x2c0 cachefileswithdrawcache+0x3fa/0x920 cachefilesputunbindpincount+0x1f6/0x250 cachefilesdaemonrelease+0x13b/0x290 _fput+0x204/0xa00 taskworkrun+0x139/0x230 do_exit+0x87a/0x29b0
Following is the process that triggers the issue:
fscache_begin_lookup
fscache_begin_volume_access
fscache_cache_is_live(fscache_cache)
cachefilesdaemonrelease cachefilesputunbindpincount cachefilesdaemonunbind cachefileswithdrawcache fscachewithdrawcache fscachesetcachestate(cache, FSCACHECACHEISWITHDRAWN); cachefileswithdrawobjects(cache) fscachewaitforobjects(fscache) atomicread(&fscachecache->objectcount) == 0 fscacheperformlookup cachefileslookupcookie cachefilesallocobject refcountset(&object->ref, 1); object->volume = volume fscachecountobject(vcookie->cache); atomicinc(&fscachecache->objectcount) cachefileswithdrawvolumes cachefileswithdrawvolume fscachewithdrawvolume _cachefilesfreevolume kfree(cachefilesvolume) fscachecookiestatemachine cachefileswithdrawcookie cache = object->volume->cache; // cachefiles_volume UAF !!!
After setting FSCACHECACHEISWITHDRAWN, wait for all the cookie lookups to complete first, and then wait for fscachecache->objectcount == 0 to avoid the cookie exiting after the volume has been freed and triggering the above issue. Therefore call fscachewithdrawvolume() before calling cachefileswithdraw_objects().
This way, after setting FSCACHECACHEISWITHDRAWN, only the following two cases will occur: 1) fscachebeginlookup fails in fscachebeginvolumeaccess(). 2) fscachewithdrawvolume() will ensure that fscachecountobject() has been executed before calling fscachewaitfor_objects().
[
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9e67589a4a7b7e5660b524d1d5fe61242bcbcc11",
"target": {
"file": "fs/cachefiles/volume.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"262705893389240477011356788617628312791",
"218038392632073377552851200423304038424",
"209984587551995221359242894135982796840",
"191725992399735855429873374564733377099"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-0120f63b"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8de253177112a47c9af157d23ae934779188b4e1",
"target": {
"function": "cachefiles_withdraw_cache",
"file": "fs/cachefiles/cache.c"
},
"digest": {
"length": 275.0,
"function_hash": "115059350325746980819122105720513195269"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-08383058"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5d8f805789072ea7fd39504694b7bd17e5f751c4",
"target": {
"file": "fs/cachefiles/cache.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"255605662103502361481757104167248297508",
"290630078633917372717690735775909997354",
"85710644442774017476881007810818323996",
"283967014402522649428579176664239792740",
"249698317711926772838925013870578683626",
"285749108460836631975993461424991972842",
"147127825412223039824017800181584081401"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-0de9ae69"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8de253177112a47c9af157d23ae934779188b4e1",
"target": {
"function": "cachefiles_withdraw_volume",
"file": "fs/cachefiles/volume.c"
},
"digest": {
"length": 110.0,
"function_hash": "119416352818316522906377505464699397688"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-12e9c5f2"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5d8f805789072ea7fd39504694b7bd17e5f751c4",
"target": {
"file": "fs/cachefiles/volume.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"262705893389240477011356788617628312791",
"218038392632073377552851200423304038424",
"209984587551995221359242894135982796840",
"191725992399735855429873374564733377099"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-288cb873"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@ef81340401e8a371d6b17f69e76d861920972cfe",
"target": {
"function": "cachefiles_withdraw_cache",
"file": "fs/cachefiles/cache.c"
},
"digest": {
"length": 275.0,
"function_hash": "115059350325746980819122105720513195269"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-28b6497b"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@ef81340401e8a371d6b17f69e76d861920972cfe",
"target": {
"file": "fs/cachefiles/volume.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"262705893389240477011356788617628312791",
"218038392632073377552851200423304038424",
"209984587551995221359242894135982796840",
"191725992399735855429873374564733377099"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-41398cab"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8de253177112a47c9af157d23ae934779188b4e1",
"target": {
"file": "fs/cachefiles/volume.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"262705893389240477011356788617628312791",
"218038392632073377552851200423304038424",
"209984587551995221359242894135982796840",
"191725992399735855429873374564733377099"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-65549fbb"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@ef81340401e8a371d6b17f69e76d861920972cfe",
"target": {
"function": "cachefiles_withdraw_volume",
"file": "fs/cachefiles/volume.c"
},
"digest": {
"length": 110.0,
"function_hash": "119416352818316522906377505464699397688"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-68b243e2"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9e67589a4a7b7e5660b524d1d5fe61242bcbcc11",
"target": {
"file": "fs/cachefiles/cache.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"255605662103502361481757104167248297508",
"290630078633917372717690735775909997354",
"85710644442774017476881007810818323996",
"283967014402522649428579176664239792740",
"249698317711926772838925013870578683626",
"285749108460836631975993461424991972842",
"147127825412223039824017800181584081401"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-72fb32bc"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9e67589a4a7b7e5660b524d1d5fe61242bcbcc11",
"target": {
"function": "cachefiles_withdraw_volume",
"file": "fs/cachefiles/volume.c"
},
"digest": {
"length": 110.0,
"function_hash": "119416352818316522906377505464699397688"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-a7787b34"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5d8f805789072ea7fd39504694b7bd17e5f751c4",
"target": {
"function": "cachefiles_withdraw_cache",
"file": "fs/cachefiles/cache.c"
},
"digest": {
"length": 275.0,
"function_hash": "115059350325746980819122105720513195269"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-ab98bb98"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5d8f805789072ea7fd39504694b7bd17e5f751c4",
"target": {
"function": "cachefiles_withdraw_volume",
"file": "fs/cachefiles/volume.c"
},
"digest": {
"length": 110.0,
"function_hash": "119416352818316522906377505464699397688"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-d1ecda5b"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8de253177112a47c9af157d23ae934779188b4e1",
"target": {
"file": "fs/cachefiles/cache.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"255605662103502361481757104167248297508",
"290630078633917372717690735775909997354",
"85710644442774017476881007810818323996",
"283967014402522649428579176664239792740",
"249698317711926772838925013870578683626",
"285749108460836631975993461424991972842",
"147127825412223039824017800181584081401"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-d42e033d"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9e67589a4a7b7e5660b524d1d5fe61242bcbcc11",
"target": {
"function": "cachefiles_withdraw_cache",
"file": "fs/cachefiles/cache.c"
},
"digest": {
"length": 275.0,
"function_hash": "115059350325746980819122105720513195269"
},
"deprecated": false,
"signature_type": "Function",
"id": "CVE-2024-41057-d95cbd72"
},
{
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@ef81340401e8a371d6b17f69e76d861920972cfe",
"target": {
"file": "fs/cachefiles/cache.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"255605662103502361481757104167248297508",
"290630078633917372717690735775909997354",
"85710644442774017476881007810818323996",
"283967014402522649428579176664239792740",
"249698317711926772838925013870578683626",
"285749108460836631975993461424991972842",
"147127825412223039824017800181584081401"
]
},
"deprecated": false,
"signature_type": "Line",
"id": "CVE-2024-41057-e3c7a6bb"
}
]