Skip to content

[Security] 触发器禁用操作缺少权限控制 — 普通用户可操作管理员功能 #432

@Clawiee

Description

@Clawiee

安全问题 / Bug 描述

问题概述

在触发器管理页面,没有管理权限的普通用户可以成功操作「禁用」触发器。这是一个权限控制缺陷,可能导致:

  1. 恶意用户故意禁用关键业务触发器
  2. 误操作导致业务流程中断
  3. 无法追溯是谁禁用了触发器

环境信息

  • 部署方式: 自部署(Docker)
  • 复现步骤:
    1. 使用一个没有管理权限的普通用户账号登录
    2. 进入触发器管理页面(/triggers 或相关路由)
    3. 找到任意触发器,点击「禁用」按钮
    4. 观察是否可以操作成功

预期行为

  • ❌ 普通用户不应该看到「禁用」按钮
  • ❌ 或者「禁用」按钮应该被禁用(disabled)
  • ❌ 或者点击后返回 403 权限错误

实际行为

  • ✅ 普通用户可以点击「禁用」按钮
  • ✅ 操作成功,触发器被禁用
  • ⚠️ 管理员可能不知道谁禁用了触发器

影响范围

角色 当前行为 期望行为
管理员 可以禁用 ✅ 正常
普通用户 可以禁用 ❌ 应该禁止
租户间隔离 需验证 需验证

技术分析(初步)

问题可能出在以下几个方面:

1. 前端层面

// 可能的问题代码
<Button onClick={handleDisable} disabled={false}>
  禁用
</Button>
// 缺少权限判断:disabled={user.isAdmin}

2. 后端层面

# 可能的问题代码
@app.post("/api/triggers/{id}/disable")
async def disable_trigger(trigger_id: str):
    trigger = get_trigger(trigger_id)
    # 缺少:if not current_user.is_admin: raise 403
    disable_trigger_in_db(trigger_id)
    return {"success": True}

3. 路由/权限中间件

可能路由配置没有添加管理员权限检查:

# 可能缺失的配置
- path: /api/triggers/{id}/disable
  methods: [POST]
  middleware: [auth]  # 只有 auth,缺少 admin_required

建议的修复方案

方案 1:前端权限控制(快速修复)

{user.isAdmin && (
  <Button onClick={handleDisable}>
    禁用
  </Button>
)}

方案 2:后端权限校验(必须)

@app.post("/api/triggers/{id}/disable")
async def disable_trigger(trigger_id: str, current_user: User):
    if not current_user.is_admin:
        raise HTTPException(status_code=403, detail="Admin required")
    # ... 继续处理

方案 3:添加审计日志

记录谁在什么时间禁用了哪个触发器:

audit_log.info(
    f"Trigger disabled: {trigger_id} by {current_user.id} at {datetime.now()}"
)

安全影响评估

  • 严重程度: 中-高
  • 利用难度: 低(任何登录用户都能操作)
  • 业务影响: 高(可能中断关键业务流程)
  • 数据泄露: 无直接泄露,但可能影响业务连续性

优先级建议

  • 优先级: High(安全相关)
  • 建议修复版本: 下一版本

相关配置/代码路径

请研发团队检查以下文件:

  • frontend/src/pages/triggers/ - 触发器前端页面
  • backend/app/api/triggers.py - 触发器后端 API
  • backend/app/middleware/auth.py - 权限中间件

注意: 此问题由用户在 2026-04-16 测试发现,用户刚测试的操作结果待确认能否恢复。

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