В ядре Linux устранена следующая уязвимость:
net/smc: переносить слишком большие сообщения SMC-Rv2 LLC в записи очереди.
smc_llc_rmt_delete_rkey() и smc_llc_save_add_link_rkeys() читают часть
сообщения версии 2, которое не вписывается в 44-байтовое объединение smc_llc_msg, и
оба связаны размером буфера, в который он попал, а не тем, что
прибыл. По каналу с общим буфером v2 получайте 44-байтовый буфер. DELETE_RKEY_V2, объявляющий 255 rkeys, достигает rkey[9..254] в любом
предыдущее сообщение осталось в lgr->wr_rx_buf_v2 и передает каждое из них в
smc_rtoken_delete().
Один из этих 255 соответствовал зарегистрированному токену rtoken и
удалил его. ADD_LINK по такой ссылке устанавливает до 255 токенов из
те же байты. Скопируйте хвост в запись очереди, чтобы его длина равнялась длине
сообщение, которое пришло, и объявить rkeys, которые вписываются в строку как член
союз вместо того, чтобы достигать их через приведение. То же самое
DELETE_RKEY_V2 теперь обрабатывает 9 имеющихся в нем ключей.
Количество копий ограничено до самого длинного хвоста, который могут прочитать две функции, поэтому партнер не выбирает размер входа. Привязка предыдущего патча размещена на ссылках без общего получения v2. буфер больше не нужен.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry smc_llc_rmt_delete_rkey() and smc_llc_save_add_link_rkeys() read the part of a v2 message that does not fit into the 44-byte union smc_llc_msg, and both bound themselves by the size of the buffer it landed in, not by what arrived. On a link with a shared v2 receive buffer a 44-byte DELETE_RKEY_V2 declaring 255 rkeys reaches rkey[9..254] in whatever an earlier message left in lgr->wr_rx_buf_v2, and passes each of them to smc_rtoken_delete(). One of those 255 matched a registered rtoken and deleted it. An ADD_LINK on such a link installs up to 255 rtokens from the same bytes. Copy the tail into the queue entry, so its length is the length of the message that arrived, and declare the rkeys that fit inline as a member of the union instead of reaching them through a cast. The same DELETE_RKEY_V2 now processes the 9 rkeys it carries. The copy is limited to the longest tail the two functions can read, so the peer does not pick the size of the entry. The bound the previous patch placed on links without a shared v2 receive buffer is no longer needed.
Характеристики атаки
Последствия
Строка CVSS v3.1