Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: ceph: descifrar correctamente los nombres de archivo en búferes vmalloc() El subsistema fscrypt usa la API criptográfica de scatterlist y hereda su requisito de que todos los búferes estén en la región de mapeo lineal. Sin embargo, el cliente de mensajería usa kvmalloc() para crear búferes para mensajes, lo que ocasionalmente ubica esos búferes en la región vmalloc() cuando la fragmentación de la memoria física no permite un kmalloc() suficientemente grande. Los distintos invocadores de ceph_fname_to_usr() pasan directamente (fragmentos de) mensajes sin procesar del MDS sin considerar que los mensajes pueden estar en búferes vmalloc(), lo que provoca oopses, especialmente en plataformas que no son x86. Se hace que ceph_fname_to_usr() tolere explícitamente búferes fname->ctext, fname->name y/u oname->name asignados con vmalloc(), usando `tname` (que, cuando no es nulo, debe ser una dirección lineal; cuando es nulo, se asigna brevemente según sea necesario) como búfer intermedio para evitar pasar direcciones inadecuadas a fscrypt_fname_disk_to_usr(). Además, se modifica parse_reply_info_readdir() (la única función que proporciona su propio `tname`) para seguir la nueva regla de que "tname nunca debe provenir de vmalloc()", pasando NULL cuando el mensaje no está en la región lineal. Aunque esto genera un kmalloc()+kfree() por dentry, esta sobrecarga solo existe al procesar la minoría de mensajes que se desbordan hacia vmalloc(). Según pruebas (rudimentarias) del autor, esto ocurre en aproximadamente 1 de cada 8.000 mensajes readdir. Aun así, si la sobrecarga resultara excesiva en el futuro, es fácil de mitigar: un cambio futuro podría asignar un búfer intermedio en parse_reply_info_readdir() y usarlo como `tname`.
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: 457117f077c6749d1e28469eae91fb69c9806768 y anteriores a 23c5cc9652c6ee85617002cb66e1068395045de6 · 457117f077c6749d1e28469eae91fb69c9806768 y anteriores a 93729594af506557a86f8b603be7ac5f3370eeca · 457117f077c6749d1e28469eae91fb69c9806768 y anteriores a 110747ff535e3d98ac17d68dbd056bb6ef000e23 · 457117f077c6749d1e28469eae91fb69c9806768 y anteriores a 3b467c68803d7c7e82678289e598afd44faa6101 · 457117f077c6749d1e28469eae91fb69c9806768 y anteriores a e939fc6a7bd969a58a150b7f188c1047138403e3
- Linux Afectadas: 6.6 No afectadas: 6.6.160 · 6.12.111 · 6.18.51 · 7.2.5 · 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/23c5cc9652c6ee85617002cb66e1068395045de6
- Referencia en git.kernel.orggit.kernel.org/stable/c/93729594af506557a86f8b603be7ac5f3370eeca
- Referencia en git.kernel.orggit.kernel.org/stable/c/110747ff535e3d98ac17d68dbd056bb6ef000e23
- Referencia en git.kernel.orggit.kernel.org/stable/c/3b467c68803d7c7e82678289e598afd44faa6101
- Referencia en git.kernel.orggit.kernel.org/stable/c/e939fc6a7bd969a58a150b7f188c1047138403e3
Ver el texto original en inglés (CVE.org)
ceph: properly decrypt filenames in vmalloc() buffers
In the Linux kernel, the following vulnerability has been resolved: ceph: properly decrypt filenames in vmalloc() buffers The fscrypt subsystem uses the scatterlist crypto API, inheriting its requirement that any buffers are in the linear mapping region. However, the messenger client uses kvmalloc() to create buffers for messages, which will occasionally place those buffers in the vmalloc() region when physical memory fragmentation doesn't permit a large enough kmalloc(). The various callers of ceph_fname_to_usr() directly pass (slices of) raw messages from the MDS without considering that the messages may be in vmalloc() buffers, resulting in oopses especially on non-x86 platforms (see 'Closes:' for more details and a reproducer). Make ceph_fname_to_usr() explicitly tolerant of vmalloc()-allocated fname->ctext, fname->name, and/or oname->name buffers, using `tname` (which, when non-null, must be a linear address; when null, is briefly allocated as necessary) as a bounce buffer to avoid passing any inappropriate addresses to fscrypt_fname_disk_to_usr(). Additionally change parse_reply_info_readdir() -- the only function to supply its own `tname` -- to follow the new "tname must never come from vmalloc()" rule by passing NULL when the message is not in the linear region. Though this causes a per-dentry kmalloc()+kfree(), this overhead exists only when processing the minority of messages that spill into vmalloc(). My (crude) testing puts this at only about 1 in 8,000 readdir messages. Still, if the overhead proves unreasonable in the future, it is easy enough to mitigate: a future change could allocate a bounce buffer in parse_reply_info_readdir() and use that as `tname` instead.