CVE-2026-98826

Estado: RecibidaSin puntuar—
Gravedad—Sin puntuar
Probabilidad de explotación0.20 %mayor que el 9 % de las CVE
Explotación activaNono figura en el catálogo de CISA
Exploit públicoNo conocidosin código público localizado

En el kernel de Linux se ha resuelto la siguiente vulnerabilidad:

rtc: ac100: Fix clock provider use-after-free on probe failure

ac100_rtc_register_clks() registra el reloj RTC-32k con clk_hw_register_fixed_rate() y el proveedor de reloj con of_clk_add_hw_provider(). Ninguno de los dos está gestionado por devm y ambos se liberan únicamente desde ac100_rtc_remove(). El núcleo del controlador no llama a remove() cuando probe() falla: really_probe() llega a probe_failed, por debajo de la llamada a device_remove(), y pasa directamente a liberar los recursos gestionados del dispositivo.

ac100_rtc_probe() termina con

Leer descripción completaMostrar menos

así que, si eso falla después de haberse registrado los relojes, el proveedor queda en la lista global of_clk_providers apuntando a chip->clk_data, que se asignó con devm_kzalloc() y se libera mientras probe() se desenrolla. Una búsqueda posterior sobre este nodo del árbol de dispositivos lee entonces memoria liberada en of_clk_hw_onecell_get(). Existen en el árbol consumidores que hacen exactamente eso: los nodos de secuencia de energía wifi de sun8i-a83t-bananapi-m3 y sun8i-a83t-cubietruck-plus usan <&ac100_rtc 1>, y las placas sun9i-a80 enrutan osc32k a través de <&ac100_rtc 0>. La ventana es estrecha, ya que devm_rtc_register_device() solo puede fallar aquí con -ENOMEM, pero el proveedor queda colgando siempre que falle.

El reloj RTC-32k también se filtra por la misma ruta. Dado que clk_core_lookup() busca en una lista global que no está delimitada por dispositivo, __clk_register() rechaza el nombre duplicado con -EEXIST, de modo que la fuga también hace que falle una sonda posterior del mismo dispositivo.

La ruta de error que devuelve -EINVAL cuando no se encuentra el reloj padre ADDA 4M filtra el reloj RTC-32k de la misma forma. En ese punto aún no se ha registrado ningún proveedor, por lo que en este caso se trata de una fuga y no de un use-after-free.

Registre ambos con devm_clk_hw_register_fixed_rate() y devm_of_clk_add_hw_provider() para que se liberen siempre que el dispositivo desaparezca, tanto si la sonda falla como al desvincularlo. Devres libera los recursos en orden inverso al de adquisición, por lo que el proveedor se elimina antes de liberar chip->clk_data, y los hijos clkout se desregistran ahora antes que su padre y no después. ac100_rtc_unregister_clks() y el callback remove quedan entonces sin nada que hacer y se eliminan.

Detalles técnicos trazas, registros y código del informe original
	return devm_rtc_register_device(chip->rtc);

Traducción automática del texto original de NVD (en inglés).

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)

Probabilidad de explotación en los próximos 30 días
0.20 %
Percentil entre todas las CVEs puntuadas
9
Fecha de la puntuación
19/10/2026

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

Mostrar las 4 referencias

JSON original (NVD)

