В ядре Linux устранена следующая уязвимость:
scsi: xen: scsiback: освободить тег команды на пути ошибки отправки TMR
scsiback_device_action() получает тег команды в
scsiback_get_pend_req() и отправляет запрос на управление задачами с помощью
target_submit_tmr(). Когда target_submit_tmr() терпит неудачу, он возвращает < 0 и
scsiback переходит к метке err:, которая отправляет ответ, но освобождает
ничего, утечка тега. Воздействие: гость pvSCSI может утечь теги команд сеанса LUN.
остановка LUN путем выдачи запросов VSCSIIF_ACT_SCSI_ABORT или RESET
всякий раз, когда target_submit_tmr() терпит неудачу.
Transport_generic_free_cmd() здесь нельзя использовать.
К тому времени
target_submit_tmr() возвращает уже выполненную ошибку
__target_init_cmd() (поэтому se_cmd->cmd_kref равен единице, а не нулю), и на его
путь ошибки target_get_sess_cmd(), который он освободил se_cmd->se_tmr_req через
core_tmr_release_req(), оставив установленным SCF_SCSI_TMR_CDB и
указатель висит. Разрешение команде Release запускать target_free_cmd_mem()
тогда дважды освободит se_tmr_req. Используйте тот же помощник, который возвращает только тег, и на этом пути.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: scsi: xen: scsiback: Free the command tag on the TMR submit-failure path scsiback_device_action() obtains a command tag in scsiback_get_pend_req() and submits a task-management request with target_submit_tmr(). When target_submit_tmr() fails it returns < 0 and scsiback jumps to the err: label, which sends a response but frees nothing, leaking the tag. Impact: a pvSCSI guest can leak the command tags of a LUN's session, stopping the LUN, by issuing VSCSIIF_ACT_SCSI_ABORT or RESET requests whenever target_submit_tmr() fails. transport_generic_free_cmd() cannot be used here. By the time target_submit_tmr() returns an error it has already run __target_init_cmd() (so se_cmd->cmd_kref is one, not zero), and on its target_get_sess_cmd() error path it has freed se_cmd->se_tmr_req via core_tmr_release_req() while leaving SCF_SCSI_TMR_CDB set and the pointer dangling. Letting the command release run target_free_cmd_mem() would then double-free se_tmr_req. Use the same helper, which returns just the tag, on this path too.