В ядре Linux устранена следующая уязвимость: постро: caif: исправить use-after-free в caif_serial ldisc_close() Существует ошибка use-after…
В ядре Linux устранена следующая уязвимость: постро: caif: исправить use-after-free в caif_serial ldisc_close() Существует ошибка use-after-free в caif_serial, где ручка_tx() может доступ ser->tty после того, как сделка была освобождена. Состояние гонки происходит между ldisc_close() и пакетной передачей: CPU 0 (закрыть) CPU 1 (xmit) ----------------------------------------------------- ldisc_close() tty_kref_put(ser->tty) [Твитти может быть освобождена здесь] <-- гоночное окно --> caif_xmit() ручка_tx() tty = ser->tty // болтающийся ptr tty->ops->write() // UAF! расписание_работа() ser_release() unregister_netdevice() Коренной причиной является то, что tty_kref_put() называется in ddisc_close() сетевое устройство все еще активно и может принимать пакеты. Так как ser и tty имеют связывающие отношения 1:1 с последовательным lifecycles (ser распределяется в ldisc_open и освобождается в ser_release через unregister_netdevice, и каждый ser связывает ровно один tty), мы можем безопасно отложить отсвращение ссылки на ser_release(), где Сетевое устройство не регистрируется. Исправьте это, переместив tty_kref_put() с ldisc_close() в ser_release(), после unregister_netdevice(). Это гарантирует, что ссылка будет проведена Пока существует сетевое устройство, предотвращает UAF. Примечание: Мы сохраняем ser->tty до unregister_netdevice(), потому что ser встроенные в личные данные Netdev и будут освобождены вместе с Netdev (needs_free_netdev = true). Как воспроизвести: Добавить mdelay(500) в начале ldisc_close() чтобы расширить гоночный окно, затем запустить программу репродукторы [1]. Примечание: Существует отдельная проблема тупиковой в рулегии (cue_tx() при использовании PORT_UNKNOWN серийные порты (например, /dev/ttyS3 в QEMU без надлежащих серийный бэкэнд). Этот тупик существует даже без этого пластыря, и, вероятно, вызвана несоответствием между uart_write_room() и uart_write() в серийном ядре. Это было рассмотрено в отдельном Плэк [2]. Доклад KASAN: ============================================================================================================================================== ОШИБКА: KASAN: slab-use-after-free в ручке_tx+0x5d1/0x620 Прочитайте размер 1 по адресу fff88811131e1490 по заданию caif_uaf_trigge/9929 Трейс по вызову: <TASK> бросок_stack_lvl+0x10e/0x1f0 print_report+0xd0/0x630 kasan_report+0xe4/0x120 ручка_tx+0x5d1/0x620 dev_hard_start_xmit+0x9d/0x6c0 __dev_queue_xmit+0x6e2/0x4410 пакет_xmit+0x243/0x360 пакет_sendmsg+0x26cf/0x5500 __sys_sendto+0x4a3/0x520 __x64_sys_sendto+0xe0/0x1c0 do_sysкол_64+0xc9/0xf80 вход_SYSCALL_64_after_hwframe+0x77/0x7f РИП: 0033:0x7f615df2c0d7 Выделено заданием 9930: Освобождено заданием 64: Последнее потенциально связанное создание работы: Адрес багги принадлежит объекту по телефону fff88811131e1000 который принадлежит к кэшу меллок-кг-2к размера 2048 Обложка адрес расположена 1168 байт внутри освобожденный 2048-байтная область [fff888131e1000, ffff88811131e1800) Обложка относится к физической странице: page_owner отслеживает страницу как выделенную страница последний бесплатный pid 9778 tgid 9778 stack трек: Состояние памяти вокруг адреса багги: fff88811131e1380: fb fb fb fb fb FCb fb fb fb fb fb fb fb fb fb fff8881131e1400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb >fff88811131e1480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff8881131e1500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff88811131e1580: fb fb fb fb fb fb fb fb fb fb fb fb fb ============================================================================================================================================== [1]: https://gist.github.com/mrpre/f683f244544f7b11e7df8df9d9e6c2eeb [2]: https://lore.kernel.org/linux-serial/20260204074327.226165-1-jiayuan.chen@linux.dev/T/#u
| Продукт | Вендор | Статус |
|---|---|---|
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| kernel-doc-6.12 | Отслеживается | |
| kernel-doc-6.12 | Отслеживается | |
| kernel-doc-6.12 | Отслеживается | |
| kernel-doc-6.18 | Отслеживается | |
| kernel-doc-6.18 | Отслеживается | |
| kernel-doc-std | Отслеживается | |
| kernel-doc-std | Отслеживается | |
| kernel-doc-un | Отслеживается | |
| kernel-doc-un | Отслеживается | |
| kernel-headers-6.12 | Отслеживается | |
| kernel-headers-6.12 | Отслеживается | |
| kernel-headers-6.12 | Отслеживается | |
| kernel-headers-6.18 | Отслеживается | |
| kernel-headers-6.18 | Отслеживается | |
| kernel-headers-modules-6.12 | Отслеживается | |
| kernel-headers-modules-6.12 | Отслеживается | |
| kernel-headers-modules-6.12 | Отслеживается |