Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en Linux (CVE-2025-68774)

Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
13/01/2026
Última modificación:
15/04/2026

Descripción

En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br /> <br /> hfsplus: corrige la falta de hfs_bnode_get() en __hfs_bnode_create<br /> <br /> Cuando sync() y link() se llaman concurrentemente, ambos hilos pueden entrar en hfs_bnode_find() sin encontrar el nodo en la tabla hash y proceder a crearlo.<br /> <br /> Hilo A:<br /> hfsplus_write_inode()<br /> -&amp;gt; hfsplus_write_system_inode()<br /> -&amp;gt; hfs_btree_write()<br /> -&amp;gt; hfs_bnode_find(tree, 0)<br /> -&amp;gt; __hfs_bnode_create(tree, 0)<br /> <br /> Hilo B:<br /> hfsplus_create_cat()<br /> -&amp;gt; hfs_brec_insert()<br /> -&amp;gt; hfs_bnode_split()<br /> -&amp;gt; hfs_bmap_alloc()<br /> -&amp;gt; hfs_bnode_find(tree, 0)<br /> -&amp;gt; __hfs_bnode_create(tree, 0)<br /> <br /> En este caso, el hilo A crea el bnode, establece refcnt=1 y lo hashea. El hilo B también intenta crear el mismo bnode, nota que ya ha sido insertado, descarta su propia instancia y usa el hasheado sin obtener el nodo.<br /> <br /> ```<br /> <br /> node2 = hfs_bnode_findhash(tree, cnid);<br /> if (!node2) { &amp;lt;- Hilo A<br /> hash = hfs_bnode_hash(cnid);<br /> node-&amp;gt;next_hash = tree-&amp;gt;node_hash[hash];<br /> tree-&amp;gt;node_hash[hash] = node;<br /> tree-&amp;gt;node_hash_cnt++;<br /> } else { &amp;lt;- Hilo B<br /> spin_unlock(&amp;amp;tree-&amp;gt;hash_lock);<br /> kfree(node);<br /> wait_event(node2-&amp;gt;lock_wq,<br /> !test_bit(HFS_BNODE_NEW, &amp;amp;node2-&amp;gt;flags));<br /> return node2;<br /> }<br /> ```<br /> <br /> Sin embargo, hfs_bnode_find() requiere que cada llamada tome una referencia. Aquí ambos hilos terminan estableciendo refcnt=1. Cuando más tarde liberan el nodo, esto dispara:<br /> <br /> BUG_ON(!atomic_read(&amp;amp;node-&amp;gt;refcnt))<br /> <br /> En este escenario, el Hilo B de hecho encuentra el nodo en la tabla hash en lugar de crear uno nuevo, y por lo tanto debe tomar una referencia.<br /> <br /> Solucione esto llamando a hfs_bnode_get() al reutilizar un bnode recién creado por otro hilo para asegurar que el contador de referencias se actualice correctamente.<br /> <br /> Un error similar fue corregido en HFS hace mucho tiempo en el commit a9dc087fd3c4 (&amp;#39;corrige la falta de hfs_bnode_get() en __hfs_bnode_create&amp;#39;) pero el mismo problema permaneció en HFS+ hasta ahora.

Impacto