В ядре Linux устранена следующая уязвимость:
net/smc: исправлено использование после освобождения в smc_rx_pipe_buf_release()
smc_rx_splice() передает страницы ПКМ в канал и принимает ссылку на сокет
для каждой записи, поэтому smc_sock остается активным до тех пор, пока программа чтения не завершит работу.
соединения нет: одновременное закрытие запускает smc_conn_free(), который
освобождает буфер приема обратно в пул канальной группы.
smc_rx_pipe_buf_release() проверяет sk_state перед блокировкой сокета. Состояние может меняться между проверкой и блокировкой, и
smc_rx_update_cons() затем разыменовывает conn->rmb_desc и переходит
conn->lgr, который smc_conn_free() уже выпустил. На
is_reg_err путь smcr_buf_unuse() полностью освобождает дескриптор, поэтому
это использование после бесплатного использования.
Сначала возьмите блокировку сокета и вместо этого проверьте conn->freed.
smc_conn_free() устанавливает этот флаг перед тем, как что-либо освободить, и каждый раз
вызывающий абонент удерживает блокировку сокета. Оба пути исключают друг друга: либо
выпуск канала запускается первым со всем действительным или видит флаг
и пропускает обновление.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: net/smc: fix use-after-free in smc_rx_pipe_buf_release() smc_rx_splice() hands RMB pages to a pipe and takes a socket reference per entry so the smc_sock stays alive until the reader finishes. The connection does not: a concurrent close runs smc_conn_free(), which releases the receive buffer back to the link group pool. smc_rx_pipe_buf_release() tests sk_state before taking the socket lock. The state can change between the test and the lock, and smc_rx_update_cons() then dereferences conn->rmb_desc and walks conn->lgr, which smc_conn_free() has already released. On the is_reg_err path smcr_buf_unuse() frees the descriptor outright, so this is a use-after-free. Take the socket lock first and test conn->freed instead. smc_conn_free() sets that flag before releasing anything, and every caller holds the socket lock. The two paths exclude each other: either the pipe release runs first with everything valid, or it sees the flag and skips the update.
Характеристики атаки
Последствия
Строка CVSS v3.1