KEYS: Fix add_key() race with keyring restriction
In the Linux kernel, the following vulnerability has been resolved: KEYS: Fix add_key() race with keyring restriction __key_create_or_update() snapshots keyring->restrict_link before taking the destination keyring's semaphore. keyring_restrict() installs a restriction while holding that semaphore. This allows a writer to observe no restriction, wait for the keyring owner to install a reject-all restriction and return successfully, and then link a key using the stale NULL snapshot. The writer only needs write permission on the destination keyring. Move the restrict_link read after __key_link_lock() and __key_link_begin(). The read and the subsequent restriction check are then serialized with restriction installation by keyring->sem. The race was reproduced on v7.2.8 in 19 executions where restriction installation returned before the link completed. All 19 linked the key despite the reject-all restriction. With this change, 312 executions reached the same ordering and every add_key() call failed with -EPERM. The issue was found by manual concurrency analysis assisted by AI-based analysis and independently verified with a QEMU reproducer and kernel instrumentation.
CVE-2026-99040
Primary source · Revision 1
Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.
Security context
Source reference: cve:CVE-2026-99040
Linux
Source reference: /containers/cna/affected/0/product
- Affected versions
- Not stated in this record
- Fixed versions
- Not stated in this record
- Prerequisites
- Not stated in this record
Linux
Source reference: /containers/cna/affected/1/product
- Affected versions
- Not stated in this record
- Fixed versions
- Not stated in this record
- Prerequisites
- Not stated in this record
Structured affected-version data
Original package identities and version rules from this source.
[
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "5ac7eace2d00eab5ae0e9fdee63e38aee6001f7c",
"lessThan": "305f1828b871dd46bf41addeb6f11d2c162dcb25",
"versionType": "git"
},
{
"status": "affected",
"version": "5ac7eace2d00eab5ae0e9fdee63e38aee6001f7c",
"lessThan": "f99399b48e3edd6851fac34cd329bab9f1f33baf",
"versionType": "git"
},
{
"status": "affected",
"version": "5ac7eace2d00eab5ae0e9fdee63e38aee6001f7c",
"lessThan": "11516a0c402a6c1fa52254aa70d8d65fb921e59e",
"versionType": "git"
},
{
"status": "affected",
"version": "5ac7eace2d00eab5ae0e9fdee63e38aee6001f7c",
"lessThan": "da0b595d8e6e2dd798f6e34e09dc51a13b888514",
"versionType": "git"
},
{
"status": "affected",
"version": "5ac7eace2d00eab5ae0e9fdee63e38aee6001f7c",
"lessThan": "dd3ea3fcba7c75493760cdbccd35f029597e8d5e",
"versionType": "git"
}
],
"programFiles": [
"security/keys/key.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "4.7"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "4.7",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "6.6.160",
"versionType": "semver",
"lessThanOrEqual": "6.6.*"
},
{
"status": "unaffected",
"version": "6.12.113",
"versionType": "semver",
"lessThanOrEqual": "6.12.*"
},
{
"status": "unaffected",
"version": "6.18.57",
"versionType": "semver",
"lessThanOrEqual": "6.18.*"
},
{
"status": "unaffected",
"version": "7.2.11",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"security/keys/key.c"
],
"defaultStatus": "affected"
}
]- Related CVEs
- CVE-2026-99040
Source reference:
/cveMetadata/cveId
Publisher severity
No explicit severity was provided.
- Event
- #52873 · Revision 1
- Added to Heist Feed
- Publisher date