Vulnerabilidad en Linux (CVE-2026-23249)
Fecha de publicación:
18/03/2026
En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br />
<br />
xfs: verificar cursores eliminados al revalidar dos btrees<br />
<br />
Las funciones de reparación de btree de espacio libre e inodo reconstruirán ambos btrees al mismo tiempo, después de lo cual necesita evaluar ambos btrees para confirmar que las corrupciones han desaparecido.<br />
<br />
Sin embargo, Jiaming Zhang ejecutó syzbot y produjo un fallo en la segunda llamada a xchk_allocbt. Su análisis de causa raíz es el siguiente (con correcciones menores):<br />
<br />
En xrep_revalidate_allocbt(), se llama a xchk_allocbt() dos veces (primero para BNOBT, segundo para CNTBT). La causa de este problema es que la primera llamada anuló el cursor requerido por la segunda llamada.<br />
<br />
Primero entremos en xrep_revalidate_allocbt() a través de la siguiente cadena de llamadas:<br />
<br />
xfs_file_ioctl() -&gt;<br />
xfs_ioc_scrubv_metadata() -&gt;<br />
xfs_scrub_metadata() -&gt;<br />
&#39;sc-&gt;ops-&gt;repair_eval(sc)&#39; -&gt;<br />
xrep_revalidate_allocbt()<br />
<br />
Se llama a xchk_allocbt() dos veces en esta función. En la primera llamada:<br />
<br />
/* Tenga en cuenta que sc-&gt;sm-&gt;sm_type es XFS_SCRUB_TYPE_BNOPT ahora */<br />
xchk_allocbt() -&gt;<br />
xchk_btree() -&gt;<br />
&#39;bs-&gt;scrub_rec(bs, recp)&#39; -&gt;<br />
xchk_allocbt_rec() -&gt;<br />
xchk_allocbt_xref() -&gt;<br />
xchk_allocbt_xref_other()<br />
<br />
dado que sm_type es XFS_SCRUB_TYPE_BNOBT, pur se establece en &amp;sc-&gt;sa.cnt_cur. El kernel llamó a xfs_alloc_get_rec() y devolvió -EFSCORRUPTED. Cadena de llamadas:<br />
<br />
xfs_alloc_get_rec() -&gt;<br />
xfs_btree_get_rec() -&gt;<br />
xfs_btree_check_block() -&gt;<br />
(XFS_IS_CORRUPT || XFS_TEST_ERROR), el primero es falso y el segundo es verdadero, devuelve -EFSCORRUPTED. Esto debería ser causado por ioctl$XFS_IOC_ERROR_INJECTION, supongo.<br />
<br />
Volviendo a xchk_allocbt_xref_other(), después de recibir -EFSCORRUPTED de xfs_alloc_get_rec(), el kernel llamó a xchk_should_check_xref(). En esta función, *curpp (que apunta a sc-&gt;sa.cnt_cur) es anulado.<br />
<br />
Volviendo a xrep_revalidate_allocbt(), dado que sc-&gt;sa.cnt_cur ha sido anulado, entonces activó una desreferencia de puntero nulo a través de xchk_allocbt() (segunda llamada) -&gt; xchk_btree().<br />
<br />
Así que. La revalidación de bnobt falló en un intento de referencia cruzada, por lo que eliminamos el cursor cntbt, y luego fallamos cuando intentamos revalidar el cntbt. Por lo tanto, verifique si hay un cursor cntbt nulo antes de esa revalidación, y marque la reparación como incompleta. También podemos ignorar el segundo árbol por completo si el primer árbol fue reconstruido pero ya está corrupto.<br />
<br />
Aplique la misma corrección a xrep_revalidate_iallocbt porque tiene el mismo problema.
Gravedad: Pendiente de análisis
Última modificación:
19/03/2026