GHSA-XVP7-XR44-89MJ
Vulnerability from github – Published: 2026-07-25 12:31 – Updated: 2026-07-25 12:31In the Linux kernel, the following vulnerability has been resolved:
tracing: Fix NULL pointer dereference in func_set_flag()
func_set_flag() dereferences tr->current_trace_flags before verifying that the current tracer is actually the function tracer. When the active tracer has been switched away from "function" (e.g., to "wakeup_rt"), tr->current_trace_flags can be NULL, leading to a NULL pointer dereference and kernel crash.
The call chain that triggers this is:
trace_options_write() -> __set_tracer_option() -> trace->set_flag() / func_set_flag /
In func_set_flag(), the first operation is:
if (!!set == !!(tr->current_trace_flags->val & bit))
This dereferences tr->current_trace_flags unconditionally. The safety check that guards against a non-function tracer:
if (tr->current_trace != &function_trace) return 0;
is placed after the dereference, which is too late.
This was observed with the following crash dump:
BUG: unable to handle page fault at 0000000000000000 RIP: func_set_flag+0xd
Call Trace: __set_tracer_option+0x27 trace_options_write+0x75 vfs_write+0x12a ksys_write+0x66 do_syscall_64+0x5b
RIP: ffffffff914c973d RSP: ff67ec88b01dfdf0 RFLAGS: 00010202 RAX: 0000000000000000 RBX: ff3a826e80354580 RCX: 0000000000000001 RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffffffff93918080
The disassembly confirms the fault:
func_set_flag+0: mov 0x1f08(%rdi), %rax ; RAX = tr->current_trace_flags = NULL func_set_flag+13: mov (%rax), %eax ; page fault: dereference NULL
At the time of the crash: tr->current_trace_flags = 0x0 (NULL) tr->current_trace = wakeup_rt_tracer (not function_trace)
The scenario is that a process opens a function tracer option file (such as "func_stack_trace"), then the current tracer is switched to another tracer (e.g., "wakeup_rt"), which sets current_trace_flags to NULL. When the process subsequently writes to the option file, func_set_flag() is invoked and crashes on the NULL dereference.
Fix this by moving the current_trace check before the current_trace_flags dereference, so that func_set_flag() returns early when the function tracer is not active.
{
"affected": [],
"aliases": [
"CVE-2026-64451"
],
"database_specific": {
"cwe_ids": [],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-07-25T10:17:30Z",
"severity": null
},
"details": "In the Linux kernel, the following vulnerability has been resolved:\n\ntracing: Fix NULL pointer dereference in func_set_flag()\n\nfunc_set_flag() dereferences tr-\u003ecurrent_trace_flags before verifying\nthat the current tracer is actually the function tracer. When the active\ntracer has been switched away from \"function\" (e.g., to \"wakeup_rt\"),\ntr-\u003ecurrent_trace_flags can be NULL, leading to a NULL pointer\ndereference and kernel crash.\n\nThe call chain that triggers this is:\n\n trace_options_write()\n -\u003e __set_tracer_option()\n -\u003e trace-\u003eset_flag() /* func_set_flag */\n\nIn func_set_flag(), the first operation is:\n\n if (!!set == !!(tr-\u003ecurrent_trace_flags-\u003eval \u0026 bit))\n\nThis dereferences tr-\u003ecurrent_trace_flags unconditionally. The safety\ncheck that guards against a non-function tracer:\n\n if (tr-\u003ecurrent_trace != \u0026function_trace)\n return 0;\n\nis placed *after* the dereference, which is too late.\n\nThis was observed with the following crash dump:\n\n BUG: unable to handle page fault at 0000000000000000\n RIP: func_set_flag+0xd\n\n Call Trace:\n __set_tracer_option+0x27\n trace_options_write+0x75\n vfs_write+0x12a\n ksys_write+0x66\n do_syscall_64+0x5b\n\n RIP: ffffffff914c973d RSP: ff67ec88b01dfdf0 RFLAGS: 00010202\n RAX: 0000000000000000 RBX: ff3a826e80354580 RCX: 0000000000000001\n RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffffffff93918080\n\nThe disassembly confirms the fault:\n\n func_set_flag+0: mov 0x1f08(%rdi), %rax ; RAX = tr-\u003ecurrent_trace_flags = NULL\n func_set_flag+13: mov (%rax), %eax ; page fault: dereference NULL\n\nAt the time of the crash:\n tr-\u003ecurrent_trace_flags = 0x0 (NULL)\n tr-\u003ecurrent_trace = wakeup_rt_tracer (not function_trace)\n\nThe scenario is that a process opens a function tracer option file (such\nas \"func_stack_trace\"), then the current tracer is switched to another\ntracer (e.g., \"wakeup_rt\"), which sets current_trace_flags to NULL. When\nthe process subsequently writes to the option file, func_set_flag() is\ninvoked and crashes on the NULL dereference.\n\nFix this by moving the current_trace check before the\ncurrent_trace_flags dereference, so that func_set_flag() returns early\nwhen the function tracer is not active.",
"id": "GHSA-xvp7-xr44-89mj",
"modified": "2026-07-25T12:31:36Z",
"published": "2026-07-25T12:31:36Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-64451"
},
{
"type": "WEB",
"url": "https://git.kernel.org/stable/c/69f17ac132a38974cf1defb480cef6b79d1ab768"
},
{
"type": "WEB",
"url": "https://git.kernel.org/stable/c/c3e94604675e3db186111b8942650d86577df9b0"
}
],
"schema_version": "1.4.0",
"severity": []
}
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.