In the Linux kernel, the following vulnerability has been resolved:
binder: fix use-after-free in shinker's callback
The mmap read lock is used during the shrinker's callback, which means that using alloc->vma pointer isn't safe as it can race with munmap(). As of commit dd2283f2605e ("mm: mmap: zap pages with read mmap_sem in munmap") the mmap lock is downgraded after the vma has been isolated.
I was able to reproduce this issue by manually adding some delays and triggering page reclaiming through the shrinker's debug sysfs. The following KASAN report confirms the UAF:
================================================================== BUG: KASAN: slab-use-after-free in zappagerange_single+0x470/0x4b8 Read of size 8 at addr ffff356ed50e50f0 by task bash/478
CPU: 1 PID: 478 Comm: bash Not tainted 6.6.0-rc5-00055-g1c8b86a3799f-dirty #70 Hardware name: linux,dummy-virt (DT) Call trace: zappagerangesingle+0x470/0x4b8 binderallocfreepage+0x608/0xadc _listlruwalkone+0x130/0x3b0 listlruwalknode+0xc4/0x22c bindershrinkscan+0x108/0x1dc shrinkerdebugfsscanwrite+0x2b4/0x500 fullproxywrite+0xd4/0x140 vfswrite+0x1ac/0x758 ksyswrite+0xf0/0x1dc _arm64sys_write+0x6c/0x9c
Allocated by task 492: kmemcachealloc+0x130/0x368 vmareaalloc+0x2c/0x190 mmapregion+0x258/0x18bc dommap+0x694/0xa60 vmmmappgoff+0x170/0x29c ksysmmappgoff+0x290/0x3a0 _arm64sys_mmap+0xcc/0x144
Freed by task 491: kmemcachefree+0x17c/0x3c8 vmareafreercucb+0x74/0x98 rcucore+0xa38/0x26d4 rcucoresi+0x10/0x1c _do_softirq+0x2fc/0xd24
Last potentially related work creation: _callrcucommon.constprop.0+0x6c/0xba0 callrcu+0x10/0x1c vmareafree+0x18/0x24 removevma+0xe4/0x118 dovmialignmunmap.isra.0+0x718/0xb5c dovmimunmap+0xdc/0x1fc _vmmunmap+0x10c/0x278 _arm64sys_munmap+0x58/0x7c
Fix this issue by performing instead a vmalookup() which will fail to find the vma that was isolated before the mmap lock downgrade. Note that this option has better performance than upgrading to a mmap write lock which would increase contention. Plus, mmapwrite_trylock() has been recently removed anyway.
[
{
"id": "CVE-2023-52438-02e31419",
"deprecated": false,
"digest": {
"line_hashes": [
"42124432970306099281779732309879880729",
"126335089944119735191187096943383899650",
"227772353244353947911142911360193127818",
"196696981978403257751910708131935785125",
"126330952194303089787847430714982641632",
"113978304796618430164961134625021559720",
"274166071319488074334098916886113591618"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a53e15e592b4dcc91c3a3b8514e484a0bdbc53a3",
"signature_type": "Line"
},
{
"id": "CVE-2023-52438-166dc227",
"deprecated": false,
"digest": {
"length": 1129.0,
"function_hash": "182103610563209274447931928359769781692"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a53e15e592b4dcc91c3a3b8514e484a0bdbc53a3",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-16ce27d6",
"deprecated": false,
"digest": {
"line_hashes": [
"9476784281400762178475942009607741807",
"322119237390627204053202449084824587404",
"184954262034825268941135090882638608849",
"196696981978403257751910708131935785125",
"37329297454813458440214055690264894870",
"241449019364187392198532497312953002484",
"152830622512398259706630180911882646771"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a49087ab93508b60d9b8add91707a22dda832869",
"signature_type": "Line"
},
{
"id": "CVE-2023-52438-45d842f7",
"deprecated": false,
"digest": {
"length": 1094.0,
"function_hash": "94414305430201044594218719877819024312"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a49087ab93508b60d9b8add91707a22dda832869",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-478f4c63",
"deprecated": false,
"digest": {
"line_hashes": [
"9476784281400762178475942009607741807",
"322119237390627204053202449084824587404",
"184954262034825268941135090882638608849",
"196696981978403257751910708131935785125",
"37329297454813458440214055690264894870",
"241449019364187392198532497312953002484",
"152830622512398259706630180911882646771"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@c8c1158ffb007197f31f9d9170cf13e4f34cbb5c",
"signature_type": "Line"
},
{
"id": "CVE-2023-52438-6aec8df2",
"deprecated": false,
"digest": {
"line_hashes": [
"9476784281400762178475942009607741807",
"322119237390627204053202449084824587404",
"184954262034825268941135090882638608849",
"196696981978403257751910708131935785125",
"37329297454813458440214055690264894870",
"241449019364187392198532497312953002484",
"152830622512398259706630180911882646771"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9fa04c93f24138747807fe75b5591bb680098f56",
"signature_type": "Line"
},
{
"id": "CVE-2023-52438-90df9978",
"deprecated": false,
"digest": {
"length": 1094.0,
"function_hash": "94414305430201044594218719877819024312"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@3f489c2067c5824528212b0fc18b28d51332d906",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-a70b39e4",
"deprecated": false,
"digest": {
"line_hashes": [
"9476784281400762178475942009607741807",
"322119237390627204053202449084824587404",
"184954262034825268941135090882638608849",
"196696981978403257751910708131935785125",
"37329297454813458440214055690264894870",
"241449019364187392198532497312953002484",
"152830622512398259706630180911882646771"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8ad4d580e8aff8de2a4d57c5930fcc29f1ffd4a6",
"signature_type": "Line"
},
{
"id": "CVE-2023-52438-ad4899e8",
"deprecated": false,
"digest": {
"length": 1087.0,
"function_hash": "247591068050565503369347191783425929340"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9fa04c93f24138747807fe75b5591bb680098f56",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-bb9775d1",
"deprecated": false,
"digest": {
"line_hashes": [
"9476784281400762178475942009607741807",
"322119237390627204053202449084824587404",
"184954262034825268941135090882638608849",
"196696981978403257751910708131935785125",
"37329297454813458440214055690264894870",
"241449019364187392198532497312953002484",
"152830622512398259706630180911882646771"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@e074686e993ff1be5f21b085a3b1b4275ccd5727",
"signature_type": "Line"
},
{
"id": "CVE-2023-52438-c236234b",
"deprecated": false,
"digest": {
"length": 1094.0,
"function_hash": "94414305430201044594218719877819024312"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@e074686e993ff1be5f21b085a3b1b4275ccd5727",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-e4a4ecf4",
"deprecated": false,
"digest": {
"length": 1093.0,
"function_hash": "106265789300489171691573112347858510886"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@c8c1158ffb007197f31f9d9170cf13e4f34cbb5c",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-eec3abc6",
"deprecated": false,
"digest": {
"length": 1093.0,
"function_hash": "106265789300489171691573112347858510886"
},
"signature_version": "v1",
"target": {
"function": "__must_hold",
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8ad4d580e8aff8de2a4d57c5930fcc29f1ffd4a6",
"signature_type": "Function"
},
{
"id": "CVE-2023-52438-f53b37f9",
"deprecated": false,
"digest": {
"line_hashes": [
"9476784281400762178475942009607741807",
"322119237390627204053202449084824587404",
"184954262034825268941135090882638608849",
"196696981978403257751910708131935785125",
"37329297454813458440214055690264894870",
"241449019364187392198532497312953002484",
"152830622512398259706630180911882646771"
],
"threshold": 0.9
},
"signature_version": "v1",
"target": {
"file": "drivers/android/binder_alloc.c"
},
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@3f489c2067c5824528212b0fc18b28d51332d906",
"signature_type": "Line"
}
]