GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

CVE-2025-38434 (GCVE-0-2025-38434)

Vulnerability from cvelistv5 – Published: 2025-07-25 14:32 – Updated: 2026-08-05 12:01
VLAI
Title
Revert "riscv: Define TASK_SIZE_MAX for __access_ok()"
Summary
In the Linux kernel, the following vulnerability has been resolved: Revert "riscv: Define TASK_SIZE_MAX for __access_ok()" This reverts commit ad5643cf2f69 ("riscv: Define TASK_SIZE_MAX for __access_ok()"). This commit changes TASK_SIZE_MAX to be LONG_MAX to optimize access_ok(), because the previous TASK_SIZE_MAX (default to TASK_SIZE) requires some computation. The reasoning was that all user addresses are less than LONG_MAX, and all kernel addresses are greater than LONG_MAX. Therefore access_ok() can filter kernel addresses. Addresses between TASK_SIZE and LONG_MAX are not valid user addresses, but access_ok() let them pass. That was thought to be okay, because they are not valid addresses at hardware level. Unfortunately, one case is missed: get_user_pages_fast() happily accepts addresses between TASK_SIZE and LONG_MAX. futex(), for instance, uses get_user_pages_fast(). This causes the problem reported by Robert [1]. Therefore, revert this commit. TASK_SIZE_MAX is changed to the default: TASK_SIZE. This unfortunately reduces performance, because TASK_SIZE is more expensive to compute compared to LONG_MAX. But correctness first, we can think about optimization later, if required.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: ad5643cf2f699989daa85d909403febd6712fccb , < fe30c30bf3bb68d4a4d8c7c814769857b5c973e6 (git)
Affected: ad5643cf2f699989daa85d909403febd6712fccb , < f8b1898748dfeb4f9b67b6a6d661f354b9de3523 (git)
Affected: ad5643cf2f699989daa85d909403febd6712fccb , < 890ba5be6335dbbbc99af14ea007befb5f83f174 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.10
Unaffected: 0 , < 6.10 (semver)
Unaffected: 6.12.36 , ≤ 6.12.* (semver)
Unaffected: 6.15.5 , ≤ 6.15.* (semver)
Unaffected: 6.16 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "arch/riscv/include/asm/pgtable.h"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "fe30c30bf3bb68d4a4d8c7c814769857b5c973e6",
              "status": "affected",
              "version": "ad5643cf2f699989daa85d909403febd6712fccb",
              "versionType": "git"
            },
            {
              "lessThan": "f8b1898748dfeb4f9b67b6a6d661f354b9de3523",
              "status": "affected",
              "version": "ad5643cf2f699989daa85d909403febd6712fccb",
              "versionType": "git"
            },
            {
              "lessThan": "890ba5be6335dbbbc99af14ea007befb5f83f174",
              "status": "affected",
              "version": "ad5643cf2f699989daa85d909403febd6712fccb",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "arch/riscv/include/asm/pgtable.h"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.10"
            },
            {
              "lessThan": "6.10",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.36",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.15.*",
              "status": "unaffected",
              "version": "6.15.5",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "6.16",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.36",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.15.5",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.16",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nRevert \"riscv: Define TASK_SIZE_MAX for __access_ok()\"\n\nThis reverts commit ad5643cf2f69 (\"riscv: Define TASK_SIZE_MAX for\n__access_ok()\").\n\nThis commit changes TASK_SIZE_MAX to be LONG_MAX to optimize access_ok(),\nbecause the previous TASK_SIZE_MAX (default to TASK_SIZE) requires some\ncomputation.\n\nThe reasoning was that all user addresses are less than LONG_MAX, and all\nkernel addresses are greater than LONG_MAX. Therefore access_ok() can\nfilter kernel addresses.\n\nAddresses between TASK_SIZE and LONG_MAX are not valid user addresses, but\naccess_ok() let them pass. That was thought to be okay, because they are\nnot valid addresses at hardware level.\n\nUnfortunately, one case is missed: get_user_pages_fast() happily accepts\naddresses between TASK_SIZE and LONG_MAX. futex(), for instance, uses\nget_user_pages_fast(). This causes the problem reported by Robert [1].\n\nTherefore, revert this commit. TASK_SIZE_MAX is changed to the default:\nTASK_SIZE.\n\nThis unfortunately reduces performance, because TASK_SIZE is more expensive\nto compute compared to LONG_MAX. But correctness first, we can think about\noptimization later, if required."
        }
      ],
      "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 bug is reached only through local syscalls (futex(), read()/write() with user iovecs, io_uring fixed-buffer registration) in which the attacker supplies a crafted userspace virtual address; there is no network path to the vulnerable get_user_pages_fast() check.\nAC:L - Exploitation is fully deterministic \u2014 the attacker simply passes an address in [TASK_SIZE, LONG_MAX] to a gup_fast user; there is no race and no attacker-uncontrolled condition on an affected RISC-V 64-bit kernel.\nPR:L - Any unprivileged local user can invoke the affected syscalls (futex, read/write, io_uring); no capabilities or elevated privileges are required.\nUI:N - The attacker triggers the flaw entirely through their own syscalls with no action required from any other user.\nS:U - The vulnerability and its impact are both contained within the OS kernel\u0027s security authority; this is a standard in-kernel memory-safety boundary bug, not a VM/sandbox escape.\nC:H - The flaw lets an unprivileged user pin present kernel PTEs (the generic pte_access_permitted() does not check _PAGE_USER) and read arbitrary kernel memory out via write()-style transfers, a full kernel-memory disclosure primitive.\nI:H - Using FOLL_WRITE paths (e.g. read() into the crafted buffer) the same walk pins writable kernel pages, allowing attacker-controlled data to be written into kernel memory \u2014 an arbitrary kernel write enabling privilege escalation.\nA:H - Walking into the kernel half of the page tables and corrupting or dereferencing kernel structures can trivially oops/panic the kernel."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-05T12:01:51.423Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/fe30c30bf3bb68d4a4d8c7c814769857b5c973e6"
        },
        {
          "url": "https://git.kernel.org/stable/c/f8b1898748dfeb4f9b67b6a6d661f354b9de3523"
        },
        {
          "url": "https://git.kernel.org/stable/c/890ba5be6335dbbbc99af14ea007befb5f83f174"
        }
      ],
      "title": "Revert \"riscv: Define TASK_SIZE_MAX for __access_ok()\"",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2025-38434",
    "datePublished": "2025-07-25T14:32:08.089Z",
    "dateReserved": "2025-04-16T04:51:24.015Z",
    "dateUpdated": "2026-08-05T12:01:51.423Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2025-38434",
      "date": "2026-09-16",
      "epss": "0.00169",
      "percentile": "0.06631"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2025-38434\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2025-07-25T15:15:28.707\",\"lastModified\":\"2026-07-30T06:23:14.043\",\"vulnStatus\":\"Modified\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nRevert \\\"riscv: Define TASK_SIZE_MAX for __access_ok()\\\"\\n\\nThis reverts commit ad5643cf2f69 (\\\"riscv: Define TASK_SIZE_MAX for\\n__access_ok()\\\").\\n\\nThis commit changes TASK_SIZE_MAX to be LONG_MAX to optimize access_ok(),\\nbecause the previous TASK_SIZE_MAX (default to TASK_SIZE) requires some\\ncomputation.\\n\\nThe reasoning was that all user addresses are less than LONG_MAX, and all\\nkernel addresses are greater than LONG_MAX. Therefore access_ok() can\\nfilter kernel addresses.\\n\\nAddresses between TASK_SIZE and LONG_MAX are not valid user addresses, but\\naccess_ok() let them pass. That was thought to be okay, because they are\\nnot valid addresses at hardware level.\\n\\nUnfortunately, one case is missed: get_user_pages_fast() happily accepts\\naddresses between TASK_SIZE and LONG_MAX. futex(), for instance, uses\\nget_user_pages_fast(). This causes the problem reported by Robert [1].\\n\\nTherefore, revert this commit. TASK_SIZE_MAX is changed to the default:\\nTASK_SIZE.\\n\\nThis unfortunately reduces performance, because TASK_SIZE is more expensive\\nto compute compared to LONG_MAX. But correctness first, we can think about\\noptimization later, if required.\"},{\"lang\":\"es\",\"value\":\"En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: Revertir \\\"riscv: Define TASK_SIZE_MAX for __access_ok()\\\". Esto revierte el commit ad5643cf2f69 (\\\"riscv: Define TASK_SIZE_MAX for __access_ok()\\\"). Este commit cambia TASK_SIZE_MAX a LONG_MAX para optimizar access_ok(), ya que el valor predeterminado de TASK_SIZE_MAX (predeterminado) requiere c\u00e1lculos. El razonamiento era que todas las direcciones de usuario son menores que LONG_MAX y todas las direcciones de kernel son mayores que LONG_MAX. Por lo tanto, access_ok() puede filtrar direcciones de kernel. Las direcciones entre TASK_SIZE y LONG_MAX no son direcciones de usuario v\u00e1lidas, pero access_ok() las deja pasar. Se consider\u00f3 que esto era correcto, ya que no son direcciones v\u00e1lidas a nivel de hardware. Desafortunadamente, se omite un caso: get_user_pages_fast() acepta direcciones entre TASK_SIZE y LONG_MAX. futex(), por ejemplo, usa get_user_pages_fast(). Esto causa el problema reportado por Robert [1]. Por lo tanto, revierte este commit . TASK_SIZE_MAX se cambia al valor predeterminado: TASK_SIZE. Lamentablemente, esto reduce el rendimiento, ya que TASK_SIZE es m\u00e1s costoso de calcular que LONG_MAX. Pero primero la correcci\u00f3n; podemos pensar en la optimizaci\u00f3n m\u00e1s adelante, si es necesario.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"arch/riscv/include/asm/pgtable.h\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"ad5643cf2f699989daa85d909403febd6712fccb\",\"lessThan\":\"fe30c30bf3bb68d4a4d8c7c814769857b5c973e6\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"ad5643cf2f699989daa85d909403febd6712fccb\",\"lessThan\":\"f8b1898748dfeb4f9b67b6a6d661f354b9de3523\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"ad5643cf2f699989daa85d909403febd6712fccb\",\"lessThan\":\"890ba5be6335dbbbc99af14ea007befb5f83f174\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"arch/riscv/include/asm/pgtable.h\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"6.10\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"6.10\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.36\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.15.5\",\"lessThanOrEqual\":\"6.15.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.16\",\"lessThanOrEqual\":\"*\",\"versionType\":\"original_commit_for_fix\",\"status\":\"unaffected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":7.8,\"baseSeverity\":\"HIGH\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":1.8,\"impactScore\":5.9},{\"source\":\"nvd@nist.gov\",\"type\":\"Primary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H\",\"baseScore\":5.5,\"baseSeverity\":\"MEDIUM\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"NONE\",\"integrityImpact\":\"NONE\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":1.8,\"impactScore\":3.6}]},\"weaknesses\":[{\"source\":\"nvd@nist.gov\",\"type\":\"Primary\",\"description\":[{\"lang\":\"en\",\"value\":\"NVD-CWE-noinfo\"}]}],\"configurations\":[{\"nodes\":[{\"operator\":\"OR\",\"negate\":false,\"cpeMatch\":[{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.10\",\"versionEndExcluding\":\"6.12.36\",\"matchCriteriaId\":\"7D12ED65-B7F2-463D-B728-1F34443EA43B\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.13\",\"versionEndExcluding\":\"6.15.5\",\"matchCriteriaId\":\"0CC768E2-3BBC-4A6E-9C2F-ECB27A703C2D\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:6.16:rc1:*:*:*:*:*:*\",\"matchCriteriaId\":\"6D4894DB-CCFE-4602-B1BF-3960B2E19A01\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:6.16:rc2:*:*:*:*:*:*\",\"matchCriteriaId\":\"09709862-E348-4378-8632-5A7813EDDC86\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:6.16:rc3:*:*:*:*:*:*\",\"matchCriteriaId\":\"415BF58A-8197-43F5-B3D7-D1D63057A26E\"}]}]}],\"references\":[{\"url\":\"https://git.kernel.org/stable/c/890ba5be6335dbbbc99af14ea007befb5f83f174\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/f8b1898748dfeb4f9b67b6a6d661f354b9de3523\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/fe30c30bf3bb68d4a4d8c7c814769857b5c973e6\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]}]}}",
    "redhat_vex": {
      "aggregate_severity": "None",
      "current_release_date": "2026-06-30T10:33:10+00:00",
      "cve": "CVE-2025-38434",
      "id": "CVE-2025-38434",
      "initial_release_date": "2025-07-25T00:00:00+00:00",
      "product_status:known_not_affected": "274",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: Revert \"riscv: Define TASK_SIZE_MAX for __access_ok()\"",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2025/cve-2025-38434.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "low",
      "current_release_date": "2026-08-28T17:01:07Z",
      "cve": "CVE-2025-38434",
      "id": "CVE-2025-38434",
      "initial_release_date": "2025-07-29T23:23:36Z",
      "product_status:known_not_affected": "578",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2025-38434",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2025-38434.json",
      "version": "7"
    }
  }
}



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…

Detection rules are retrieved from Rulezet.

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…