🛡️ CVE-2026-54901 — oj

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-416 NVD
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Oj: Use-After-Free in Oj::Parser array_class/hash_class GC Marking

Summary

Oj::Parser in usual mode does not mark array_class and hash_class references during garbage collection. If GC runs after the class is assigned but before a parse, the class object is reclaimed, leaving the parser holding a dangling VALUE. The subsequent parse call dereferences the freed object, producing a segfault.

Version

  • Software: oj gem
  • Affected: all versions with ext/oj/usual.c / ext/oj/parser.c
  • Latest tested: 3.17.1 (confirmed present)

Details

The parser_mark function in ext/oj/parser.c is registered as the GC mark callback for the parser's TypedData. If array_class (stored as d->array_class in the Usual struct) is not passed to rb_gc_mark, the GC does not know it is referenced and may collect it.

When close_array_class (usual.c:405) later calls rb_funcallv on the collected class VALUE, it accesses freed memory, crashing at RIP: 0x7f... / 0x0000000000000000.

Crash output:

```

array_class finalized

about to parse

[BUG] Segmentation fault at 0x0000000000000000

close_array_class+0x194 /ext/oj/usual.c:405

parse+0x17b3 /ext/oj/parser.c:715

parser_parse+0x10b /ext/oj/parser.c:1408

RIP: 0x7fd1b46d68b7 RBP: 0x0000000000000000

```

Reproduce

```ruby

require 'oj'

p = Oj::Parser.new(:usual,

array_class: (ac = Class.new { def <<(_x); end }))

ObjectSpace.define_finalizer(ac, proc { warn 'array_class finalized' })

ac = nil

GC.start(full_mark: true, immediate_sweep: true) # collect the class

p.parse('[1]') # segfault

```

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. Rated impact: confidentiality none, integrity none, availability high.

Weakness class

CVE-2026-54901 is classified as CWE-416: Use After Free. Memory is used after being released, so its contents may already belong to something else.

Affected software

CVE-2026-54901 is recorded against 2 packages.

  • oj (fixed in 3.17.3)
  • unknown

Timeline and source

Published on 19 June 2026 and last revised on 26 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
github.com (Package)

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
CWE CWE-416
Public Exploit ✅ No
Source NVD
Published 2026-06-19
Updated 2026-08-12
Modified 2026-06-26
Fix URL N/A

Affected Packages

Software From version Fixed in
oj 3.17.3
unknown

Site Security Check

Is oj part of your stack?

CVE-2026-54901 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.