CVE-2025-66908CVE-2025-66908是Turms开源即时通讯系统中AI-Serving模块的一个中高危安全漏洞。该漏洞存在于OCR图像上传功能中,由于系统对上传文件的类型验证不充分,攻击者可以绕过安全限制上传任意文件类型。Turms是一个用Java开发的即时通讯服务端项目,其AI-Serving模块提供了OCR文字识别功能。在v0.10.0-SNAPSHOT及更早版本中,OcrController使用@FormData(contentType = MediaTypeConst.IMAGE)注解来限制上传文件为图像类型,但该约束仅在HTTP层面进行检查,并未真正验证文件的实际内容。系统仅依赖客户端提供的Content-Type请求头和文件扩展名来判断文件类型,缺乏基于文件魔数(magic bytes)的真实内容验证机制。这一设计缺陷使得攻击者可以通过简单修改HTTP请求头或文件扩展名来伪装恶意文件为图像文件,从而上传 webshell、恶意脚本或HTML文件,可能导致服务器被完全接管、存储型XSS攻击或敏感信息泄露等严重后果。
漏洞存在于turms-ai-serving/src/main/java/im/turms/ai/domain/ocr/controller/OcrController.java文件中。该控制器使用Spring框架的@FormData注解配合MediaTypeConst.IMAGE常量来限制文件上传类型,但这种验证方式存在严重缺陷。具体问题包括:(1) 仅验证Content-Type头:系统信任客户端提供的Content-Type请求头,攻击者可以将恶意文件的Content-Type设置为image/png、image/jpeg等图像MIME类型;(2) 仅验证文件扩展名:在某些检查场景下,系统可能仅检查文件扩展名是否为.jpg、.png等图像格式;(3) 缺少魔数验证:最关键的是,系统没有读取文件头部的魔数字节(如PNG文件以89 50 4E 47开头,JPEG以FF D8 FF开头)来验证文件的真实类型;(4) 上传文件可被访问:如果上传的恶意文件被存储在Web可访问目录且可被直接请求,将直接导致RCE或XSS等严重危害。攻击者可以利用此漏洞上传包含恶意代码的文件(如PHP webshell、HTML+XSS payload、可执行脚本等),然后通过访问上传的文件来执行恶意代码或触发攻击。