
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/openprojectOpenProject 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_identitiesdef 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 项目文件夹访问权限正是这类映射缺陷的另一个具体表现。当前源码中的多重防线值得一提的是当前仓库中的实现已经为这类问题建立了多重防御机制从数据模型、契约校验到同步服务层层设防可作为理解修复方向的参考项目文件夹模式枚举ProjectStorage通过project_folder_mode枚举区分三种模式——inactive停用、manual手动管理、automatic自动管理且规定每个项目与存储之间只允许存在一条ProjectStorage记录validates :project, uniqueness: { scope: :storage }。见 project_storage.rb。契约层防止文件夹 ID 冲突ProjectStorages::BaseContract中内置project_folder_id_unique校验——对于自动管理模式若同一存储下已存在相同project_folder_id的ProjectStorage记录则直接报错防止一个项目接管另一个项目已拥有的文件夹。见 base_contract.rb。同步服务二次防碰撞NextcloudManagedFolderPermissionsService#set_folder_permissions在执行前再次调用project_folder_id_collision?检查文件夹 ID 冲突防御纵深避免契约被绕过或 DB 被直接写入冲突数据冲突时拒绝覆盖 ACL。见 nextcloud_managed_folder_permissions_service.rb。自动化同步链路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 镜像中缺失 Subversionsvn可执行文件的问题。升级注意事项综合以上修复内容升级到 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、packagerDebian/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),仅供参考