CVE-2026-21869llama.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。由于内存写入是确定性的,攻击者可以多次尝试逐步精确定位目标内存地址。