CVE-2026-90237 (GCVE-0-2026-90237)

Vulnerability from cvelistv5 – Published: 2026-09-17 16:07 – Updated: 2026-09-18 17:54
VLAI
Title
netfilter: nft_ct: move custom expectation support to helper
Summary
In the Linux kernel, the following vulnerability has been resolved: netfilter: nft_ct: move custom expectation support to helper Originally, the ct expectation support called nf_ct_helper_ext_add() for confirmed conntracks, which is invalid, triggering a splat. This was fixed by commit 1710eb913bdc ("netfilter: nft_ct: skip expectations for confirmed conntrack") which restricted it to unconfirmed conntracks. However, early insertion of expectations into the expectations list when the conntrack is unconfirmed leads to stale entries pointing to the wrong hlist_head through .pprev due to ct extension reallocation. Commit 7c9664351980 ("netfilter: move nat hlist_head to nf_conn") moved the nat hlist_head to nf_conn for this reason: 1. ... 2. When reallocation of extension area occurs we need to fixup the bysource hash head via hlist_replace_rcu. I'd rather not increase the size of the struct nf_conn for this feature has very limited scope: only one expectation can be created at a time given expect_clash() will make nf_ct_expect_related() reports EBUSY. For this reason, relax nf_ct_expect_related() not to drop packets in case expectation creation fails, therefore, expectation creation becomes best effort. To address this issue, add an internal ct helper and attach it to the conntrack entry to streamline the custom ct expectation support with existing ct helpers. Expose a new nf_conntrack_helper_release() function to release the internal helper that is allocated and attached to the conntrack entry to create the custom expectations. The nft_ct module removal always waits for rcu grace period, then the NULL helper callback is observed after this. This patch also restricts the creation of expectations to different helpers other than this custom helper that is created for this type of expectations.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 857b46027d6f91150797295752581b7155b9d0e1 , < af3fe52fd108fd38235e4813df62442ed0f1d8ff (git)
Affected: 857b46027d6f91150797295752581b7155b9d0e1 , < 3679da4ad8be84cddaf40bc307fef1fe13e051ff (git)
guessed Create a notification for this product.
Linux Linux Affected: 5.3
Unaffected: 0 , < 5.3 (semver)
Unaffected: 7.2.6 , ≤ 7.2.* (semver)
Unaffected: 7.3-rc1 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "include/net/netfilter/nf_conntrack_helper.h",
            "net/netfilter/nf_conntrack_helper.c",
            "net/netfilter/nft_ct.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "af3fe52fd108fd38235e4813df62442ed0f1d8ff",
              "status": "affected",
              "version": "857b46027d6f91150797295752581b7155b9d0e1",
              "versionType": "git"
            },
            {
              "lessThan": "3679da4ad8be84cddaf40bc307fef1fe13e051ff",
              "status": "affected",
              "version": "857b46027d6f91150797295752581b7155b9d0e1",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "include/net/netfilter/nf_conntrack_helper.h",
            "net/netfilter/nf_conntrack_helper.c",
            "net/netfilter/nft_ct.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "5.3"
            },
            {
              "lessThan": "5.3",
              "status": "unaffected",
              "version": "0",
              "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": "7.2.6",
                  "versionStartIncluding": "5.3",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "5.3",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnetfilter: nft_ct: move custom expectation support to helper\n\nOriginally, the ct expectation support called nf_ct_helper_ext_add() for\nconfirmed conntracks, which is invalid, triggering a splat. This was\nfixed by commit 1710eb913bdc (\"netfilter: nft_ct: skip expectations for\nconfirmed conntrack\") which restricted it to unconfirmed conntracks.\n\nHowever, early insertion of expectations into the expectations list when\nthe conntrack is unconfirmed leads to stale entries pointing to the\nwrong hlist_head through .pprev due to ct extension reallocation.\n\nCommit 7c9664351980 (\"netfilter: move nat hlist_head to nf_conn\") moved\nthe nat hlist_head to nf_conn for this reason:\n\n     1. ...\n     2. When reallocation of extension area occurs we need to fixup the\n        bysource hash head via hlist_replace_rcu.\n\nI\u0027d rather not increase the size of the struct nf_conn for this feature\nhas very limited scope: only one expectation can be created at a time\ngiven expect_clash() will make nf_ct_expect_related() reports EBUSY.\nFor this reason, relax nf_ct_expect_related() not to drop packets in\ncase expectation creation fails, therefore, expectation creation becomes\nbest effort.\n\nTo address this issue, add an internal ct helper and attach it to the\nconntrack entry to streamline the custom ct expectation support with\nexisting ct helpers.\n\nExpose a new nf_conntrack_helper_release() function to release the\ninternal helper that is allocated and attached to the conntrack entry to\ncreate the custom expectations. The nft_ct module removal always waits\nfor rcu grace period, then the NULL helper callback is observed after\nthis.\n\nThis patch also restricts the creation of expectations to different\nhelpers other than this custom helper that is created for this type of\nexpectations."
        }
      ],
      "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 - The triggering state is created by a local NFT_MSG_NEWOBJ (nf_tables_newobj) of type NFT_OBJECT_CT_EXPECT plus an objref rule; nft_objref_eval then calls nft_ct_expect_obj_eval from nft_do_chain_ipv4 on a packet the attacker sends in their netns. No remote protocol field carries the malformed expectation-list linkage.\nAC:L - After nf_ct_expect_insert stores exp-\u003elnode into nf_conn_help.expectations, the attacker\u2019s later expressions on the same packet (nft_ct_timeout_obj_eval, nft_ct_set_eval NFT_CT_EVENTMASK, or nft_nat_eval \u2192 nf_nat_setup_info \u2192 nfct_seqadj_ext_add) call nf_ct_ext_add so krealloc moves ct-\u003eext; that rule order is attacker-chosen and needs no race.\nPR:L - nfnetlink_rcv admits the NFT_MSG_NEWOBJ/NEWRULE batch only after netlink_net_capable(skb, CAP_NET_ADMIN) against sock_net(skb-\u003esk)-\u003euser_ns, which an unprivileged user gets via unshare -Urn; nft_ct_expect_obj_init has no extra init-namespace capability check.\nUI:N - The attacker installs the ct expectation object and objref rule themselves, then emits their own UDP/TCP packet so nft_do_chain_ipv4 at NF_INET_LOCAL_OUT reaches nft_ct_expect_obj_eval; no other user must mount, open a file, or confirm the ruleset.\nS:U - krealloc of ct-\u003eext leaves a dangling hlist_node.pprev in the host kernel heap (nf_conn_help.expectations); impact is in-kernel memory corruption on the same host, not a KVM/Xen guest-to-host escape or IOMMU/DMA bypass.\nC:H - After nf_ct_ext_add\u2019s krealloc frees the old nf_conn_help, exp-\u003elnode.pprev still addresses that slab; spraying it and then walking help-\u003eexpectations in nf_ct_remove_expectations is a use-after-free read of reused kernel memory.\nI:H - nf_ct_unlink_expect_report\u2019s hlist_del_rcu(\u0026exp-\u003elnode) writes the next pointer through the stale pprev into the freed helper extension, a heap write primitive that can be groomed for control-flow hijack.\nA:H - The same dangling pprev is used when the conntrack is destroyed (clean_from_lists \u2192 nf_ct_remove_expectations) or the expectation is unlinked, which oopses or panics if the old ct-\u003eext slab was reused or poisoned."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-18T17:54:03.145Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/af3fe52fd108fd38235e4813df62442ed0f1d8ff"
        },
        {
          "url": "https://git.kernel.org/stable/c/3679da4ad8be84cddaf40bc307fef1fe13e051ff"
        }
      ],
      "title": "netfilter: nft_ct: move custom expectation support to helper",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-90237",
    "datePublished": "2026-09-17T16:07:42.524Z",
    "dateReserved": "2026-09-11T19:38:34.794Z",
    "dateUpdated": "2026-09-18T17:54:03.145Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-90237",
      "date": "2026-09-25",
      "epss": "0.00165",
      "percentile": "0.05054"
    },
    "microsoft_vex": {
      "current_release_date": "2026-09-23T02:50:31.000Z",
      "cve": "CVE-2026-90237",
      "id": "msrc_CVE-2026-90237",
      "initial_release_date": "2026-09-19T01:05:22.000Z",
      "product_status:known_affected": "2",
      "source": "Microsoft CSAF VEX",
      "status": "final",
      "title": "netfilter: nft_ct: move custom expectation support to helper",
      "url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-90237.json",
      "version": "2"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "defaultStatus": "unaffected",
                "product": "Linux",
                "programFiles": [
                  "include/net/netfilter/nf_conntrack_helper.h",
                  "net/netfilter/nf_conntrack_helper.c",
                  "net/netfilter/nft_ct.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "lessThan": "af3fe52fd108fd38235e4813df62442ed0f1d8ff",
                    "status": "affected",
                    "version": "857b46027d6f91150797295752581b7155b9d0e1",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "3679da4ad8be84cddaf40bc307fef1fe13e051ff",
                    "status": "affected",
                    "version": "857b46027d6f91150797295752581b7155b9d0e1",
                    "versionType": "git"
                  }
                ]
              },
              {
                "defaultStatus": "affected",
                "product": "Linux",
                "programFiles": [
                  "include/net/netfilter/nf_conntrack_helper.h",
                  "net/netfilter/nf_conntrack_helper.c",
                  "net/netfilter/nft_ct.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "status": "affected",
                    "version": "5.3"
                  },
                  {
                    "lessThan": "5.3",
                    "status": "unaffected",
                    "version": "0",
                    "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"
                  }
                ]
              }
            ],
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnetfilter: nft_ct: move custom expectation support to helper\n\nOriginally, the ct expectation support called nf_ct_helper_ext_add() for\nconfirmed conntracks, which is invalid, triggering a splat. This was\nfixed by commit 1710eb913bdc (\"netfilter: nft_ct: skip expectations for\nconfirmed conntrack\") which restricted it to unconfirmed conntracks.\n\nHowever, early insertion of expectations into the expectations list when\nthe conntrack is unconfirmed leads to stale entries pointing to the\nwrong hlist_head through .pprev due to ct extension reallocation.\n\nCommit 7c9664351980 (\"netfilter: move nat hlist_head to nf_conn\") moved\nthe nat hlist_head to nf_conn for this reason:\n\n     1. ...\n     2. When reallocation of extension area occurs we need to fixup the\n        bysource hash head via hlist_replace_rcu.\n\nI\u0027d rather not increase the size of the struct nf_conn for this feature\nhas very limited scope: only one expectation can be created at a time\ngiven expect_clash() will make nf_ct_expect_related() reports EBUSY.\nFor this reason, relax nf_ct_expect_related() not to drop packets in\ncase expectation creation fails, therefore, expectation creation becomes\nbest effort.\n\nTo address this issue, add an internal ct helper and attach it to the\nconntrack entry to streamline the custom ct expectation support with\nexisting ct helpers.\n\nExpose a new nf_conntrack_helper_release() function to release the\ninternal helper that is allocated and attached to the conntrack entry to\ncreate the custom expectations. The nft_ct module removal always waits\nfor rcu grace period, then the NULL helper callback is observed after\nthis.\n\nThis patch also restricts the creation of expectations to different\nhelpers other than this custom helper that is created for this type of\nexpectations."
          }
        ],
        "id": "CVE-2026-90237",
        "lastModified": "2026-09-18T18:17:50.027",
        "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": "2026-09-17T17:17:19.640",
        "references": [
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/3679da4ad8be84cddaf40bc307fef1fe13e051ff"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/af3fe52fd108fd38235e4813df62442ed0f1d8ff"
          }
        ],
        "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "vulnStatus": "Received"
      }
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-09-21T16:29:54Z",
      "cve": "CVE-2026-90237",
      "id": "CVE-2026-90237",
      "initial_release_date": "2026-09-18T00:19:27Z",
      "product_status:known_affected": "254",
      "product_status:known_not_affected": "93",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-90237",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-90237.json",
      "version": "4"
    }
  }
}



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…