Ash Framework: Filter authorization misapplies impossible bypass/runtime policies · CVE-2025-48043 · GitHub Advisory Database
摘要
高严重性 · GitHub已审核
发布日期:2025年10月10日 · 更新日期:2025年10月13日
受影响包:erlang ash (Erlang)
受影响版本:< 3.6.2
修复版本:3.6.2
漏洞描述
概述
在使用过滤器授权时,两种边缘情况可能导致策略编译器/授权器生成过于宽松的过滤器:
-
绕过策略:其条件在运行时永远无法通过,被编译为
OR(AND(condition, compiled_policies), NOT(condition))- 如果条件在运行时永远不可能为真,
NOT(condition)分支将评估为真值,整体表达式变得宽松
- 如果条件在运行时永远不可能为真,
-
运行时策略:简化为"无适用检查"(空SAT场景)的情况被当作空子句丢弃,而不是被视为false,这可能再次产生过于宽泛(宽松)的过滤器
这些漏洞可能导致读取操作返回本应被策略排除的记录。
影响范围
依赖基于过滤器的授权并定义以下内容的项目可能受到影响:
- 定义
bypass ... do ... end块,其条件仅在运行时可解析,并且在特定请求上下文中永远无法通过 - 定义运行时检查,这些检查为某个子句简化为空场景
主要受影响的操作:受过滤器策略保护的读取操作。非过滤器策略(例如硬性禁止)不受影响。
技术细节
此补丁修正了两种行为:
-
Ash.Policy.Policy.compile_policy_expression/1现在将绕过块视为AND(condition_expression, compiled_policies),而不是OR(AND(...), NOT(condition_expression))。这移除了当绕过条件永远无法通过时的宽松NOT(condition)逃生舱口。 -
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返回:unknown且runtime check/4在某些上下文中可能永远不会成功),且其后没有任何策略
一个快速的完整性测试是发出一个预期在此类绕过或运行时假条件下不返回任何行的读取,并验证它确实返回[]。包含的测试绕过与过滤器策略一起工作,展示了修正后的非宽松行为。
参考链接
- GHSA-7r7f-9xpj-jmr7
- https://nvd.nist.gov/vuln/detail/CVE-2025-48043
- ash-project/ash@66d8130
- https://github.com/ash-project/ash/releases/tag/v3.6.2
严重性评分
CVSS总体评分:8.6/10(高)
CVSS v4基础指标:
- 攻击向量:网络
- 攻击复杂度:低
- 攻击要求:无
- 权限要求:低
- 用户交互:无
- 脆弱系统影响指标:机密性-高,完整性-高,可用性-无
弱点
CWE-863:不正确的授权 产品在执行授权检查时没有正确执行检查,允许攻击者绕过预期的访问限制。
CVE ID:CVE-2025-48043
GHSA ID:GHSA-7r7f-9xpj-jmr7