CVE-2026-74727 (GCVE-0-2026-74727)

Vulnerability from cvelistv5 – Published: 2026-08-22 15:33 – Updated: 2026-08-25 05:42
VLAI
Title
ovpn: skip rehash for peers already removed from by_id
Summary
In the Linux kernel, the following vulnerability has been resolved: ovpn: skip rehash for peers already removed from by_id ovpn_nl_peer_set_doit() resolves the target peer via ovpn_peer_get_by_id() before taking ovpn->lock. In the window between the lookup (which only takes a refcount) and the subsequent spin_lock_bh(&ovpn->lock), a concurrent OVPN_CMD_PEER_DEL, keepalive expiry, or socket teardown can take ovpn->lock first, run ovpn_peer_remove() to unhash the peer from all four tables (by_id, by_vpn_addr4/6, by_transp_addr) and release the lock. set_doit then acquires ovpn->lock and calls ovpn_peer_hash_vpn_ip(), which re-inserts the now-removed peer back into the rehashing tables. The same race affects the float path: ovpn_peer_endpoints_update() holds only a refcount and acquires ovpn->lock very late (after async AEAD decrypt and a netlink notification), then rehashes the peer in the by_transp_addr table. The resurrected peer becomes reachable again from the RX lookup (ovpn_peer_get_by_transp_addr) and the TX VPN-IP lookup, even though userspace believes it is gone. Once the data-path refcount drops the peer is freed via call_rcu while the hash entries embedded in it remain linked, opening a UAF window. Bail out of the rehash when hash_entry_id is unhashed, mirroring the sentinel already used by ovpn_peer_remove() to detect the already-removed state. The check is safe under ovpn->lock, which serializes every mutation of hash_entry_id, and is a no-op for the add path because ovpn_peer_add_mp() inserts hash_entry_id before calling ovpn_peer_hash_vpn_ip().
Assigner
Linux CNA under the mitre root
CNA scorecard D 53/100 over 6666 records in the last 180 days details
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 1d36a36f6d5347360ef9681a05f6166683bafd1d , < d20c181088984b6eaa8d7fe7cb5ab3510988df59 (git)
Affected: 1d36a36f6d5347360ef9681a05f6166683bafd1d , < 66745480298775f188b2f5ad266643e85a90f73b (git)
Affected: 1d36a36f6d5347360ef9681a05f6166683bafd1d , < 33ec10567fe14456063daf549fdf1a4f53448e4c (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.16
Unaffected: 0 , < 6.16 (semver)
Unaffected: 6.18.45 , ≤ 6.18.* (semver)
Unaffected: 7.1.9 , ≤ 7.1.* (semver)
Unaffected: 7.2 , ≤ * (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/net/ovpn/peer.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "d20c181088984b6eaa8d7fe7cb5ab3510988df59",
              "status": "affected",
              "version": "1d36a36f6d5347360ef9681a05f6166683bafd1d",
              "versionType": "git"
            },
            {
              "lessThan": "66745480298775f188b2f5ad266643e85a90f73b",
              "status": "affected",
              "version": "1d36a36f6d5347360ef9681a05f6166683bafd1d",
              "versionType": "git"
            },
            {
              "lessThan": "33ec10567fe14456063daf549fdf1a4f53448e4c",
              "status": "affected",
              "version": "1d36a36f6d5347360ef9681a05f6166683bafd1d",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "drivers/net/ovpn/peer.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.16"
            },
            {
              "lessThan": "6.16",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.45",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.1.*",
              "status": "unaffected",
              "version": "7.1.9",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.2",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.45",
                  "versionStartIncluding": "6.16",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.1.9",
                  "versionStartIncluding": "6.16",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2",
                  "versionStartIncluding": "6.16",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\novpn: skip rehash for peers already removed from by_id\n\novpn_nl_peer_set_doit() resolves the target peer via\novpn_peer_get_by_id() before taking ovpn-\u003elock. In the window between\nthe lookup (which only takes a refcount) and the subsequent\nspin_lock_bh(\u0026ovpn-\u003elock), a concurrent OVPN_CMD_PEER_DEL, keepalive\nexpiry, or socket teardown can take ovpn-\u003elock first, run\novpn_peer_remove() to unhash the peer from all four tables (by_id,\nby_vpn_addr4/6, by_transp_addr) and release the lock. set_doit then\nacquires ovpn-\u003elock and calls ovpn_peer_hash_vpn_ip(), which\nre-inserts the now-removed peer back into the rehashing tables.\n\nThe same race affects the float path: ovpn_peer_endpoints_update()\nholds only a refcount and acquires ovpn-\u003elock very late (after async\nAEAD decrypt and a netlink notification), then rehashes the peer\nin the by_transp_addr table.\n\nThe resurrected peer becomes reachable again from the RX lookup\n(ovpn_peer_get_by_transp_addr) and the TX VPN-IP lookup, even though\nuserspace believes it is gone. Once the data-path refcount drops the\npeer is freed via call_rcu while the hash entries embedded in it\nremain linked, opening a UAF window.\n\nBail out of the rehash when hash_entry_id is unhashed, mirroring\nthe sentinel already used by ovpn_peer_remove() to detect the\nalready-removed state. The check is safe under ovpn-\u003elock, which\nserializes every mutation of hash_entry_id, and is a no-op for the\nadd path because ovpn_peer_add_mp() inserts hash_entry_id before\ncalling ovpn_peer_hash_vpn_ip()."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 9.8,
            "baseSeverity": "CRITICAL",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:N - The float-path UAF is reached from ovpn_udp_encap_recv()/ovpn_tcp_rcv() through ovpn_recv(), async AEAD decrypt, and ovpn_peer_endpoints_update(); a remote peer sends authenticated DATA_V2 packets over UDP/TCP to an internet-facing MP-mode OpenVPN gateway.\nAC:L - The remote peer controls float timing (new transport source), packet rate, and concurrent removal via TCP disconnect, UDP socket teardown, or keepalive expiry; netlink PEER_SET vs PEER_DEL races are likewise attacker-synchronized with no luck-dependent layout.\nPR:N - On an internet-facing MP-mode gateway, exploitation needs no Linux credentials on the victim\u2014only an established kernel-installed peer with valid AEAD keys (or namespace CAP_NET_ADMIN for netlink races), matching a remote VPN client rather than host root.\nUI:N - The rehash race is triggered by normal peer traffic and automatic keepalive/socket teardown; no administrator or end-user action on the victim host is required beyond routine VPN server operation.\nS:U - The UAF corrupts ovpn peer hash tables inside the kernel VPN driver; impact remains within the host kernel security domain without crossing VM, container, or IOMMU boundaries.\nC:H - Freed ovpn_peer objects remain linked in by_transp_addr/by_vpn_addr hash tables, so RX/TX lookups dereference recycled kmalloc-1k structures and enable arbitrary kernel-memory reads via attacker-controlled heap reuse.\nI:H - Resurrected hash entries steer traffic to freed peers and subsequent RCU/kref teardown on stale objects provide typical slab-UAF write primitives (refcount, socket, crypto pointer updates) suitable for kernel code execution.\nA:H - Use-after-free on hot datapath peer lookups reliably causes kernel oops/panic or slab corruption on VPN gateways, and remote peers can repeat the race to sustain denial of service."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-25T05:42:08.380Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/d20c181088984b6eaa8d7fe7cb5ab3510988df59"
        },
        {
          "url": "https://git.kernel.org/stable/c/66745480298775f188b2f5ad266643e85a90f73b"
        },
        {
          "url": "https://git.kernel.org/stable/c/33ec10567fe14456063daf549fdf1a4f53448e4c"
        }
      ],
      "title": "ovpn: skip rehash for peers already removed from by_id",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-74727",
    "datePublished": "2026-08-22T15:33:17.773Z",
    "dateReserved": "2026-08-15T05:44:03.929Z",
    "dateUpdated": "2026-08-25T05:42:08.380Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-74727",
      "date": "2026-10-16",
      "epss": "0.00649",
      "percentile": "0.50069"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "defaultStatus": "unaffected",
                "product": "Linux",
                "programFiles": [
                  "drivers/net/ovpn/peer.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "lessThan": "d20c181088984b6eaa8d7fe7cb5ab3510988df59",
                    "status": "affected",
                    "version": "1d36a36f6d5347360ef9681a05f6166683bafd1d",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "66745480298775f188b2f5ad266643e85a90f73b",
                    "status": "affected",
                    "version": "1d36a36f6d5347360ef9681a05f6166683bafd1d",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "33ec10567fe14456063daf549fdf1a4f53448e4c",
                    "status": "affected",
                    "version": "1d36a36f6d5347360ef9681a05f6166683bafd1d",
                    "versionType": "git"
                  }
                ]
              },
              {
                "defaultStatus": "affected",
                "product": "Linux",
                "programFiles": [
                  "drivers/net/ovpn/peer.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "status": "affected",
                    "version": "6.16"
                  },
                  {
                    "lessThan": "6.16",
                    "status": "unaffected",
                    "version": "0",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.18.*",
                    "status": "unaffected",
                    "version": "6.18.45",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "7.1.*",
                    "status": "unaffected",
                    "version": "7.1.9",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "*",
                    "status": "unaffected",
                    "version": "7.2",
                    "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\novpn: skip rehash for peers already removed from by_id\n\novpn_nl_peer_set_doit() resolves the target peer via\novpn_peer_get_by_id() before taking ovpn-\u003elock. In the window between\nthe lookup (which only takes a refcount) and the subsequent\nspin_lock_bh(\u0026ovpn-\u003elock), a concurrent OVPN_CMD_PEER_DEL, keepalive\nexpiry, or socket teardown can take ovpn-\u003elock first, run\novpn_peer_remove() to unhash the peer from all four tables (by_id,\nby_vpn_addr4/6, by_transp_addr) and release the lock. set_doit then\nacquires ovpn-\u003elock and calls ovpn_peer_hash_vpn_ip(), which\nre-inserts the now-removed peer back into the rehashing tables.\n\nThe same race affects the float path: ovpn_peer_endpoints_update()\nholds only a refcount and acquires ovpn-\u003elock very late (after async\nAEAD decrypt and a netlink notification), then rehashes the peer\nin the by_transp_addr table.\n\nThe resurrected peer becomes reachable again from the RX lookup\n(ovpn_peer_get_by_transp_addr) and the TX VPN-IP lookup, even though\nuserspace believes it is gone. Once the data-path refcount drops the\npeer is freed via call_rcu while the hash entries embedded in it\nremain linked, opening a UAF window.\n\nBail out of the rehash when hash_entry_id is unhashed, mirroring\nthe sentinel already used by ovpn_peer_remove() to detect the\nalready-removed state. The check is safe under ovpn-\u003elock, which\nserializes every mutation of hash_entry_id, and is a no-op for the\nadd path because ovpn_peer_add_mp() inserts hash_entry_id before\ncalling ovpn_peer_hash_vpn_ip()."
          },
          {
            "lang": "es",
            "value": "En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:\n\novpn: omitir el rehash para pares ya eliminados de by_id\n\novpn_nl_peer_set_doit() resuelve el par objetivo a trav\u00e9s de ovpn_peer_get_by_id() antes de tomar ovpn -\u003e lock. En la ventana entre la b\u00fasqueda (que solo toma un refcount) y el subsiguiente spin_lock_bh(\u0026ovpn -\u003e lock), un OVPN_CMD_PEER_DEL concurrente, la expiraci\u00f3n de un keepalive o el cierre de un socket pueden tomar ovpn -\u003e lock primero, ejecutar ovpn_peer_remove() para deshashear el par de las cuatro tablas (by_id, by_vpn_addr4/6, by_transp_addr) y liberar el bloqueo. set_doit luego adquiere ovpn -\u003e lock y llama a ovpn_peer_hash_vpn_ip(), lo que reinserta el par ahora eliminado de nuevo en las tablas de rehashing.\n\nLa misma condici\u00f3n de carrera afecta la ruta flotante: ovpn_peer_endpoints_update() solo mantiene un refcount y adquiere ovpn -\u003e lock muy tarde (despu\u00e9s de un descifrado AEAD as\u00edncrono y una notificaci\u00f3n netlink), luego rehashea el par en la tabla by_transp_addr.\n\nEl par resucitado vuelve a ser accesible desde la b\u00fasqueda RX (ovpn_peer_get_by_transp_addr) y la b\u00fasqueda TX VPN-IP, aunque el userspace cree que ha desaparecido. Una vez que el refcount de la ruta de datos disminuye, el par es liberado a trav\u00e9s de call_rcu mientras que las entradas de hash incrustadas en \u00e9l permanecen vinculadas, abriendo una ventana UAF.\n\nSalir del rehash cuando hash_entry_id es deshasheado, reflejando el centinela ya utilizado por ovpn_peer_remove() para detectar el estado ya eliminado. La verificaci\u00f3n es segura bajo ovpn -\u003e lock, que serializa cada mutaci\u00f3n de hash_entry_id, y es una operaci\u00f3n nula para la ruta de adici\u00f3n porque ovpn_peer_add_mp() inserta hash_entry_id antes de llamar a ovpn_peer_hash_vpn_ip()."
          }
        ],
        "id": "CVE-2026-74727",
        "lastModified": "2026-10-14T13:10:00.187",
        "metrics": {
          "cvssMetricV31": [
            {
              "cvssData": {
                "attackComplexity": "LOW",
                "attackVector": "NETWORK",
                "availabilityImpact": "HIGH",
                "baseScore": 9.8,
                "baseSeverity": "CRITICAL",
                "confidentialityImpact": "HIGH",
                "integrityImpact": "HIGH",
                "privilegesRequired": "NONE",
                "scope": "UNCHANGED",
                "userInteraction": "NONE",
                "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
                "version": "3.1"
              },
              "exploitabilityScore": 3.9,
              "impactScore": 5.9,
              "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
              "type": "Secondary"
            }
          ]
        },
        "published": "2026-08-22T16:16:47.813",
        "references": [
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/33ec10567fe14456063daf549fdf1a4f53448e4c"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/66745480298775f188b2f5ad266643e85a90f73b"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/d20c181088984b6eaa8d7fe7cb5ab3510988df59"
          }
        ],
        "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "vulnStatus": "Received"
      }
    },
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-08-25T08:56:33+00:00",
      "cve": "CVE-2026-74727",
      "id": "CVE-2026-74727",
      "initial_release_date": "2026-08-22T00:00:00+00:00",
      "product_status:known_not_affected": "274",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: ovpn: skip rehash for peers already removed from by_id",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-74727.json",
      "version": "3"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

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.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
Events included in the timeline

Loading timeline…


    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.