CVE-2024-42305

In the Linux kernel, the following vulnerability has been resolved: ext4: check dot and dotdot of dx_root before making dir indexed Syzbot reports a issue as follows: ============================================ BUG: unable to handle page fault for address: ffffed11022e24fe PGD 23ffee067 P4D 23ffee067 PUD 0 Oops: Oops: 0000 [#1] PREEMPT SMP KASAN PTI CPU: 0 PID: 5079 Comm: syz-executor306 Not tainted 6.10.0-rc5-g55027e689933 #0 Call Trace: <TASK> make_indexed_dir+0xdaf/0x13c0 fs/ext4/namei.c:2341 ext4_add_entry+0x222a/0x25d0 fs/ext4/namei.c:2451 ext4_rename fs/ext4/namei.c:3936 [inline] ext4_rename2+0x26e5/0x4370 fs/ext4/namei.c:4214 [...] ============================================ The immediate cause of this problem is that there is only one valid dentry for the block to be split during do_split, so split==0 results in out of bounds accesses to the map triggering the issue. do_split unsigned split dx_make_map count = 1 split = count/2 = 0; continued = hash2 == map[split - 1].hash; ---> map[4294967295] The maximum length of a filename is 255 and the minimum block size is 1024, so it is always guaranteed that the number of entries is greater than or equal to 2 when do_split() is called. But syzbot's crafted image has no dot and dotdot in dir, and the dentry distribution in dirblock is as follows: bus dentry1 hole dentry2 free |xx--|xx-------------|...............|xx-------------|...............| 0 12 (8+248)=256 268 256 524 (8+256)=264 788 236 1024 So when renaming dentry1 increases its name_len length by 1, neither hole nor free is sufficient to hold the new dentry, and make_indexed_dir() is called. In make_indexed_dir() it is assumed that the first two entries of the dirblock must be dot and dotdot, so bus and dentry1 are left in dx_root because they are treated as dot and dotdot, and only dentry2 is moved to the new leaf block. That's why count is equal to 1. Therefore add the ext4_check_dx_root() helper function to add more sanity checks to dot and dotdot before starting the conversion to avoid the above issue.
CVSS

No CVSS.

Configurations

No configuration.

History

19 Aug 2024, 12:59

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: ext4: verifique el punto y el punto de dx_root antes de indexar el directorio Syzbot informa un problema de la siguiente manera: =================== ========================= ERROR: no se puede manejar el error de página para la dirección: ffffed11022e24fe PGD 23ffee067 P4D 23ffee067 PUD 0 Ups: Ups: 0000 [#1 ] PREEMPT SMP KASAN PTI CPU: 0 PID: 5079 Comm: syz-executor306 No contaminado 6.10.0-rc5-g55027e689933 #0 Seguimiento de llamada: make_indexed_dir+0xdaf/0x13c0 fs/ext4/namei.c:2341 ext4_add_entry+0x222 un /0x25d0 fs/ext4/namei.c:2451 ext4_rename fs/ext4/namei.c:3936 [en línea] text4_rename2+0x26e5/0x4370 fs/ext4/namei.c:4214 [...] ======= ====================================== La causa inmediata de este problema es que sólo hay una válida dentry para que el bloque se divida durante do_split, por lo que split==0 da como resultado accesos fuera de los límites al mapa que desencadenan el problema. do_split división sin signo dx_make_map recuento = 1 división = recuento/2 = 0; continúa = hash2 == mapa[dividido - 1].hash; ---&gt; map[4294967295] La longitud máxima de un nombre de archivo es 255 y el tamaño mínimo de bloque es 1024, por lo que siempre se garantiza que el número de entradas sea mayor o igual a 2 cuando se llama a do_split(). Pero la imagen manipulada por syzbot no tiene punto ni puntopunto en el directorio, y la distribución de dentry en dirblock es la siguiente: bus dentry1 agujero dentry2 gratis |xx--|xx-------------|... ............|xx-------------|...............| 0 12 (8+248)=256 268 256 524 (8+256)=264 788 236 1024 Entonces, cuando se cambia el nombre de dentry1 se aumenta la longitud de name_len en 1, ni el agujero ni el espacio libre son suficientes para contener el nuevo dentry, y make_indexed_dir() es llamado. En make_indexed_dir() se supone que las dos primeras entradas del bloque de directorios deben ser punto y puntopunto, por lo que bus y dentry1 se dejan en dx_root porque se tratan como punto y puntodot, y solo dentry2 se mueve al nuevo bloque de hoja. Es por eso que el recuento es igual a 1. Por lo tanto, agregue la función auxiliar ext4_check_dx_root() para agregar más controles de cordura a los puntos y puntos antes de comenzar la conversión para evitar el problema anterior.

19 Aug 2024, 05:15

Type Values Removed Values Added
References
  • () https://git.kernel.org/stable/c/19e13b4d7f0303186fcc891aba8d0de7c8fdbda8 -
  • () https://git.kernel.org/stable/c/42d420517072028fb0eb852c358056b7717ba5aa -
  • () https://git.kernel.org/stable/c/8afe06ed3be7a874b3cd82ef5f8959aca8d6429a -
  • () https://git.kernel.org/stable/c/b80575ffa98b5bb3a5d4d392bfe4c2e03e9557db -

17 Aug 2024, 09:15

Type Values Removed Values Added
New CVE

Information

Published : 2024-08-17 09:15

Updated : 2024-08-19 12:59


NVD link : CVE-2024-42305

Mitre link : CVE-2024-42305

CVE.ORG link : CVE-2024-42305


JSON object : View

Products Affected

No product.

CWE

No CWE.