CVE-2024-58098

In the Linux kernel, the following vulnerability has been resolved: bpf: track changes_pkt_data property for global functions When processing calls to certain helpers, verifier invalidates all packet pointers in a current state. For example, consider the following program: __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->data; if ((void *)(p + 1) > (void *)(long)sk->data_end) return TCX_DROP; skb_pull_data(sk, 0); *p = 42; return TCX_PASS; } After a call to bpf_skb_pull_data() the pointer 'p' can't be used safely. See function filter.c:bpf_helper_changes_pkt_data() for a list of such helpers. At the moment verifier invalidates packet pointers when processing helper function calls, and does not traverse global sub-programs when processing calls to global sub-programs. This means that calls to helpers done from global sub-programs do not invalidate pointers in the caller state. E.g. the program above is unsafe, but is not rejected by verifier. This commit fixes the omission by computing field bpf_subprog_info->changes_pkt_data for each sub-program before main verification pass. changes_pkt_data should be set if: - subprogram calls helper for which bpf_helper_changes_pkt_data returns true; - subprogram calls a global function, for which bpf_subprog_info->changes_pkt_data should be set. The verifier.c:check_cfg() pass is modified to compute this information. The commit relies on depth first instruction traversal done by check_cfg() and absence of recursive function calls: - check_cfg() would eventually visit every call to subprogram S in a state when S is fully explored; - when S is fully explored: - every direct helper call within S is explored (and thus changes_pkt_data is set if needed); - every call to subprogram S1 called by S was visited with S1 fully explored (and thus S inherits changes_pkt_data from S1). The downside of such approach is that dead code elimination is not taken into account: if a helper call inside global function is dead because of current configuration, verifier would conservatively assume that the call occurs for the purpose of the changes_pkt_data computation.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc2:*:*:*:*:*:*

History

10 Nov 2025, 17:35

Type Values Removed Values Added
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
References () https://git.kernel.org/stable/c/1d572c60488b52882b719ed273767ee3b280413d - () https://git.kernel.org/stable/c/1d572c60488b52882b719ed273767ee3b280413d - Patch
References () https://git.kernel.org/stable/c/51081a3f25c742da5a659d7fc6fd77ebfdd555be - () https://git.kernel.org/stable/c/51081a3f25c742da5a659d7fc6fd77ebfdd555be - Patch
References () https://git.kernel.org/stable/c/79751e9227a5910c0e5a2c7186877d91821d957d - () https://git.kernel.org/stable/c/79751e9227a5910c0e5a2c7186877d91821d957d - Patch
CPE cpe:2.3:o:linux:linux_kernel:6.13:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
CWE NVD-CWE-noinfo
First Time Linux
Linux linux Kernel

09 May 2025, 08:15

Type Values Removed Values Added
References
  • () https://git.kernel.org/stable/c/79751e9227a5910c0e5a2c7186877d91821d957d -
Summary
  • (es) 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->data; if ((void *)(p + 1) > (void *)(long)sk->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 'p' no se puede usar de forma segura. Consulte la función 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ón corrige la omisión calculando el campo bpf_subprog_info->changes_pkt_data para cada subprograma antes de la verificación 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ón global, para la cual bpf_subprog_info->changes_pkt_data debe establecerse. El pase verifier.c:check_cfg() se modifica para calcular esta información. el commit se basa en el recorrido de la instrucción de profundidad primero realizado por check_cfg() y la ausencia de llamadas a funciones recursivas: - check_cfg() eventualmente visitaría cada llamada al subprograma S en un estado cuando S está completamente explorado; - cuando S está 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ón de código muerto: si una llamada de ayuda dentro de una función global está muerta debido a la configuración actual, el verificador asumiría conservadoramente que la llamada ocurre para el propósito del cálculo de changes_pkt_data.

05 May 2025, 15:15

Type Values Removed Values Added
New CVE

Information

Published : 2025-05-05 15:15

Updated : 2025-11-10 17:35


NVD link : CVE-2024-58098

Mitre link : CVE-2024-58098

CVE.ORG link : CVE-2024-58098


JSON object : View

Products Affected

linux

  • linux_kernel