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

本文详细分析Ash Framework中过滤器授权机制的两种边缘情况漏洞,这些漏洞可能导致策略编译器生成过于宽松的过滤器,从而返回未经授权的数据。文章涵盖技术细节、影响范围和修复方案。

Ash Framework:过滤器授权错误应用不可绕过的绕过/运行时策略

漏洞概述

CVE-2025-48043 是一个在Ash Framework中发现的高危安全漏洞,涉及过滤器授权机制中的策略错误应用问题。

受影响版本

  • 受影响版本:< 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 现在将绕过块视为:

    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)验证修正后的行为

临时解决方案

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

判断是否受影响

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

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

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

参考信息

安全评分

  • 严重等级:高
  • CVSS总体评分:8.6/10
  • EPSS评分:0.104%(被利用概率估计)

弱点分类

  • CWE-863:不正确的授权
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计