Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2021-47127)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-476 Desreferencia a puntero nulo (NULL)
Fecha de publicación:
15/03/2024
Última modificación:
07/01/2025

Descripción

En el kernel de Linux, se resolvió la siguiente vulnerabilidad: ice: rastrear colas habilitadas para AF_XDP ZC en mapa de bits. El commit c7a219048e45 ("ice: Remove xsk_buff_pool from VSI Structure") introdujo silenciosamente una regresión y rompió el lado Tx de AF_XDP en modo de copia. xsk_pool en ice_ring se configura únicamente en función de la existencia del programa XDP en la VSI, que a su vez selecciona ice_clean_tx_irq_zc para ejecutarse. Eso no es algo que debería suceder en el modo de copia, ya que debería usar la ruta de datos normal ice_clean_tx_irq. Esto da como resultado el siguiente símbolo cuando xdpsock se ejecuta en escenarios txonly o l2fwd en modo copia: [ 106.050195] ERROR: desreferencia del puntero NULL del kernel, dirección: 00000000000000030 [ 106.057269] #PF: acceso de lectura del supervisor en modo kernel [ 106.062493] #PF: error_code(0x0000) - página no presente [106.067709] PGD 0 P4D 0 [106.070293] Ups: 0000 [#1] PREEMPT SMP NOPTI [106.074721] CPU: 61 PID: 0 Comm: swapper/61 No contaminado 5.12. 0-rc2+ #45 [ 106.081436] Nombre de hardware: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0008.031920191559 19/03/2019 [ 106.092027] RIP: 0010:xp_raw_get_dma+0x3 6/0x50 [ 106.096551] Código: 74 14 48 b8 ff ff ff ff ff ff 00 00 48 21 f0 48 c1 ee 30 48 01 c6 48 8b 87 90 00 00 00 48 89 f2 81 e6 ff 0f 00 00 48 c1 ea 0c <48> 8b 04 d0 48 83 e0 fe 4 8 01 f0 c3 66 66 2e 0f 1f 84 00 00 00 00 [ 106.115588] RSP: 0018:ffffc9000d694e50 EFLAGS: 00010206 [ 106.120893] RAX: 0000000000000000 RBX: ffff88984b8c8a00 RCX: ffff889852581800 [ 106.128137] RDX: 0000000000000006 RSI: 000000000000000000 RDI: ffff88984cd8b800 [ 106.135383 ] RBP: ffff888123b50001 R08: ffff889896800000 R09: 0000000000000800 [ 106.142628] R10: 00000000000000000 R11: ffffffff826060c0 R12: 00000000 000000ff [ 106.149872] R13: 0000000000000000 R14: 0000000000000040 R15: ffff888123b50018 [ 106.157117] FS: 0000000000000000(0000) GS:ffff8 897e0f40000(0000) knlGS :0000000000000000 [ 106.165332] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 106.171163] CR2: 0000000000000030 CR3: 000000000560a004 CR4: 00000000007706e0 [ 106.178408] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 00000000000000000 [ 106.185653] DR3: 0000000000000000 0 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 106.192898] PKRU: 55555554 [ 106.195653] Seguimiento de llamadas: [ 106.198143] [ 106.200196] ice_clean_tx_irq_zc+0x183/0x2a0 [ice] [ 106 .205087] ice_napi_poll+0x3e/0x590 [hielo] [ 106.209356] __napi_poll+0x2a/ 0x160 [ 106.212911] net_rx_action+0xd6/0x200 [ 106.216634] __do_softirq+0xbf/0x29b [ 106.220274] irq_exit_rcu+0x88/0xc0 [ 106.223819] common_interrupt+0x7b/0xa0 [ 106.227719] [ 106.229857] asm_common_interrupt+0x1e/0x40 Solucione este problema introduciendo el mapa de bits de las colas que están habilitadas para copia cero, donde cada bit, correspondiente a una identificación de cola en la que se está configurando el grupo xsk, se establecerá/borrará dentro de ice_xsk_pool_{en,dis}able y se verificará dentro ice_xsk_pool(). Esta última es una función utilizada para decidir qué rutina de encuesta napi se ejecuta. La idea se ha tomado de nuestros otros controladores, como i40e e ixgbe.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.12 (incluyendo) 5.12.10 (excluyendo)
cpe:2.3:o:linux:linux_kernel:5.13:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:5.13:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:5.13:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:5.13:rc4:*:*:*:*:*:*