В ядре Linux устранена следующая уязвимость:
scsi: xen: scsiback: Бесплатная неотправленная команда вместо ее двойного ввода
scsiback_get_pend_req() получает тег команды и возвращает vscibk_pend
чей встроенный se_cmd только что был установлен в 0, поэтому его cmd_kref равен 0;
se_cmd инициализируется (kref_init() через target_init_cmd()) только
позже, в scsiback_cmd_exec(), при успешном выполнении VSCSIIF_ACT_SCSI_CDB.
путь. Два пути ошибки в scsiback_do_cmd_fn(), принятые перед
отправлена команда — не удалось выполнить scsiback_gnttab_data_map() и
неизвестный Ring_req.act -- вызов
Transport_generic_free_cmd(&pending_req->se_cmd, 0), который является kref_put()
refcount равен 0. Это приводит к его опустошению ("refcount_t: underflow;
use-after-free") и, поскольку функция Release не запускается, происходит утечка
командный тег.
Воздействие: гость pvSCSI может утечь каждый тег команды сеанса LUN.
остановка LUN путем отправки запросов с неверной ссылкой на грант или
неизвестный тип запроса; под паникой_on_warn недополнение счетчика ссылок
паникует хозяин. Добавьте помощник, который просто возвращает тег с помощью target_free_tag() и отправляет
ответ об ошибке. Он освобождает тег, пока ссылка на v2p все еще закреплена.
сеанс и заранее делает снимки полей ответа, потому что
освобождение тега может позволить другому кольцу повторно использовать слот pending_req.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: scsi: xen: scsiback: Free unsubmitted command instead of double-putting it scsiback_get_pend_req() obtains a command tag and returns a vscsibk_pend whose embedded se_cmd has only been memset to 0, so its cmd_kref is 0; the se_cmd is initialised (kref_init() via target_init_cmd()) only later, in scsiback_cmd_exec(), on the successful VSCSIIF_ACT_SCSI_CDB path. The two error paths in scsiback_do_cmd_fn() taken before the command is submitted -- a failed scsiback_gnttab_data_map() and an unknown ring_req.act -- call transport_generic_free_cmd(&pending_req->se_cmd, 0), which kref_put()s a refcount of 0. That underflows it ("refcount_t: underflow; use-after-free") and, as the release function is not run, leaks the command tag. Impact: a pvSCSI guest can leak every command tag of a LUN's session, stopping the LUN, by submitting requests with a bad grant reference or an unknown request type; under panic_on_warn the refcount underflow panics the host. Add a helper that just returns the tag with target_free_tag() and sends the error response. It frees the tag while the v2p reference still pins the session, and snapshots the response fields beforehand because freeing the tag can let another ring reuse the pending_req slot.
Характеристики атаки
Последствия
Строка CVSS v3.1