В ядре Linux устранена следующая уязвимость:
svcrdma: проверка позиций чтения блоков перед реконструкцией
Поле позиции фрагмента чтения RPC/RDMA предоставляется удаленным
клиента и дословно сохраняется в проанализированном списке фрагментов.
xdr_count_read_segments() проверяет только 4-байтовое выравнивание; это никогда
сравнивает позицию с полученной длиной тела. В пути, состоящем из одного фрагмента, svc_rdma_read_complete_one() разделяет
голова и хвост kvecs в ch_position. Позиция за строкой
тело выходит за пределы длины хвоста, подвергая соседнюю пластину памяти воздействию
верхний декодер XDR.
В многочанковом пути svc_rdma_read_multiple_chunks() вычисляет
длины промежутков между частями как беззнаковые вычитания из
ch_position. Перекрывающиеся фрагменты чтения приводят к тому, что эти вычитания
подлив. Конечная позиция после встроенного тела также
меньше длины конечного промежутка. svc_rdma_copy_inline_range()
затем копирует буфер приема на страницы запроса, которые
возвращается клиенту через канал ответа.
Связанные копии встроенного диапазона в svc_rdma_copy_inline_range() против
декодированное встроенное тело RPC, сохраненное в rc_saved_arg. Отклонить
один фрагмент чтения, расположенный за пределами этого тела, и отклонение
многокусковые списки, в которых накопленные прочитанные байты превышают следующие
позиция чанка. Примените ту же позицию и перекройте проверки
путь перемежения фрагмента вызова.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: svcrdma: Validate Read chunk positions before reconstruction The RPC/RDMA Read chunk position field is supplied by the remote client and stored verbatim in the parsed chunk list. xdr_count_read_segments() checks only 4-byte alignment; it never compares the position against the received inline body length. In the single-chunk path, svc_rdma_read_complete_one() splits the head and tail kvecs at ch_position. A position past the inline body underflows the tail length, exposing adjacent slab memory to the upper XDR decoder. In the multi-chunk path, svc_rdma_read_multiple_chunks() computes gap lengths between chunks as unsigned subtractions from ch_position. Overlapping Read chunks cause these subtractions to underflow. A final position past the inline body likewise underflows the trailing gap length. svc_rdma_copy_inline_range() then copies past the receive buffer into request pages that are returned to the client through the Reply channel. Bound inline-range copies in svc_rdma_copy_inline_range() against the decoded inline RPC body saved in rc_saved_arg. Reject a single Read chunk positioned beyond that body, and reject multi-chunk lists where accumulated read bytes exceed the next chunk's position. Apply the same position and overlap checks in the call-chunk interleaving path.
Характеристики атаки
Последствия
Строка CVSS v3.1