Ash框架授权漏洞分析:过滤器策略错误导致数据泄露风险

分析Ash框架中过滤器授权机制的两个边缘案例漏洞,这些漏洞可能导致策略编译器生成过于宽松的过滤器,使得未经授权的数据能够通过查询返回,影响使用过滤授权的项目。

Ash框架过滤器授权漏洞分析

漏洞概述

CVE-2025-48043是一个影响Ash框架的高严重性安全漏洞,涉及过滤器授权机制中的策略错误应用问题。

技术细节

漏洞成因

该漏洞包含两个边缘案例:

  1. 绕过策略条件编译错误

    • 当使用运行时无法通过的绕过策略时,策略编译器会生成格式为OR(AND(condition, compiled_policies), NOT(condition))的表达式
    • 如果条件在运行时永远不可能为真,NOT(condition)分支将评估为真值,导致整个表达式变得宽松
  2. 运行时策略场景处理错误

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

影响范围

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

漏洞影响

这些漏洞可能导致读取操作返回本应被策略排除的记录,主要影响受过滤器策略保护的读取操作。非过滤器策略(如硬性禁止)不受影响。

修复方案

技术修复

补丁修正了两个行为:

  1. Ash.Policy.Policy.compile_policy_expression/1现在将绕过块处理为AND(condition_expression, compiled_policies),而不是OR(AND(...), NOT(condition_expression))

  2. Ash.Policy.Authorizer现在将空SAT场景(scenario == %{})视为false,确保不可能的场景不会意外扩大过滤器

相关代码变更

  • lib/ash/policy/policy.ex(绕过编译)
  • lib/ash/policy/authorizer/authorizer.ex(场景处理/auto_filter规范化)
  • 新增测试:test/policy/filter_condition_test.exs

临时解决方案

  1. 避免使用条件仅在运行时可决定且在某些上下文中可能永远为假的绕过策略
  2. 为敏感读取添加显式的最终forbid_if always()保护
  3. 尽可能将运行时未知检查替换为严格/编译时检查

检测方法

如果同时满足以下所有条件,用户可能受到影响:

  • 使用过滤器授权
  • 定义了具有access_type :runtime的绕过块,且其后没有任何策略
  • 定义了条件在运行时评估的绕过块

参考信息

  • GHSA-7r7f-9xpj-jmr7
  • NVD漏洞详情:CVE-2025-48043
  • 修复提交:ash-project/ash@66d8130
  • 发布版本:v3.6.2

安全评分

CVSS总体评分:8.6(高危) EPSS利用概率:0.09%(第26百分位) 相关弱点:CWE-863(不正确授权)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计