locking/qrwlock: Fix ordering in queued_write_lock_slowpath()
Summary
| CVE | CVE-2021-46921 |
|---|---|
| State | PUBLISHED |
| Assigner | Linux |
| Source Priority | CVE Program / NVD first with legacy fallback |
| Published | 2024-02-27 10:15:06 UTC |
| Updated | 2026-08-04 10:16:36 UTC |
| Description | 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()] |
Risk And Classification
Primary CVSS: v3.1 5.5 MEDIUM from [email protected]
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Problem Types: CWE-668
| Version | Source | Type | Score | Severity | Vector |
|---|---|---|---|---|---|
| 3.1 | [email protected] | Primary | 5.5 | MEDIUM | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 3.1 | 416baaa9-dc9f-4396-8d5f-8c081fb06d67 | Secondary | 7.8 | HIGH | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 3.1 | CNA | DECLARED | 7.8 | HIGH | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
CVSS v3.1 Breakdown
Attack Vector
LocalAttack Complexity
LowPrivileges Required
LowUser Interaction
NoneScope
UnchangedConfidentiality
HighIntegrity
NoneAvailability
NoneCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
NVD Known Affected Configurations (CPE 2.3)
| Type | Vendor | Product | Version | Update | Edition | Language |
|---|---|---|---|---|---|---|
| Operating System | Linux | Linux Kernel | All | All | All | All |
Vendor Declared Affected Products
| Source | Vendor | Product | Version | Platforms |
|---|---|---|---|---|
| CNA | Linux | Linux | affected b519b56e378ee82caf9b079b04f5db87dedc3251 5902f9453a313be8fe78cbd7e7ca9dba9319fc6e git | Not specified |
| CNA | Linux | Linux | affected b519b56e378ee82caf9b079b04f5db87dedc3251 82808cc026811fbc3ecf0c0b267a12a339eead56 git | Not specified |
| CNA | Linux | Linux | affected b519b56e378ee82caf9b079b04f5db87dedc3251 82fa9ced35d88581cffa4a1c856fc41fca96d80a git | Not specified |
| CNA | Linux | Linux | affected b519b56e378ee82caf9b079b04f5db87dedc3251 d558fcdb17139728347bccc60a16af3e639649d2 git | Not specified |
| CNA | Linux | Linux | affected b519b56e378ee82caf9b079b04f5db87dedc3251 84a24bf8c52e66b7ac89ada5e3cfbe72d65c1896 git | Not specified |
| CNA | Linux | Linux | affected 4.15 | Not specified |
| CNA | Linux | Linux | unaffected 4.15 semver | Not specified |
| CNA | Linux | Linux | unaffected 4.19.189 4.19.* semver | Not specified |
| CNA | Linux | Linux | unaffected 5.4.115 5.4.* semver | Not specified |
| CNA | Linux | Linux | unaffected 5.10.33 5.10.* semver | Not specified |
| CNA | Linux | Linux | unaffected 5.11.17 5.11.* semver | Not specified |
| CNA | Linux | Linux | unaffected 5.12 * original_commit_for_fix | Not specified |
References
| Reference | Source | Link | Tags |
|---|---|---|---|
| git.kernel.org/stable/c/84a24bf8c52e66b7ac89ada5e3cfbe72d65c1896 | af854a3a-2127-422b-91ae-364da2661108 | git.kernel.org | Patch |
| git.kernel.org/stable/c/5902f9453a313be8fe78cbd7e7ca9dba9319fc6e | af854a3a-2127-422b-91ae-364da2661108 | git.kernel.org | Patch |
| git.kernel.org/stable/c/d558fcdb17139728347bccc60a16af3e639649d2 | af854a3a-2127-422b-91ae-364da2661108 | git.kernel.org | Patch |
| git.kernel.org/stable/c/82808cc026811fbc3ecf0c0b267a12a339eead56 | af854a3a-2127-422b-91ae-364da2661108 | git.kernel.org | Patch |
| git.kernel.org/stable/c/82fa9ced35d88581cffa4a1c856fc41fca96d80a | af854a3a-2127-422b-91ae-364da2661108 | git.kernel.org | Patch |
| CVE Program record | CVE.ORG | www.cve.org | canonical |
| NVD vulnerability detail | NVD | nvd.nist.gov | canonical, analysis |
No vendor comments have been submitted for this CVE.