В ядре Linux устранена следующая уязвимость:
ntfs: не обновлять список атрибутов, когда суперблок неактивен
generic_shutdown_super() очищает SB_ACTIVE перед удалением кэшированных индексных дескрипторов. Если вытеснение выбирает поддельный индекс для безымянного базового индекса
Атрибут $ATTRIBUTE_LIST, ntfs_evict_big_inode() удаляет поддельные индексные дескрипторы
ссылка на базовый индексный дескриптор, в то время как поддельный индексный дескриптор все еще хеширован и помечен
Я_БЕСПЛАТНО. Этот ввод может синхронно записывать обратно базовый индексный дескриптор.
Путь обратной записи
может обновить пары сопоставлений и вызвать ntfs_attrlist_update(), что
безоговорочно вызывает ntfs_attr_iget() для той же подделки $ATTRIBUTE_LIST
индексный дескриптор. Затем VFS находит индексный дескриптор I_FREEING и ожидает завершения вытеснения.
но текущая задача все еще находится внутри этого пути выселения, что приводит к
самоблокировка в find_inode(). Исправьте это, отразив защиту от разрушения, используемую __ntfs_write_inode():
после очистки SB_ACTIVE не пытайтесь получить список атрибутов
поддельный индексный дескриптор.
Верните -EIO, чтобы демонтаж прервал обновление вместо ожидания
индексный дескриптор, который он вытесняет.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ntfs: fail attrlist updates when the superblock is inactive generic_shutdown_super() clears SB_ACTIVE before evicting cached inodes. If eviction selects the fake inode for a base inode's unnamed $ATTRIBUTE_LIST attribute, ntfs_evict_big_inode() drops the fake inode's reference on the base inode while the fake inode is still hashed and marked I_FREEING. That iput can synchronously write back the base inode. The writeback path may update mapping pairs and call ntfs_attrlist_update(), which unconditionally calls ntfs_attr_iget() for the same $ATTRIBUTE_LIST fake inode. VFS then finds the I_FREEING inode and waits for eviction to finish, but the current task is still inside that eviction path, causing a self-deadlock in find_inode(). Fix this by mirroring the teardown guard used by __ntfs_write_inode(): once SB_ACTIVE has been cleared, do not try to iget the attribute-list fake inode. Return -EIO so teardown aborts the update instead of waiting on the inode it is evicting.