GHSA-V583-2W7F-R9GC

Vulnerability from github – Published: 2026-09-25 12:31 – Updated: 2026-09-25 12:31
VLAI
Details

In the Linux kernel, the following vulnerability has been resolved:

tracing: Free histogram the field rejected for a bad modifier

Writing a hist trigger whose value or variable carries a modifier that is not allowed there leaks the fields that were built for it.

__create_val_field() takes the field from parse_expr() and stores it in hist_data->fields[] only after the modifier checks have run:

hist_field = parse_expr(hist_data, file, field_str, flags, var_name,
            &n_subexprs);
...
if (hist_field->flags & HIST_FIELD_FL_VAR) {
    if (hist_field->flags & (...))
        goto err;
} else {
    if (hist_field->flags & (...))
        goto err;
}

hist_data->fields[val_idx] = hist_field;

Both checks jump past that store, and the err label returns without freeing anything. The error unwinds to create_hist_data(), which calls destroy_hist_data() -> destroy_hist_fields(), and that reaches a field only by walking fields[]. A field that never got there is unreachable.

commit e0213434fe3e ("tracing: Do not let histogram values have some modifiers") set ret to -EINVAL and fell through to the store, which left the field owned by fields[] and freed along with the rest of hist_data. Splitting the check into a value case and a variable case replaced that fall-through with a goto that skips it.

With CONFIG_DEBUG_KMEMLEAK, 200 writes of

# echo 'hist:keys=prev_pid:vals=next_pid.log2' > \ events/sched/sched_switch/trigger

each correctly rejected with -EINVAL, leave 332 unreferenced objects (63744 bytes) reported at create_hist_field(); 200 install and remove cycles of a valid trigger leave none. A '.log2' field is two allocations, since create_hist_field() puts the plain field in operands[0] of the log2 field, and both are reported.

Use destroy_hist_field() rather than __destroy_hist_field() so that operands[0] is freed as well. It returns early for HIST_FIELD_FL_VAR_REF, which is what an operand owned by hist_data->var_refs[] needs; the rejected field itself is never a var ref, because a var ref never carries a modifier flag.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-97921"
  ],
  "database_specific": {
    "cwe_ids": [],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-09-25T11:17:19Z",
    "severity": null
  },
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\ntracing: Free histogram the field rejected for a bad modifier\n\nWriting a hist trigger whose value or variable carries a modifier that is\nnot allowed there leaks the fields that were built for it.\n\n__create_val_field() takes the field from parse_expr() and stores it in\nhist_data-\u003efields[] only after the modifier checks have run:\n\n\thist_field = parse_expr(hist_data, file, field_str, flags, var_name,\n\t\t\t\t\u0026n_subexprs);\n\t...\n\tif (hist_field-\u003eflags \u0026 HIST_FIELD_FL_VAR) {\n\t\tif (hist_field-\u003eflags \u0026 (...))\n\t\t\tgoto err;\n\t} else {\n\t\tif (hist_field-\u003eflags \u0026 (...))\n\t\t\tgoto err;\n\t}\n\n\thist_data-\u003efields[val_idx] = hist_field;\n\nBoth checks jump past that store, and the err label returns without\nfreeing anything. The error unwinds to create_hist_data(), which calls\ndestroy_hist_data() -\u003e destroy_hist_fields(), and that reaches a field\nonly by walking fields[]. A field that never got there is unreachable.\n\ncommit e0213434fe3e (\"tracing: Do not let histogram values have some\nmodifiers\") set ret to -EINVAL and fell through to the store, which left\nthe field owned by fields[] and freed along with the rest of hist_data.\nSplitting the check into a value case and a variable case replaced that\nfall-through with a goto that skips it.\n\nWith CONFIG_DEBUG_KMEMLEAK, 200 writes of\n\n  # echo \u0027hist:keys=prev_pid:vals=next_pid.log2\u0027 \u003e \\\n\t events/sched/sched_switch/trigger\n\neach correctly rejected with -EINVAL, leave 332 unreferenced objects\n(63744 bytes) reported at create_hist_field(); 200 install and remove\ncycles of a valid trigger leave none. A \u0027.log2\u0027 field is two\nallocations, since create_hist_field() puts the plain field in\noperands[0] of the log2 field, and both are reported.\n\nUse destroy_hist_field() rather than __destroy_hist_field() so that\noperands[0] is freed as well. It returns early for HIST_FIELD_FL_VAR_REF,\nwhich is what an operand owned by hist_data-\u003evar_refs[] needs; the\nrejected field itself is never a var ref, because a var ref never carries\na modifier flag.",
  "id": "GHSA-v583-2w7f-r9gc",
  "modified": "2026-09-25T12:31:28Z",
  "published": "2026-09-25T12:31:28Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-97921"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/230234d12ce42ab04132a32c3a848f07a5d27a71"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/891c21f6d5673b2a519b536243bfc6dd2d35beb6"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/b22dc0add7d72b8bd9cae3188db0dd65da1c8652"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/e787361bb6b0026ea3eb4d3fa7a304c7fcb99555"
    }
  ],
  "schema_version": "1.4.0",
  "severity": []
}



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…

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…