OpenProject 13.0.2 版本发布详解:Nextcloud 项目文件夹越权漏洞修复与完整缺陷清单
2026/9/16 11:58:05 网站建设 项目流程

OpenProject 13.0.2 版本发布详解:Nextcloud 项目文件夹越权漏洞修复与完整缺陷清单

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

OpenProject 13.0.2 于 2023-09-07 发布,是一个以安全修复为核心的补丁版本。该版本重点修复了 13.0 新引入的 Nextcloud「Project folder」功能中一个被官方标记为"高优先级"的越权访问漏洞——用户可能在未获授权的情况下获得其他项目文件夹的访问权限,官方强烈建议所有使用该功能的实例立即升级。本文以官方发布说明为主体,结合仓库中modules/storages模块的源码实现、数据模型与测试用例,逐条解析该安全漏洞的成因与防护机制,并完整梳理本次发布包含的 15 项缺陷修复与行为变更,帮助运维与开发人员评估升级风险并理解底层原理。

版本概览与升级建议

项目内容
版本号13.0.2
发布日期2023-09-07
版本类型补丁版本(bugfix release)
升级建议强烈推荐,尤其是已启用 Nextcloud「Project folder」功能的实例应立即更新

官方在发布说明中明确指出:"本次发布包含若干缺陷修复,其中一项我们视为高优先级,建议升级到最新版本。"该高优先级问题仅影响使用了 Nextcloud 集成中Project folder(项目文件夹)功能的 OpenProject 实例,而该功能是在不久前的 13.0 版本中才引入的。

高优先级安全修复:Nextcloud 项目文件夹越权访问漏洞

漏洞行为与触发条件

根据发布说明,该漏洞的表现为:

  • 潜在影响:漏洞可能导致 OpenProject 用户访问到其本不应有权限的项目文件夹;
  • 触发前提:用户必须合法拥有至少一个项目文件夹的访问权限,这些项目文件夹的权限会被错误地复制到其他项目文件夹上;
  • 影响范围限定:仅影响那些已通过 OAuth 向 OpenProject 授予其 Nextcloud 用户访问权的用户;未获得任何项目文件夹访问权限、且未通过 OAuth 授权访问 Nextcloud 的用户不受影响。

换言之,攻击面并非"任意用户可越权",而是"拥有 A 项目文件夹权限的用户被错误地同时授予了 B 项目文件夹权限",属于典型的一处 ACL 计算与同步逻辑缺陷。

源码层面的根因印证

从当前仓库modules/storages模块的实现可以还原该漏洞对应的权限同步逻辑。自动管理的项目文件夹权限由NextcloudManagedFolderPermissionsService负责下发,其call方法按两阶段执行:

def call with_tagged_logger([self.class.name, "storage-#{@storage.id}"]) do apply_permissions_to_folders.bind { add_remove_users_to_group } @result end end

对应文件:nextcloud_managed_folder_permissions_service.rb

其中apply_permissions_to_folders遍历该存储下所有automatic模式、已激活且有项目文件夹的ProjectStorage记录,逐一调用set_folder_permissions为每个文件夹计算 ACL 并同步到 Nextcloud。而set_folder_permissions中计算"哪些用户应获得文件夹权限"的核心方法是project_remote_identities

def project_remote_identities(project_storage) user_remote_identities = remote_identities.where.not(id: admin_remote_identities).order(:id) if project_storage.project.public? && ProjectRole.non_member.permissions.intersect?(FILE_PERMISSIONS) user_remote_identities else user_remote_identities.where(user: project_storage.project.users) end end

对应文件:nextcloud_managed_folder_permissions_service.rb

