{"api_version":"1","generated_at":"2026-10-05T22:44:13+00:00","cve":"CVE-2026-90102","urls":{"html":"https://cve.report/CVE-2026-90102","api":"https://cve.report/api/cve/CVE-2026-90102.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-90102","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-90102"},"summary":{"title":"NFSv4/pnfs: key the data server cache on the NFS version","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nNFSv4/pnfs: key the data server cache on the NFS version\n\nnfs4_pnfs_ds_add() keys the per-net data server cache on the multipath\naddress set alone, and struct nfs4_pnfs_ds records no version. That\nsuffices for the files layout driver, which always connects with version\n4, but flexfiles takes its version tuple from GETDEVICEINFO per device,\nand one address can legitimately serve both NFSv3 and NFSv4.\n\nTwo deviceids on one address with different ds_versions[0].version\ntherefore share a single nfs4_pnfs_ds, and whichever mirror connects\nfirst pins ds_clp to its own version. The other one is handed that\nclient anyway, so it selects rpc_call_ops for a version the connection\ndoes not speak, and the mismatched sequence-slot handling dereferences\nNULL.\n\nAdd the version to the cache key so the two cannot alias, giving each\nversion its own nfs4_pnfs_ds and connection while both mirrors stay\nusable. Only the major version is compared, since that is what selects\nrpc_call_ops and rpc_ops; v4.0 and v4.1 keep sharing a client. The files\nlayout driver passes the 4 it already hardcodes at connect time.","state":"PUBLISHED","assigner":"Linux","published_at":"2026-09-17 17:17:01","updated_at":"2026-09-18 18:17:41"},"problem_types":[],"metrics":[{"version":"3.1","source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","score":"7.5","severity":"HIGH","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","data":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","baseScore":7.5,"baseSeverity":"HIGH","attackVector":"NETWORK","attackComplexity":"LOW","privilegesRequired":"NONE","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"NONE","integrityImpact":"NONE","availabilityImpact":"HIGH"}},{"version":"3.1","source":"CNA","type":"DECLARED","score":"7.5","severity":"HIGH","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","data":{"baseScore":7.5,"baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","version":"3.1"}}],"references":[{"url":"https://git.kernel.org/stable/c/13c23c5cb977f66390795437fd3837887ce1fd75","name":"https://git.kernel.org/stable/c/13c23c5cb977f66390795437fd3837887ce1fd75","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/27f640cd92eebf5c2f64336be7ca24f4636390cb","name":"https://git.kernel.org/stable/c/27f640cd92eebf5c2f64336be7ca24f4636390cb","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/dd5bd091daa48c6ed8f9235ddf448aa288a0881f","name":"https://git.kernel.org/stable/c/dd5bd091daa48c6ed8f9235ddf448aa288a0881f","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/02e160922bc83cd25e346a028ed43cbdb0b57e1a","name":"https://git.kernel.org/stable/c/02e160922bc83cd25e346a028ed43cbdb0b57e1a","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/ffb100b0da0e217d5d63ce6fe092f9c29e59f7dd","name":"https://git.kernel.org/stable/c/ffb100b0da0e217d5d63ce6fe092f9c29e59f7dd","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/bc7aa9d8aff826031ffe25eba7f2f3acafcbf7a1","name":"https://git.kernel.org/stable/c/bc7aa9d8aff826031ffe25eba7f2f3acafcbf7a1","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/bbc975cfb07a146843fde1126c43441e76177539","name":"https://git.kernel.org/stable/c/bbc975cfb07a146843fde1126c43441e76177539","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/f2994ba1263d9e88d3d9ae1d097c5cf811d4bfa5","name":"https://git.kernel.org/stable/c/f2994ba1263d9e88d3d9ae1d097c5cf811d4bfa5","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-90102","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-90102","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e ffb100b0da0e217d5d63ce6fe092f9c29e59f7dd git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e 02e160922bc83cd25e346a028ed43cbdb0b57e1a git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e bc7aa9d8aff826031ffe25eba7f2f3acafcbf7a1 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e dd5bd091daa48c6ed8f9235ddf448aa288a0881f git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e f2994ba1263d9e88d3d9ae1d097c5cf811d4bfa5 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e 27f640cd92eebf5c2f64336be7ca24f4636390cb git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e bbc975cfb07a146843fde1126c43441e76177539 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d67ae825a59d639e4d8b82413af84d854617a87e 13c23c5cb977f66390795437fd3837887ce1fd75 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 4.0","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 4.0 semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 5.10.270 5.10.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 5.15.221 5.15.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.1.188 6.1.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.6.157 6.6.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.12.110 6.12.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.18.52 6.18.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.2.6 7.2.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.3-rc1 * original_commit_for_fix","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":{"cve_year":"2026","cve_id":"90102","cve":"CVE-2026-90102","epss":"0.006770000","percentile":"0.504610000","score_date":"2026-09-21","updated_at":"2026-09-22 00:03:19"},"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","product":"Linux","programFiles":["fs/nfs/filelayout/filelayoutdev.c","fs/nfs/flexfilelayout/flexfilelayoutdev.c","fs/nfs/pnfs.h","fs/nfs/pnfs_nfs.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"lessThan":"ffb100b0da0e217d5d63ce6fe092f9c29e59f7dd","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"02e160922bc83cd25e346a028ed43cbdb0b57e1a","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"bc7aa9d8aff826031ffe25eba7f2f3acafcbf7a1","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"dd5bd091daa48c6ed8f9235ddf448aa288a0881f","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"f2994ba1263d9e88d3d9ae1d097c5cf811d4bfa5","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"27f640cd92eebf5c2f64336be7ca24f4636390cb","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"bbc975cfb07a146843fde1126c43441e76177539","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"},{"lessThan":"13c23c5cb977f66390795437fd3837887ce1fd75","status":"affected","version":"d67ae825a59d639e4d8b82413af84d854617a87e","versionType":"git"}]},{"defaultStatus":"affected","product":"Linux","programFiles":["fs/nfs/filelayout/filelayoutdev.c","fs/nfs/flexfilelayout/flexfilelayoutdev.c","fs/nfs/pnfs.h","fs/nfs/pnfs_nfs.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"status":"affected","version":"4.0"},{"lessThan":"4.0","status":"unaffected","version":"0","versionType":"semver"},{"lessThanOrEqual":"5.10.*","status":"unaffected","version":"5.10.270","versionType":"semver"},{"lessThanOrEqual":"5.15.*","status":"unaffected","version":"5.15.221","versionType":"semver"},{"lessThanOrEqual":"6.1.*","status":"unaffected","version":"6.1.188","versionType":"semver"},{"lessThanOrEqual":"6.6.*","status":"unaffected","version":"6.6.157","versionType":"semver"},{"lessThanOrEqual":"6.12.*","status":"unaffected","version":"6.12.110","versionType":"semver"},{"lessThanOrEqual":"6.18.*","status":"unaffected","version":"6.18.52","versionType":"semver"},{"lessThanOrEqual":"7.2.*","status":"unaffected","version":"7.2.6","versionType":"semver"},{"lessThanOrEqual":"*","status":"unaffected","version":"7.3-rc1","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"5.10.270","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"5.15.221","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.1.188","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.6.157","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.12.110","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.18.52","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.2.6","versionStartIncluding":"4.0","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.3-rc1","versionStartIncluding":"4.0","vulnerable":true}],"negate":false,"operator":"OR"}]}],"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nNFSv4/pnfs: key the data server cache on the NFS version\n\nnfs4_pnfs_ds_add() keys the per-net data server cache on the multipath\naddress set alone, and struct nfs4_pnfs_ds records no version. That\nsuffices for the files layout driver, which always connects with version\n4, but flexfiles takes its version tuple from GETDEVICEINFO per device,\nand one address can legitimately serve both NFSv3 and NFSv4.\n\nTwo deviceids on one address with different ds_versions[0].version\ntherefore share a single nfs4_pnfs_ds, and whichever mirror connects\nfirst pins ds_clp to its own version. The other one is handed that\nclient anyway, so it selects rpc_call_ops for a version the connection\ndoes not speak, and the mismatched sequence-slot handling dereferences\nNULL.\n\nAdd the version to the cache key so the two cannot alias, giving each\nversion its own nfs4_pnfs_ds and connection while both mirrors stay\nusable. Only the major version is compared, since that is what selects\nrpc_call_ops and rpc_ops; v4.0 and v4.1 keep sharing a client. The files\nlayout driver passes the 4 it already hardcodes at connect time."}],"metrics":[{"cvssV3_1":{"baseScore":7.5,"baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","version":"3.1"},"scenarios":[{"lang":"en","value":"AV:N - The colliding cache key is carried in the MDS GETDEVICEINFO reply: nfs4_ff_alloc_deviceid_node() XDR-decodes the flexfiles device_addr4 multipath r_addr list and ds_versions[0].version, then nfs4_pnfs_ds_add() indexed nfs4_data_server_cache on addresses alone so two deviceids with the same address and versions 3 vs 4 alias. That COMPOUND arrives over NFSv4.1/TCP.\nAC:L - The MDS chooses LAYOUTGET mirrors and both GETDEVICEINFO bodies. ff_layout_pg_init_write() calls nfs4_ff_layout_prepare_ds() per mirror; the first nfs4_pnfs_ds_connect() pins ds_clp to NFSv3 (nfs3_set_ds_client), and the later ff_layout_write_pagelist() uses ff_layout_write_call_ops_v4 on that client with no race.\nPR:N - The attacker is the remote flexfiles MDS (or an injector of GETDEVICEINFO/LAYOUTGET RPC replies) and holds no account or capability on the victim; nfs4_proc_getdeviceinfo() consumes those replies on the client's existing session.\nUI:N - Flexfiles sets PNFS_LAYOUTGET_ON_OPEN, so an already-mounted pNFS export issues LAYOUTGET at open; the next write through ff_layout_pg_init_write() fetches both deviceids and hits the aliased ds_clp without any extra victim step beyond ordinary file I/O.\nS:U - The oops is in the client's nfs4_setup_sequence() on the aliased nfs4_pnfs_ds during DS I/O for that mount; it does not cross a VM, IOMMU, or sandbox boundary.\nC:N - ff_layout_write_prepare_v4()/ff_layout_read_prepare_v4() call nfs4_setup_sequence() on the v3 ds_clp, which does spin_lock(&tbl->slot_tbl_lock) with tbl = client->cl_slot_tbl (NULL on nfs_init_client); that is a NULL dereference with no OOB read or UAF.\nI:N - The version-mismatched rpc_call_ops path never writes through a corrupted object or hijacks control flow: nfs4_setup_sequence() NULL-dereferences the v3 client's cl_slot_tbl before any slot table or session state is modified.\nA:H - nfs4_setup_sequence() NULL-dereferences cl_slot_tbl in process context on the v4 DS write/read that reused the v3-pinned ds_clp, causing a kernel oops/panic of the NFS client."}]}],"providerMetadata":{"dateUpdated":"2026-09-18T17:53:00.756Z","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux"},"references":[{"url":"https://git.kernel.org/stable/c/ffb100b0da0e217d5d63ce6fe092f9c29e59f7dd"},{"url":"https://git.kernel.org/stable/c/02e160922bc83cd25e346a028ed43cbdb0b57e1a"},{"url":"https://git.kernel.org/stable/c/bc7aa9d8aff826031ffe25eba7f2f3acafcbf7a1"},{"url":"https://git.kernel.org/stable/c/dd5bd091daa48c6ed8f9235ddf448aa288a0881f"},{"url":"https://git.kernel.org/stable/c/f2994ba1263d9e88d3d9ae1d097c5cf811d4bfa5"},{"url":"https://git.kernel.org/stable/c/27f640cd92eebf5c2f64336be7ca24f4636390cb"},{"url":"https://git.kernel.org/stable/c/bbc975cfb07a146843fde1126c43441e76177539"},{"url":"https://git.kernel.org/stable/c/13c23c5cb977f66390795437fd3837887ce1fd75"}],"title":"NFSv4/pnfs: key the data server cache on the NFS version","x_generator":{"engine":"bippy-1.2.0"}}},"cveMetadata":{"assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","assignerShortName":"Linux","cveId":"CVE-2026-90102","datePublished":"2026-09-17T16:06:12.873Z","dateReserved":"2026-09-11T19:38:34.786Z","dateUpdated":"2026-09-18T17:53:00.756Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-09-17 17:17:01","lastModifiedDate":"2026-09-18 18:17:41","problem_types":[],"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:N/I:N/A:H","baseScore":7.5,"baseSeverity":"HIGH","attackVector":"NETWORK","attackComplexity":"LOW","privilegesRequired":"NONE","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"NONE","integrityImpact":"NONE","availabilityImpact":"HIGH"},"exploitabilityScore":3.9,"impactScore":3.6}]},"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"90102","Ordinal":"1","Title":"NFSv4/pnfs: key the data server cache on the NFS version","CVE":"CVE-2026-90102","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"90102","Ordinal":"1","NoteData":"In the Linux kernel, the following vulnerability has been resolved:\n\nNFSv4/pnfs: key the data server cache on the NFS version\n\nnfs4_pnfs_ds_add() keys the per-net data server cache on the multipath\naddress set alone, and struct nfs4_pnfs_ds records no version. That\nsuffices for the files layout driver, which always connects with version\n4, but flexfiles takes its version tuple from GETDEVICEINFO per device,\nand one address can legitimately serve both NFSv3 and NFSv4.\n\nTwo deviceids on one address with different ds_versions[0].version\ntherefore share a single nfs4_pnfs_ds, and whichever mirror connects\nfirst pins ds_clp to its own version. The other one is handed that\nclient anyway, so it selects rpc_call_ops for a version the connection\ndoes not speak, and the mismatched sequence-slot handling dereferences\nNULL.\n\nAdd the version to the cache key so the two cannot alias, giving each\nversion its own nfs4_pnfs_ds and connection while both mirrors stay\nusable. Only the major version is compared, since that is what selects\nrpc_call_ops and rpc_ops; v4.0 and v4.1 keep sharing a client. The files\nlayout driver passes the 4 it already hardcodes at connect time.","Type":"Description","Title":"NFSv4/pnfs: key the data server cache on the NFS version"}]}}}