🛡️ CVE-2026-54899 — 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 Symbol Key Cache Toggle

Summary

Disabling symbol_keys on a reused Oj::Parser instance triggers a heap use-after-free. When symbol_keys is toggled from true to false, opt_symbol_keys_set frees the internal key cache (cache_free) but does not clear the pointer. The next parse call reads from the freed cache via cache_intern, producing a use-after-free.

Version

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

Details

ext/oj/usual.c, opt_symbol_keys_set:

```c

// usual.c:1043–1051

if (symbol_keys) {

d->key_cache = cache_create(...); // allocate

} else {

cache_free(d->key_cache); // free — but d->key_cache pointer not NULLed

}

```

On the next parse call, cache_keycache_intern reads from d->key_cache which now points to freed memory.

ASAN report:

```

==145265==ERROR: AddressSanitizer: heap-use-after-free on address 0x50b00001a318

READ of size 8 at 0x50b00001a318 thread T0

#0 cache_intern /ext/oj/cache.c:328

#1 cache_key /ext/oj/usual.c:161

#2 close_object /ext/oj/usual.c:285

#3 parse /ext/oj/parser.c:693

#4 parser_parse /ext/oj/parser.c:1408

freed by thread T0 here:

#0 free

#1 cache_free /ext/oj/cache.c:277

#2 opt_symbol_keys_set /ext/oj/usual.c:1051

#3 option /ext/oj/usual.c:1111

#4 parser_missing /ext/oj/parser.c:1362

0x50b00001a318 is 40 bytes inside freed 112-byte region [fd]fd fd fd fd fd fd fd

```

Reproduce

```ruby

require 'oj'

p = Oj::Parser.new(:usual, symbol_keys: true)

p.symbol_keys = false # frees cache without nulling pointer

p.parse('{"attacker":1}') # UAF: reads freed cache

```

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-54899 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-54899 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-54899 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.

Browse related advisories

All advisoriesCVECVE 2026