CVE-2021-47505CWE-416

CVE-2021-47505

High · published May 24, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
15.9
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

aio: fix use-after-free due to missing POLLFREE handling

signalfd_poll() and binder_poll() are special in that they use a

waitqueue whose lifetime is the current task, rather than the struct

file as is normally the case. This is okay for blocking polls, since a

blocking poll occurs within one task; however, non-blocking polls

require another solution. This solution is for the queue to be cleared

before it is freed, by sending a POLLFREE notification to all waiters.

Unfortunately, only eventpoll handles POLLFREE. A second type of

non-blocking poll, aio poll, was added in kernel v4.18, and it doesn't

handle POLLFREE. This allows a use-after-free to occur if a signalfd or

binder fd is polled with aio poll, and the waitqueue gets freed.

Fix this by making aio poll handle POLLFREE.

A patch by Ramji Jiyani <[email protected]>

(https://lore.kernel.org/r/[email protected])

tried to do this by making aio_poll_wake() always complete the request

inline if POLLFREE is seen. However, that solution had two bugs.

First, it introduced a deadlock, as it unconditionally locked the aio

context while holding the waitqueue lock, which inverts the normal

locking order. Second, it didn't consider that POLLFREE notifications

are missed while the request has been temporarily de-queued.

The second problem was solved by my previous patch. This patch then

properly fixes the use-after-free by handling POLLFREE in a

deadlock-free way. It does this by taking advantage of the fact that

freeing of the waitqueue is RCU-delayed, similar to what eventpoll does.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00252 · 15.9th percentile
Weakness
CWE-416 · Use After Free
Published
2024-05-24T19:15Z
Affected products (8)
ProductVersionsFixed in
linux/linux_kernel≥ 4.18, < 4.19.2214.19.221
linux/linux_kernel≥ 4.20, < 5.4.1655.4.165
linux/linux_kernel≥ 5.5, < 5.10.855.10.85
linux/linux_kernel≥ 5.11, < 5.15.85.15.8
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (10)
EPSS history
Timeline
  • 24 MAY 15:01Z
    aio: fix use-after-free due to missing POLLFREE handling
    cvelistv5