В ядре Linux устранена следующая уязвимость:
f2fs: исправлена несогласованность fsck, вызванная неправильным использованием флага nat_entry.
f2fs_need_dentry_mark() считывает флаги nat_entry без взаимного исключения
с путем контрольной точки, что может привести к неправильному блоку индексного дескриптора
состояние маркировки. Сценарий следующий:
создать, записать и fsync контрольную точку записи «файла A»
- f2fs_do_sync_file // встроенный индексный дескриптор
- f2fs_write_inode // индексный дескриптор загрязнен
- f2fs_write_checkpoint
- f2fs_flush_merged_writes
- f2fs_sync_node_pages
- f2fs_fsync_node_pages // нет грязного узла
- f2fs_need_inode_block_update // возвращаем true
- f2fs_fsync_node_pages // испорченный индекс
- f2fs_need_dentry_mark // возвращаем true
- f2fs_flush_nat_entries
- конец f2fs_write_checkpoint
- __write_node_folio // индексный дескриптор с установленным DENT_BIT_SHIFT
SPO, "fsck --dry-run" найти индексный дескриптор уже имеет контрольную точку, но все равно
с установленным DENT_BIT_SHIFT
Состояние, наблюдаемое функцией f2fs_need_dentry_mark(), может отличаться от состояния
наблюдается в __write_node_folio() после получения sbi->node_write. Основная причина заключается в том, что семантика IS_CHECKPOINTED и
HAS_FSYNCED_INODE гарантированы только после записи контрольной точки.
полностью завершен.
Этот патч перемещает set_dentry_mark() в __write_node_folio() и
защищает его блокировкой sbi->node_write.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: f2fs: fix fsck inconsistency caused by incorrect nat_entry flag usage f2fs_need_dentry_mark() reads nat_entry flags without mutual exclusion with the checkpoint path, which can result in an incorrect inode block marking state. The scenario is as follows: create & write & fsync 'file A' write checkpoint - f2fs_do_sync_file // inline inode - f2fs_write_inode // inode folio is dirty - f2fs_write_checkpoint - f2fs_flush_merged_writes - f2fs_sync_node_pages - f2fs_fsync_node_pages // no dirty node - f2fs_need_inode_block_update // return true - f2fs_fsync_node_pages // inode dirtied - f2fs_need_dentry_mark //return true - f2fs_flush_nat_entries - f2fs_write_checkpoint end - __write_node_folio // inode with DENT_BIT_SHIFT set SPO, "fsck --dry-run" find inode has already checkpointed but still with DENT_BIT_SHIFT set The state observed by f2fs_need_dentry_mark() can differ from the state observed in __write_node_folio() after acquiring sbi->node_write. The root cause is that the semantics of IS_CHECKPOINTED and HAS_FSYNCED_INODE are only guaranteed after the checkpoint write has fully completed. This patch moves set_dentry_mark() into __write_node_folio() and protects it with the sbi->node_write lock.
Характеристики атаки
Последствия
Строка CVSS v3.1
Уязвимые продукты 2
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
3.18
|
6.18.30
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
6.19
|
7.0.7
|