🛡️ CVE-2026-54899 — oj
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_key → cache_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
Details
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
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| oj | — | 3.17.3 |
| unknown | — | — |
References
Similar Threats
- High ROOT-APP-RUBY-CVE-2026-54902
- Medium CVE-2026-54500
- High CVE-2026-54502
- High CVE-2026-54592
- High CVE-2026-54896
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.