关键漏洞信息 漏洞概述 标题: Orion-ops user update endpoint allows horizontal privilege abuse 产品: Orion-ops (server component) 厂商主页: https://github.com/lijiahangmax/orion-ops 受影响/已修复版本: <= master commit 5925824997a3109651bbde07460958a7be249ed1 (没有官方发布的修复) 软件链接: https://github.com/lijiahangmax/orion-ops 提交人: sh7err@vEcho 漏洞类型 类型: 不当授权导致水平权限提升 (CWE-269) 根因 UserController#update 在处理 POST /orion/api/user/update 请求时,没有使用 @RequireRole 注解。它将 request.id 设置为调用者提供的值或当前用户 ID。由于控制器不覆盖攻击者提供的 ID,UserServiceImpl#updateUser 会更新任何用户记录。该服务仅保护 roleType 字段(需要管理员状态才能进行角色更改),但仍允许调用者设置 status、nickname、phone 和 email。因此,普通账户可以禁用管理员账户或篡改其元数据,只需发布另一个用户的 ID。 影响 任何已认证的用户可以禁用其他账户,包括管理员,通过将他们的状态设置为“禁用”,有效地导致合法操作员的服务拒绝。攻击者还可以覆盖 user_info 中的联系信息,或利用伪装数据执行钓鱼/社会工程攻击。 描述 Orion-ops 旨在通过 /user/update 使用户能够编辑自己的个人资料。然而,实现从未强制执行这一不变性。控制器信任提供的 id,服务层也不将其与 currents.getUserId() 进行比较。因此,任何会话都可以更新 user_info 中的任意行,只有 roleType 字段受到保护。这与预期设计相矛盾,并使低权限用户能够锁定管理员或篡改与审计相关的信息。 代码分析 orion-ops-api/orion-ops-web/src/main/java/cn/orionsec/ops/controller/UserController.java:86-128 orion-ops-api/orion-ops-service/src/main/java/cn/orionsec/ops/service/impl/UserServiceImpl.java:141-214 概念验证 1. 以普通用户身份(角色=开发者或操作员)进行身份验证。 2. 发送 POST /orion/api/user/update,请求体为 {"id":1,"status":2},其中 1 是管理员账户 ID,2 代表“禁用”。 3. API 返回成功,管理员无法登录,因为账户已被攻击者禁用。 建议的修复措施 需要管理员权限来修改调用者自己的记录以外的任何账户。 在服务层,对于非管理员会话,在应用更新之前,强制执行 request.id == Currents.getUserId()。 将 API 分裂为“自我个人资料更新”和“管理用户管理”端点,并进行明确的授权检查。