CVE-2024-26837

In the Linux kernel, the following vulnerability has been resolved: net: bridge: switchdev: Skip MDB replays of deferred events on offload Before this change, generation of the list of MDB events to replay would race against the creation of new group memberships, either from the IGMP/MLD snooping logic or from user configuration. While new memberships are immediately visible to walkers of br->mdb_list, the notification of their existence to switchdev event subscribers is deferred until a later point in time. So if a replay list was generated during a time that overlapped with such a window, it would also contain a replay of the not-yet-delivered event. The driver would thus receive two copies of what the bridge internally considered to be one single event. On destruction of the bridge, only a single membership deletion event was therefore sent. As a consequence of this, drivers which reference count memberships (at least DSA), would be left with orphan groups in their hardware database when the bridge was destroyed. This is only an issue when replaying additions. While deletion events may still be pending on the deferred queue, they will already have been removed from br->mdb_list, so no duplicates can be generated in that scenario. To a user this meant that old group memberships, from a bridge in which a port was previously attached, could be reanimated (in hardware) when the port joined a new bridge, without the new bridge's knowledge. For example, on an mv88e6xxx system, create a snooping bridge and immediately add a port to it: root@infix-06-0b-00:~$ ip link add dev br0 up type bridge mcast_snooping 1 && \ > ip link set dev x3 up master br0 And then destroy the bridge: root@infix-06-0b-00:~$ ip link del dev br0 root@infix-06-0b-00:~$ mvls atu ADDRESS FID STATE Q F 0 1 2 3 4 5 6 7 8 9 a DEV:0 Marvell 88E6393X 33:33:00:00:00:6a 1 static - - 0 . . . . . . . . . . 33:33:ff:87:e4:3f 1 static - - 0 . . . . . . . . . . ff:ff:ff:ff:ff:ff 1 static - - 0 1 2 3 4 5 6 7 8 9 a root@infix-06-0b-00:~$ The two IPv6 groups remain in the hardware database because the port (x3) is notified of the host's membership twice: once via the original event and once via a replay. Since only a single delete notification is sent, the count remains at 1 when the bridge is destroyed. Then add the same port (or another port belonging to the same hardware domain) to a new bridge, this time with snooping disabled: root@infix-06-0b-00:~$ ip link add dev br1 up type bridge mcast_snooping 0 && \ > ip link set dev x3 up master br1 All multicast, including the two IPv6 groups from br0, should now be flooded, according to the policy of br1. But instead the old memberships are still active in the hardware database, causing the switch to only forward traffic to those groups towards the CPU (port 0). Eliminate the race in two steps: 1. Grab the write-side lock of the MDB while generating the replay list. This prevents new memberships from showing up while we are generating the replay list. But it leaves the scenario in which a deferred event was already generated, but not delivered, before we grabbed the lock. Therefore: 2. Make sure that no deferred version of a replay event is already enqueued to the switchdev deferred queue, before adding it to the replay list, when replaying additions.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc5:*:*:*:*:*:*

History

02 Apr 2025, 13:18

Type Values Removed Values Added
CPE cpe:2.3:o:linux:linux_kernel:6.8:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc2:*:*:*:*:*:*
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 4.7
First Time Linux linux Kernel
Linux
References () https://git.kernel.org/stable/c/2d5b4b3376fa146a23917b8577064906d643925f - () https://git.kernel.org/stable/c/2d5b4b3376fa146a23917b8577064906d643925f - Patch
References () https://git.kernel.org/stable/c/603be95437e7fd85ba694e75918067fb9e7754db - () https://git.kernel.org/stable/c/603be95437e7fd85ba694e75918067fb9e7754db - Patch
References () https://git.kernel.org/stable/c/dc489f86257cab5056e747344f17a164f63bff4b - () https://git.kernel.org/stable/c/dc489f86257cab5056e747344f17a164f63bff4b - Patch
References () https://git.kernel.org/stable/c/e0b4c5b1d760008f1dd18c07c35af0442e54f9c8 - () https://git.kernel.org/stable/c/e0b4c5b1d760008f1dd18c07c35af0442e54f9c8 - Patch
CWE CWE-362

