CVE-2025-68774: hfsplus: fix missing hfs_bnode_get() in __hfs_bnode_create
In the Linux kernel, the following vulnerability has been resolved:
hfsplus: fix missing hfs_bnode_get() in __hfs_bnode_create
When sync() and link() are called concurrently, both threads may
enter hfs_bnode_find() without finding the node in the hash table
and proceed to create it.
Thread A:
hfsplus_write_inode()
-> hfsplus_write_system_inode()
-> hfs_btree_write()
-> hfs_bnode_find(tree, 0)
-> __hfs_bnode_create(tree, 0)
Thread B:
hfsplus_create_cat()
-> hfs_brec_insert()
-> hfs_bnode_split()
-> hfs_bmap_alloc()
-> hfs_bnode_find(tree, 0)
-> __hfs_bnode_create(tree, 0)
In this case, thread A creates the bnode, sets refcnt=1, and hashes it.
Thread B also tries to create the same bnode, notices it has already
been inserted, drops its own instance, and uses the hashed one without
getting the node.
```
node2 = hfs_bnode_findhash(tree, cnid);
if (!node2) { <- Thread A
hash = hfs_bnode_hash(cnid);
node->next_hash = tree->node_hash[hash];
tree->node_hash[hash] = node;
tree->node_hash_cnt++;
} else { <- Thread B
spin_unlock(&tree->hash_lock);
kfree(node);
wait_event(node2->lock_wq,
!test_bit(HFS_BNODE_NEW, &node2->flags));
return node2;
}
```
However, hfs_bnode_find() requires each call to take a reference.
Here both threads end up setting refcnt=1. When they later put the node,
this triggers:
BUG_ON(!atomic_read(&node->refcnt))
In this scenario, Thread B in fact finds the node in the hash table
rather than creating a new one, and thus must take a reference.
Fix this by calling hfs_bnode_get() when reusing a bnode newly created by
another thread to ensure the refcount is updated correctly.
A similar bug was fixed in HFS long ago in commit
a9dc087fd3c4 ("fix missing hfs_bnode_get() in __hfs_bnode_create")
but the same issue remained in HFS+ until now.
Security readout for executives and security teams
Plain-English summary
A race in Linux’s HFS+ filesystem can mishandle an internal reference count when synchronization and link creation occur concurrently. The resulting kernel assertion can crash or disrupt the system, affecting availability rather than confidentiality or integrity. Systems that do not use HFS+ are unlikely to reach the vulnerable path.
Executive priority
Prioritize availability-sensitive systems that use HFS+, especially where untrusted or removable HFS+ media is accepted. Patch through the normal kernel vendor channel promptly. Systems with no HFS+ support or usage can receive lower priority after that absence is verified.
Technical view
Concurrent sync() and link() paths can both attempt to create the same HFS+ b-tree node. The losing thread reuses the already-hashed node without incrementing its reference count. Both callers later release a node recorded with only one reference, triggering a BUG_ON assertion. The fix adds hfs_bnode_get() before returning the reused node.
Likely exposure
Exposure is concentrated on Linux systems using HFS+ filesystems and workloads capable of concurrent synchronization and link creation. Merely running Linux does not confirm practical exposure. The supplied version data is not sufficiently clear for package-level decisions, so kernel builds should be checked against vendor backports or the listed stable commits.
Exploitation context
KEV is false, and the provided sources do not report active exploitation or a public exploit. The described trigger is a concurrency race in HFS+ operations. Although the supplied CVSS vector states network attackability, the technical description alone does not establish a remotely reachable path; deployment-specific reachability must be verified.
Researcher notes
The defect is a reference-counting race in __hfs_bnode_create(): a concurrent caller discovers an inserted node but returns it without acquiring its own reference. The source bundle identifies no CWE. Researchers should distinguish theoretical CVSS network reachability from the filesystem-specific trigger and avoid claiming remote exploitation without additional evidence.
Mitigation direction
Inventory Linux systems that mount, access, or permit HFS+ filesystems.
Update to a vendor kernel containing the applicable Linux stable fix commit.
Where patching is delayed, disable or avoid HFS+ mounts when operationally feasible.
Check distribution advisories for exact fixed package versions; the bundle lists commits, not package releases.
Validation and detection
Confirm the running kernel includes the applicable stable commit or documented vendor backport.
Verify whether HFS+ support is enabled, loaded, or used by mounted media.
Review kernel logs for HFS bnode reference-count assertions, BUG_ON events, or unexplained crashes.
Regression-test concurrent synchronization and link operations only in an isolated, non-production environment.
Generated from the cited source records. This long-tail analysis has not been individually reviewed by a named human.
Potential ATT&CK relevance
Conservative CVE-to-ATT&CK context
These mappings and lookup hints may be relevant to the vulnerability behavior, CWE, affected product, or exposure path. Glexia-inferred context is not an official MITRE, ATT&CK, CWE, or CVE Program mapping.
ATT&CK lookup starting points
Use these exact CWE pages and searches to review the Glexia ATT&CK library from this CVE's weakness and description context.
cve · low confidence lookup
CVE-2025-68774 mapping review
Open the CVE-to-ATT&CK bridge for reviewed, inferred, or future official mappings tied to this CVE.
These fields come from the CVE record and ADP containers, not from Glexia's Take. They preserve time-varying source decisions such as CISA SSVC, KEV status, CVSS metrics, and provider references.
1CVSS vectors
3Timeline events
0ADP providers
8Source links
CVSS vector scores
1 official score
We collect every scored CVSS vector available in the official CNA and ADP containers. When more than one version is present, the table keeps the source vectors side by side instead of collapsing them into the highest score.