CVE-2021-46921CWE-668

CVE-2021-46921

High · published February 27, 2024

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

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

locking/qrwlock: Fix ordering in queued_write_lock_slowpath()

While this code is executed with the wait_lock held, a reader can

acquire the lock without holding wait_lock. The writer side loops

checking the value with the atomic_cond_read_acquire(), but only truly

acquires the lock when the compare-and-exchange is completed

successfully which isn’t ordered. This exposes the window between the

acquire and the cmpxchg to an A-B-A problem which allows reads

following the lock acquisition to observe values speculatively before

the write lock is truly acquired.

We've seen a problem in epoll where the reader does a xchg while

holding the read lock, but the writer can see a value change out from

under it.

Writer | Reader

--------------------------------------------------------------------------------

ep_scan_ready_list() |

|- write_lock_irq() |

|- queued_write_lock_slowpath() |

|- atomic_cond_read_acquire() |

| read_lock_irqsave(&ep->lock, flags);

--> (observes value before unlock) | chain_epi_lockless()

| | epi->next = xchg(&ep->ovflist, epi);

| | read_unlock_irqrestore(&ep->lock, flags);

| |

| atomic_cmpxchg_relaxed() |

|-- READ_ONCE(ep->ovflist); |

A core can order the read of the ovflist ahead of the

atomic_cmpxchg_relaxed(). Switching the cmpxchg to use acquire

semantics addresses this issue at which point the atomic_cond_read can

be switched to use relaxed semantics.

[peterz: use try_cmpxchg()]

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.00237 · 14.0th percentile
Weakness
CWE-668 · Exposure of Resource to Wrong Sphere
Published
2024-02-27T15:15Z
Affected products (4)
ProductVersionsFixed in
linux/linux_kernel≥ 4.15.0, < 4.19.1894.19.189
linux/linux_kernel≥ 4.20.0, < 5.4.1155.4.115
linux/linux_kernel≥ 5.5.0, < 5.10.335.10.33
linux/linux_kernel≥ 5.11.0, < 5.11.175.11.17
References (10)
EPSS history
Timeline
  • 27 FEB 09:36Z
    locking/qrwlock: Fix ordering in queued_write_lock_slowpath()
    cvelistv5