APITable: fail-open NodePermissionGuard 允许附件写入被拒绝的私有数据表
通过电子邮件于 6 月 13 日报告 - 没有回复: 我报告了一个开放授权问题,已通过真实的守护逻辑(未变化)驱动后端拒绝路径进行了确认。这与之前的内部服务器发现不同;它位于 Node.js 房间服务器融合守护中。`NodePermissionGuard.matchPermissions`(packages/room-server/src/fusion/middleware/guard/node.permission.guard.ts:55-65) 执行 `try { nodePermission = await getNodeRole(...) } catch(e){}`,然后 `if (nodePermission) {...} return true`。当后端拒绝私有节点时,它会抛出 BusinessException(NODE_ACCESS_DENIED)=601;房间服务器拦截器的 responseCodeHandler(601)(`: never`) 总是抛出错误,这会导致空的捕获 -> nodePermission 为 undefined -> 循环跳过 -> 守护返回 true。两个可编辑附件端点(预签名 URL ~160,附件 POST ~186)依赖于此守护(ApiDatasheetGuard 仅检查成员身份)。我观察到的情况是:编译未修改的守护并调用 canActivate() 方法,使用 getNodeRole 方法,该方法抛出了类似于返回 601 路径的 `true`,尽管被拒绝。反射器提供了真实的 `['editable']` 元数据。影响:被拒绝的私有数据表中的成员仍然可以上传附件/获取对其的预签名 URL。CWE-636/862, ~4.3。新增: 0 项建议,没有匹配的问题。建议的修复:在捕获中关闭(以及在 undefined 上),通过抛出 api_node_permission_error。提供了一个 PoC。
内容来源: apitable/apitable