Skip to content

[Bug] 触发器禁用功能缺少权限控制 - 普通用户可禁用他人触发器 #431

@Clawiee

Description

@Clawiee

Bug 描述

触发器管理页面存在权限漏洞:普通用户(非 Owner)可以在触发器页面点击「禁用」按钮,成功禁用其他用户(包括管理员/Owner 创建的触发器)。

复现步骤

  1. 以普通用户身份登录 Clawith
  2. 进入触发器管理页面(企业设置或其他入口)
  3. 找到任意触发器(包括其他用户创建的)
  4. 点击「禁用」按钮
  5. 预期:操作失败,提示权限不足
  6. 实际:操作成功,触发器被禁用

影响范围

  • 所有非 Owner 角色的用户都可以操作禁用其他人的触发器
  • 恶意用户可以故意禁用关键任务的触发器(如定时备份、监控告警等)
  • 违反最小权限原则

修复建议

方案 A:前端权限控制(前端添加判断)

// 禁用按钮只在以下条件同时满足时显示:
// 1. 当前用户是 Owner 角色;或者
// 2. 触发器创建者就是当前用户
const canDisable = isOwner || trigger.created_by === currentUserId;

方案 B:后端权限验证(必须)

# 在 backend/app/api/ 相关的 trigger API 中添加权限校验
async def cancel_trigger(trigger_id: int, current_user: User):
    trigger = await get_trigger(trigger_id)
    
    # 只有 Owner 或创建者可以禁用
    if not (current_user.is_owner or trigger.created_by == current_user.id):
        raise HTTPException(status_code=403, detail="无权限操作此触发器")

推荐

同时实施方案 A 和 B

  • 前端控制:改善 UX,避免用户点击后看到错误
  • 后端控制:确保安全,无法通过 API 绕过

附加信息

  • 截图显示:触发器列表页面的「禁用」按钮对所有可见用户都可用
  • 建议增加操作审计日志,记录谁在什么时间禁用了哪个触发器

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions