Every CVE Search/ Get API key

OSEC-2026-30

Ephemeron data is freed while still referenced when the key is an `Infix_tag` closure

7.0 HighFix available

Summary

In OCaml before 4.14.5, when the key of an ephemeron is a closure with Infix_tag (a function of a mutually recursive group that is not the first function), the mark phase does not keep the ephemeron's data alive, although the key is alive. The clean phase does treat the key as alive, so it leaves the data field filled. The sweep phase then frees the data block. After a major collection the ephemeron's data field still points to the freed block.

This looks like the part of #7810 that PR #9742 did not cover. PR #9742 fixed the clean phase and the minor collector. It did not change mark_ephe_aux.

Please note that the CVSS score high is under the conditions:

  • if the application is using ephemerons,
  • and if the application is available over the network,
  • and if the attacker can find a way to exploit the memory safety issue in an attack chain.

Reproduction

[@@@alert "-old_ephemeron_api"]
let infix n = let rec f () = n and g () = f () in g

let build key n =
  let e = Ephemeron.K1.create () in
  let w = Weak.create 1 in
  let d = ref n in
  Ephemeron.K1.set_key e key;
  Ephemeron.K1.set_data e d;
  Weak.set w 0 (Some d);
  (e, w)

let run key =
  let (e, w) = build key 1 in
  Gc.full_major ();
  Printf.printf "tag=%d weak=%b check_key=%b check_data=%b\n"
    (Obj.tag (Obj.repr key)) (Weak.check w 0)
    (Ephemeron.K1.check_key e) (Ephemeron.K1.check_data e);
  ignore (Sys.opaque_identity key)

let () =
  if Sys.argv.(1) = "infix" then run (infix 1) else run (ref 1)

Obj is used only to print the tag of the key. The program does not read the data after the collection.

Timeline

  • 2026-10-04: initial report via email
  • 2026-10-09: develop and committed the fix
  • 2026-11-03: fix was reviewed and merged
  • 2026-11-06: OCaml 4.14.5 released

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
Low
Integrity
Low
Availability
High

What each source reports

OSV Score used 7.0

Ephemeron data is freed while still referenced when the key is an `Infix_tag` closure

Summary

In OCaml before 4.14.5, when the key of an ephemeron is a closure with Infix_tag (a function of a mutually recursive group that is not the first function), the mark phase does not keep the ephemeron's data alive, although the key is alive. The clean phase does treat the key as alive, so it leaves the data field filled. The sweep phase then frees the data block. After a major collection the ephemeron's data field still points to the freed block.

This looks like the part of #7810 that PR #9742 did not cover. PR #9742 fixed the clean phase and the minor collector. It did not change mark_ephe_aux.

Please note that the CVSS score high is under the conditions:

  • if the application is using ephemerons,
  • and if the application is available over the network,
  • and if the attacker can find a way to exploit the memory safety issue in an attack chain.

Reproduction

[@@@alert "-old_ephemeron_api"]
let infix n = let rec f () = n and g () = f () in g

let build key n =
  let e = Ephemeron.K1.create () in
  let w = Weak.create 1 in
  let d = ref n in
  Ephemeron.K1.set_key e key;
  Ephemeron.K1.set_data e d;
  Weak.set w 0 (Some d);
  (e, w)

let run key =
  let (e, w) = build key 1 in
  Gc.full_major ();
  Printf.printf "tag=%d weak=%b check_key=%b check_data=%b\n"
    (Obj.tag (Obj.repr key)) (Weak.check w 0)
    (Ephemeron.K1.check_key e) (Ephemeron.K1.check_data e);
  ignore (Sys.opaque_identity key)

let () =
  if Sys.argv.(1) = "infix" then run (infix 1) else run (ref 1)

Obj is used only to print the tag of the key. The program does not read the data after the collection.

Timeline

  • 2026-10-04: initial report via email
  • 2026-10-09: develop and committed the fix
  • 2026-11-03: fix was reviewed and merged
  • 2026-11-06: OCaml 4.14.5 released
Record
OSEC-2026-30
CVSS 4.0
7.0 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:H/SC:N/SI:N/SA:N/E:P
Updated
2026-11-06

Affected packages

Affected packages
PackageAffectedFixed
ocaml
opam
before 4.14.5, plus listed versions
3.073.07+13.07+23.08.03.08.1
Show 45 moreShow less
3.08.23.08.33.08.43.09.03.09.13.09.23.09.33.10.03.10.13.10.23.11.03.11.13.11.23.12.03.12.14.00.04.00.14.01.04.02.04.02.14.02.24.02.34.02.44.03.04.03.14.04.04.04.14.04.24.04.34.05.04.05.14.06.04.06.14.06.24.07.04.07.14.07.24.08.04.08.14.08.24.09.04.09.14.09.24.10.04.10.1
4.14.5

History

History
RecordedChangedSources
first indexedOSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

OSEC-2026-30 is a high vulnerability (CVSS 7.0) in ocaml, published November 6, 2026. No source lists public exploit code. Fixed in ocaml 4.14.5.

This page doesn't list everything

Left out here: 17 versions. The JSON record has them.

MoveEnter Open