В ядре Linux устранена следующая уязвимость:
nvme-tcp: исправлено использование page_frag_cache.
nvme использует page_frag_cache для предварительного выделения PDU для каждого предварительно выделенного запроса.
блочного устройства. Блочные устройства создаются в параллельных потоках,
следовательно, page_frag_cache используется не поточно-ориентированным способом. Это приводит к некорректному пересчету страниц backstore и преждевременному освобождению.
Это можно отловить с помощью !sendpage_ok внутри сетевого стека:
ВНИМАНИЕ: ЦП: 7 PID: 467 в ../net/core/skbuff.c:6931 skb_splice_from_iter+0xfa/0x310.
tcp_sendmsg_locked+0x782/0xce0
tcp_sendmsg+0x27/0x40
sock_sendmsg+0x8b/0xa0
nvme_tcp_try_send_cmd_pdu+0x149/0x2a0
Тогда может возникнуть случайная паника. Исправьте это, сериализовав использование page_frag_cache.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: nvme-tcp: fix usage of page_frag_cache nvme uses page_frag_cache to preallocate PDU for each preallocated request of block device. Block devices are created in parallel threads, consequently page_frag_cache is used in not thread-safe manner. That leads to incorrect refcounting of backstore pages and premature free. That can be catched by !sendpage_ok inside network stack: WARNING: CPU: 7 PID: 467 at ../net/core/skbuff.c:6931 skb_splice_from_iter+0xfa/0x310. tcp_sendmsg_locked+0x782/0xce0 tcp_sendmsg+0x27/0x40 sock_sendmsg+0x8b/0xa0 nvme_tcp_try_send_cmd_pdu+0x149/0x2a0 Then random panic may occur. Fix that by serializing the usage of page_frag_cache.