{"api_version":"1","generated_at":"2026-10-23T07:25:10+00:00","cve":"CVE-2026-98689","urls":{"html":"https://cve.report/CVE-2026-98689","api":"https://cve.report/api/cve/CVE-2026-98689.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-98689","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-98689"},"summary":{"title":"thunderbolt: Don't access a DP tunnel after its DPRX read was canceled","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nthunderbolt: Don't access a DP tunnel after its DPRX read was canceled\n\ntb_dp_dprx_work() checks ->dprx_canceled before it takes tb->lock so it\nmisses a tb_dp_dprx_stop() that could not cancel the already running\nwork. It then polls the DPRX capabilities and runs the callback for a\ntunnel that has already been torn down while the domain is suspending or\ngoing away.\n\nThis can be hit by cancelling the DPRX read from outside the ordered\ntb->wq: During suspend tb_disconnect_and_release_dp() does just this and\nwith a later patch tb_stop() will do it as well. The latter in combination\nwith the Apple NHI where the DPRX read never completed is how I hit\nthis.\n\nCheck the flag with tb->lock held instead and check it again in\ntb_dp_tunnel_active() because the callback runs after the lock has been\ndropped again.\n\nAlso clear the flag in tb_dp_dprx_start() so that it only ever describes\nthe work that is currently in flight.","state":"PUBLISHED","assigner":"Linux","published_at":"2026-10-18 16:17:22","updated_at":"2026-10-19 10:19:33"},"problem_types":[],"metrics":[],"references":[{"url":"https://git.kernel.org/stable/c/419fa32fa5bc2d7fb9d0d15d5630b1c1090808b3","name":"https://git.kernel.org/stable/c/419fa32fa5bc2d7fb9d0d15d5630b1c1090808b3","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/2c2fd6a7fd5e1218db7e17336fc1a0393b6949e6","name":"https://git.kernel.org/stable/c/2c2fd6a7fd5e1218db7e17336fc1a0393b6949e6","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/405a969c0b3356639116db89ab367be1d64b77c0","name":"https://git.kernel.org/stable/c/405a969c0b3356639116db89ab367be1d64b77c0","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-98689","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-98689","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d6d458d42e1e1544a18f37f1d5c840e00d5261b9 405a969c0b3356639116db89ab367be1d64b77c0 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d6d458d42e1e1544a18f37f1d5c840e00d5261b9 2c2fd6a7fd5e1218db7e17336fc1a0393b6949e6 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected d6d458d42e1e1544a18f37f1d5c840e00d5261b9 419fa32fa5bc2d7fb9d0d15d5630b1c1090808b3 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 6.14","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.14 semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.18.56 6.18.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.2.10 7.2.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.3 * original_commit_for_fix","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":null,"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","product":"Linux","programFiles":["drivers/thunderbolt/tb.c","drivers/thunderbolt/tunnel.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"lessThan":"405a969c0b3356639116db89ab367be1d64b77c0","status":"affected","version":"d6d458d42e1e1544a18f37f1d5c840e00d5261b9","versionType":"git"},{"lessThan":"2c2fd6a7fd5e1218db7e17336fc1a0393b6949e6","status":"affected","version":"d6d458d42e1e1544a18f37f1d5c840e00d5261b9","versionType":"git"},{"lessThan":"419fa32fa5bc2d7fb9d0d15d5630b1c1090808b3","status":"affected","version":"d6d458d42e1e1544a18f37f1d5c840e00d5261b9","versionType":"git"}]},{"defaultStatus":"affected","product":"Linux","programFiles":["drivers/thunderbolt/tb.c","drivers/thunderbolt/tunnel.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"status":"affected","version":"6.14"},{"lessThan":"6.14","status":"unaffected","version":"0","versionType":"semver"},{"lessThanOrEqual":"6.18.*","status":"unaffected","version":"6.18.56","versionType":"semver"},{"lessThanOrEqual":"7.2.*","status":"unaffected","version":"7.2.10","versionType":"semver"},{"lessThanOrEqual":"*","status":"unaffected","version":"7.3","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.18.56","versionStartIncluding":"6.14","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.2.10","versionStartIncluding":"6.14","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.3","versionStartIncluding":"6.14","vulnerable":true}],"negate":false,"operator":"OR"}]}],"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nthunderbolt: Don't access a DP tunnel after its DPRX read was canceled\n\ntb_dp_dprx_work() checks ->dprx_canceled before it takes tb->lock so it\nmisses a tb_dp_dprx_stop() that could not cancel the already running\nwork. It then polls the DPRX capabilities and runs the callback for a\ntunnel that has already been torn down while the domain is suspending or\ngoing away.\n\nThis can be hit by cancelling the DPRX read from outside the ordered\ntb->wq: During suspend tb_disconnect_and_release_dp() does just this and\nwith a later patch tb_stop() will do it as well. The latter in combination\nwith the Apple NHI where the DPRX read never completed is how I hit\nthis.\n\nCheck the flag with tb->lock held instead and check it again in\ntb_dp_tunnel_active() because the callback runs after the lock has been\ndropped again.\n\nAlso clear the flag in tb_dp_dprx_start() so that it only ever describes\nthe work that is currently in flight."}],"providerMetadata":{"dateUpdated":"2026-10-19T09:23:59.268Z","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux"},"references":[{"url":"https://git.kernel.org/stable/c/405a969c0b3356639116db89ab367be1d64b77c0"},{"url":"https://git.kernel.org/stable/c/2c2fd6a7fd5e1218db7e17336fc1a0393b6949e6"},{"url":"https://git.kernel.org/stable/c/419fa32fa5bc2d7fb9d0d15d5630b1c1090808b3"}],"title":"thunderbolt: Don't access a DP tunnel after its DPRX read was canceled","x_generator":{"engine":"bippy-1.2.0"}}},"cveMetadata":{"assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","assignerShortName":"Linux","cveId":"CVE-2026-98689","datePublished":"2026-10-18T15:46:04.217Z","dateReserved":"2026-09-25T10:25:14.364Z","dateUpdated":"2026-10-19T09:23:59.268Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-10-18 16:17:22","lastModifiedDate":"2026-10-19 10:19:33","problem_types":[],"metrics":[],"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"98689","Ordinal":"1","Title":"thunderbolt: Don't access a DP tunnel after its DPRX read was ca","CVE":"CVE-2026-98689","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"98689","Ordinal":"1","NoteData":"In the Linux kernel, the following vulnerability has been resolved:\n\nthunderbolt: Don't access a DP tunnel after its DPRX read was canceled\n\ntb_dp_dprx_work() checks ->dprx_canceled before it takes tb->lock so it\nmisses a tb_dp_dprx_stop() that could not cancel the already running\nwork. It then polls the DPRX capabilities and runs the callback for a\ntunnel that has already been torn down while the domain is suspending or\ngoing away.\n\nThis can be hit by cancelling the DPRX read from outside the ordered\ntb->wq: During suspend tb_disconnect_and_release_dp() does just this and\nwith a later patch tb_stop() will do it as well. The latter in combination\nwith the Apple NHI where the DPRX read never completed is how I hit\nthis.\n\nCheck the flag with tb->lock held instead and check it again in\ntb_dp_tunnel_active() because the callback runs after the lock has been\ndropped again.\n\nAlso clear the flag in tb_dp_dprx_start() so that it only ever describes\nthe work that is currently in flight.","Type":"Description","Title":"thunderbolt: Don't access a DP tunnel after its DPRX read was ca"}]}}}