从源码结构可以推断,权限同步涉及"远端身份(RemoteIdentity)→ 本地用户 → 项目成员"之间的映射关系,一旦该映射在某个边界条件下判断失误(例如身份归属、项目成员集合计算不精确),就可能把某个项目文件夹的权限集合错误地应用到其他文件夹。发布说明中提到的"该文件夹的权限被错误地复制到其他项目文件夹"与权限计算结果的错配直接相关。同一发布周期内的 [#49956]「Accidentally granting access to Nextcloud project folders that are no members of the project」(意外授予了不属于该项目成员的 Nextcloud 项目文件夹访问权限)正是这类映射缺陷的另一个具体表现。

当前源码中的多重防线

值得一提的是,当前仓库中的实现已经为这类问题建立了多重防御机制,从数据模型、契约校验到同步服务层层设防,可作为理解修复方向的参考:

  1. 项目文件夹模式枚举ProjectStorage通过project_folder_mode枚举区分三种模式——inactive(停用)、manual(手动管理)、automatic(自动管理),且规定每个项目与存储之间只允许存在一条ProjectStorage记录(validates :project, uniqueness: { scope: :storage })。见 project_storage.rb。

  2. 契约层防止文件夹 ID 冲突ProjectStorages::BaseContract中内置project_folder_id_unique校验——对于自动管理模式,若同一存储下已存在相同project_folder_idProjectStorage记录则直接报错,防止一个项目"接管"另一个项目已拥有的文件夹。见 base_contract.rb。

  3. 同步服务二次防碰撞NextcloudManagedFolderPermissionsService#set_folder_permissions在执行前再次调用project_folder_id_collision?检查文件夹 ID 冲突(防御纵深,避免契约被绕过或 DB 被直接写入冲突数据),冲突时拒绝覆盖 ACL。见 nextcloud_managed_folder_permissions_service.rb。

  4. 自动化同步链路ManagedFolderSyncService将"创建远端文件夹"(prepare_remote_folders)与"下发文件夹权限"(apply_permissions_to_folders)串行执行,并在结束时汇总错误计数。见 managed_folder_sync_service.rb。

测试覆盖印证

仓库中的规格测试对权限计算做了细粒度断言。以nextcloud_managed_folder_permissions_service_spec.rb为例,它构造了管理员(admin)、多项目用户(multiple_projects_user)、单项目用户(single_project_user)、OIDC 管理员以及含非法字符的项目名、非激活项目、公开项目等多种场景,并断言同步后远端文件夹的权限集合精确匹配预期(contain_exactly逐项比对用户与权限)。见 nextcloud_managed_folder_permissions_service_spec.rb。这类"按人按文件夹精确比对 ACL"的测试模式,正是防止越权回归的有效手段。

完整缺陷修复与变更清单

除高优先级安全修复外,13.0.2 还包含以下修复与变更(编号为社区工作包编号):

性能类修复

  • AppSignal 性能问题:MessagesController#show([#47871]):修复了消息详情页面的性能问题(AppSignal 监控报告);
  • API eager loading 失效导致性能下降([#49915]):修复 API 部分场景下 eager loading 未生效、进而导致性能退化的问题。

文件链接与存储集成类

  • 迁移文件链接的活动记录文案不理想([#49770]):优化了迁移后的文件链接在活动记录(activity entry)中的显示文本;
  • 意外授予非项目成员 Nextcloud 项目文件夹访问权限([#49956]):与高优先级安全漏洞同属项目文件夹权限映射问题;
  • 禁止为项目启用配置错误的存储([#49218],行为变更):当存储的配置校验(Storage#configured?/configuration_checks,见 nextcloud_storage.rb)不通过时,不再允许将其启用关联到项目;
  • 移除存储设置页面的"show"视图([#49676],行为变更):简化存储管理界面,去掉冗余的只读展示页。

权限与账户安全类

  • share_calendars权限未注册依赖与契约动作([#49833]):修复该权限在契约层与依赖注册中的缺失;
  • OAuth 映射既有用户时大小写敏感,与注册流程不一致([#49834]):修复 OAuth 关联既有用户时按大小写敏感的登录名匹配、而注册流程不敏感的不一致问题;
  • 受邀未激活账户似乎可重置密码([#49836]):修复受邀但尚未激活的账户存在可重置密码的表象(安全加固)。

UI 与展示类

  • 图表条柱不再显示工作包数量([#49767]):修复了图表中条柱上显示工作包数量(number of wp)的问题;
  • 浏览器窗口变窄时描述框高度过小([#49831]):修复响应式布局下描述文本容器高度不足的样式问题。

其他修复

  • 修复未翻译字符串([#49848])与补齐全部缺失翻译([#49937]):两轮 i18n 收尾;
  • 仓库切换分支无效果([#49852]):修复 repository 分支切换不生效的问题;
  • 设置OPENPROJECT_HOST__NAME环境变量时packager:postinstall任务失败([#49867]):修复打包器安装后任务在特定环境变量配置下崩溃的问题(与 packaging 目录下的打包脚本相关);
  • Docker 实例在 v13 中没有 svn([#49930]):修复 Docker 镜像中缺失 Subversion(svn)可执行文件的问题。

升级注意事项

综合以上修复内容,升级到 13.0.2 时建议关注以下几点:

  • Nextcloud「Project folder」用户优先升级:凡是已启用 13.0 引入的 Project folder 功能、且用户已通过 OAuth 授权访问 Nextcloud 的实例,应立即升级以消除越权风险;
  • 配置错误的存储将无法启用:升级后,若某存储的configuration_checks校验不通过(例如 Nextcloud 缺少 OAuth client / OpenProject OAuth application / host 或 name 未配置,见 nextcloud_storage.rb),将无法再将其启用关联到项目,需先修正存储配置;
  • Docker 部署注意 svn 回归:若在 Docker 环境中依赖 svn 仓库集成,需确认升级后的镜像包含 svn 支持(对应 [#49930] 的修复);
  • 打包安装注意环境变量:若使用 packager 方式安装且设置了OPENPROJECT_HOST__NAME环境变量,需确认 postinstall 任务可正常执行(对应 [#49867] 的修复)。

OpenProject 支持 Docker、packager(Debian/Ubuntu)等多种部署方式,具体安装与升级流程可参考 安装与运维文档 与 docker 部署目录。

贡献致谢

本次发布特别感谢社区成员 Bernhard Kroll、Mario Haustein、Markus K. 在漏洞报告与定位修复过程中提供的帮助。发布说明亦对所有报告缺陷、协助定位并提供修复的社区成员致以谢意。

延伸阅读:相关源码入口

  • Storages 模块根目录:Nextcloud 等项目文件存储集成全部实现;
  • ProjectStorage 模型:项目-存储关联与文件夹模式定义;
  • NextcloudStorage 模型:Nextcloud 存储配置与校验;
  • ManagedFolderSyncService:自动化项目文件夹同步编排;
  • NextcloudManagedFolderPermissionsService:文件夹 ACL 同步核心实现;
  • ProjectStorages::BaseContract:项目文件夹契约校验(含 ID 冲突防护);
  • 权限同步规格测试:越权回归的测试防线。

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询