llama.cpp b11000修复RPC服务端释放后使用漏洞,可致远程代码执行
该版本在free_buffer() 中丢弃全部缓存计算图,修复未认证远程客户端可利用的use-after-free;现有graph_recompute() 的空指针检查会拒绝请求,客户端下次调用回退到GRAPH_COMPUTE,协议与API无变化。
AI解读:llama.cpp的b11000版本修掉了一个RPC服务端漏洞:缓存的计算图会在引用的后端缓冲区被释放后继续被复用,指针悬空,形成use-after-free。
危险之处在于这个漏洞不需要登录就能触发。攻击者通过后续的ALLOC_BUFFER/SET_TENSOR命令重塑内存块,就能借助缓存计算图读写出libc地址,并劫持BUFFER_CLEAR使用的buffer iface vtable,最终实现远程代码执行。
修复方式很直接:在free_buffer() 里丢弃所有缓存计算图。之后graph_recompute() 已有的空指针检查会拒绝请求,客户端下一次调用自动回退到GRAPH_COMPUTE。协议和API都没改。
对自建RPC推理服务的用户来说,这次更新值得优先处理,因为暴露在网络上的未认证接口此前等于给攻击者留了执行入口。b11000同时照常提供了macOS、Linux、Windows、Android等多平台预编译包。
llama.cpp发布b11000版本,修复RPC服务端的一处use-after-free漏洞(PR #24292),该漏洞可被未认证远程客户端利用,最终导致远程代码执行。
问题出在计算图缓存机制:服务器按设备缓存最近一次计算图,以便GRAPH_RECOMPUTE在无需重新发送张量数据的情况下重新执行。缓存图节点持有graph_compute() 时仍然有效的后端缓冲区直接指针。如果这些缓冲区之后通过FREE_BUFFER被释放,下一次GRAPH_RECOMPUTE就会通过悬空指针重新执行缓存图。
漏洞可被未认证远程客户端触发。悬空指针指向的内存块可被攻击者通过后续ALLOC_BUFFER/SET_TENSOR命令重塑,由此产生的读写足以泄漏libc地址,并劫持BUFFER_CLEAR使用的buffer iface vtable,从而实现远程代码执行。
修复方式与行为变化
修复方案是在free_buffer() 中丢弃所有缓存计算图。graph_recompute() 中已有的空指针检查随后会拒绝该请求,客户端在下一次调用时回退到GRAPH_COMPUTE。
本次修复不涉及协议或API变更。
- 在free_buffer() 中丢弃全部缓存计算图
- graph_recompute() 已有空指针检查负责拒绝请求
- 客户端下一次调用回退到GRAPH_COMPUTE
- 无协议或API变更