В ядре Linux устранена следующая уязвимость:
RDMA/ionic: исправлена утечка стека ядра в ionic_create_cq().
struct ionic_cq_resp соответственно {
__u32 cqid[2]; // смещение 0 - ЧАСТИЧНО УСТАНОВЛЕНО (см. ниже)
__u8 udma_mask; // смещение 8 - SET (соответственно udma_mask = vcq->udma_mask)
__u8 rsvd[7]; // смещение 9 - НИКОГДА НЕ УСТАНОВЛЕНО <- УТЕЧКА
};
rsvd[7]: 7 байтов стековой памяти утекли безоговорочно.
cqid[2]: цикл в строке 1256 перебирает udma_idx, но пропускает индексы.
где !(vcq->udma_mask & BIT(udma_idx)). Массив имеет 2 записи, но
udma_count может быть равен 1, что означает, что cqid[1] никогда не будет записан через
ionic_create_cq_common(). Если в udma_mask установлен только бит 0, cqid[1] (4
байт) также просочилась.
Таким образом, потенциально утекло 11 байт.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: RDMA/ionic: Fix kernel stack leak in ionic_create_cq() struct ionic_cq_resp resp { __u32 cqid[2]; // offset 0 - PARTIALLY SET (see below) __u8 udma_mask; // offset 8 - SET (resp.udma_mask = vcq->udma_mask) __u8 rsvd[7]; // offset 9 - NEVER SET <- LEAK }; rsvd[7]: 7 bytes of stack memory leaked unconditionally. cqid[2]: The loop at line 1256 iterates over udma_idx but skips indices where !(vcq->udma_mask & BIT(udma_idx)). The array has 2 entries but udma_count could be 1, meaning cqid[1] might never be written via ionic_create_cq_common(). If udma_mask only has bit 0 set, cqid[1] (4 bytes) is also leaked. So potentially 11 bytes leaked.