В ядре Linux устранена следующая уязвимость: ext2: отказ от иноду с нулем i_nlink и действительным режимом в ext2_iget() ext2_iget() уже от…
В ядре Linux устранена следующая уязвимость: ext2: отказ от иноду с нулем i_nlink и действительным режимом в ext2_iget() ext2_iget() уже отклоняет индоды с i_nlink == 0, когда i_mode нулевой или i_dtime устанавливается, рассматривая их как удаленные. Однако дело о i_nlink == 0 с ненулевым режимом и нулевым временем проскальзывает. С тех пор ext2 не имеет списка сирот, такая комбинация может возникнуть только в результате коррупция в файловой системе - законное удаление inode всегда устанавливает i_dtime или очищает i_mode перед освобождением инода. Сделанное изображение может использовать этот пробел, чтобы представить такой инодеон VFS, который затем запускает WARN_ON внутри drop_nlink() (fs/inode.c) через ext2_unlink(), ext2_rename() и ext2_rmdir(): ВНИМАНИЕ: CPU: 3 PID: 609 на fs/inode.c:336 drop_nlink+0xd0 fs/inode.c:336 drop_nlink+0xd0 fs/inode.c:336 CPU: 3 UID: 0 PID: 609 Комп.: syz-исполнитель Не испорчен 6.12.77+ #1 Трейс по вызову: <TASK> inode_dec_link_count включить/linux/fs.h:2518 [inline] ext2_unlink+0x26c/0x300 fs/ext2/namei.c:295 vfs_unlink+0x2fc/0x9b0 fs/namei.c:4477 do_unlinkat+0x53e/0x730 fs/namei.c:4541 __x64_sys_unlink+0xc6/0x110 fs/namei.c:4587 do_syscal_64+0xf5/0x220 арка/x86/entry/common.c:78 вход_SYSCALL_64_after_hwframe+0x77/0x7f </TASK> ВНИМАНИЕ: CPU: 0 PID: 646 на fs/inode.c:336 drop_nlink+0xd0 fs/inode.c:336 CPU: 0 UID: 0 PID: 646 Comm: syz.0.17 Не испорченный 6.12.77+ #1 Трейс по вызову: <TASK> inode_dec_link_count включить/linux/fs.h:2518 [inline] ext2_rename+0x35e/0x850 fs/ext2/namei.c:374 vfs_rename+0xf2f/0x2060 fs/namei.c:5021 do_renameat2+0xbe2/0xd50 fs/namei.c:5178 __x64_sys_rename+0x7e/0xa0 fs/namei.c:5223 do_syscal_64+0xf5/0x220 арка/x86/entry/common.c:78 вход_SYSCALL_64_after_hwframe+0x77/0x7f </TASK> ВНИМАНИЕ: ЦП: 0 ПИД: 634 на fs/inode.c:336 drop_nlink+0xd0 fs/inode.c:336 CPU: 0 UID: 0 PID: 634 Comm: syz-исполнитель Не испорчен 6.12.77+ #1 Трейс по вызову: <TASK> inode_dec_link_count включить/linux/fs.h:2518 [inline] ext2_rmdir+0xca/0x110 fs/ext2/namei.c:311 vfs_rmdir+0x204/0x690 fs/namei.c:4348 do_rmdir+0x372/0x3e0 fs/namei.c:4407 __x64_sys_unlinkat+0xf0/0x130 fs/namei.c:4577 do_syscal_64+0xf5/0x220 арка/x86/entry/common.c:78 вход_SYSCALL_64_after_hwframe+0x77/0x7f </TASK> Продлить существующий i_inlink == 0 чек, чтобы также поймать этот случай, Сообщение о коррупции через ext2_error() и возвращение -EFSCorRUPTED. Это отклоняет иноде во время загрузки и предотвращает его достижение любого Путь namei.c. Найдено Центром верификации Linux (linuxtesting.org) с компанией Syzkaller.
| Продукт | Вендор | Статус |
|---|---|---|
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux_kernel | * | Отслеживается |
| kernel-doc-6.12 | Отслеживается | |
| kernel-doc-6.12 | Отслеживается | |
| kernel-doc-6.12 | Отслеживается | |
| kernel-doc-6.18 | Отслеживается | |
| kernel-doc-6.18 | Отслеживается | |
| kernel-doc-7.0 | Отслеживается | |
| kernel-doc-std | Отслеживается | |
| kernel-doc-un | Отслеживается | |
| kernel-headers-6.12 | Отслеживается | |
| kernel-headers-6.12 | Отслеживается | |
| kernel-headers-6.12 | Отслеживается | |
| kernel-headers-6.18 | Отслеживается | |
| kernel-headers-6.18 | Отслеживается | |
| kernel-headers-7.0 | Отслеживается | |
| kernel-headers-modules-6.12 | Отслеживается | |
| kernel-headers-modules-6.12 | Отслеживается | |
| kernel-headers-modules-6.12 | Отслеживается |