开源llama.cpp Releases·原文 2026年9月30日

llama.cpp b11275修复GGUF张量填充溢出绕过大小校验的问题

当张量字节数落在SIZE_MAX减去对齐值加 1 的窗口内时,GGML_PAD会把数值回绕成 0,从而悄悄跳过了gguf_init_from_reader中的尺寸溢出检查;b11275在填充前先拒绝这类张量。

AI解读:llama.cpp的b11275版本修了一个GGUF加载环节的整数溢出漏洞:当张量的字节数已经逼近 64 位无符号整数的上限时,按对齐填充这一步会把数值回绕成 0,结果原本用来拦截超大张量的溢出检查就被静默绕过。

改动的位置在gguf_init_from_reader:在调用GGML_PAD做对齐填充之前,先判断nbytes + (alignment - 1) 是否会溢出,会的话直接拒绝这个张量,而不是等填充完再去检查。

这次修复针对的是恶意或损坏的GGUF文件能否骗过加载器校验的问题,直接影响使用llama.cpp加载第三方模型文件的用户和下游发行版;随版本一同发布的还有macOS、Linux、Windows、Android等平台的预编译包。

llama.cpp发布b11275版本,其中一项改动是拒绝填充后发生回绕的张量大小(PR #26979)。

问题出在GGML_PAD(nbytes, alignment):当nbytes落在SIZE_MAX减去 (alignment - 1) 的范围内时,填充计算会回绕成 0,从而静默绕过gguf_init_from_reader中的大小溢出保护。

修复方式是在填充前先做判断,如果nbytes + (alignment - 1) 会溢出,就直接拒绝该张量。

该PR还新增了一个test-gguf手工构造的测试用例:F32类型,ne = [4, 2^30-1, 2^30+1, 1],其ggml_nbytes = 2^64 - 16,正好落在回绕窗口内;该用例在master分支上失败,加上保护后通过。

b11275同时提供各平台预编译包,包括macOS Apple Silicon(arm64)与macOS Intel(x64)、iOS XCFramework、Ubuntu x64/arm64/s390x(CPU)、Ubuntu Vulkan、Ubuntu CUDA 12.8、Ubuntu CUDA 13.4(含arm64)、Ubuntu ROCm 10.0、Ubuntu OpenVINO 2026.4、Ubuntu SYCL FP32/FP16、Linux arm64(骁龙:CPU、Adreno GPU、Hexagon NPU)、Android arm64(CPU)、Android arm64(骁龙)以及Windows x64/arm64的CPU、OpenCL Adreno、CUDA 12.4、CUDA 13.4、Vulkan、OpenVINO 2026.4、SYCL、ROCm 10.0版本。

该版本中macOS Apple Silicon的KleidiAI启用包和openEuler相关构建均标记为DISABLED。

信息来源

llama.cpp Releases原始来源