В ядре Linux устранена следующая уязвимость:
ocfs2: проверьте длину в dlm_mig_lockres_handler
Узел, получающий сообщение DLM_MIG_LOCKRES, доверяет нескольким полям
предоставленный партнером dlm_migratable_lockres без проверки. num_locks и
lockname_len ограничены только на отправляющей стороне, и сообщение
никогда не проверялся на наличие записей num_locks migratable_lock. Как
result dlm_process_recovery_data() проходит mres->ml[0..num_locks) мимо
kmalloc(data_len) копия сообщения (чтение за пределами границ, которое заканчивается на
паника BUG_ON), а dlm_init_lockres() копирует байты lockname_len в
исправлен 32-байтовый объект o2dlm_lockname slab (запись в кучу за пределами области). Оба доступны любому узлу в домене.
Проверьте эти поля сразу после dlm_grab(), прежде чем они будут использованы —
включая путь к несвязанной ошибке, который уже печатает mres->lockname
с неограниченным значением lockname_len с точностью %.*s. Отклонить сообщение
если имя_блокировки_len <= DLM_LOCKID_NAME_MAX, num_locks <=
DLM_MAX_MIGRATABLE_LOCKS (привязка, которую уже утверждает отправитель), и
полезная нагрузка достаточно велика, чтобы удерживать заявленные замки. Соответствующее восстановление
и сообщения о миграции остаются без изменений.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ocfs2: validate lengths in dlm_mig_lockres_handler A node receiving a DLM_MIG_LOCKRES message trusts several fields of the peer-supplied dlm_migratable_lockres without validation. num_locks and lockname_len are bounded only on the sending side, and the message is never checked to actually carry num_locks migratable_lock entries. As a result dlm_process_recovery_data() walks mres->ml[0..num_locks) past the kmalloc(data_len) copy of the message (an out-of-bounds read that ends in a BUG_ON panic), and dlm_init_lockres() copies lockname_len bytes into the fixed 32-byte o2dlm_lockname slab object (a heap out-of-bounds write). Both are reachable by any node in the domain. Validate these fields right after dlm_grab(), before anything uses them -- including the not-joined error path, which already prints mres->lockname with the unbounded lockname_len as a %.*s precision. Reject the message unless lockname_len <= DLM_LOCKID_NAME_MAX, num_locks <= DLM_MAX_MIGRATABLE_LOCKS (the bound the sender already asserts), and the payload is large enough to hold the claimed locks. Conforming recovery and migration messages are unaffected.
Характеристики атаки
Последствия
Строка CVSS v3.1