# 漏洞总结:OWASP DefectDojo 授权绕过 (IDOR) ## 漏洞概述 **漏洞名称**:Authorization Bypass / IDOR - Access to Other People's Risk Acceptances via raid Parameter Substitution **漏洞类型**:越权访问 (IDOR) **受影响版本**:≤ 2.55.4 (已在 2.56.0 修复) **报告人**:noname13371 **报告日期**:2026年2月23日 **修复日期**:2026年3月2日 **核心问题**: 系统仅对 `engagement` (项目) 进行了权限校验,但在加载 `risk_acceptance` (风险接受) 时,未验证该风险接受是否属于当前用户有权访问的项目。攻击者可以通过修改 `raid` 参数访问其他项目的风险接受数据。 ## 影响范围 * **读取**:查看其他产品的已接受发现、笔记、详情。 * **操作**:编辑、过期、恢复、删除他人的风险接受。 * **数据泄露**:通过 `accepted_findings` 可获取其他产品的发现名称、严重程度和描述。 ## 漏洞代码分析 页面指出以下函数存在漏洞,仅校验了 `eid` (engagement ID),未校验 `raid` (risk_acceptance ID) 的归属权: ```python # will only be called by view_risk_acceptance and edit_risk_acceptance def view_edit_risk_acceptance(request, eid, raid, *, edit_mode=False): risk_acceptance = get_object_or_404(RiskAcceptance, pk=raid) # -- No check that raid belongs to eid! ``` ## 修复方案 **修复状态**:已在 PR #14375 中合并 (2026年2月26日)。 **修复逻辑**:在所有受影响的功能中添加了正确的所有权验证,确保 `raid` 必须属于 `eid`。 **正确的保护实现示例**: ```python user_is_authorized(Engagement, Permissions.Engagement_View, "eid") def download_risk_acceptance(request, eid, raid): ... risk_acceptance = get_object_or_404(RiskAcceptance, pk=raid) # Ensure the risk acceptance is under the supplied engagement if not Engagement.objects.filter(risk_acceptance=risk_acceptance, id=eid).exists(): raise PermissionDenied ... ```