В ядре Linux устранена следующая уязвимость: ipv4: маршрут: Предотвратить rt_bind_exception() от переигровки несвежего fnhe Путь передачи п…
В ядре Linux устранена следующая уязвимость: ipv4: маршрут: Предотвратить rt_bind_exception() от переигровки несвежего fnhe Путь передачи пакета водителя сайта звонит: sit_tunnel_xmit() -> update_or_create_fnhe(), что приводит к вызову fnhe_remove_oldest() удалить записи, превышающие FNHE_RECLAIM_DEPTH+random. Окно гонки находится между fnhe_remove_oldest() выбор fnheX для удаление и последующий kfree_rcu(). В течение этого времени, параллельный путь __mkroute_output() -> find_exception() может принести скоро-будет удален fnheX, и rt_bind_exception(), затем связывает его с новый dst с помощью dst_hold(). Когда оригинал fnheX освобождается через RCU, Самая данность остается навсегда просочком. CPU 0 CPU 1 __mkroute_output() find_exception() [fnheX] update_or_create_fnhe() fnhe_remove_oldest() [fnheX] rt_bind_exception() [bind dst] Обратный звонок RCU [fnheX освобожден, dst утечка] Эта проблема проявляется в виде утечки количества ссылок на устройство и предупреждения в dmesg при незарегистрированности нетто-устройства: unregister_netdevice: в ожидании, когда ситХ станет бесплатным. Количество использования = N Идо Шиммель предоставил простой метод проверки теста [1]. Исправление очищает 'oldest->fnhe_daddr' перед вызовом fnhe_flush_routes(). Поскольку rt_bind_exception() проверяет это поле, настройка его на нуль предотвращает несвежие от повторного использования и привязаны к новому Dst непосредственно перед этим Он освобожден. [1] ip netns добавить ns1 ip -n ns1 ссылка set dev lo up ip -n ns1 адрес добавить 192.0.2.1/32 dev lo ip -n ns1 ссылка добавить имя dummy1 вверх тип манекена ip -n ns1 маршрут добавить 192.0.2.2/32 dev dummy1 ip -n ns1 ссылка добавить имя gretap1 up arp off type gretap \ Локальный 192.0.2.1 удаленный 192.0.2.2 ip -n ns1 маршрут добавьте 198.51.0.0/16 dev gretap1 taskset -c 0 ip netns exec ns1 mausezahn gretap1 \ -A 198.51.100.1 -B 198.51.0.0/16 -t udp -p 1000 -c 0 -q & & taskset -c 2 ip netns exec ns1 mausezahn gretap1 \ -A 198.51.100.1 -B 198.51.0.0/16 -t udp -p 1000 -c 0 -q & & Спать 10 ip netns pids ns1 | xargs kill ip netns del ns1
| Продукт | Вендор | Статус |
|---|---|---|
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-6.1 | Отслеживается | |
| linux-allwinner-5.19 | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается |