CVE-2024-35798 (GCVE-0-2024-35798)
Vulnerability from cvelistv5 – Published: 2024-05-17 13:23 – Updated: 2025-05-04 09:05
VLAI?
Title
btrfs: fix race in read_extent_buffer_pages()
Summary
In the Linux kernel, the following vulnerability has been resolved:
btrfs: fix race in read_extent_buffer_pages()
There are reports from tree-checker that detects corrupted nodes,
without any obvious pattern so possibly an overwrite in memory.
After some debugging it turns out there's a race when reading an extent
buffer the uptodate status can be missed.
To prevent concurrent reads for the same extent buffer,
read_extent_buffer_pages() performs these checks:
/* (1) */
if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
return 0;
/* (2) */
if (test_and_set_bit(EXTENT_BUFFER_READING, &eb->bflags))
goto done;
At this point, it seems safe to start the actual read operation. Once
that completes, end_bbio_meta_read() does
/* (3) */
set_extent_buffer_uptodate(eb);
/* (4) */
clear_bit(EXTENT_BUFFER_READING, &eb->bflags);
Normally, this is enough to ensure only one read happens, and all other
callers wait for it to finish before returning. Unfortunately, there is
a racey interleaving:
Thread A | Thread B | Thread C
---------+----------+---------
(1) | |
| (1) |
(2) | |
(3) | |
(4) | |
| (2) |
| | (1)
When this happens, thread B kicks of an unnecessary read. Worse, thread
C will see UPTODATE set and return immediately, while the read from
thread B is still in progress. This race could result in tree-checker
errors like this as the extent buffer is concurrently modified:
BTRFS critical (device dm-0): corrupted node, root=256
block=8550954455682405139 owner mismatch, have 11858205567642294356
expect [256, 18446744073709551360]
Fix it by testing UPTODATE again after setting the READING bit, and if
it's been set, skip the unnecessary read.
[ minor update of changelog ]
Severity ?
No CVSS data available.
Assigner
References
Impacted products
| Vendor | Product | Version | ||
|---|---|---|---|---|
| Linux | Linux |
Affected:
d7172f52e9933b6ec9305e7fe6e829e3939dba04 , < 0427c8ef8bbb7f304de42ef51d69c960e165e052
(git)
Affected: d7172f52e9933b6ec9305e7fe6e829e3939dba04 , < 3a25878a3378adce5d846300c9570f15aa7f7a80 (git) Affected: d7172f52e9933b6ec9305e7fe6e829e3939dba04 , < 2885d54af2c2e1d910e20d5c8045bae40e02fbc1 (git) Affected: d7172f52e9933b6ec9305e7fe6e829e3939dba04 , < ef1e68236b9153c27cb7cf29ead0c532870d4215 (git) |
||
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2024-35798",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2024-06-12T15:26:19.488238Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2024-06-12T15:26:30.636Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
},
{
"providerMetadata": {
"dateUpdated": "2024-08-02T03:21:47.569Z",
"orgId": "af854a3a-2127-422b-91ae-364da2661108",
"shortName": "CVE"
},
"references": [
{
"tags": [
"x_transferred"
],
"url": "https://git.kernel.org/stable/c/0427c8ef8bbb7f304de42ef51d69c960e165e052"
},
{
"tags": [
"x_transferred"
],
"url": "https://git.kernel.org/stable/c/3a25878a3378adce5d846300c9570f15aa7f7a80"
},
{
"tags": [
"x_transferred"
],
"url": "https://git.kernel.org/stable/c/2885d54af2c2e1d910e20d5c8045bae40e02fbc1"
},
{
"tags": [
"x_transferred"
],
"url": "https://git.kernel.org/stable/c/ef1e68236b9153c27cb7cf29ead0c532870d4215"
}
],
"title": "CVE Program Container"
}
],
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"fs/btrfs/extent_io.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "0427c8ef8bbb7f304de42ef51d69c960e165e052",
"status": "affected",
"version": "d7172f52e9933b6ec9305e7fe6e829e3939dba04",
"versionType": "git"
},
{
"lessThan": "3a25878a3378adce5d846300c9570f15aa7f7a80",
"status": "affected",
"version": "d7172f52e9933b6ec9305e7fe6e829e3939dba04",
"versionType": "git"
},
{
"lessThan": "2885d54af2c2e1d910e20d5c8045bae40e02fbc1",
"status": "affected",
"version": "d7172f52e9933b6ec9305e7fe6e829e3939dba04",
"versionType": "git"
},
{
"lessThan": "ef1e68236b9153c27cb7cf29ead0c532870d4215",
"status": "affected",
"version": "d7172f52e9933b6ec9305e7fe6e829e3939dba04",
"versionType": "git"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"fs/btrfs/extent_io.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "6.5"
},
{
"lessThan": "6.5",
"status": "unaffected",
"version": "0",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.6.*",
"status": "unaffected",
"version": "6.6.24",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.7.*",
"status": "unaffected",
"version": "6.7.12",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.8.*",
"status": "unaffected",
"version": "6.8.3",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "6.9",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.6.24",
"versionStartIncluding": "6.5",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.7.12",
"versionStartIncluding": "6.5",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.8.3",
"versionStartIncluding": "6.5",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.9",
"versionStartIncluding": "6.5",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbtrfs: fix race in read_extent_buffer_pages()\n\nThere are reports from tree-checker that detects corrupted nodes,\nwithout any obvious pattern so possibly an overwrite in memory.\nAfter some debugging it turns out there\u0027s a race when reading an extent\nbuffer the uptodate status can be missed.\n\nTo prevent concurrent reads for the same extent buffer,\nread_extent_buffer_pages() performs these checks:\n\n /* (1) */\n if (test_bit(EXTENT_BUFFER_UPTODATE, \u0026eb-\u003ebflags))\n return 0;\n\n /* (2) */\n if (test_and_set_bit(EXTENT_BUFFER_READING, \u0026eb-\u003ebflags))\n goto done;\n\nAt this point, it seems safe to start the actual read operation. Once\nthat completes, end_bbio_meta_read() does\n\n /* (3) */\n set_extent_buffer_uptodate(eb);\n\n /* (4) */\n clear_bit(EXTENT_BUFFER_READING, \u0026eb-\u003ebflags);\n\nNormally, this is enough to ensure only one read happens, and all other\ncallers wait for it to finish before returning. Unfortunately, there is\na racey interleaving:\n\n Thread A | Thread B | Thread C\n ---------+----------+---------\n (1) | |\n | (1) |\n (2) | |\n (3) | |\n (4) | |\n | (2) |\n | | (1)\n\nWhen this happens, thread B kicks of an unnecessary read. Worse, thread\nC will see UPTODATE set and return immediately, while the read from\nthread B is still in progress. This race could result in tree-checker\nerrors like this as the extent buffer is concurrently modified:\n\n BTRFS critical (device dm-0): corrupted node, root=256\n block=8550954455682405139 owner mismatch, have 11858205567642294356\n expect [256, 18446744073709551360]\n\nFix it by testing UPTODATE again after setting the READING bit, and if\nit\u0027s been set, skip the unnecessary read.\n\n[ minor update of changelog ]"
}
],
"providerMetadata": {
"dateUpdated": "2025-05-04T09:05:39.197Z",
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux"
},
"references": [
{
"url": "https://git.kernel.org/stable/c/0427c8ef8bbb7f304de42ef51d69c960e165e052"
},
{
"url": "https://git.kernel.org/stable/c/3a25878a3378adce5d846300c9570f15aa7f7a80"
},
{
"url": "https://git.kernel.org/stable/c/2885d54af2c2e1d910e20d5c8045bae40e02fbc1"
},
{
"url": "https://git.kernel.org/stable/c/ef1e68236b9153c27cb7cf29ead0c532870d4215"
}
],
"title": "btrfs: fix race in read_extent_buffer_pages()",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"assignerShortName": "Linux",
"cveId": "CVE-2024-35798",
"datePublished": "2024-05-17T13:23:08.868Z",
"dateReserved": "2024-05-17T12:19:12.341Z",
"dateUpdated": "2025-05-04T09:05:39.197Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.1",
"vulnerability-lookup:meta": {
"vulnrichment": {
"containers": "{\"adp\": [{\"title\": \"CVE Program Container\", \"references\": [{\"url\": \"https://git.kernel.org/stable/c/0427c8ef8bbb7f304de42ef51d69c960e165e052\", \"tags\": [\"x_transferred\"]}, {\"url\": \"https://git.kernel.org/stable/c/3a25878a3378adce5d846300c9570f15aa7f7a80\", \"tags\": [\"x_transferred\"]}, {\"url\": \"https://git.kernel.org/stable/c/2885d54af2c2e1d910e20d5c8045bae40e02fbc1\", \"tags\": [\"x_transferred\"]}, {\"url\": \"https://git.kernel.org/stable/c/ef1e68236b9153c27cb7cf29ead0c532870d4215\", \"tags\": [\"x_transferred\"]}], \"providerMetadata\": {\"orgId\": \"af854a3a-2127-422b-91ae-364da2661108\", \"shortName\": \"CVE\", \"dateUpdated\": \"2024-08-02T03:21:47.569Z\"}}, {\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2024-35798\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"partial\"}], \"version\": \"2.0.3\", \"timestamp\": \"2024-06-12T15:26:19.488238Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2024-06-12T15:26:27.214Z\"}}], \"cna\": {\"title\": \"btrfs: fix race in read_extent_buffer_pages()\", \"affected\": [{\"repo\": \"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\", \"vendor\": \"Linux\", \"product\": \"Linux\", \"versions\": [{\"status\": \"affected\", \"version\": \"d7172f52e993\", \"lessThan\": \"0427c8ef8bbb\", \"versionType\": \"git\"}, {\"status\": \"affected\", \"version\": \"d7172f52e993\", \"lessThan\": \"3a25878a3378\", \"versionType\": \"git\"}, {\"status\": \"affected\", \"version\": \"d7172f52e993\", \"lessThan\": \"2885d54af2c2\", \"versionType\": \"git\"}, {\"status\": \"affected\", \"version\": \"d7172f52e993\", \"lessThan\": \"ef1e68236b91\", \"versionType\": \"git\"}], \"programFiles\": [\"fs/btrfs/extent_io.c\"], \"defaultStatus\": \"unaffected\"}, {\"repo\": \"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\", \"vendor\": \"Linux\", \"product\": \"Linux\", \"versions\": [{\"status\": \"affected\", \"version\": \"6.5\"}, {\"status\": \"unaffected\", \"version\": \"0\", \"lessThan\": \"6.5\", \"versionType\": \"custom\"}, {\"status\": \"unaffected\", \"version\": \"6.6.24\", \"versionType\": \"custom\", \"lessThanOrEqual\": \"6.6.*\"}, {\"status\": \"unaffected\", \"version\": \"6.7.12\", \"versionType\": \"custom\", \"lessThanOrEqual\": \"6.7.*\"}, {\"status\": \"unaffected\", \"version\": \"6.8.3\", \"versionType\": \"custom\", \"lessThanOrEqual\": \"6.8.*\"}, {\"status\": \"unaffected\", \"version\": \"6.9\", \"versionType\": \"original_commit_for_fix\", \"lessThanOrEqual\": \"*\"}], \"programFiles\": [\"fs/btrfs/extent_io.c\"], \"defaultStatus\": \"affected\"}], \"references\": [{\"url\": \"https://git.kernel.org/stable/c/0427c8ef8bbb7f304de42ef51d69c960e165e052\"}, {\"url\": \"https://git.kernel.org/stable/c/3a25878a3378adce5d846300c9570f15aa7f7a80\"}, {\"url\": \"https://git.kernel.org/stable/c/2885d54af2c2e1d910e20d5c8045bae40e02fbc1\"}, {\"url\": \"https://git.kernel.org/stable/c/ef1e68236b9153c27cb7cf29ead0c532870d4215\"}], \"x_generator\": {\"engine\": \"bippy-a5840b7849dd\"}, \"descriptions\": [{\"lang\": \"en\", \"value\": \"In the Linux kernel, the following vulnerability has been resolved:\\n\\nbtrfs: fix race in read_extent_buffer_pages()\\n\\nThere are reports from tree-checker that detects corrupted nodes,\\nwithout any obvious pattern so possibly an overwrite in memory.\\nAfter some debugging it turns out there\u0027s a race when reading an extent\\nbuffer the uptodate status can be missed.\\n\\nTo prevent concurrent reads for the same extent buffer,\\nread_extent_buffer_pages() performs these checks:\\n\\n /* (1) */\\n if (test_bit(EXTENT_BUFFER_UPTODATE, \u0026eb-\u003ebflags))\\n return 0;\\n\\n /* (2) */\\n if (test_and_set_bit(EXTENT_BUFFER_READING, \u0026eb-\u003ebflags))\\n goto done;\\n\\nAt this point, it seems safe to start the actual read operation. Once\\nthat completes, end_bbio_meta_read() does\\n\\n /* (3) */\\n set_extent_buffer_uptodate(eb);\\n\\n /* (4) */\\n clear_bit(EXTENT_BUFFER_READING, \u0026eb-\u003ebflags);\\n\\nNormally, this is enough to ensure only one read happens, and all other\\ncallers wait for it to finish before returning. Unfortunately, there is\\na racey interleaving:\\n\\n Thread A | Thread B | Thread C\\n ---------+----------+---------\\n (1) | |\\n | (1) |\\n (2) | |\\n (3) | |\\n (4) | |\\n | (2) |\\n | | (1)\\n\\nWhen this happens, thread B kicks of an unnecessary read. Worse, thread\\nC will see UPTODATE set and return immediately, while the read from\\nthread B is still in progress. This race could result in tree-checker\\nerrors like this as the extent buffer is concurrently modified:\\n\\n BTRFS critical (device dm-0): corrupted node, root=256\\n block=8550954455682405139 owner mismatch, have 11858205567642294356\\n expect [256, 18446744073709551360]\\n\\nFix it by testing UPTODATE again after setting the READING bit, and if\\nit\u0027s been set, skip the unnecessary read.\\n\\n[ minor update of changelog ]\"}], \"providerMetadata\": {\"orgId\": \"416baaa9-dc9f-4396-8d5f-8c081fb06d67\", \"shortName\": \"Linux\", \"dateUpdated\": \"2024-05-29T05:29:09.898Z\"}}}",
"cveMetadata": "{\"cveId\": \"CVE-2024-35798\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2024-08-02T03:21:47.569Z\", \"dateReserved\": \"2024-05-17T12:19:12.341Z\", \"assignerOrgId\": \"416baaa9-dc9f-4396-8d5f-8c081fb06d67\", \"datePublished\": \"2024-05-17T13:23:08.868Z\", \"assignerShortName\": \"Linux\"}",
"dataType": "CVE_RECORD",
"dataVersion": "5.1"
}
}
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
Loading…