CVE-2025-40061 (GCVE-0-2025-40061)

Vulnerability from cvelistv5 – Published: 2025-10-28 11:48 – Updated: 2026-08-05 12:07
VLAI
Title
RDMA/rxe: Fix race in do_task() when draining
Summary
In the Linux kernel, the following vulnerability has been resolved: RDMA/rxe: Fix race in do_task() when draining When do_task() exhausts its iteration budget (!ret), it sets the state to TASK_STATE_IDLE to reschedule, without a secondary check on the current task->state. This can overwrite the TASK_STATE_DRAINING state set by a concurrent call to rxe_cleanup_task() or rxe_disable_task(). While state changes are protected by a spinlock, both rxe_cleanup_task() and rxe_disable_task() release the lock while waiting for the task to finish draining in the while(!is_done(task)) loop. The race occurs if do_task() hits its iteration limit and acquires the lock in this window. The cleanup logic may then proceed while the task incorrectly reschedules itself, leading to a potential use-after-free. This bug was introduced during the migration from tasklets to workqueues, where the special handling for the draining case was lost. Fix this by restoring the original pre-migration behavior. If the state is TASK_STATE_DRAINING when iterations are exhausted, set cont to 1 to force a new loop iteration. This allows the task to finish its work, so that a subsequent iteration can reach the switch statement and correctly transition the state to TASK_STATE_DRAINED, stopping the task as intended.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 9b4b7c1f9f54120940e243251e2b1407767b3381 , < 85288bcf7ffe11e7b036edf91937bc62fd384076 (git)
Affected: 9b4b7c1f9f54120940e243251e2b1407767b3381 , < 52edccfb555142678c836c285bf5b4ec760bd043 (git)
Affected: 9b4b7c1f9f54120940e243251e2b1407767b3381 , < 660b6959c4170637f5db2279d1f71af33a49e49b (git)
Affected: 9b4b7c1f9f54120940e243251e2b1407767b3381 , < 8ca7eada62fcfabf6ec1dc7468941e791c1d8729 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.5
Unaffected: 0 , < 6.5 (semver)
Unaffected: 6.6.112 , ≤ 6.6.* (semver)
Unaffected: 6.12.53 , ≤ 6.12.* (semver)
Unaffected: 6.17.3 , ≤ 6.17.* (semver)
Unaffected: 6.18 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "drivers/infiniband/sw/rxe/rxe_task.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "85288bcf7ffe11e7b036edf91937bc62fd384076",
              "status": "affected",
              "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
              "versionType": "git"
            },
            {
              "lessThan": "52edccfb555142678c836c285bf5b4ec760bd043",
              "status": "affected",
              "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
              "versionType": "git"
            },
            {
              "lessThan": "660b6959c4170637f5db2279d1f71af33a49e49b",
              "status": "affected",
              "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
              "versionType": "git"
            },
            {
              "lessThan": "8ca7eada62fcfabf6ec1dc7468941e791c1d8729",
              "status": "affected",
              "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "drivers/infiniband/sw/rxe/rxe_task.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.5"
            },
            {
              "lessThan": "6.5",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.112",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.53",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.17.*",
              "status": "unaffected",
              "version": "6.17.3",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "6.18",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.112",
                  "versionStartIncluding": "6.5",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.53",
                  "versionStartIncluding": "6.5",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.17.3",
                  "versionStartIncluding": "6.5",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18",
                  "versionStartIncluding": "6.5",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nRDMA/rxe: Fix race in do_task() when draining\n\nWhen do_task() exhausts its iteration budget (!ret), it sets the state\nto TASK_STATE_IDLE to reschedule, without a secondary check on the\ncurrent task-\u003estate. This can overwrite the TASK_STATE_DRAINING state\nset by a concurrent call to rxe_cleanup_task() or rxe_disable_task().\n\nWhile state changes are protected by a spinlock, both rxe_cleanup_task()\nand rxe_disable_task() release the lock while waiting for the task to\nfinish draining in the while(!is_done(task)) loop. The race occurs if\ndo_task() hits its iteration limit and acquires the lock in this window.\nThe cleanup logic may then proceed while the task incorrectly\nreschedules itself, leading to a potential use-after-free.\n\nThis bug was introduced during the migration from tasklets to workqueues,\nwhere the special handling for the draining case was lost.\n\nFix this by restoring the original pre-migration behavior. If the state is\nTASK_STATE_DRAINING when iterations are exhausted, set cont to 1 to\nforce a new loop iteration. This allows the task to finish its work, so\nthat a subsequent iteration can reach the switch statement and correctly\ntransition the state to TASK_STATE_DRAINED, stopping the task as intended."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.8,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:L - Both sides of the race are driven through local verbs calls on /dev/infiniband/uverbsN \u2014 posting work requests to exhaust the 1024-iteration budget and concurrently issuing modify_qp(RESET)/destroy_qp. Remote RoCE packets can feed the responder task, but the draining half (rxe_disable_task/rxe_cleanup_task) is only reachable from a local ioctl/write on the uverbs device.\nAC:L - The attacker controls both racers: one thread posts more than RXE_MAX_ITERATIONS work items so do_task deterministically hits the `!ret` branch, while another thread calls modify_qp(RESET) or destroy_qp to set TASK_STATE_DRAINING. The window can be retried unboundedly across many QPs and widened with CPU contention, so no condition lies outside the attacker\u0027s influence.\nPR:L - The kernel\u0027s uverbs_devnode() publishes /dev/infiniband/uverbsN with mode 0666, so any unprivileged local account can allocate a PD/CQ/QP and drive the race with no capabilities. Only the one-time creation of the rdma_rxe link requires CAP_NET_ADMIN, which is administrator setup rather than a privilege the attacker must hold.\nUI:N - The attacker performs every step itself from its own process; no victim action, mount, or file open is involved.\nS:U - The corruption is confined to kernel objects owned by the same kernel security authority (rxe QP, queues, CQs, MRs); no VM, IOMMU, or sandbox boundary is crossed.\nC:H - Clobbering DRAINING lets a work item run rxe_responder/rxe_requester against a QP whose send/receive queues have been vfree\u0027d or memset and whose MRs and CQs have been put, giving use-after-free reads of freed kernel memory that are copied into userspace-mapped completion queues and onto the wire.\nI:H - The same use-after-free is a write primitive: the re-scheduled responder writes CQ entries, WQE state, and RDMA payloads into freed queue and MR memory, and duplicated rxe_put() calls underflow object refcounts, enabling heap grooming toward control-flow hijack.\nA:H - The race trips WARN_ON(task-\u003enum_done != task-\u003enum_sched) and dereferences freed rxe_queue, CQ, MR, and socket objects, reliably producing an oops or panic and taking down the machine."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-05T12:07:27.040Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/85288bcf7ffe11e7b036edf91937bc62fd384076"
        },
        {
          "url": "https://git.kernel.org/stable/c/52edccfb555142678c836c285bf5b4ec760bd043"
        },
        {
          "url": "https://git.kernel.org/stable/c/660b6959c4170637f5db2279d1f71af33a49e49b"
        },
        {
          "url": "https://git.kernel.org/stable/c/8ca7eada62fcfabf6ec1dc7468941e791c1d8729"
        }
      ],
      "title": "RDMA/rxe: Fix race in do_task() when draining",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2025-40061",
    "datePublished": "2025-10-28T11:48:33.361Z",
    "dateReserved": "2025-04-16T07:20:57.158Z",
    "dateUpdated": "2026-08-05T12:07:27.040Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2025-40061",
      "date": "2026-09-26",
      "epss": "0.0014",
      "percentile": "0.0273"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "defaultStatus": "unaffected",
                "product": "Linux",
                "programFiles": [
                  "drivers/infiniband/sw/rxe/rxe_task.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "lessThan": "85288bcf7ffe11e7b036edf91937bc62fd384076",
                    "status": "affected",
                    "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "52edccfb555142678c836c285bf5b4ec760bd043",
                    "status": "affected",
                    "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "660b6959c4170637f5db2279d1f71af33a49e49b",
                    "status": "affected",
                    "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "8ca7eada62fcfabf6ec1dc7468941e791c1d8729",
                    "status": "affected",
                    "version": "9b4b7c1f9f54120940e243251e2b1407767b3381",
                    "versionType": "git"
                  }
                ]
              },
              {
                "defaultStatus": "affected",
                "product": "Linux",
                "programFiles": [
                  "drivers/infiniband/sw/rxe/rxe_task.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "status": "affected",
                    "version": "6.5"
                  },
                  {
                    "lessThan": "6.5",
                    "status": "unaffected",
                    "version": "0",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.6.*",
                    "status": "unaffected",
                    "version": "6.6.112",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.12.*",
                    "status": "unaffected",
                    "version": "6.12.53",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.17.*",
                    "status": "unaffected",
                    "version": "6.17.3",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "*",
                    "status": "unaffected",
                    "version": "6.18",
                    "versionType": "original_commit_for_fix"
                  }
                ]
              }
            ],
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nRDMA/rxe: Fix race in do_task() when draining\n\nWhen do_task() exhausts its iteration budget (!ret), it sets the state\nto TASK_STATE_IDLE to reschedule, without a secondary check on the\ncurrent task-\u003estate. This can overwrite the TASK_STATE_DRAINING state\nset by a concurrent call to rxe_cleanup_task() or rxe_disable_task().\n\nWhile state changes are protected by a spinlock, both rxe_cleanup_task()\nand rxe_disable_task() release the lock while waiting for the task to\nfinish draining in the while(!is_done(task)) loop. The race occurs if\ndo_task() hits its iteration limit and acquires the lock in this window.\nThe cleanup logic may then proceed while the task incorrectly\nreschedules itself, leading to a potential use-after-free.\n\nThis bug was introduced during the migration from tasklets to workqueues,\nwhere the special handling for the draining case was lost.\n\nFix this by restoring the original pre-migration behavior. If the state is\nTASK_STATE_DRAINING when iterations are exhausted, set cont to 1 to\nforce a new loop iteration. This allows the task to finish its work, so\nthat a subsequent iteration can reach the switch statement and correctly\ntransition the state to TASK_STATE_DRAINED, stopping the task as intended."
          }
        ],
        "id": "CVE-2025-40061",
        "lastModified": "2026-07-30T06:24:08.850",
        "metrics": {
          "cvssMetricV31": [
            {
              "cvssData": {
                "attackComplexity": "LOW",
                "attackVector": "LOCAL",
                "availabilityImpact": "HIGH",
                "baseScore": 7.8,
                "baseSeverity": "HIGH",
                "confidentialityImpact": "HIGH",
                "integrityImpact": "HIGH",
                "privilegesRequired": "LOW",
                "scope": "UNCHANGED",
                "userInteraction": "NONE",
                "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
                "version": "3.1"
              },
              "exploitabilityScore": 1.8,
              "impactScore": 5.9,
              "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
              "type": "Secondary"
            }
          ]
        },
        "published": "2025-10-28T12:15:40.493",
        "references": [
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/52edccfb555142678c836c285bf5b4ec760bd043"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/660b6959c4170637f5db2279d1f71af33a49e49b"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/85288bcf7ffe11e7b036edf91937bc62fd384076"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/8ca7eada62fcfabf6ec1dc7468941e791c1d8729"
          }
        ],
        "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "vulnStatus": "Deferred"
      }
    },
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-07-30T08:53:02+00:00",
      "cve": "CVE-2025-40061",
      "id": "CVE-2025-40061",
      "initial_release_date": "2025-10-28T00:00:00+00:00",
      "product_status:known_affected": "108",
      "product_status:known_not_affected": "166",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: RDMA/rxe: Fix race in do_task() when draining",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2025/cve-2025-40061.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-09-11T01:56:05Z",
      "cve": "CVE-2025-40061",
      "id": "CVE-2025-40061",
      "initial_release_date": "2025-10-29T00:25:02Z",
      "product_status:first_fixed": "2",
      "product_status:known_affected": "461",
      "product_status:known_not_affected": "323",
      "product_status:recommended": "470",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2025-40061",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2025-40061.json",
      "version": "53"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…