CVE-2025-39879

In the Linux kernel, the following vulnerability has been resolved: ceph: always call ceph_shift_unused_folios_left() The function ceph_process_folio_batch() sets folio_batch entries to NULL, which is an illegal state. Before folio_batch_release() crashes due to this API violation, the function ceph_shift_unused_folios_left() is supposed to remove those NULLs from the array. However, since commit ce80b76dd327 ("ceph: introduce ceph_process_folio_batch() method"), this shifting doesn't happen anymore because the "for" loop got moved to ceph_process_folio_batch(), and now the `i` variable that remains in ceph_writepages_start() doesn't get incremented anymore, making the shifting effectively unreachable much of the time. Later, commit 1551ec61dc55 ("ceph: introduce ceph_submit_write() method") added more preconditions for doing the shift, replacing the `i` check (with something that is still just as broken): - if ceph_process_folio_batch() fails, shifting never happens - if ceph_move_dirty_page_in_page_array() was never called (because ceph_process_folio_batch() has returned early for some of various reasons), shifting never happens - if `processed_in_fbatch` is zero (because ceph_process_folio_batch() has returned early for some of the reasons mentioned above or because ceph_move_dirty_page_in_page_array() has failed), shifting never happens Since those two commits, any problem in ceph_process_folio_batch() could crash the kernel, e.g. this way: BUG: kernel NULL pointer dereference, address: 0000000000000034 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page PGD 0 P4D 0 Oops: Oops: 0002 [#1] SMP NOPTI CPU: 172 UID: 0 PID: 2342707 Comm: kworker/u778:8 Not tainted 6.15.10-cm4all1-es #714 NONE Hardware name: Dell Inc. PowerEdge R7615/0G9DHV, BIOS 1.6.10 12/08/2023 Workqueue: writeback wb_workfn (flush-ceph-1) RIP: 0010:folios_put_refs+0x85/0x140 Code: 83 c5 01 39 e8 7e 76 48 63 c5 49 8b 5c c4 08 b8 01 00 00 00 4d 85 ed 74 05 41 8b 44 ad 00 48 8b 15 b0 > RSP: 0018:ffffb880af8db778 EFLAGS: 00010207 RAX: 0000000000000001 RBX: 0000000000000000 RCX: 0000000000000003 RDX: ffffe377cc3b0000 RSI: 0000000000000000 RDI: ffffb880af8db8c0 RBP: 0000000000000000 R08: 000000000000007d R09: 000000000102b86f R10: 0000000000000001 R11: 00000000000000ac R12: ffffb880af8db8c0 R13: 0000000000000000 R14: 0000000000000000 R15: ffff9bd262c97000 FS: 0000000000000000(0000) GS:ffff9c8efc303000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000034 CR3: 0000000160958004 CR4: 0000000000770ef0 PKRU: 55555554 Call Trace: <TASK> ceph_writepages_start+0xeb9/0x1410 The crash can be reproduced easily by changing the ceph_check_page_before_write() return value to `-E2BIG`. (Interestingly, the crash happens only if `huge_zero_folio` has already been allocated; without `huge_zero_folio`, is_huge_zero_folio(NULL) returns true and folios_put_refs() skips NULL entries instead of dereferencing them. That makes reproducing the bug somewhat unreliable. See https://lore.kernel.org/20250826231626.218675-1-max.kellermann@ionos.com for a discussion of this detail.) My suggestion is to move the ceph_shift_unused_folios_left() to right after ceph_process_folio_batch() to ensure it always gets called to fix up the illegal folio_batch state.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc5:*:*:*:*:*:*

History

21 Oct 2026, 13:18

Type Values Removed Values Added
References
  • () https://git.kernel.org/stable/c/523214f0afa1b3d0e696917bc5a4d0737718e3d7 -

19 Oct 2026, 21:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: ceph: llamar siempre a ceph_shift_unused_folios_left() La función ceph_process_folio_batch() establece las entradas de folio_batch a NULL, lo cual es un estado ilegal. Antes de que folio_batch_release() falle debido a esta violación de la API, se supone que la función ceph_shift_unused_folios_left() debe eliminar esos NULLs del array. Sin embargo, desde el commit ce80b76dd327 ('ceph: introduce el método ceph_process_folio_batch()'), este desplazamiento ya no ocurre porque el bucle 'for' se movió a ceph_process_folio_batch(), y ahora la variable 'i' que permanece en ceph_writepages_start() ya no se incrementa, haciendo que el desplazamiento sea efectivamente inalcanzable la mayor parte del tiempo. Más tarde, el commit 1551ec61dc55 ('ceph: introduce el método ceph_submit_write()') añadió más precondiciones para realizar el desplazamiento, reemplazando la comprobación de 'i' (con algo que sigue estando igual de roto): - si ceph_process_folio_batch() falla, el desplazamiento nunca ocurre - si ceph_move_dirty_page_in_page_array() nunca fue llamada (porque ceph_process_folio_batch() ha retornado anticipadamente por alguna de varias razones), el desplazamiento nunca ocurre - si 'processed_in_fbatch' es cero (porque ceph_process_folio_batch() ha retornado anticipadamente por alguna de las razones mencionadas anteriormente o porque ceph_move_dirty_page_in_page_array() ha fallado), el desplazamiento nunca ocurre Desde esos dos commits, cualquier problema en ceph_process_folio_batch() podría bloquear el kernel, por ejemplo, de esta manera: BUG: desreferencia de puntero NULL del kernel, dirección: 0000000000000034 #PF: acceso de escritura de supervisor en modo kernel #PF: error_code(0x0002) - página no presente PGD 0 P4D 0 Oops: Oops: 0002 [#1] SMP NOPTI CPU: 172 UID: 0 PID: 2342707 Comm: kworker/u778:8 Not tainted 6.15.10-cm4all1-es #714 NONE Hardware name: Dell Inc. PowerEdge R7615/0G9DHV, BIOS 1.6.10 12/08/2023 Workqueue: writeback wb_workfn (flush-ceph-1) RIP: 0010:folios_put_refs+0x85/0x140 Code: 83 c5 01 39 e8 7e 76 48 63 c5 49 8b 5c c4 08 b8 01 00 00 00 4d 85 ed 74 05 41 8b 44 ad 00 48 8b 15 b0 > RSP: 0018:ffffb880af8db778 EFLAGS: 00010207 RAX: 0000000000000001 RBX: 0000000000000000 RCX: 0000000000000003 RDX: ffffe377cc3b0000 RSI: 0000000000000000 RDI: ffffb880af8db8c0 RBP: 0000000000000000 R08: 000000000000007d R09: 000000000102b86f R10: 0000000000000001 R11: 00000000000000ac R12: ffffb880af8db8c0 R13: 0000000000000000 R14: 0000000000000000 R15: ffff9bd262c97000 FS: 0000000000000000(0000) GS:ffff9c8efc303000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000034 CR3: 0000000160958004 CR4: 0000000000770ef0 PKRU: 55555554 Traza de Llamadas: <TASK> ceph_writepages_start+0xeb9/0x1410 El fallo se puede reproducir fácilmente cambiando el valor de retorno de ceph_check_page_before_write() a '-E2BIG'. (Curiosamente, el fallo ocurre solo si 'huge_zero_folio' ya ha sido asignado; sin 'huge_zero_folio', is_huge_zero_folio(NULL) retorna verdadero y folios_put_refs() omite las entradas NULL en lugar de desreferenciarlas. Eso hace que la reproducción del error sea algo poco fiable. Ver https://lore.kernel.org/20250826231626.218675-1-max.kellermann@ionos.com para una discusión de este detalle.) Mi sugerencia es mover ceph_shift_unused_folios_left() justo después de ceph_process_folio_batch() para asegurar que siempre sea llamada para corregir el estado ilegal de folio_batch.

Information

Published : 2025-09-23 06:15

Updated : 2026-10-21 13:18


NVD link : CVE-2025-39879

Mitre link : CVE-2025-39879

CVE.ORG link : CVE-2025-39879


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-476

NULL Pointer Dereference