CVE-2026-43886Outline是一款用于协作文档的服务。在0.84.0至1.6.1版本中,存在一个严重的逻辑漏洞。该漏洞源于OAuthInterface.validateScope()方法在验证OAuth范围时使用了错误的逻辑。具体来说,代码使用了Array.some()函数进行校验,导致只要请求的scope数组中存在任意一个合法的scope,系统就会默认接受整个scope数组,而不会拒绝非法的scope请求。攻击者可以利用这一缺陷,通过在请求中构造包含通配符`*`的scope(例如`scope=read *`),成功绕过验证机制。这使得攻击者能够将一个原本只读的OAuth令牌升级为拥有完全不受限的API访问权限。利用该漏洞,攻击者可以执行写入、删除以及管理员等高危操作,对系统安全造成严重威胁。
该漏洞的核心在于Outline的OAuth接口实现中存在一个逻辑缺陷,具体位于`OAuthInterface.validateScope()`函数。该函数的设计初衷是验证客户端请求的OAuth权限范围是否均已被授权。然而,开发者错误地使用了JavaScript的`Array.some()`方法来遍历和校验scope数组。
`Array.some()`的语义是“只要数组中至少有一个元素满足条件,即返回true”。在正常的OAuth流程中,如果用户只授权了`read`权限,而应用请求了`read, delete`,验证逻辑应当检查请求中的每一项是否都在允许列表中。但由于使用了`Array.some()`,当应用请求`['read', '*', 'admin']`时,系统检测到`read`是合法的,便直接返回验证通过,忽略了`*`和`admin`这两个非法或未授权的高危scope。
攻击者利用这一逻辑漏洞,可以通过精心构造的OAuth授权请求,将通配符`*`注入到scope参数中。在OAuth标准中,`*`通常代表所有权限。一旦该请求通过验证,服务器颁发的令牌将携带`*` scope。此后,攻击者利用该令牌调用API时,服务端会将该令牌视为拥有超级管理员权限,从而允许执行包括文档修改、删除、用户管理在内的所有敏感操作。这是一个典型的权限提升漏洞,CVSS 3.1评分为8.2,属于高危漏洞。