В ядре Linux устранена следующая уязвимость:
ieee802154: ca8210: исправлено усечение указателя в kfifo на 64-битной версии. Обмен ca8210_test_int_driver_write() и ca8210_test_int_user_read()
указатель буфера kmalloc через структуру kfifo, но передать литерал
«4» — количество байтов в kfifo_in()/kfifo_out(). Это верно для 32-битной версии (указатель = 4 байта), но для 64-битной версии только
младшие 4 байта 8-байтового указателя записываются в FIFO.
Читатель
затем считывает обратно 4 байта в 8-байтовую переменную локального указателя, оставляя
верхние 4 байта неинициализированных данных стека. Первое разыменование
восстановленный указатель (fifo_buffer[1]) обращается к произвольному ядру
адрес и обычно приводит к упс. Используйте sizeof(fifo_buffer), чтобы количество байтов соответствовало ширине указателя на каждом
архитектура.
Драйвер не имеет ограничений по архитектуре в Kconfig, поэтому любой 64-битный сборка с CONFIG_IEEE802154_CA8210_DEBUGFS=y доступна. Проблема имеет был скрыт с момента добавления драйвера в 2017 году, поскольку он наиболее обычно используется на 32-битных микроконтроллерах. Находится с помощью специального семантического патча Coccinelle, охотящегося за короткими байтами. kfifo Ввод-вывод на kfifo в байтовом режиме, используемый для перемещения указателей.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ieee802154: ca8210: fix pointer truncation in kfifo on 64-bit ca8210_test_int_driver_write() and ca8210_test_int_user_read() exchange a kmalloc'd buffer pointer through a struct kfifo, but pass a literal '4' as the byte count to kfifo_in()/kfifo_out(). This is correct on 32-bit (pointer = 4 bytes), but on 64-bit only the low 4 bytes of the 8-byte pointer are written into the FIFO. The reader then reads back 4 bytes into an 8-byte local pointer variable, leaving the upper 4 bytes uninitialized stack data. The first dereference of the reconstructed pointer (fifo_buffer[1]) accesses an arbitrary kernel address and generally results in an oops. Use sizeof(fifo_buffer) so the byte count matches pointer width on every architecture. The driver has no architecture restriction in Kconfig, so any 64-bit build with CONFIG_IEEE802154_CA8210_DEBUGFS=y is exposed. Issue has been latent since the driver was added in 2017 because it is most commonly deployed on 32-bit MCUs. Found via a custom Coccinelle semantic patch hunting for short-byte kfifo I/O on byte-mode kfifos used to shuttle pointers.