cve-2024-26706
Vulnerability from cvelistv5
Published
2024-04-03 14:55
Modified
2024-12-19 08:45
Severity ?
Summary
In the Linux kernel, the following vulnerability has been resolved: parisc: Fix random data corruption from exception handler The current exception handler implementation, which assists when accessing user space memory, may exhibit random data corruption if the compiler decides to use a different register than the specified register %r29 (defined in ASM_EXCEPTIONTABLE_REG) for the error code. If the compiler choose another register, the fault handler will nevertheless store -EFAULT into %r29 and thus trash whatever this register is used for. Looking at the assembly I found that this happens sometimes in emulate_ldd(). To solve the issue, the easiest solution would be if it somehow is possible to tell the fault handler which register is used to hold the error code. Using %0 or %1 in the inline assembly is not posssible as it will show up as e.g. %r29 (with the "%r" prefix), which the GNU assembler can not convert to an integer. This patch takes another, better and more flexible approach: We extend the __ex_table (which is out of the execution path) by one 32-word. In this word we tell the compiler to insert the assembler instruction "or %r0,%r0,%reg", where %reg references the register which the compiler choosed for the error return code. In case of an access failure, the fault handler finds the __ex_table entry and can examine the opcode. The used register is encoded in the lowest 5 bits, and the fault handler can then store -EFAULT into this register. Since we extend the __ex_table to 3 words we can't use the BUILDTIME_TABLE_SORT config option any longer.
Impacted products
Vendor Product Version
Linux Linux
Show details on NVD website


