Vulnerabilidad en kernel de Linux (CVE-2025-38470)
Fecha de publicación:
28/07/2025
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: net:vlan: fix VLAN 0 refcount desequilibrio de alternancia de filtrado durante el tiempo de ejecución. Suponiendo que la función "rx-vlan-filter" esté habilitada en un dispositivo de red, el módulo 8021q agregará o eliminará automáticamente la VLAN 0 cuando el dispositivo de red se active o desactive administrativamente, respectivamente. Existen un par de problemas con el esquema anterior. El primer problema es una fuga de memoria que puede ocurrir si la función "rx-vlan-filter" está deshabilitada mientras el dispositivo está en ejecución: # ip link add bond1 up type bond mode 0 # ethtool -K bond1 rx-vlan-filter off # ip link del dev bond1 Cuando el dispositivo se desactiva administrativamente, la función "rx-vlan-filter" está deshabilitada, por lo que el módulo 8021q no eliminará la VLAN 0 y se producirá una fuga de memoria [1]. Otro problema que puede ocurrir es que el kernel puede eliminar automáticamente la VLAN 0 cuando el dispositivo se pone administrativamente fuera de servicio a pesar de no haberla agregado cuando el dispositivo se puso administrativamente en servicio ya que durante ese tiempo la función "rx-vlan-filter" estaba deshabilitada. null-ptr-unref o bug_on[2] se activarán mediante unregister_vlan_dev() para el desequilibrio de refcount si se alterna el filtrado durante el tiempo de ejecución: $ ip link add bond0 type bond mode 0 $ ip link add link bond0 name vlan0 type vlan id 0 protocol 802.1q $ ethtool -K bond0 rx-vlan-filter off $ ifconfig bond0 up $ ethtool -K bond0 rx-vlan-filter on $ ifconfig bond0 down $ ip link del vlan0 La causa raíz es la siguiente: paso 1: agregue vlan0 para real_dev, como bond, team. register_vlan_dev vlan_vid_add(real_dev,htons(ETH_P_8021Q),0) //refcnt=1 paso2: deshabilitar la función de filtro de vlan y habilitar real_dev paso3: cambiar el filtro de 0 a 1 vlan_device_event vlan_filter_push_vids ndo_vlan_rx_add_vid //No se agregó refcnt a real_dev vlan0 paso4: real_dev inactivo vlan_device_event vlan_vid_del(dev, htons(ETH_P_8021Q), 0); //refcnt=0 vlan_info_rcu_free //liberar vlan0 paso5: eliminar vlan0 unregister_vlan_dev BUG_ON(!vlan_info); //vlan_info es nulo Corrija ambos problemas anotando en la información de VLAN si la VLAN 0 se agregó automáticamente en NETDEV_UP y en función de eso decida si debe eliminarse en NETDEV_DOWN, independientemente del estado de la función "rx-vlan-filter". [1] objeto sin referencia 0xffff8880068e3100 (tamaño 256): comm "ip", pid 384, jiffies 4296130254 hex dump (first 32 bytes): 00 20 30 0d 80 88 ff ff 00 00 00 00 00 00 00 00 . 0............. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace (crc 81ce31fa): __kmalloc_cache_noprof+0x2b5/0x340 vlan_vid_add+0x434/0x940 vlan_device_event.cold+0x75/0xa8 notifier_call_chain+0xca/0x150 __dev_notify_flags+0xe3/0x250 rtnl_configure_link+0x193/0x260 rtnl_newlink_create+0x383/0x8e0 __rtnl_newlink+0x22c/0xa40 rtnl_newlink+0x627/0xb00 rtnetlink_rcv_msg+0x6fb/0xb70 netlink_rcv_skb+0x11f/0x350 netlink_unicast+0x426/0x710 netlink_sendmsg+0x75a/0xc20 __sock_sendmsg+0xc1/0x150 ____sys_sendmsg+0x5aa/0x7b0 ___sys_sendmsg+0xfc/0x180 [2] kernel BUG at net/8021q/vlan.c:99! Oops: invalid opcode: 0000 [#1] SMP KASAN PTI CPU: 0 UID: 0 PID: 382 Comm: ip Not tainted 6.16.0-rc3 #61 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:unregister_vlan_dev (net/8021q/vlan.c:99 (discriminator 1)) RSP: 0018:ffff88810badf310 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff88810da84000 RCX: ffffffffb47ceb9a RDX: dffffc0000000000 RSI: 0000000000000008 RDI: ffff88810e8b43c8 RBP: 0000000000000000 R08: 0000000000000000 R09: fffffbfff6cefe80 R10: ffffffffb677f407 R11: ffff88810badf3c0 R12: ffff88810e8b4000 R13: 0000000000000000 R14: ffff88810642a5c0 R15: 000000000000017e FS: 00007f1ff68c20c0(0000) GS:ffff888163a24000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 ---truncado---
Gravedad: Pendiente de análisis
Última modificación:
29/07/2025