Vulnerabilidad en Linux (CVE-2026-23143)
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
14/02/2026
Última modificación:
18/02/2026
Descripción
En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:<br />
<br />
virtio_net: Corrige un error de desalineación en la estructura virtnet_info<br />
<br />
Usa el nuevo ayudante TRAILING_OVERLAP() para corregir un error de desalineación junto con la siguiente advertencia:<br />
<br />
drivers/net/virtio_net.c:429:46: advertencia: la estructura que contiene un miembro de array flexible no está al final de otra estructura [-Wflex-array-member-not-at-end]<br />
<br />
Este ayudante crea una unión entre un miembro de array flexible (FAM) y un conjunto de miembros que de otro modo lo seguirían (en este caso &#39;u8 rss_hash_key_data[VIRTIO_NET_RSS_MAX_KEY_SIZE];&#39;). Esto superpone los miembros finales (rss_hash_key_data) sobre el FAM (hash_key_data) mientras mantiene el FAM y el inicio de los MIEMBROS alineados. El static_assert() asegura que esta alineación se mantenga.<br />
<br />
Nótese que debido al relleno de cola en la estructura flexible &#39;struct virtio_net_rss_config_trailer&#39;, &#39;rss_trailer.hash_key_data&#39; (en el desplazamiento 83 en la estructura virtnet_info) y &#39;rss_hash_key_data&#39; (en el desplazamiento 84 en la estructura virtnet_info) están desalineados por un byte. Ver a continuación:<br />
<br />
```<br />
struct virtio_net_rss_config_trailer {<br />
__le16 max_tx_vq; /* 0 2 */<br />
__u8 hash_key_length; /* 2 1 */<br />
__u8 hash_key_data[]; /* 3 0 */<br />
<br />
/* size: 4, cachelines: 1, members: 3 */<br />
/* padding: 1 */<br />
/* last cacheline: 4 bytes */<br />
};<br />
```<br />
<br />
```<br />
struct virtnet_info {<br />
...<br />
struct virtio_net_rss_config_trailer rss_trailer; /* 80 4 */<br />
<br />
/* XXX last struct has 1 byte of padding */<br />
<br />
u8 rss_hash_key_data[40]; /* 84 40 */<br />
...<br />
/* size: 832, cachelines: 13, members: 48 */<br />
/* sum members: 801, holes: 8, sum holes: 31 */<br />
/* paddings: 2, sum paddings: 5 */<br />
};<br />
```<br />
<br />
Después de los cambios, esos miembros están correctamente alineados en el desplazamiento 795:<br />
<br />
```<br />
struct virtnet_info {<br />
...<br />
union {<br />
struct virtio_net_rss_config_trailer rss_trailer; /* 792 4 */<br />
struct {<br />
unsigned char __offset_to_hash_key_data[3]; /* 792 3 */<br />
u8 rss_hash_key_data[40]; /* 795 40 */<br />
}; /* 792 43 */<br />
}; /* 792 44 */<br />
...<br />
/* size: 840, cachelines: 14, members: 47 */<br />
/* sum members: 801, holes: 8, sum holes: 35 */<br />
/* padding: 4 */<br />
/* paddings: 1, sum paddings: 4 */<br />
/* last cacheline: 8 bytes */<br />
};<br />
```<br />
<br />
Como resultado, la clave RSS pasada al dispositivo se desplaza 1 byte: el último byte se corta y, en su lugar, se añade un byte (posiblemente no inicializado) al principio.<br />
<br />
Como última nota, &#39;struct virtio_net_rss_config_hdr *rss_hdr;&#39; también se mueve al final, ya que parece que esos tres miembros deberían permanecer juntos. :)



