CVE-2026-43890Outline是一款允许进行协作文档编写的服务。在0.84.0至1.7.0版本中,其服务器端`server/routes/api/subscriptions/subscriptions.ts`文件的`subscriptions.create` API端点存在严重的权限绕过漏洞。该漏洞的根源在于授权逻辑的不一致性。当API请求同时包含`collectionId`和`documentId`参数时,路由处理器的授权逻辑仅对`collectionId`进行了权限检查,而完全忽略了`documentId`的验证。然而,实际执行订阅创建的底层命令`subscriptionCreator`却使用了未经验证的`documentId`来写入订阅记录。这种逻辑缺陷使得经过身份验证的低权限攻击者可以通过发送特制的请求,将自己的用户订阅到其本无权访问的受害文档。攻击者无需用户交互即可利用此漏洞,导致实例中任何团队的敏感文档信息可能被非法订阅和监控。该漏洞在CVSS v3.1中的评分为7.7,属于高危漏洞,目前已在Outline 1.7.1版本中修复。
该漏洞的技术细节集中在Outline服务端对于订阅请求的处理流程上,涉及文件包括`server/routes/api/subscriptions/subscriptions.ts`(路由层)、`server/routes/api/subscriptions/schema.ts`(模式层)以及`server/commands/subscriptionCreator.ts`(命令层)。
首先,在Schema验证层面,`schema.ts`仅使用`.refine()`方法强制要求请求体中至少包含`collectionId`或`documentId`中的一个,但并未强制这两个参数的互斥性。因此,从数据结构角度看,同时提交这两个参数是符合Schema定义的合法请求。
其次,在路由处理层面,代码逻辑存在严重的授权绕过。当请求到达路由处理器时,代码检查了`if (collectionId)`,如果该参数存在,则仅对`collectionId`所指向的集合进行权限验证。由于攻击者通常对自己所在的某个集合拥有访问权限,这一步验证通常会通过,而此时`documentId`虽然存在于请求中,却未被任何授权逻辑触碰。
最后,问题出在命令执行层面。`subscriptionCreator`命令在创建订阅记录时,直接读取请求中的`documentId`参数并将其用于数据库写入操作。由于`documentId`从未经过任何权限校验,攻击者可以将`collectionId`设置为自己有权限的ID,将`documentId`设置为目标受害文档的ID。
攻击者利用这种逻辑不一致性,成功欺骗服务器创建了针对受限文档的订阅记录。虽然这不一定直接赋予文档内容的读取权限,但违反了访问控制原则,可能导致信息泄露(如文档的存在性、更新通知等),属于典型的CWE-285(不正确的授权)漏洞。