В ядре Linux устранена следующая уязвимость:
xsk: исправлено удаление узла фрагмента, чтобы предотвратить утечку буфера. После фиксации b692bf9a7543 («xsk: избавиться от xdp_buff_xsk::xskb_list_node»),
поле list_node повторно используется как для списка пула xskb, так и для буфера
свободный список, это приводит к утечке буфера, как описано ниже.
xp_free() проверяет, находится ли буфер уже в списке свободных, используя
list_empty(&xskb->list_node). Когда list_del() используется для удаления узла
из списка пулов xskb он не инициализирует повторно указатели узлов.
Это означает, что list_empty() вернет false даже после того, как узел был
удален, из-за чего xp_free() неправильно пропускает добавление буфера в
бесплатный список. Исправьте это, используя list_del_init() вместо list_del() во всех фрагментах.
обработка путей, это гарантирует повторную инициализацию узла списка после удаления,
позволяя list_empty() работать правильно.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: xsk: Fix fragment node deletion to prevent buffer leak After commit b692bf9a7543 ("xsk: Get rid of xdp_buff_xsk::xskb_list_node"), the list_node field is reused for both the xskb pool list and the buffer free list, this causes a buffer leak as described below. xp_free() checks if a buffer is already on the free list using list_empty(&xskb->list_node). When list_del() is used to remove a node from the xskb pool list, it doesn't reinitialize the node pointers. This means list_empty() will return false even after the node has been removed, causing xp_free() to incorrectly skip adding the buffer to the free list. Fix this by using list_del_init() instead of list_del() in all fragment handling paths, this ensures the list node is reinitialized after removal, allowing the list_empty() to work correctly.