В ядре Linux устранена следующая уязвимость:
ocfs2: проверка цели быстрой символической ссылки во время чтения индексного дескриптора
ocfs2_validate_inode_block() уже отклоняет несколько противоречивых
автономные диноды, прежде чем они будут подвергнуты воздействию остальной части
файловая система. Быстрые символические ссылки требуют такого же подхода. Символическая ссылка с нулевым кластером рассматривается как быстрая символическая ссылка и позже считывается.
page_get_link() и ocfs2_fast_symlink_read_folio().
Этот путь использует
strnlen() для встроенных полезных данных, а затем копирует len + 1 байт в
фолио. Если поврежденный динод хранит i_size, который не соответствует встроенному
область или опускает завершающий NUL в i_size, эта копия считывается за конец
буфера блока индексного дескриптора. Отклонять диноды символических ссылок нулевого кластера, i_size которых превышает встроенный
емкость быстрой символической ссылки или чья встроенная полезная нагрузка не завершается NUL
точно в i_size, когда блок индексного дескриптора проверен.
Это сохраняет неправильную форму
быстрые символические ссылки от достижения пути чтения. Проверка воспроизвела этот отчет ядра:
KASAN use-after-free в ocfs2_fast_symlink_read_folio+0x12c/0x1f0
РИП: 0033:0x7f5c6d859aa7
Читать размер 3905. Трассировка звонков:
dump_stack_lvl+0x66/0xa0 (?:?)
print_report+0xce/0x630 (?:?)
ocfs2_fast_symlink_read_folio+0x12c/0x1f0 (fs/ocfs2/inode.c:?)
srso_alias_return_thunk+0x5/0xfbef5 (?:?)
__virt_addr_valid+0x19f/0x330 (?:?)
kasan_report+0xe0/0x110 (?:?)
kasan_check_range+0x105/0x1b0 (?:?)
__asan_memcpy+0x23/0x60 (?:?)
filemap_read_folio+0x27/0xe0 (?:?)
filemap_read_folio+0x35/0xe0 (?:?)
do_read_cache_folio+0x138/0x230 (?:?)
__page_get_link+0x26/0x110 (?:?)
page_get_link+0x2e/0x70 (?:?)
vfs_readlink+0x15e/0x250 (?:?)
touch_atime+0x4d/0x370 (?:?)
do_readlinkat+0x186/0x200 (?:?)
do_user_addr_fault+0x65a/0x890 (?:?)
__x64_sys_readlink+0x46/0x60 (?:?)
do_syscall_64+0x115/0x6a0 (arch/x86/entry/syscall_64.c:87)
запись_SYSCALL_64_after_hwframe+0x77/0x7f (?:?)
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ocfs2: validate fast symlink target during inode read ocfs2_validate_inode_block() already rejects several inconsistent self-contained dinodes before they are exposed to the rest of the filesystem. Fast symlinks need the same treatment. A zero-cluster symlink is treated as a fast symlink and later read through page_get_link() and ocfs2_fast_symlink_read_folio(). That path uses strnlen() on the inline payload and then copies len + 1 bytes into the folio. If a corrupt dinode stores an i_size that does not fit the inline area or omits the terminating NUL at i_size, that copy reads past the end of the inode block buffer. Reject zero-cluster symlink dinodes whose i_size exceeds the inline fast-symlink capacity or whose inline payload is not NUL-terminated exactly at i_size when the inode block is validated. This keeps malformed fast symlinks from reaching the read path. Validation reproduced this kernel report: KASAN use-after-free in ocfs2_fast_symlink_read_folio+0x12c/0x1f0 RIP: 0033:0x7f5c6d859aa7 Read of size 3905 Call trace: dump_stack_lvl+0x66/0xa0 (?:?) print_report+0xce/0x630 (?:?) ocfs2_fast_symlink_read_folio+0x12c/0x1f0 (fs/ocfs2/inode.c:?) srso_alias_return_thunk+0x5/0xfbef5 (?:?) __virt_addr_valid+0x19f/0x330 (?:?) kasan_report+0xe0/0x110 (?:?) kasan_check_range+0x105/0x1b0 (?:?) __asan_memcpy+0x23/0x60 (?:?) filemap_read_folio+0x27/0xe0 (?:?) filemap_read_folio+0x35/0xe0 (?:?) do_read_cache_folio+0x138/0x230 (?:?) __page_get_link+0x26/0x110 (?:?) page_get_link+0x2e/0x70 (?:?) vfs_readlink+0x15e/0x250 (?:?) touch_atime+0x4d/0x370 (?:?) do_readlinkat+0x186/0x200 (?:?) do_user_addr_fault+0x65a/0x890 (?:?) __x64_sys_readlink+0x46/0x60 (?:?) do_syscall_64+0x115/0x6a0 (arch/x86/entry/syscall_64.c:87) entry_SYSCALL_64_after_hwframe+0x77/0x7f (?:?)
Характеристики атаки
Последствия
Строка CVSS v3.1