В ядре Linux устранена следующая уязвимость:
afs: удалить настройку AS_RELEASE_ALWAYS для символических ссылок и точек монтирования. Обычные файлы AFS правильно используют afs_file_aops, у которых есть Release_folio.
установлен как netfs_release_folio, поэтому для них действует AS_RELEASE_ALWAYS
когда fscache включен (устанавливается с помощью afs_vnode_set_cache()). Символические ссылки и точки монтирования в AFS используют afs_dir_aops, который не обеспечивает
обратный вызов Release_folio.
Однако afs_apply_status() безоговорочно
для них вызывает Mapping_set_release_always(). В таком случае, когда код управления памятью пытается освободить фолио,
filemap_release_folio() проверяет folio_needs_release(), который
возвращает true, поскольку установлен AS_RELEASE_ALWAYS. Поскольку нет
обратный вызов Release_folio, он не проходит через try_to_free_buffers(),
который в настоящее время ожидает, что buffer_heads будет не нулевым.
Для символических ссылок
и точки монтирования без buffer_heads, это приводит к разыменованию указателя.
[dh: Добавлено больше пропущенных фрагментов]
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: afs: Remove setting of AS_RELEASE_ALWAYS for symlinks and mountpoints Regular AFS files correctly use afs_file_aops which have release_folio set as netfs_release_folio, so AS_RELEASE_ALWAYS is valid for them when fscache is enabled (set via afs_vnode_set_cache()). Symlinks and mountpoints in AFS use afs_dir_aops, which does not provide a release_folio callback. However, afs_apply_status() unconditionally calls mapping_set_release_always() for these. In such case when memory management code attempts to release folios, filemap_release_folio() checks folio_needs_release() which returns true due to AS_RELEASE_ALWAYS being set. Since there is no release_folio callback, it falls through to try_to_free_buffers(), which at present expects buffer_heads to be not null. For symlinks and mountpoints without buffer_heads, this causes pointer dereference. [dh: Added more bits that were missed]