« Volver al listado

CVE-2026-93100

Estado: RecibidaSin puntuar—

In the Linux kernel, the following vulnerability has been resolved:

fs/resctrl: Prevent use-after-free in rdtgroup_kn_put()

A struct rdtgroup is reference counted via rdtgroup::waitcount. Callers that need the structure to remain valid across a sleep (while waiting on acquiring rdtgroup_mutex) take a reference with rdtgroup_kn_get() and release it with rdtgroup_kn_put().

The release path is intended to serve as the fallback freer: if the count drops to zero and the group has already been marked RDT_DELETED, rdtgroup_kn_put() frees the structure.

The bulk teardown paths free_all_child_rdtgrp() and rmdir_all_sub() resulting from a resctrl directory remove or resctrl fs unmount act as the primary freer: they hold rdtgroup_mutex and free each rdtgroup whose waitcount is zero, otherwise they set RDT_DELETED and leave the freeing to the last waiter.

Leer descripción completaMostrar menos

These two freers race. rdtgroup_kn_put() commits waitcount == 0 with atomic_dec_and_test() outside rdtgroup_mutex, then reads rdtgroup::flags. Between those two operations a concurrent caller of free_all_child_rdtgrp() or rmdir_all_sub() (which holds the mutex) can observe waitcount == 0 via atomic_read(), call rdtgroup_remove(), and kfree() the structure.

The subsequent read of rdtgroup::flags in rdtgroup_kn_put() is then a use-after-free, and the structure may even be freed twice if the freed memory happens to satisfy the RDT_DELETED flag check.

Replace the bare atomic_dec_and_test() with atomic_dec_and_mutex_lock() so that the decrement-to-zero takes rdtgroup_mutex before the count becomes globally visible. The inspection of rdtgroup::flags then runs under the same mutex held by the bulk freers, making the two paths mutually exclusive.

The common case where the count does not reach zero remains lock-free. Defer kernfs_unbreak_active_protection() until after the mutex is dropped since kernfs active protections functionally wrap rdtgroup_mutex. Remove resource group, which in turn drops its kernfs reference, after kernfs protection is restored.

Detalles técnicos trazas, registros y código del informe original
  [ bp: Split the commit messsages into smaller, easier-parseable paragraphs. ]

CVSS

NVD no ha asignado puntuación CVSS a esta CVE (habitual desde el cambio de política de abril de 2026).

Probabilidad de explotación (EPSS)

EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).

Tecnologías afectadas (1)

⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.

Referencias

JSON original (NVD)

Mostrar
{
  "id": "CVE-2026-93100",
  "cveTags": [],
  "metrics": {},
  "affected": [
    {
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
      "affectedData": [
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "b8511ccc75c033f6d54188ea4df7bf1e85778740",
              "lessThan": "ae69f936e8ffed553d899ba4c02f8a7461a89e54",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "b8511ccc75c033f6d54188ea4df7bf1e85778740",
              "lessThan": "4c593c62c1499665baebbb41b70e2c9b7e947b86",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "b8511ccc75c033f6d54188ea4df7bf1e85778740",
              "lessThan": "f5bcf539484d2d604c2f2330e09487ea090b21c7",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "d20edc0bca5577bab38acb5b190619c922ddebf8",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "1b006f8cbde9f3dabdfafe2ff7aa9f831ed5b625",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "40300f986e47dbc8f1d02e5080385f5cf9f85f70",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "b5a4949897ebada8132d54c93208989482503103",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "4.14.170",
              "lessThan": "4.15",
              "versionType": "semver"
            },
            {
              "status": "affected",
              "version": "4.19.102",
              "lessThan": "4.20",
              "versionType": "semver"
            },
            {
              "status": "affected",
              "version": "5.4.18",
              "lessThan": "5.5",
              "versionType": "semver"
            },
            {
              "status": "affected",
              "version": "5.5.2",
              "lessThan": "5.6",
              "versionType": "semver"
            }
          ],
          "programFiles": [
            "fs/resctrl/rdtgroup.c"
          ],
          "defaultStatus": "unaffected"
        },
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "5.6"
            },
            {
              "status": "unaffected",
              "version": "0",
              "lessThan": "5.6",
              "versionType": "semver"
            },
            {
              "status": "unaffected",
              "version": "6.18.52",
              "versionType": "semver",
              "lessThanOrEqual": "6.18.*"
            },
            {
              "status": "unaffected",
              "version": "7.2.6",
              "versionType": "semver",
              "lessThanOrEqual": "7.2.*"
            },
            {
              "status": "unaffected",
              "version": "7.3-rc1",
              "versionType": "original_commit_for_fix",
              "lessThanOrEqual": "*"
            }
          ],
          "programFiles": [
            "fs/resctrl/rdtgroup.c"
          ],
          "defaultStatus": "affected"
        }
      ]
    }
  ],
  "published": "2026-09-17T17:18:04.223",
  "references": [
    {
      "url": "https://git.kernel.org/stable/c/4c593c62c1499665baebbb41b70e2c9b7e947b86",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/ae69f936e8ffed553d899ba4c02f8a7461a89e54",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/f5bcf539484d2d604c2f2330e09487ea090b21c7",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    }
  ],
  "vulnStatus": "Received",
  "descriptions": [
    {
      "lang": "en",
      "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nfs/resctrl: Prevent use-after-free in rdtgroup_kn_put()\n\nA struct rdtgroup is reference counted via rdtgroup::waitcount. Callers that\nneed the structure to remain valid across a sleep (while waiting on acquiring\nrdtgroup_mutex) take a reference with rdtgroup_kn_get() and release it with\nrdtgroup_kn_put().\n\nThe release path is intended to serve as the fallback freer: if the count\ndrops to zero and the group has already been marked RDT_DELETED,\nrdtgroup_kn_put() frees the structure.\n\nThe bulk teardown paths free_all_child_rdtgrp() and rmdir_all_sub() resulting\nfrom a resctrl directory remove or resctrl fs unmount act as the primary\nfreer: they hold rdtgroup_mutex and free each rdtgroup whose waitcount is\nzero, otherwise they set RDT_DELETED and leave the freeing to the last waiter.\n\nThese two freers race. rdtgroup_kn_put() commits waitcount == 0 with\natomic_dec_and_test() outside rdtgroup_mutex, then reads rdtgroup::flags.\nBetween those two operations a concurrent caller of free_all_child_rdtgrp()\nor rmdir_all_sub() (which holds the mutex) can observe waitcount == 0 via\natomic_read(), call rdtgroup_remove(), and kfree() the structure.\n\nThe subsequent read of rdtgroup::flags in rdtgroup_kn_put() is then\na use-after-free, and the structure may even be freed twice if the freed\nmemory happens to satisfy the RDT_DELETED flag check.\n\nReplace the bare atomic_dec_and_test() with atomic_dec_and_mutex_lock() so\nthat the decrement-to-zero takes rdtgroup_mutex before the count becomes\nglobally visible. The inspection of rdtgroup::flags then runs under the same\nmutex held by the bulk freers, making the two paths mutually exclusive.\n\nThe common case where the count does not reach zero remains lock-free. Defer\nkernfs_unbreak_active_protection() until after the mutex is dropped since\nkernfs active protections functionally wrap rdtgroup_mutex. Remove resource\ngroup, which in turn drops its kernfs reference, after kernfs protection is\nrestored.\n\n  [ bp: Split the commit messsages into smaller, easier-parseable paragraphs. ]"
    }
  ],
  "lastModified": "2026-09-17T17:18:04.223",
  "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}