В ядре Linux устранена следующая уязвимость:
PCI/IOV: пропустить восстановление VF Resizable BAR при ошибке чтения
sriov_restore_vf_rebar_state() использует регистр управления VF Resizable BAR.
решить, сколько VF BAR восстановить (nbars) и какой VF BAR каждый
адреса итераций (bar_idx). bar_idx индексируется в dev->sriov->barsz[],
который имеет только записи PCI_SRIOV_NUM_BARS (6). Когда устройство не отвечает, чтение конфигурации обычно возвращает
PCI_ERROR_RESPONSE (~0). Оба поля имеют ширину 3 бита, поэтому nbars и bar_idx
оба оцениваются как 7.
Тогда доступ barz[] выходит за пределы. УБСАН
сообщает об этом как:
UBSAN: индекс массива за пределами границ в драйверах/pci/iov.c:948:51, индекс 7 выходит за пределы диапазона для типа 'resource_size_t [6]'
Наблюдалось на графическом процессоре NVIDIA RTX PRO 1000 (GB207GLM), который перестал отвечать на запросы.
во время неудачного выхода из состояния питания GC6. Последующий pci_restore_state()
вызвал sriov_restore_vf_rebar_state(), пока чтение конфигурации вернулось
0xffffffff, вызывающий удар.
Выход из строя, если какое-либо чтение элемента управления VF Resizable BAR возвращает PCI_ERROR_RESPONSE. Никакие дальнейшие полосы VF не затрагиваются, что безопасно, поскольку в конфигурации указано, что
возвращает PCI_ERROR_RESPONSE, указывая, что устройство недоступно и
восстанавливать бессмысленно. Это отражает охранника в
pci_restore_rebar_state().
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: PCI/IOV: Skip VF Resizable BAR restore on read error sriov_restore_vf_rebar_state() uses the VF Resizable BAR Control register to decide how many VF BARs to restore (nbars) and which VF BAR each iteration addresses (bar_idx). bar_idx indexes into dev->sriov->barsz[], which has only PCI_SRIOV_NUM_BARS (6) entries. When a device does not respond, config reads typically return PCI_ERROR_RESPONSE (~0). Both fields are 3 bits wide, so nbars and bar_idx both evaluate to 7. The barsz[] access then goes out of bounds. UBSAN reports this as: UBSAN: array-index-out-of-bounds in drivers/pci/iov.c:948:51 index 7 is out of range for type 'resource_size_t [6]' Observed on an NVIDIA RTX PRO 1000 GPU (GB207GLM) that stopped responding during a failed GC6 power state exit. The subsequent pci_restore_state() invoked sriov_restore_vf_rebar_state() while config reads returned 0xffffffff, triggering the splat. Bail out if any VF Resizable BAR Control read returns PCI_ERROR_RESPONSE. No further VF BARs are touched, which is safe because a config read that returns PCI_ERROR_RESPONSE indicates the device is unreachable and restoration is pointless. This mirrors the guard in pci_restore_rebar_state().
Характеристики атаки
Последствия
Строка CVSS v3.1