В ядре Linux устранена следующая уязвимость:
tpm: сделать символьные устройства TPM недоступными для поиска. Символьные устройства TPM предоставляют последовательную команду/ответ.
интерфейс, но их открытые обработчики оставляют FMODE_PREAD и FMODE_PWRITE
включен. После того, как команда оставляет ожидающий ответ, pread(fd, buf, 16, 0x1400)
передает 0x1400 как *off в tpm_common_read().
Длина передачи составляет
ограничено response_length, но смещение используется непроверенным, когда
формирование data_buffer + *off. Поэтому достаточно большое смещение приводит к
куча за пределами границ читается через copy_to_user() и, если копия
завершается успешно, запись нуля за пределами допустимого диапазона осуществляется с помощью следующего memset(). Позиционный ввод-вывод не обеспечивает связную семантику для этого интерфейса.
Произвольное смещение чтения не может отражать, какая часть ответа уже обработана.
потреблялись последовательно. Обратный вызов записи всегда сохраняет команду
в начале data_buffer, а pwrite() не обновляет файл->f_pos
и может оставить курсор последовательного чтения устаревшим. Вызовите Nonseekable_open() из обоих открытых обработчиков.
Это удаляет
FMODE_PREAD и FMODE_PWRITE, вызывающие позиционное чтение и запись в
потерпеть неудачу с -ESPIPE до достижения обратных вызовов TPM и явно
помечает файлы как недоступные для поиска. Обычные read() и write() продолжают использовать
существующий последовательный курсор f_pos, оставляя конечный автомат ответа
без изменений. Протестировано на Linux 6.12 с KASAN и устройством swtpm TPM2:
- последовательное частичное чтение вернуло полный ответ
- pread() и preadv() со смещением 0x1400 возвращают -ESPIPE
- pwrite() и pwritev() возвращают нулевое смещение -ESPIPE
- ожидающий ответ остался нетронутым после отклоненных операций
- последующий нормальный цикл команды/ответа завершился нормально
- отчет КАСАН не составлен.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: tpm: Make the TPM character devices non-seekable The TPM character devices expose a sequential command/response interface, but their open handlers leave FMODE_PREAD and FMODE_PWRITE enabled. After a command leaves a response pending, pread(fd, buf, 16, 0x1400) passes 0x1400 as *off to tpm_common_read(). The transfer length is bounded by response_length, but the offset is used unchecked when forming data_buffer + *off. A sufficiently large offset therefore causes an out-of-bounds heap read through copy_to_user() and, if the copy succeeds, an out-of-bounds zero-write through the following memset(). Positional I/O does not provide coherent semantics for this interface. An arbitrary pread offset cannot represent how much of a response has been consumed sequentially. The write callback always stores a command at the start of data_buffer, while pwrite() does not update file->f_pos and can leave the sequential read cursor stale. Call nonseekable_open() from both open handlers. This removes FMODE_PREAD and FMODE_PWRITE, causing positional reads and writes to fail with -ESPIPE before reaching the TPM callbacks, and explicitly marks the files non-seekable. Normal read() and write() continue to use the existing sequential f_pos cursor, leaving the response state machine unchanged. Tested on Linux 6.12 with KASAN and a swtpm TPM2 device: - sequential partial reads returned the complete response - pread() and preadv() with offset 0x1400 returned -ESPIPE - pwrite() and pwritev() with offset zero returned -ESPIPE - the pending response remained intact after the rejected operations - a subsequent normal command/response cycle completed normally - no KASAN report was produced.
Характеристики атаки
Последствия
Строка CVSS v3.1