В ядре Linux устранена следующая уязвимость:
fs/ntfs3: привязан attr_off в UpdateResidentValue к data_off
В случае UpdateResidentValue функции do_action() (fslog.c:3307)
lrh->attr_off и lrh->redo_len берутся из дискового LRH. Когда они удовлетворяют aoff + dlen < attr->res.data_off,
задание
attr->res.data_size = cpu_to_le32(aoff + dlen - data_off);
уменьшается до ~4 ГиБ (например, 0xFFFFFFFF9, когда aoff=0x10, dlen=1,
data_off=0x18). Последующий код, который читает attr->res.data_size
для обхода полезной нагрузки резидентного атрибута затем будет считаться до
4 ГиБ сверх выделения записи MFT размером 1024 байта.
Существующая защита mi_enum_attr() в fs/ntfs3/record.c:287.
ловит поврежденный data_size при следующем обходе атрибута
и терпит неудачу на горе, но только на пути, по которому идут все
атрибуты. Сайт чтения, который выбирает атрибут по имени и
чтение его data_size без повторной проверки не рассматривается. Проверьте aoff на соответствие data_off и размеру в источнике.
Воспроизведено под UML+KASAN на основной ветке 8d90b09e6741 через
Проверка pr_warn-only: при aoff=0x10 и data_off=0x18
data_size после назначения равен 0xffffffff9 (затем монтирование завершается с ошибкой
при -22 из mi_enum_attr).
[almaz.alexandrovich@paragon-software.com: отформатировал изменения в clang]
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: fs/ntfs3: bound attr_off in UpdateResidentValue against data_off In do_action()'s UpdateResidentValue case (fslog.c:3307), lrh->attr_off and lrh->redo_len come from the on-disk LRH. When they satisfy aoff + dlen < attr->res.data_off, the assignment attr->res.data_size = cpu_to_le32(aoff + dlen - data_off); underflows to ~4 GiB (e.g. 0xFFFFFFF9 when aoff=0x10, dlen=1, data_off=0x18). Subsequent code that reads attr->res.data_size to walk the resident attribute payload would then read up to 4 GiB past the 1024-byte MFT record allocation. The existing mi_enum_attr() defense in fs/ntfs3/record.c:287 catches the corrupted data_size on the next attribute walk and fails the mount, but only on the path that walks all attributes. A read site that picks an attribute by name and reads its data_size without re-validating is not covered. Validate aoff against data_off and asize at the source. Reproduced under UML+KASAN on mainline 8d90b09e6741 via pr_warn-only probe: with aoff=0x10 and data_off=0x18, the post-assignment data_size is 0xfffffff9 (mount then fails at -22 from mi_enum_attr). [almaz.alexandrovich@paragon-software.com: clang-formatted the changes]
Характеристики атаки
Последствия
Строка CVSS v3.1