Ash框架授权漏洞分析:过滤器策略误用导致权限绕过

本文详细分析了Ash框架中的过滤器授权漏洞CVE-2025-48043,该漏洞在特定条件下会导致策略编译器生成过于宽松的查询过滤器,可能返回未经授权的数据。文章涵盖技术细节、影响范围和修复方案。

Ash Framework: Filter authorization misapplies impossible bypass/runtime policies · CVE-2025-48043 · GitHub Advisory Database

漏洞概述

严重程度:高
CVSS评分:8.6

受影响版本: < 3.6.2
修复版本: 3.6.2

漏洞描述

摘要

在使用过滤器授权时,两种边缘情况可能导致策略编译器/授权器生成过于宽松的过滤器:

  1. 绕过策略问题:在运行时永远无法通过的绕过策略被编译为OR(AND(condition, compiled_policies), NOT(condition))。如果条件在运行时永远无法为真,NOT(condition)分支将评估为真值,整个表达式变得宽松。

  2. 运行时策略问题:简化为"无适用检查"(空SAT场景)的运行时策略场景被当作空子句丢弃,而不是被视为false,这同样可能产生过于宽松的过滤器。

这些漏洞可能导致读取操作返回本应被策略排除的记录。

影响范围

依赖基于过滤器的授权并定义以下内容的项目可能受到影响:

  • 其条件仅在运行时可解析且在特定请求上下文中永远无法通过的bypass ... do ... end
  • 简化为空场景子句的运行时检查

可能无意中生成宽松的查询过滤器,从而返回未经授权的数据。

主要受影响的操作: 受过滤器策略保护的读取操作。非过滤器策略(例如硬性禁止)不受影响。

技术细节

此补丁修正了两种行为:

  1. Ash.Policy.Policy.compile_policy_expression/1现在将绕过块视为AND(condition_expression, compiled_policies)而不是OR(AND(...), NOT(condition_expression))。这移除了当绕过条件永远无法通过时的宽松NOT(condition)逃生舱口。

  2. Ash.Policy.Authorizer现在将空SAT场景(scenario == %{})视为false,确保不可能的场景不会塌陷为无操作并无意中扩大过滤器。在构建auto_filter片段时,归约器还一致地将nil → false标准化。

相关修改文件:

  • lib/ash/policy/policy.ex(绕过编译)
  • lib/ash/policy/authorizer/authorizer.ex(场景处理/auto_filter标准化)
  • 新增测试:test/policy/filter_condition_test.exs(RuntimeFalsyCheck, RuntimeBypassResource)验证修正后的行为

临时解决方案

  • 避免使用条件仅在运行时可决定且在某些上下文中可能永远为假的绕过策略;对于这些情况,优先使用没有绕过的显式authorize_if/forbid_if块。
  • 在敏感读取操作中添加显式的最终forbid_if always()保护作为额外保障,直到用户可以升级。
  • 在可行的情况下,将运行时未知检查替换为严格/编译时检查,或重构以避免空SAT场景。

如何判断是否受影响

如果以下所有条件都成立,用户很可能受到影响:

  • 使用过滤器授权;且
  • 定义具有access_type :runtime且后面没有任何策略的绕过块;或
  • 定义其条件在运行时评估(例如,strict_check/3返回:unknownruntime check/4在某些上下文中可能永远不会成功)且后面没有任何策略的绕过块

一个快速的完整性测试是发出预期在此类绕过或运行时假条件下不返回任何行的读取操作,并验证它确实返回[]。包含的测试绕过与过滤器策略一起工作展示了修正后的非宽松行为。

参考链接

漏洞信息

发布时间: 2025年10月10日
最后更新: 2025年10月13日
弱点类型: CWE-863 不正确授权

致谢:

  • 报告者:maennchen
  • 修复审查者:zachdaniel
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计