21 Nov 2024, 09:03

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: net: bridge: switchdev: omitir repeticiones MDB de eventos diferidos durante la descarga. Antes de este cambio, la generación de la lista de eventos MDB para reproducir competiría con la creación de nuevas membresías de grupos, ya sea desde la lógica de espionaje IGMP/MLD o desde la configuración del usuario. Si bien las nuevas membresías son visibles inmediatamente para los caminantes de br->mdb_list, la notificación de su existencia a los suscriptores del evento switchdev se difiere hasta un momento posterior. Entonces, si se generó una lista de reproducción durante un tiempo que se superpuso con dicha ventana, también contendría una repetición del evento aún no entregado. El conductor recibiría así dos copias de lo que internamente el puente consideraba un único evento. Por lo tanto, tras la destrucción del puente, solo se envió un evento de eliminación de membresía. Como consecuencia de esto, los controladores que hacen referencia al recuento de membresías (al menos DSA) quedarían con grupos huérfanos en su base de datos de hardware cuando se destruyera el puente. Esto sólo es un problema al reproducir adiciones. Si bien es posible que los eventos de eliminación aún estén pendientes en la cola diferida, ya se habrán eliminado de br->mdb_list, por lo que no se pueden generar duplicados en ese escenario. Para un usuario, esto significaba que las antiguas membresías de grupos, de un puente al que previamente se había conectado un puerto, podían reanimarse (en hardware) cuando el puerto se unía a un nuevo puente, sin el conocimiento del nuevo puente. Por ejemplo, en un sistema mv88e6xxx, cree un puente de vigilancia e inmediatamente agréguele un puerto: root@infix-06-0b-00:~$ ip link add dev br0 up type bridge mcast_snooping 1 && \ > ip link set dev x3 up master br0 Y luego destruye el puente: root@infix-06-0b-00:~$ ip link del dev br0 root@infix-06-0b-00:~$ mvls atu DIRECCIÓN FID ESTADO QF 0 1 2 3 4 5 6 7 8 9 a DEV:0 Marvell 88E6393X 33:33:00:00:00:6a 1 estático - - 0 . . . . . . . . . . 33:33:ff:87:e4:3f 1 estático - - 0 . . . . . . . . . . ff:ff:ff:ff:ff:ff 1 static - - 0 1 2 3 4 5 6 7 8 9 a root@infix-06-0b-00:~$ Los dos grupos IPv6 permanecen en la base de datos de hardware porque el puerto (x3) recibe dos notificaciones sobre la membresía del anfitrión: una vez a través del evento original y otra a través de una repetición. Dado que solo se envía una notificación de eliminación, el recuento permanece en 1 cuando se destruye el puente. Luego agregue el mismo puerto (u otro puerto que pertenezca al mismo dominio de hardware) a un nuevo puente, esta vez con el snooping deshabilitado: root@infix-06-0b-00:~$ ip link add dev br1 up type bridge mcast_snooping 0 && \ > ip link set dev x3 up master br1 Toda la multidifusión, incluidos los dos grupos IPv6 de br0, ahora debería estar inundada, de acuerdo con la política de br1. Pero, en cambio, las membresías antiguas todavía están activas en la base de datos del hardware, lo que hace que el conmutador solo reenvíe el tráfico a esos grupos hacia la CPU (puerto 0). Elimine la carrera en dos pasos: 1. Tome el bloqueo del lado de escritura del MDB mientras genera la lista de reproducción. Esto evita que aparezcan nuevas membresías mientras generamos la lista de reproducción. Pero deja el escenario en el que ya se generó un evento diferido, pero no se entregó, antes de que tomáramos el bloqueo. Por lo tanto: 2. Asegúrese de que ninguna versión diferida de un evento de reproducción ya esté en cola en la cola diferida de switchdev, antes de agregarla a la lista de reproducción, al reproducir adiciones.
References () https://git.kernel.org/stable/c/2d5b4b3376fa146a23917b8577064906d643925f - () https://git.kernel.org/stable/c/2d5b4b3376fa146a23917b8577064906d643925f -
References () https://git.kernel.org/stable/c/603be95437e7fd85ba694e75918067fb9e7754db - () https://git.kernel.org/stable/c/603be95437e7fd85ba694e75918067fb9e7754db -
References () https://git.kernel.org/stable/c/dc489f86257cab5056e747344f17a164f63bff4b - () https://git.kernel.org/stable/c/dc489f86257cab5056e747344f17a164f63bff4b -
References () https://git.kernel.org/stable/c/e0b4c5b1d760008f1dd18c07c35af0442e54f9c8 - () https://git.kernel.org/stable/c/e0b4c5b1d760008f1dd18c07c35af0442e54f9c8 -

17 Apr 2024, 10:15

Type Values Removed Values Added
New CVE

Information

Published : 2024-04-17 10:15

Updated : 2025-04-02 13:18


NVD link : CVE-2024-26837

Mitre link : CVE-2024-26837

CVE.ORG link : CVE-2024-26837


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-362

Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')