В ядре Linux устранена следующая уязвимость:
cxl/features: привязка полезных данных команды fwctl к входному буферу.
fwctl_cmd_rpc() копирует байты cmd->in_len в inbuf = kvzalloc(cmd->in_len)
и передает inbuf и in_len в ->fw_rpc(). Обратный вызов CXL cxlctl_fw_rpc()
игнорирует in_len и никогда не сверяет с ним управляемый пользователем op_size.
cxlctl_set_feature() ограничивает op_size только снизу
(op_size <= sizeof(feat_in->hdr)) а затем читает op_size - sizeof(hdr)
байты из feat_in->feat_data через cxl_set_feature(). С небольшой ин_лен
и большой op_size, первый memcpy() уже читает мимо
буфер kvzalloc(in_len); байты за пределами границ помещаются в почтовый ящик
полезная нагрузка и отправляется на устройство, и достаточно большой op_size может войти в
неотображенная память и упс ядро.
Пути Get прикрепляют op_size к фиксированному значению.
size, но также прочитайте входную структуру без проверки in_len. Отклонять в единой точке отправки любой запрос, фиксированный заголовок которого плюс
op_size не помещается в скопированный буфер. Нижняя граница тестовых охранников
вычитание и гарантирует, что op_size был скопирован до его чтения.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: cxl/features: bound fwctl command payload to the input buffer fwctl_cmd_rpc() copies cmd->in_len bytes into inbuf = kvzalloc(cmd->in_len) and passes inbuf and in_len to ->fw_rpc(). The CXL callback cxlctl_fw_rpc() ignores in_len and never checks the user-controlled op_size against it. cxlctl_set_feature() bounds op_size only from below (op_size <= sizeof(feat_in->hdr)) and then reads op_size - sizeof(hdr) bytes from feat_in->feat_data via cxl_set_feature(). With a small in_len and a large op_size the first memcpy() already reads past the kvzalloc(in_len) buffer; the out-of-bounds bytes are placed in the mailbox payload and sent to the device, and a large enough op_size can walk into unmapped memory and oops the kernel. The Get paths pin op_size to a fixed size but likewise read the input struct without checking in_len. Reject, at the single dispatch point, any request whose fixed header plus op_size does not fit in the copied-in buffer. The lower-bound test guards the subtraction and ensures op_size was copied in before it is read.
Характеристики атаки
Последствия
Строка CVSS v3.1