{
  "containers": {
    "adp": [
      {
        "metrics": [
          {
            "other": {
              "content": {
                "id": "CVE-2024-26706",
                "options": [
                  {
                    "Exploitation": "none"
                  },
                  {
                    "Automatable": "no"
                  },
                  {
                    "Technical Impact": "partial"
                  }
                ],
                "role": "CISA Coordinator",
                "timestamp": "2024-06-17T19:29:32.394995Z",
                "version": "2.0.3"
              },
              "type": "ssvc"
            }
          }
        ],
        "providerMetadata": {
          "dateUpdated": "2024-06-17T19:29:43.758Z",
          "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
          "shortName": "CISA-ADP"
        },
        "title": "CISA ADP Vulnrichment"
      },
      {
        "providerMetadata": {
          "dateUpdated": "2024-08-02T00:14:12.642Z",
          "orgId": "af854a3a-2127-422b-91ae-364da2661108",
          "shortName": "CVE"
        },
        "references": [
          {
            "tags": [
              "x_transferred"
            ],
            "url": "https://git.kernel.org/stable/c/23027309b099ffc4efca5477009a11dccbdae592"
          },
          {
            "tags": [
              "x_transferred"
            ],
            "url": "https://git.kernel.org/stable/c/fa69a8063f8b27f3c7434a0d4f464a76a62f24d2"
          },
          {
            "tags": [
              "x_transferred"
            ],
            "url": "https://git.kernel.org/stable/c/ce31d79aa1f13a2345791f84935281a2c194e003"
          },
          {
            "tags": [
              "x_transferred"
            ],
            "url": "https://git.kernel.org/stable/c/8b1d72395635af45410b66cc4c4ab37a12c4a831"
          }
        ],
        "title": "CVE Program Container"
      }
    ],
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "arch/parisc/Kconfig",
            "arch/parisc/include/asm/assembly.h",
            "arch/parisc/include/asm/extable.h",
            "arch/parisc/include/asm/special_insns.h",
            "arch/parisc/include/asm/uaccess.h",
            "arch/parisc/kernel/cache.c",
            "arch/parisc/kernel/unaligned.c",
            "arch/parisc/mm/fault.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "23027309b099ffc4efca5477009a11dccbdae592",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "fa69a8063f8b27f3c7434a0d4f464a76a62f24d2",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "ce31d79aa1f13a2345791f84935281a2c194e003",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "8b1d72395635af45410b66cc4c4ab37a12c4a831",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "arch/parisc/Kconfig",
            "arch/parisc/include/asm/assembly.h",
            "arch/parisc/include/asm/extable.h",
            "arch/parisc/include/asm/special_insns.h",
            "arch/parisc/include/asm/uaccess.h",
            "arch/parisc/kernel/cache.c",
            "arch/parisc/kernel/unaligned.c",
            "arch/parisc/mm/fault.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThanOrEqual": "6.1.*",
              "status": "unaffected",
              "version": "6.1.79",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.18",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.7.*",
              "status": "unaffected",
              "version": "6.7.6",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "6.8",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nparisc: Fix random data corruption from exception handler\n\nThe current exception handler implementation, which assists when accessing\nuser space memory, may exhibit random data corruption if the compiler decides\nto use a different register than the specified register %r29 (defined in\nASM_EXCEPTIONTABLE_REG) for the error code. If the compiler choose another\nregister, the fault handler will nevertheless store -EFAULT into %r29 and thus\ntrash whatever this register is used for.\nLooking at the assembly I found that this happens sometimes in emulate_ldd().\n\nTo solve the issue, the easiest solution would be if it somehow is\npossible to tell the fault handler which register is used to hold the error\ncode. Using %0 or %1 in the inline assembly is not posssible as it will show\nup as e.g. %r29 (with the \"%r\" prefix), which the GNU assembler can not\nconvert to an integer.\n\nThis patch takes another, better and more flexible approach:\nWe extend the __ex_table (which is out of the execution path) by one 32-word.\nIn this word we tell the compiler to insert the assembler instruction\n\"or %r0,%r0,%reg\", where %reg references the register which the compiler\nchoosed for the error return code.\nIn case of an access failure, the fault handler finds the __ex_table entry and\ncan examine the opcode. The used register is encoded in the lowest 5 bits, and\nthe fault handler can then store -EFAULT into this register.\n\nSince we extend the __ex_table to 3 words we can\u0027t use the BUILDTIME_TABLE_SORT\nconfig option any longer."
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2024-12-19T08:45:33.339Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/23027309b099ffc4efca5477009a11dccbdae592"
        },
        {
          "url": "https://git.kernel.org/stable/c/fa69a8063f8b27f3c7434a0d4f464a76a62f24d2"
        },
        {
          "url": "https://git.kernel.org/stable/c/ce31d79aa1f13a2345791f84935281a2c194e003"
        },
        {
          "url": "https://git.kernel.org/stable/c/8b1d72395635af45410b66cc4c4ab37a12c4a831"
        }
      ],
      "title": "parisc: Fix random data corruption from exception handler",
      "x_generator": {
        "engine": "bippy-5f407fcff5a0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2024-26706",
    "datePublished": "2024-04-03T14:55:09.529Z",
    "dateReserved": "2024-02-19T14:20:24.158Z",
    "dateUpdated": "2024-12-19T08:45:33.339Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.1",
  "vulnerability-lookup:meta": {
    "nvd": "{\"cve\":{\"id\":\"CVE-2024-26706\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2024-04-03T15:15:53.293\",\"lastModified\":\"2024-11-21T09:02:53.200\",\"vulnStatus\":\"Awaiting Analysis\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nparisc: Fix random data corruption from exception handler\\n\\nThe current exception handler implementation, which assists when accessing\\nuser space memory, may exhibit random data corruption if the compiler decides\\nto use a different register than the specified register %r29 (defined in\\nASM_EXCEPTIONTABLE_REG) for the error code. If the compiler choose another\\nregister, the fault handler will nevertheless store -EFAULT into %r29 and thus\\ntrash whatever this register is used for.\\nLooking at the assembly I found that this happens sometimes in emulate_ldd().\\n\\nTo solve the issue, the easiest solution would be if it somehow is\\npossible to tell the fault handler which register is used to hold the error\\ncode. Using %0 or %1 in the inline assembly is not posssible as it will show\\nup as e.g. %r29 (with the \\\"%r\\\" prefix), which the GNU assembler can not\\nconvert to an integer.\\n\\nThis patch takes another, better and more flexible approach:\\nWe extend the __ex_table (which is out of the execution path) by one 32-word.\\nIn this word we tell the compiler to insert the assembler instruction\\n\\\"or %r0,%r0,%reg\\\", where %reg references the register which the compiler\\nchoosed for the error return code.\\nIn case of an access failure, the fault handler finds the __ex_table entry and\\ncan examine the opcode. The used register is encoded in the lowest 5 bits, and\\nthe fault handler can then store -EFAULT into this register.\\n\\nSince we extend the __ex_table to 3 words we can\u0027t use the BUILDTIME_TABLE_SORT\\nconfig option any longer.\"},{\"lang\":\"es\",\"value\":\"En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: parisc: corrige la corrupci\u00f3n aleatoria de datos del controlador de excepciones La implementaci\u00f3n actual del controlador de excepciones, que ayuda al acceder a la memoria del espacio del usuario, puede exhibir corrupci\u00f3n aleatoria de datos si el compilador decide usar un registro diferente al el registro especificado %r29 (definido en ASM_EXCEPTIONTABLE_REG) para el c\u00f3digo de error. Si el compilador elige otro registro, el manejador de fallas almacenar\u00e1 -EFAULT en %r29 y, por lo tanto, eliminar\u00e1 cualquier cosa para la que se utilice este registro. Al observar el ensamblaje, encontr\u00e9 que esto sucede a veces en emulate_ldd(). Para resolver el problema, la soluci\u00f3n m\u00e1s sencilla ser\u00eda si de alguna manera fuera posible decirle al manejador de fallas qu\u00e9 registro se utiliza para contener el c\u00f3digo de error. No es posible usar %0 o %1 en el ensamblador en l\u00ednea ya que aparecer\u00e1, por ejemplo, como %r29 (con el prefijo \\\"%r\\\"), que el ensamblador GNU no puede convertir a un n\u00famero entero. Este parche adopta otro enfoque mejor y m\u00e1s flexible: ampliamos el __ex_table (que est\u00e1 fuera de la ruta de ejecuci\u00f3n) en 32 palabras. En esta palabra le decimos al compilador que inserte la instrucci\u00f3n ensambladora \\\"o %r0,%r0,%reg\\\", donde %reg hace referencia al registro que el compilador eligi\u00f3 para el c\u00f3digo de retorno de error. En caso de un error de acceso, el controlador de fallas encuentra la entrada __ex_table y puede examinar el c\u00f3digo de operaci\u00f3n. El registro utilizado est\u00e1 codificado en los 5 bits m\u00e1s bajos y el manejador de fallas puede almacenar -EFAULT en este registro. Dado que ampliamos __ex_table a 3 palabras, ya no podemos usar la opci\u00f3n de configuraci\u00f3n BUILDTIME_TABLE_SORT.\"}],\"metrics\":{},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/23027309b099ffc4efca5477009a11dccbdae592\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/8b1d72395635af45410b66cc4c4ab37a12c4a831\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/ce31d79aa1f13a2345791f84935281a2c194e003\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/fa69a8063f8b27f3c7434a0d4f464a76a62f24d2\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/23027309b099ffc4efca5477009a11dccbdae592\",\"source\":\"af854a3a-2127-422b-91ae-364da2661108\"},{\"url\":\"https://git.kernel.org/stable/c/8b1d72395635af45410b66cc4c4ab37a12c4a831\",\"source\":\"af854a3a-2127-422b-91ae-364da2661108\"},{\"url\":\"https://git.kernel.org/stable/c/ce31d79aa1f13a2345791f84935281a2c194e003\",\"source\":\"af854a3a-2127-422b-91ae-364da2661108\"},{\"url\":\"https://git.kernel.org/stable/c/fa69a8063f8b27f3c7434a0d4f464a76a62f24d2\",\"source\":\"af854a3a-2127-422b-91ae-364da2661108\"}]}}"
  }
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.