В ядре Linux устранена следующая уязвимость:
smb: клиент: исправлено использование перед проверкой ReparseDataLength в reparse_buf_ptr()
reparse_buf_ptr() читает buf->ReparseDataLength перед проверкой этого
count охватывает полный фиксированный заголовок:
buf = (struct reparse_data_buffer *)((u8 *)io + off);
лен = sizeof(*buf); /* 8 байт */
rdlen = le16_to_cpu(buf->ReparseDataLength); /* смещение 4, 2 байта */
if (count < len || count < rdlen + len) /* проверка идет после */
Структура reparse_data_buffer имеет ReparseDataLength со смещением 4. Если
сервер возвращает OutputCount <6, чтение со смещением 4-5 достигает прошлого
конец полученных данных. Off+count ограничивает iov_len
уже проверены, но это не защищает от подсчета
меньше, чем sizeof(*buf).
Разделите проверку: проверьте счетчик >= sizeof(*buf) перед чтением
ReparseDataLength, затем убедитесь, что счетчик охватывает область данных.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: smb: client: fix use-before-check of ReparseDataLength in reparse_buf_ptr() reparse_buf_ptr() reads buf->ReparseDataLength before checking that count covers the full fixed header: buf = (struct reparse_data_buffer *)((u8 *)io + off); len = sizeof(*buf); /* 8 bytes */ rdlen = le16_to_cpu(buf->ReparseDataLength); /* offset 4, 2 bytes */ if (count < len || count < rdlen + len) /* check comes after */ struct reparse_data_buffer has ReparseDataLength at offset 4. If a server returns OutputCount < 6, the read at offset 4-5 reaches past the end of the received data. The off+count bounds against iov_len were already validated, but that does not protect against count being smaller than sizeof(*buf). Split the check: verify count >= sizeof(*buf) before reading ReparseDataLength, then verify count covers the data region.
Характеристики атаки
Последствия
Строка CVSS v3.1