{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2026-89508",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2026-89508"
  ],
  "published": "2026-09-11T19:47:07Z",
  "summary": "RDMA/ucma: Lock the handler in ucma_set_ib_path()",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nRDMA/ucma: Lock the handler in ucma_set_ib_path()\n\nucma_set_ib_path() calls ucma_event_handler() straight from the write()\npath, without the handler lock that keeps ctx->file stable while a uevent\nis queued.  The handler re-reads ctx->file for every dereference:\n\n\tmutex_lock(&ctx->file->mut);\t\t\t/* file A */\n\tlist_add_tail(&uevent->list, &ctx->file->event_list);\t/* file B */\n\tmutex_unlock(&ctx->file->mut);\t\t\t/* file B */\n\twake_up_interruptible(&ctx->file->poll_wait);\t/* file B */\n\nA concurrent ucma_migrate_id() reassigns ctx->file while the SET_OPTION\ncaller sleeps in mutex_lock(), so the list_add_tail() lands on file B's\nevent_list while only file A's mutex is held, racing every other user of\nthat list:\n\n  BUG: KASAN: slab-use-after-free in __list_add_valid_or_report+0x1aa/0x1c0\n  Read of size 8 at addr ffff888153c6a418 by task poc_corr/486\n  Call Trace:\n   __list_add_valid_or_report+0x1aa/0x1c0\n   ucma_event_handler+0x1be/0xc00\n   ucma_set_ib_path+0x45e/0x710\n   ucma_set_option+0x32e/0x590\n   ucma_write+0x1f9/0x330\n  Allocated by task 505:\n   ucma_write_cm_event+0x1a1/0x660\n  Freed by task 505:\n   kfree+0x1da/0x4c0\n   ucma_get_event+0x5d5/0x7e0\n\nThe freed object is a ucma_event that another thread dequeued from file B's\nlist under file B's mutex.  File A's mut is left held on top of that,\nwedging its next writer in uninterruptible sleep.\n\nThis path needs a bound and address-resolved cm_id, so it requires an RDMA\ndevice to be present.\n\nTake the handler lock around the call.",
  "severity": [
    {
      "type": "CVSS_V3",
      "score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H"
    }
  ],
  "affected": [
    {
      "package": {
        "ecosystem": "Raspberry Pi OS:12",
        "name": "linux"
      },
      "versions": [
        "1:6.1.47-1+rpt4"
      ],
      "ecosystem_specific": {
        "binaries": [
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-2712",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v6",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v7",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v7l",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v8",
            "binary_version": "1:6.1.47-1+rpt4"
          }
        ]
      },
      "database_specific": {
        "per_version": {
          "1:6.1.47-1+rpt4": {
            "linux_commit": "655fc658a15ae7a6f37103754adb39ba52a9a14e",
            "upstream_version": "6.1.47",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.1.188",
            "compiled_filter": false
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2026-89508"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/3dd07b369371a2f29e1c3caf1ade85bb92b4c551"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/b2da0d488a1c72956ebb0a57015ee8ee6a2f7748"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/a7f8d26e653ee43b0b572984b8ec544d3b3b6f3c"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/71dc206f2e2a645dac78879768762451aa1799f7"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/764586f8f6180084c5a7d622120f526acc6ce0c9"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/28ac2dd416482d1c763c4af5d61af465b387fb50"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/43a7d8ae9f645dc00235cfa4bf57673c20b769f8"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/ecbe7d36dc2de07e5dfbb4a8ff5b315ab43de820"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-09-14T12:06:03Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 7.8,
      "cvss_v3_severity": "High",
      "scenario": "AV:L - The bug is reached only via write() on /dev/infiniband/rdma_cm (SET_OPTION -> ucma_set_option -> ucma_set_ib_path). A remote RDMA peer cannot invoke this path; in-kernel CM event delivery already holds the handler lock that this write path omitted.\nAC:L - The attacker controls both sides of the race: one thread issues SET_OPTION (RDMA_OPTION_IB_PATH) while another MIGRATE_IDs the cm_id to a second fd and a third GET_EVENTs to free the uevent. The window is the mutex_lock() sleep in ucma_event_handler, which the attacker can widen, and it was reproduced by poc_corr.\nPR:L - ucma is a miscdevice with mode 0666 and ucma_write() has no capability check. Any unprivileged local user can open /dev/infiniband/rdma_cm, CREATE_ID, resolve an address on an existing RDMA device, then issue SET_OPTION and MIGRATE_ID.\nUI:N - The attacker opens rdma_cm, creates and migrates their own cm_id, and issues the concurrent SET_OPTION and GET_EVENT writes themselves; no other user or administrator action is required.\nS:U - The use-after-free and list corruption are confined to host-kernel objects (ucma_event and file event_list). This is a standard local kernel compromise and does not cross a VM, IOMMU, or sandbox boundary.\nC:H - The race is a slab use-after-free of struct ucma_event (KASAN in __list_add_valid_or_report after GET_EVENT kfree). Reclaiming the freed object gives the attacker control over list pointers and event contents, enabling disclosure of kernel memory.\nI:H - list_add_tail runs on file B's event_list while only file A's mutex is held, corrupting list pointers. Combined with UAF reclaim of ucma_event, this is a classic kernel list-unlink arbitrary-write primitive suitable for control-flow hijacking.\nA:H - The UAF and list_debug BUG can oops the kernel, and the mismatched mutex_unlock leaves file A's mut held so the next writer sleeps uninterruptibly in D state, hanging the system."
    }
  }
}
