关键漏洞信息 影响产品 Orion-ops (服务器组件) 漏洞类型 不当授权导致水平权限提升 (CWE-269) 影响版本 <= master commit 5925824997a3109651bbde07460958a7be249ed1 (没有官方修复发布) 根因 UserController#update 暴露了 POST /orion/api/user/update 而没有 @RequireRole。它将 request.id 设置为调用者提供的值或当前用户 ID。因为控制器不覆盖攻击者提供的 ID,UserServiceImpl#updateUser 会欣然更新任何用户记录。服务只保护 roleType 字段 (角色变更需要管理员状态),但仍允许调用者设置 status、nickname、phone 和 email。因此,普通账户可以通过发布另一个用户的 ID 来禁用管理员账户或篡改其元数据。 描述 Orion-ops 旨在让用户 /user/update 编辑他们自己的配置文件。然而,实现从未强制执行该不变量。控制器信任提供的 id 且服务层不将其与 currents.getUserId() 进行比较。因此,任何会话都可以更新 user_info 中的任何行,只有 roleType 字段受到保护。这与预期设计相矛盾,使低权限用户能够锁定管理员或篡改与审计相关的数据。 证明概念 1. 以普通用户身份进行认证 (角色 = 开发者或运营商)。 2. 发送 POST /orion/api/user/update ,附带 {"id":1,"status":2},其中 1 是管理员账户 ID,2 代表“禁用”。 3. API 返回成功,管理员因为账户被攻击者禁用而无法再登录。 建议的修复 需要管理员权限才能修改调用者自己的记录以外的任何账户。 在服务层中,对于非管理员会话,在应用更新之前强制执行 request.id == Currents.getUserId()。 将 API 分为“自我配置文件更新”和“管理用户管理”端点,并带有明确的授权检查。