cve-2024-58098
Vulnerability from cvelistv5
Published
2025-05-05 14:53
Modified
2025-05-09 08:06
Severity ?
Summary
bpf: track changes_pkt_data property for global functions
Impacted products
LinuxLinux
LinuxLinux
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "include/linux/bpf_verifier.h",
            "kernel/bpf/verifier.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "79751e9227a5910c0e5a2c7186877d91821d957d",
              "status": "affected",
              "version": "51c39bb1d5d105a02e29aa7960f0a395086e6342",
              "versionType": "git"
            },
            {
              "lessThan": "1d572c60488b52882b719ed273767ee3b280413d",
              "status": "affected",
              "version": "51c39bb1d5d105a02e29aa7960f0a395086e6342",
              "versionType": "git"
            },
            {
              "lessThan": "51081a3f25c742da5a659d7fc6fd77ebfdd555be",
              "status": "affected",
              "version": "51c39bb1d5d105a02e29aa7960f0a395086e6342",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "include/linux/bpf_verifier.h",
            "kernel/bpf/verifier.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "5.6"
            },
            {
              "lessThan": "5.6",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.90",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.25",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "6.13",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.90",
                  "versionStartIncluding": "5.6",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.25",
                  "versionStartIncluding": "5.6",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.13",
                  "versionStartIncluding": "5.6",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: track changes_pkt_data property for global functions\n\nWhen processing calls to certain helpers, verifier invalidates all\npacket pointers in a current state. For example, consider the\nfollowing program:\n\n    __attribute__((__noinline__))\n    long skb_pull_data(struct __sk_buff *sk, __u32 len)\n    {\n        return bpf_skb_pull_data(sk, len);\n    }\n\n    SEC(\"tc\")\n    int test_invalidate_checks(struct __sk_buff *sk)\n    {\n        int *p = (void *)(long)sk-\u003edata;\n        if ((void *)(p + 1) \u003e (void *)(long)sk-\u003edata_end) return TCX_DROP;\n        skb_pull_data(sk, 0);\n        *p = 42;\n        return TCX_PASS;\n    }\n\nAfter a call to bpf_skb_pull_data() the pointer \u0027p\u0027 can\u0027t be used\nsafely. See function filter.c:bpf_helper_changes_pkt_data() for a list\nof such helpers.\n\nAt the moment verifier invalidates packet pointers when processing\nhelper function calls, and does not traverse global sub-programs when\nprocessing calls to global sub-programs. This means that calls to\nhelpers done from global sub-programs do not invalidate pointers in\nthe caller state. E.g. the program above is unsafe, but is not\nrejected by verifier.\n\nThis commit fixes the omission by computing field\nbpf_subprog_info-\u003echanges_pkt_data for each sub-program before main\nverification pass.\nchanges_pkt_data should be set if:\n- subprogram calls helper for which bpf_helper_changes_pkt_data\n  returns true;\n- subprogram calls a global function,\n  for which bpf_subprog_info-\u003echanges_pkt_data should be set.\n\nThe verifier.c:check_cfg() pass is modified to compute this\ninformation. The commit relies on depth first instruction traversal\ndone by check_cfg() and absence of recursive function calls:\n- check_cfg() would eventually visit every call to subprogram S in a\n  state when S is fully explored;\n- when S is fully explored:\n  - every direct helper call within S is explored\n    (and thus changes_pkt_data is set if needed);\n  - every call to subprogram S1 called by S was visited with S1 fully\n    explored (and thus S inherits changes_pkt_data from S1).\n\nThe downside of such approach is that dead code elimination is not\ntaken into account: if a helper call inside global function is dead\nbecause of current configuration, verifier would conservatively assume\nthat the call occurs for the purpose of the changes_pkt_data\ncomputation."
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2025-05-09T08:06:08.048Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/79751e9227a5910c0e5a2c7186877d91821d957d"
        },
        {
          "url": "https://git.kernel.org/stable/c/1d572c60488b52882b719ed273767ee3b280413d"
        },
        {
          "url": "https://git.kernel.org/stable/c/51081a3f25c742da5a659d7fc6fd77ebfdd555be"
        }
      ],
      "title": "bpf: track changes_pkt_data property for global functions",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2024-58098",
    "datePublished": "2025-05-05T14:53:32.417Z",
    "dateReserved": "2025-03-06T15:52:09.189Z",
    "dateUpdated": "2025-05-09T08:06:08.048Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.1",
  "meta": {
    "nvd": "{\"cve\":{\"id\":\"CVE-2024-58098\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2025-05-05T15:15:53.810\",\"lastModified\":\"2025-05-09T08:15:18.823\",\"vulnStatus\":\"Awaiting Analysis\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nbpf: track changes_pkt_data property for global functions\\n\\nWhen processing calls to certain helpers, verifier invalidates all\\npacket pointers in a current state. For example, consider the\\nfollowing program:\\n\\n    __attribute__((__noinline__))\\n    long skb_pull_data(struct __sk_buff *sk, __u32 len)\\n    {\\n        return bpf_skb_pull_data(sk, len);\\n    }\\n\\n    SEC(\\\"tc\\\")\\n    int test_invalidate_checks(struct __sk_buff *sk)\\n    {\\n        int *p = (void *)(long)sk-\u003edata;\\n        if ((void *)(p + 1) \u003e (void *)(long)sk-\u003edata_end) return TCX_DROP;\\n        skb_pull_data(sk, 0);\\n        *p = 42;\\n        return TCX_PASS;\\n    }\\n\\nAfter a call to bpf_skb_pull_data() the pointer \u0027p\u0027 can\u0027t be used\\nsafely. See function filter.c:bpf_helper_changes_pkt_data() for a list\\nof such helpers.\\n\\nAt the moment verifier invalidates packet pointers when processing\\nhelper function calls, and does not traverse global sub-programs when\\nprocessing calls to global sub-programs. This means that calls to\\nhelpers done from global sub-programs do not invalidate pointers in\\nthe caller state. E.g. the program above is unsafe, but is not\\nrejected by verifier.\\n\\nThis commit fixes the omission by computing field\\nbpf_subprog_info-\u003echanges_pkt_data for each sub-program before main\\nverification pass.\\nchanges_pkt_data should be set if:\\n- subprogram calls helper for which bpf_helper_changes_pkt_data\\n  returns true;\\n- subprogram calls a global function,\\n  for which bpf_subprog_info-\u003echanges_pkt_data should be set.\\n\\nThe verifier.c:check_cfg() pass is modified to compute this\\ninformation. The commit relies on depth first instruction traversal\\ndone by check_cfg() and absence of recursive function calls:\\n- check_cfg() would eventually visit every call to subprogram S in a\\n  state when S is fully explored;\\n- when S is fully explored:\\n  - every direct helper call within S is explored\\n    (and thus changes_pkt_data is set if needed);\\n  - every call to subprogram S1 called by S was visited with S1 fully\\n    explored (and thus S inherits changes_pkt_data from S1).\\n\\nThe downside of such approach is that dead code elimination is not\\ntaken into account: if a helper call inside global function is dead\\nbecause of current configuration, verifier would conservatively assume\\nthat the call occurs for the purpose of the changes_pkt_data\\ncomputation.\"},{\"lang\":\"es\",\"value\":\"En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: bpf: propiedad `track changes_pkt_data` para funciones globales. Al procesar llamadas a ciertos ayudantes, el verificador invalida todos los punteros de paquete en un estado actual. Por ejemplo, considere el siguiente programa: __attribute__((__noinline__)) long skb_pull_data(struct __sk_buff *sk, __u32 len) { return bpf_skb_pull_data(sk, len); } SEC(\\\"tc\\\") int test_invalidate_checks(struct __sk_buff *sk) { int *p = (void *)(long)sk-\u0026gt;data; if ((void *)(p + 1) \u0026gt; (void *)(long)sk-\u0026gt;data_end) return TCX_DROP; skb_pull_data(sk, 0); *p = 42; return TCX_PASS; Tras una llamada a bpf_skb_pull_data(), el puntero \u0027p\u0027 no se puede usar de forma segura. Consulte la funci\u00f3n filter.c:bpf_helper_changes_pkt_data() para obtener una lista de dichos ayudantes. Actualmente, el verificador invalida los punteros de paquetes al procesar llamadas a funciones de ayuda y no recorre subprogramas globales al procesar llamadas a subprogramas globales. Esto significa que las llamadas a ayudantes realizadas desde subprogramas globales no invalidan los punteros en el estado del llamador. Por ejemplo, el programa anterior es inseguro, pero no es rechazado por el verificador. Esta confirmaci\u00f3n corrige la omisi\u00f3n calculando el campo bpf_subprog_info-\u0026gt;changes_pkt_data para cada subprograma antes de la verificaci\u00f3n principal. changes_pkt_data debe establecerse si: - el subprograma llama a un ayudante para el cual bpf_helper_changes_pkt_data devuelve verdadero; - el subprograma llama a una funci\u00f3n global, para la cual bpf_subprog_info-\u0026gt;changes_pkt_data debe establecerse. El pase verifier.c:check_cfg() se modifica para calcular esta informaci\u00f3n. el commit se basa en el recorrido de la instrucci\u00f3n de profundidad primero realizado por check_cfg() y la ausencia de llamadas a funciones recursivas: - check_cfg() eventualmente visitar\u00eda cada llamada al subprograma S en un estado cuando S est\u00e1 completamente explorado; - cuando S est\u00e1 completamente explorado: - cada llamada de ayuda directa dentro de S es explorada (y por lo tanto changes_pkt_data se establece si es necesario); - cada llamada al subprograma S1 llamada por S fue visitada con S1 completamente explorado (y por lo tanto S hereda changes_pkt_data de S1). La desventaja de este enfoque es que no se tiene en cuenta la eliminaci\u00f3n de c\u00f3digo muerto: si una llamada de ayuda dentro de una funci\u00f3n global est\u00e1 muerta debido a la configuraci\u00f3n actual, el verificador asumir\u00eda conservadoramente que la llamada ocurre para el prop\u00f3sito del c\u00e1lculo de changes_pkt_data.\"}],\"metrics\":{},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/1d572c60488b52882b719ed273767ee3b280413d\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/51081a3f25c742da5a659d7fc6fd77ebfdd555be\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/79751e9227a5910c0e5a2c7186877d91821d957d\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}"
  }
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading...

Loading...

Loading...
  • 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.