CVE-2026-46325
Full vulnerability record from the local CVENow database.
Description
In the Linux kernel, the following vulnerability has been resolved: RDMA/rxe: Fix iova-to-va conversion for MR page sizes != PAGE_SIZE The current implementation incorrectly handles memory regions (MRs) with page sizes different from the system PAGE_SIZE. The core issue is that rxe_set_page() is called with mr->page_size step increments, but the page_list stores individual struct page pointers, each representing PAGE_SIZE of memory. ib_sg_to_page() has ensured that when i>=1 either a) SG[i-1].dma_end and SG[i].dma_addr are contiguous or b) SG[i-1].dma_end and SG[i].dma_addr are mr->page_size aligned. This leads to incorrect iova-to-va conversion in scenarios: 1) page_size < PAGE_SIZE (e.g., MR: 4K, system: 64K): ibmr->iova = 0x181800 sg[0]: dma_addr=0x181800, len=0x800 sg[1]: dma_addr=0x173000, len=0x1000 Access iova = 0x181800 + 0x810 = 0x182010 Expected VA: 0x173010 (second SG, offset 0x10) Before fix: - index = (0x182010 >> 12) - (0x181800 >> 12) = 1 - page_offset = 0x182010 & 0xFFF = 0x10 - xarray[1] stores system page base 0x170000 - Resulting VA: 0x170000 + 0x10 = 0x170010 (wrong) 2) page_size > PAGE_SIZE (e.g., MR: 64K, system: 4K): ibmr->iova = 0x18f800 sg[0]: dma_addr=0x18f800, len=0x800 sg[1]: dma_addr=0x170000, len=0x1000 Access iova = 0x18f800 + 0x810 = 0x190010 Expected VA: 0x170010 (second SG, offset 0x10) Before fix: - index = (0x190010 >> 16) - (0x18f800 >> 16) = 1 - page_offset = 0x190010 & 0xFFFF = 0x10 - xarray[1] stores system page for dma_addr 0x170000 - Resulting VA: system page of 0x170000 + 0x10 = 0x170010 (wrong) Yi Zhang reported a kernel panic[1] years ago related to this defect. Solution: 1. Replace xarray with pre-allocated rxe_mr_page array for sequential indexing (all MR page indices are contiguous) 2. Each rxe_mr_page stores both struct page* and offset within the system page 3. Handle MR page_size != PAGE_SIZE relationships: - page_size > PAGE_SIZE: Split MR pages into multiple system pages - page_size <= PAGE_SIZE: Store offset within system page 4. Add boundary checks and compatibility validation This ensures correct iova-to-va conversion regardless of MR page size and system PAGE_SIZE relationship, while improving performance through array-based sequential access. Tests on 4K and 64K PAGE_SIZE hosts: - rdma-core/pytests $ ./build/bin/run_tests.py --dev eth0_rxe - blktest: $ TIMEOUT=30 QUICK_RUN=1 USE_RXE=1 NVMET_TRTYPES=rdma ./check nvme srp rnbd [1] https://lore.kernel.org/all/CAHj4cs9XRqE25jyVw9rj9YugffLn5+f=1znaBEnu1usLOciD+g@mail.gmail.com/T/
View original CVE JSON
{
"id": "CVE-2026-46325",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"published": "2026-06-09T14:16:42.177",
"lastModified": "2026-10-21T13:19:06.677",
"vulnStatus": "Modified",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nRDMA/rxe: Fix iova-to-va conversion for MR page sizes != PAGE_SIZE\n\nThe current implementation incorrectly handles memory regions (MRs) with\npage sizes different from the system PAGE_SIZE. The core issue is that\nrxe_set_page() is called with mr->page_size step increments, but the\npage_list stores individual struct page pointers, each representing\nPAGE_SIZE of memory.\n\nib_sg_to_page() has ensured that when i>=1 either\na) SG[i-1].dma_end and SG[i].dma_addr are contiguous\nor\nb) SG[i-1].dma_end and SG[i].dma_addr are mr->page_size aligned.\n\nThis leads to incorrect iova-to-va conversion in scenarios:\n\n1) page_size < PAGE_SIZE (e.g., MR: 4K, system: 64K):\n ibmr->iova = 0x181800\n sg[0]: dma_addr=0x181800, len=0x800\n sg[1]: dma_addr=0x173000, len=0x1000\n\n Access iova = 0x181800 + 0x810 = 0x182010\n Expected VA: 0x173010 (second SG, offset 0x10)\n Before fix:\n - index = (0x182010 >> 12) - (0x181800 >> 12) = 1\n - page_offset = 0x182010 & 0xFFF = 0x10\n - xarray[1] stores system page base 0x170000\n - Resulting VA: 0x170000 + 0x10 = 0x170010 (wrong)\n\n2) page_size > PAGE_SIZE (e.g., MR: 64K, system: 4K):\n ibmr->iova = 0x18f800\n sg[0]: dma_addr=0x18f800, len=0x800\n sg[1]: dma_addr=0x170000, len=0x1000\n\n Access iova = 0x18f800 + 0x810 = 0x190010\n Expected VA: 0x170010 (second SG, offset 0x10)\n Before fix:\n - index = (0x190010 >> 16) - (0x18f800 >> 16) = 1\n - page_offset = 0x190010 & 0xFFFF = 0x10\n - xarray[1] stores system page for dma_addr 0x170000\n - Resulting VA: system page of 0x170000 + 0x10 = 0x170010 (wrong)\n\nYi Zhang reported a kernel panic[1] years ago related to this defect.\n\nSolution:\n1. Replace xarray with pre-allocated rxe_mr_page array for sequential\n indexing (all MR page indices are contiguous)\n2. Each rxe_mr_page stores both struct page* and offset within the\n system page\n3. Handle MR page_size != PAGE_SIZE relationships:\n - page_size > PAGE_SIZE: Split MR pages into multiple system pages\n - page_size <= PAGE_SIZE: Store offset within system page\n4. Add boundary checks and compatibility validation\n\nThis ensures correct iova-to-va conversion regardless of MR page size\nand system PAGE_SIZE relationship, while improving performance through\narray-based sequential access.\n\nTests on 4K and 64K PAGE_SIZE hosts:\n- rdma-core/pytests\n $ ./build/bin/run_tests.py --dev eth0_rxe\n- blktest:\n $ TIMEOUT=30 QUICK_RUN=1 USE_RXE=1 NVMET_TRTYPES=rdma ./check nvme srp rnbd\n\n[1] https://lore.kernel.org/all/CAHj4cs9XRqE25jyVw9rj9YugffLn5+f=1znaBEnu1usLOciD+g@mail.gmail.com/T/"
},
{
"lang": "es",
"value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\nRDMA/rxe: Corrección de la conversión iova-a-va para tamaños de página de MR != PAGE_SIZE\n\nLa implementación actual maneja incorrectamente las regiones de memoria (MRs) con tamaños de página diferentes al PAGE_SIZE del sistema. El problema central es que rxe_set_page() se llama con incrementos de paso mr->page_size, pero la page_list almacena punteros individuales a struct page, cada uno representando PAGE_SIZE de memoria.\n\nib_sg_to_page() ha asegurado que cuando i>=1, o bien a) SG[i-1].dma_end y SG[i].dma_addr son contiguos o b) SG[i-1].dma_end y SG[i].dma_addr están alineados con mr->page_size.\n\nEsto lleva a una conversión iova-a-va incorrecta en los siguientes escenarios:\n\n1) page_size < PAGE_SIZE (ej., MR: 4K, sistema: 64K):\n ibmr->iova = 0x181800\n sg[0]: dma_addr=0x181800, len=0x800\n sg[1]: dma_addr=0x173000, len=0x1000\n\n Acceso iova = 0x181800 + 0x810 = 0x182010\n VA esperada: 0x173010 (segundo SG, desplazamiento 0x10)\n Antes de la corrección:\n - índice = (0x182010 >> 12) - (0x181800 >> 12) = 1\n - page_offset = 0x182010 & 0xFFF = 0x10\n - xarray[1] almacena la base de página del sistema 0x170000\n - VA resultante: 0x170000 + 0x10 = 0x170010 (incorrecto)\n\n2) page_size > PAGE_SIZE (ej., MR: 64K, sistema: 4K):\n ibmr->iova = 0x18f800\n sg[0]: dma_addr=0x18f800, len=0x800\n sg[1]: dma_addr=0x170000, len=0x1000\n\n Acceso iova = 0x18f800 + 0x810 = 0x190010\n VA esperada: 0x170010 (segundo SG, desplazamiento 0x10)\n Antes de la corrección:\n - índice = (0x190010 >> 16) - (0x18f800 >> 16) = 1\n - page_offset = 0x190010 & 0xFFFF = 0x10\n - xarray[1] almacena la página del sistema para dma_addr 0x170000\n - VA resultante: página del sistema de 0x170000 + 0x10 = 0x170010 (incorrecto)\n\nYi Zhang informó de un kernel panic[1] hace años relacionado con este defecto.\n\nSolución:\n1. Reemplazar xarray con un array rxe_mr_page preasignado para indexación secuencial (todos los índices de página de MR son contiguos)\n2. Cada rxe_mr_page almacena tanto struct page como el desplazamiento dentro de la página del sistema\n3. Manejar las relaciones MR page_size != PAGE_SIZE:\n - page_size > PAGE_SIZE: Dividir las páginas de MR en múltiples páginas del sistema\n - page_size <= PAGE_SIZE: Almacenar el desplazamiento dentro de la página del sistema\n4. Añadir comprobaciones de límites y validación de compatibilidad\n\nEsto asegura una conversión iova-a-va correcta independientemente del tamaño de página de MR y la relación PAGE_SIZE del sistema, al tiempo que mejora el rendimiento mediante el acceso secuencial basado en arrays.\n\nPruebas en hosts con PAGE_SIZE de 4K y 64K:\n- rdma-core/pytests\n $ ./build/bin/run_tests.py --dev eth0_rxe\n- blktest:\n $ TIMEOUT=30 QUICK_RUN=1 USE_RXE=1 NVMET_TRTYPES=rdma ./check nvme srp rnbd\n\n[1] https://lore.kernel.org/all/CAHj4cs9XRqE25jyVw9rj9YugffLn5+f=1znaBEnu1usLOciD+g@mail.gmail.com/T/"
}
],
"affected": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"affectedData": [
{
"vendor": "Linux",
"product": "Linux",
"defaultStatus": "unaffected",
"programFiles": [
"drivers/infiniband/sw/rxe/rxe_mr.c",
"drivers/infiniband/sw/rxe/rxe_verbs.h"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"versions": [
{
"version": "592627ccbdff0ec6fff00fc761142a76db750dd4",
"lessThan": "e327021bd73b134c18167e2cd2a52eb5597fcba6",
"versionType": "git",
"status": "affected"
},
{
"version": "592627ccbdff0ec6fff00fc761142a76db750dd4",
"lessThan": "2a585a08a43c568ed6e9f27a97fd3d95106b9e68",
"versionType": "git",
"status": "affected"
},
{
"version": "592627ccbdff0ec6fff00fc761142a76db750dd4",
"lessThan": "409c2c5508f3d30627bea576f8676de523cb906e",
"versionType": "git",
"status": "affected"
},
{
"version": "592627ccbdff0ec6fff00fc761142a76db750dd4",
"lessThan": "836f6c13c9674027793f720be3f15ecd2b90b6ca",
"versionType": "git",
"status": "affected"
},
{
"version": "592627ccbdff0ec6fff00fc761142a76db750dd4",
"lessThan": "12985e5915a0b8354796efadaaeb201eed115377",
"versionType": "git",
"status": "affected"
},
{
"version": "0e443760b8b7b1e6723f4408afa056b2bc4fea12",
"versionType": "git",
"status": "affected"
},
{
"version": "6.2.3",
"lessThan": "6.3",
"versionType": "semver",
"status": "affected"
}
]
},
{
"vendor": "Linux",
"product": "Linux",
"defaultStatus": "affected",
"programFiles": [
"drivers/infiniband/sw/rxe/rxe_mr.c",
"drivers/infiniband/sw/rxe/rxe_verbs.h"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"versions": [
{
"version": "6.3",
"status": "affected"
},
{
"version": "0",
"lessThan": "6.3",
"versionType": "semver",
"status": "unaffected"
},
{
"version": "6.6.160",
"lessThanOrEqual": "6.6.*",
"versionType": "semver",
"status": "unaffected"
},
{
"version": "6.12.114",
"lessThanOrEqual": "6.12.*",
"versionType": "semver",
"status": "unaffected"
},
{
"version": "6.18.14",
"lessThanOrEqual": "6.18.*",
"versionType": "semver",
"status": "unaffected"
},
{
"version": "6.19.4",
"lessThanOrEqual": "6.19.*",
"versionType": "semver",
"status": "unaffected"
},
{
"version": "7.0",
"lessThanOrEqual": "*",
"versionType": "original_commit_for_fix",
"status": "unaffected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV31": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"baseScore": 9.8,
"baseSeverity": "CRITICAL",
"attackVector": "NETWORK",
"attackComplexity": "LOW",
"privilegesRequired": "NONE",
"userInteraction": "NONE",
"scope": "UNCHANGED",
"confidentialityImpact": "HIGH",
"integrityImpact": "HIGH",
"availabilityImpact": "HIGH"
},
"exploitabilityScore": 3.9,
"impactScore": 5.9
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-10-16T15:22:12.775005Z",
"id": "CVE-2026-46325",
"options": [
{
"exploitation": "none"
},
{
"automatable": "yes"
},
{
"technicalImpact": "total"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "[email protected]",
"type": "Primary",
"description": [
{
"lang": "en",
"value": "NVD-CWE-noinfo"
}
]
},
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-190"
}
]
}
],
"configurations": [
{
"nodes": [
{
"operator": "OR",
"negate": false,
"cpeMatch": [
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.2.3",
"versionEndExcluding": "6.18.14",
"matchCriteriaId": "372F28D4-9F28-4024-B964-DE55031C23BD"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.19",
"versionEndExcluding": "6.19.4",
"matchCriteriaId": "672A3E79-EC03-479D-8503-361DFBDC8092"
}
]
}
]
}
],
"references": [
{
"url": "https://git.kernel.org/stable/c/12985e5915a0b8354796efadaaeb201eed115377",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"tags": [
"Patch"
]
},
{
"url": "https://git.kernel.org/stable/c/2a585a08a43c568ed6e9f27a97fd3d95106b9e68",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/409c2c5508f3d30627bea576f8676de523cb906e",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"tags": [
"Patch"
]
},
{
"url": "https://git.kernel.org/stable/c/836f6c13c9674027793f720be3f15ecd2b90b6ca",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"tags": [
"Patch"
]
},
{
"url": "https://git.kernel.org/stable/c/e327021bd73b134c18167e2cd2a52eb5597fcba6",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
]
}