Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: md/raid10: corregir still_degraded invertido en raid10_sync_request() El commit fe6a19d40ceb ("md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations") convirtió still_degraded de int a bool, pero invirtió la asignación en el bucle que verifica si el arreglo seguirá degradado después de recuperar el dispositivo actual: "still_degraded = 1" pasó a ser "still_degraded = false". Como resultado, al recuperar un dispositivo mientras otro espejo sigue ausente, se llama a md_bitmap_start_sync() con degraded == false, lo que borra bits del bitmap que necesita el dispositivo aún ausente. Cuando ese dispositivo se vuelve a agregar, su recuperación basada en bitmap encuentra los bits ya borrados y omite todas las regiones escritas mientras el arreglo estaba degradado, por lo que queda marcado como In_sync conteniendo datos obsoletos: corrupción silenciosa. Reproducción (raid10 near=2, 4 discos, bitmap interno): - provocar la falla y quitar un disco de cada par espejo - escribir en el arreglo degradado - volver a agregar ambos discos y dejar que termine la recuperación - "check" reporta mismatch_cnt=262272 después de 256 MiB de escrituras en modo degradado y el contenido de los archivos difiere; la "recovery" del segundo disco termina en milisegundos porque se omite todo La misma conversión en raid1 se hizo correctamente (still_degraded = true). Se restaura el valor correcto.
Qué hacer
Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.
Versiones afectadas
- Linux Afectadas: fe6a19d40ceb44281905485f56dda715e3214e0e y anteriores a 9bb8da6ecb330a5b1ac9b96f1e55f134a7aef1d4 · fe6a19d40ceb44281905485f56dda715e3214e0e y anteriores a 0efabe6229dc683dbf6eeebd0f9fddc7971ed420 · fe6a19d40ceb44281905485f56dda715e3214e0e y anteriores a 00449d752bee9c8787f42ea1bf533a9fb17f9b6b · fe6a19d40ceb44281905485f56dda715e3214e0e y anteriores a 47f1441b281decde6954a2fa82b4131637d685ac
- Linux Afectadas: 6.12 No afectadas: 6.12.109 · 6.18.50 · 7.2.4 · 7.3
Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.
Referencias
- Referencia en git.kernel.orggit.kernel.org/stable/c/9bb8da6ecb330a5b1ac9b96f1e55f134a7aef1d4
- Referencia en git.kernel.orggit.kernel.org/stable/c/0efabe6229dc683dbf6eeebd0f9fddc7971ed420
- Referencia en git.kernel.orggit.kernel.org/stable/c/00449d752bee9c8787f42ea1bf533a9fb17f9b6b
- Referencia en git.kernel.orggit.kernel.org/stable/c/47f1441b281decde6954a2fa82b4131637d685ac
Ver el texto original en inglés (CVE.org)
md/raid10: fix still_degraded being inverted in raid10_sync_request()
In the Linux kernel, the following vulnerability has been resolved: md/raid10: fix still_degraded being inverted in raid10_sync_request() Commit fe6a19d40ceb ("md/md-bitmap: merge md_bitmap_start_sync() into bitmap_operations") converted still_degraded from int to bool, but inverted the assignment in the loop that checks whether the array will still be degraded after the current device is recovered: "still_degraded = 1" became "still_degraded = false". As a result, recovering a device while another mirror is still missing calls md_bitmap_start_sync() with degraded == false, which clears bitmap bits that the still-missing device needs. When that device is re-added, its bitmap-based recovery finds the bits already cleared and skips every region written while the array was degraded, so it is marked In_sync while holding stale data: silent corruption. Reproducer (raid10 near=2, 4 disks, internal bitmap): - fail and remove one disk of each mirror pair - write to the degraded array - re-add both disks and let recovery finish - "check" reports mismatch_cnt=262272 after 256 MiB of degraded writes and file contents differ; the second disk's "recovery" completes in milliseconds because everything is skipped The same conversion in raid1 got it right (still_degraded = true). Restore the correct value.