Mostrar
{
  "id": "CVE-2026-98826",
  "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": "d00a18a42c1483924de086ddfb0efe8da1dba3ac",
              "lessThan": "12bcd20d76703ee2baf52224d287b7fea096b12f",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "d00a18a42c1483924de086ddfb0efe8da1dba3ac",
              "lessThan": "9cff19ddd7f90c1f572a0f83cfc41de8f8dcbcd8",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "d00a18a42c1483924de086ddfb0efe8da1dba3ac",
              "lessThan": "55ca60ba336632349f7c4585d22ba74ae355b7ce",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "d00a18a42c1483924de086ddfb0efe8da1dba3ac",
              "lessThan": "fcf0b58e976e83adf246b014518e49c662b96f5e",
              "versionType": "git"
            }
          ],
          "programFiles": [
            "drivers/rtc/rtc-ac100.c"
          ],
          "defaultStatus": "unaffected"
        },
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "4.9"
            },
            {
              "status": "unaffected",
              "version": "0",
              "lessThan": "4.9",
              "versionType": "semver"
            },
            {
              "status": "unaffected",
              "version": "6.12.113",
              "versionType": "semver",
              "lessThanOrEqual": "6.12.*"
            },
            {
              "status": "unaffected",
              "version": "6.18.56",
              "versionType": "semver",
              "lessThanOrEqual": "6.18.*"
            },
            {
              "status": "unaffected",
              "version": "7.2.10",
              "versionType": "semver",
              "lessThanOrEqual": "7.2.*"
            },
            {
              "status": "unaffected",
              "version": "7.3",
              "versionType": "original_commit_for_fix",
              "lessThanOrEqual": "*"
            }
          ],
          "programFiles": [
            "drivers/rtc/rtc-ac100.c"
          ],
          "defaultStatus": "affected"
        }
      ]
    }
  ],
  "published": "2026-10-18T16:17:36.823",
  "references": [
    {
      "url": "https://git.kernel.org/stable/c/12bcd20d76703ee2baf52224d287b7fea096b12f",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/55ca60ba336632349f7c4585d22ba74ae355b7ce",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/9cff19ddd7f90c1f572a0f83cfc41de8f8dcbcd8",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/fcf0b58e976e83adf246b014518e49c662b96f5e",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    }
  ],
  "vulnStatus": "Received",
  "descriptions": [
    {
      "lang": "en",
      "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nrtc: ac100: Fix clock provider use-after-free on probe failure\n\nac100_rtc_register_clks() registers the RTC-32k clock with\nclk_hw_register_fixed_rate() and the clock provider with\nof_clk_add_hw_provider(). Neither is device managed, and both are\nreleased only from ac100_rtc_remove(). The driver core does not call\nremove() when probe() fails: really_probe() reaches probe_failed below\nthe device_remove() call and goes straight to releasing the device's\nmanaged resources.\n\nac100_rtc_probe() ends with\n\n\treturn devm_rtc_register_device(chip->rtc);\n\nso if that fails after the clocks have been registered, the provider is\nleft on the global of_clk_providers list holding chip->clk_data, which\nwas allocated with devm_kzalloc() and is freed while probe() unwinds. A\nlater lookup on this device tree node then reads freed memory in\nof_clk_hw_onecell_get(). Consumers that do exactly that exist in tree:\nthe wifi power sequence nodes on sun8i-a83t-bananapi-m3 and\nsun8i-a83t-cubietruck-plus take <&ac100_rtc 1>, and the sun9i-a80 boards\nroute osc32k through <&ac100_rtc 0>. The window is narrow, as\ndevm_rtc_register_device() can only fail with -ENOMEM here, but the\nprovider is left dangling whenever it does.\n\nThe RTC-32k clock is leaked on the same path. Since clk_core_lookup()\nsearches a global list that is not scoped per device, __clk_register()\nrejects the duplicate name with -EEXIST, so the leak also makes a later\nprobe of the same device fail.\n\nThe error path that returns -EINVAL when the ADDA 4M parent clock cannot\nbe found leaks the RTC-32k clock in the same way. No provider has been\nregistered at that point, so that one is a leak rather than a\nuse-after-free.\n\nRegister both with devm_clk_hw_register_fixed_rate() and\ndevm_of_clk_add_hw_provider() so that they are released whenever the\ndevice goes away, on a failed probe as well as on unbind. Devres\nreleases in reverse order of acquisition, so the provider is removed\nbefore chip->clk_data is freed, and the clkout children are now\nunregistered before their parent rather than after it.\nac100_rtc_unregister_clks() and the remove callback then have nothing\nleft to do and are removed."
    }
  ],
  "lastModified": "2026-10-19T10:19:46.643",
  "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}