Files
vuln-osv/data/RubyGems/GHSA-2cw7-v8ff-p88r.json

1 line
5.5 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"schema_version":"1.9.0","id":"GHSA-2cw7-v8ff-p88r","published":"2026-06-19T19:34:30Z","modified":"2026-10-06T20:00:05.191640486Z","aliases":["CVE-2026-54899"],"summary":"Oj: Use-After-Free in Oj::Parser Symbol Key Cache Toggle","details":"### Summary\n\nDisabling `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.\n\n### Version\n\n- **Software**: oj gem\n- **Affected**: all versions with `ext/oj/usual.c`\n- **Latest tested**: 3.17.1 (confirmed present)\n\n### Details\n\n`ext/oj/usual.c`, `opt_symbol_keys_set`:\n\n```c\n// usual.c:1043–1051\nif (symbol_keys) {\n d->key_cache = cache_create(...); // allocate\n} else {\n cache_free(d->key_cache); // free — but d->key_cache pointer not NULLed\n}\n```\n\nOn the next parse call, `cache_key` → `cache_intern` reads from `d->key_cache` which now points to freed memory.\n\nASAN report:\n```\n==145265==ERROR: AddressSanitizer: heap-use-after-free on address 0x50b00001a318\nREAD of size 8 at 0x50b00001a318 thread T0\n #0 cache_intern /ext/oj/cache.c:328\n #1 cache_key /ext/oj/usual.c:161\n #2 close_object /ext/oj/usual.c:285\n #3 parse /ext/oj/parser.c:693\n #4 parser_parse /ext/oj/parser.c:1408\nfreed by thread T0 here:\n #0 free\n #1 cache_free /ext/oj/cache.c:277\n #2 opt_symbol_keys_set /ext/oj/usual.c:1051\n #3 option /ext/oj/usual.c:1111\n #4 parser_missing /ext/oj/parser.c:1362\n0x50b00001a318 is 40 bytes inside freed 112-byte region [fd]fd fd fd fd fd fd fd\n```\n\n### Reproduce\n\n```ruby\nrequire 'oj'\np = Oj::Parser.new(:usual, symbol_keys: true)\np.symbol_keys = false # frees cache without nulling pointer\np.parse('{\"attacker\":1}') # UAF: reads freed cache\n```","affected":[{"package":{"name":"oj","ecosystem":"RubyGems","purl":"pkg:gem/oj"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"3.17.2"}]}],"versions":["0.5","0.5.1","0.5.2","0.6.0","0.7.0","0.8.0","0.9.0","1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.1.0","1.1.1","1.2.0","1.2.1","1.2.10","1.2.11","1.2.12","1.2.13","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","1.3.0","1.3.2","1.3.4","1.3.5","1.3.6","1.3.7","1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.4.5","1.4.6","1.4.6a2","1.4.7","2.0.0","2.0.1","2.0.10","2.0.11","2.0.12","2.0.13","2.0.14","2.0.2","2.0.3","2.0.4","2.0.5","2.0.6","2.0.7","2.0.8","2.0.9","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.1.6","2.1.7","2.10.0","2.10.1","2.10.2","2.10.3","2.10.4","2.11.0","2.11.1","2.11.2","2.11.3","2.11.4","2.11.5","2.12.0","2.12.1","2.12.10","2.12.11","2.12.12","2.12.13","2.12.14","2.12.2","2.12.3","2.12.4","2.12.5","2.12.6","2.12.7","2.12.8","2.12.9","2.13.0","2.13.1","2.14.0","2.14.1","2.14.2","2.14.3","2.14.4","2.14.5","2.14.6","2.15.0","2.15.1","2.16.0","2.16.1","2.17.0","2.17.1","2.17.2","2.17.3","2.17.4","2.17.5","2.18.0","2.18.1","2.18.2","2.18.3","2.18.4","2.18.5","2.2.0","2.2.1","2.2.2","2.2.3","2.3.0","2.4.0","2.4.1","2.4.2","2.4.3","2.5.1","2.5.2","2.5.3","2.5.4","2.5.5","2.6.0","2.6.1","2.7.0","2.7.1","2.7.2","2.7.3","2.8.0","2.8.1","2.9.0","2.9.1","2.9.2","2.9.3","2.9.4","2.9.5","2.9.6","2.9.7","2.9.8","2.9.9","3.0.0","3.0.1","3.0.10","3.0.11","3.0.2","3.0.3","3.0.4","3.0.5","3.0.6","3.0.7","3.0.8","3.0.9","3.1.0","3.1.2","3.1.3","3.1.4","3.10.0","3.10.1","3.10.10","3.10.11","3.10.12","3.10.13","3.10.14","3.10.15","3.10.16","3.10.17","3.10.18","3.10.2","3.10.3","3.10.5","3.10.6","3.10.7","3.10.8","3.10.9","3.11.0","3.11.1","3.11.2","3.11.3","3.11.4","3.11.5","3.11.6","3.11.7","3.11.8","3.12.0","3.12.1","3.12.2","3.12.3","3.13.0","3.13.1","3.13.10","3.13.11","3.13.12","3.13.13","3.13.14","3.13.15","3.13.16","3.13.17","3.13.18","3.13.19","3.13.2","3.13.20","3.13.21","3.13.22","3.13.23","3.13.3","3.13.4","3.13.5","3.13.6","3.13.7","3.13.8","3.13.9","3.14.0","3.14.1","3.14.2","3.14.3","3.15.0","3.15.1","3.16.0","3.16.1","3.16.10","3.16.11","3.16.12","3.16.13","3.16.14","3.16.15","3.16.16","3.16.17","3.16.2","3.16.3","3.16.4","3.16.5","3.16.6","3.16.7","3.16.8","3.16.9","3.17.0","3.17.1","3.2.0","3.2.1","3.3.0","3.3.1","3.3.10","3.3.2","3.3.3","3.3.4","3.3.5","3.3.6","3.3.7","3.3.8","3.3.9","3.4.0","3.5.0","3.5.1","3.6.0","3.6.10","3.6.11","3.6.12","3.6.13","3.6.2","3.6.3","3.6.4","3.6.5","3.6.6","3.6.7","3.6.8","3.6.9","3.7.0","3.7.1","3.7.10","3.7.11","3.7.12","3.7.2","3.7.3","3.7.4","3.7.5","3.7.6","3.7.7","3.7.8","3.7.9","3.8.0","3.8.1","3.9.0","3.9.1","3.9.2"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-2cw7-v8ff-p88r/GHSA-2cw7-v8ff-p88r.json"}}],"references":[{"type":"WEB","url":"https://github.com/ohler55/oj/security/advisories/GHSA-2cw7-v8ff-p88r"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-54899"},{"type":"PACKAGE","url":"https://github.com/ohler55/oj"},{"type":"WEB","url":"https://github.com/rubysec/ruby-advisory-db/blob/master/gems/oj/CVE-2026-54899.yml"},{"type":"WEB","url":"https://www.cve.org/CVERecord/SearchResults?query=CVE-2026-54899"}],"database_specific":{"cwe_ids":["CWE-416"],"github_reviewed":true,"github_reviewed_at":"2026-06-19T19:34:30Z","nvd_published_at":"2026-07-01T00:16:33Z","severity":"HIGH"},"severity":[{"type":"CVSS_V4","score":"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"}]}