В ядре Linux устранена следующая уязвимость:
связывание: alb: перепроверьте Primary_is_promisc под RTNL в Bond_alb_monitor
Bond_alb_monitor() считывает Primary_is_promisc под RCU, затем удаляет RCU и
принимает RTNL через rtnl_trylock(), прежде чем отменить распущенность, которую он установил на
активный раб. В этом окне активный ведомый может измениться в режиме RTNL.
(RTM_DELLINK -> __bond_release_one() -> Bond_alb_handle_active_change()),
что уже устраняет распущенность и очищает Primary_is_promisc.
монитор по-прежнему действует в соответствии с устаревшим решением: если подчиненное устройство было удалено без
аварийное переключение, curr_active_slave теперь имеет значение NULL и происходит ошибка разыменования; если бы это не удалось
закончилось, устаревший dev_set_promiscuity(-1) переполняет новый подчиненный
счетчик распущенности и закрепляет его в IFF_PROMISC. Упс: общая ошибка защиты, вероятно, по неканоническому адресу...
KASAN: null-ptr-deref в диапазоне [0x0000000000000000-0x0000000000000007]
Рабочая очередь: b42 Bond_alb_monitor
RIP: 0010:bond_alb_monitor (drivers/net/bonding/bond_alb.c:1600)
process_one_work (ядро/workqueue.c:3322)
рабочий_поток (ядро/workqueue.c:3486)
kthread (ядро/kthread.c:436)
ret_from_fork (arch/x86/kernel/process.c:158)
Паника ядра – не синхронизируется: фатальное исключение
Перепроверьте Primary_is_promisc (и curr_active_slave) после приема RTNL, чтобы
монитор отменяет только приращение, которым он все еще владеет.
Другая связь
мониторы уже перечитывают состояние под RTNL на этапе фиксации
(bond_miimon_commit/bond_ab_arp_commit); Bond_alb_monitor() был единственным
один действует на основании решения перед попыткой блокировки.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: bonding: alb: re-check primary_is_promisc under RTNL in bond_alb_monitor bond_alb_monitor() reads primary_is_promisc under RCU, then drops RCU and takes RTNL via rtnl_trylock() before undoing the promiscuity it set on the active slave. In that window the active slave can change under RTNL (RTM_DELLINK -> __bond_release_one() -> bond_alb_handle_active_change()), which already drops the promiscuity and clears primary_is_promisc. The monitor still acts on the stale decision: if the slave was removed with no failover, curr_active_slave is now NULL and the deref faults; if it failed over, the stale dev_set_promiscuity(-1) underflows the new slave's promiscuity counter and pins it in IFF_PROMISC. Oops: general protection fault, probably for non-canonical address ... KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] Workqueue: b42 bond_alb_monitor RIP: 0010:bond_alb_monitor (drivers/net/bonding/bond_alb.c:1600) process_one_work (kernel/workqueue.c:3322) worker_thread (kernel/workqueue.c:3486) kthread (kernel/kthread.c:436) ret_from_fork (arch/x86/kernel/process.c:158) Kernel panic - not syncing: Fatal exception Re-check primary_is_promisc (and curr_active_slave) after taking RTNL so the monitor only undoes an increment it still owns. The other bonding monitors already re-read state under RTNL in their commit phase (bond_miimon_commit/bond_ab_arp_commit); bond_alb_monitor() was the only one acting on the pre-trylock decision.
Уязвимые продукты 8
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
5.10.265
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
5.15.216
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
6.1.183
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
6.6.152
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
6.12.104
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
6.18.45
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
7.1.9
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
2.6.24
|
7.2
|