Ash框架授权绕过漏洞分析:CVE-2025-48044技术详解

本文详细分析Ash框架中存在的授权绕过漏洞CVE-2025-48044,该漏洞在绕过策略条件评估为真时会导致授权检查失效,影响版本3.6.3至3.7.0,已发布修复版本3.7.1。

Ash框架授权绕过漏洞分析:CVE-2025-48044

漏洞概述

CVE ID: CVE-2025-48044
严重程度: 高危 (CVSS 8.6)
影响版本: Ash 3.6.3 至 3.7.0
修复版本: Ash 3.7.1

漏洞描述

问题摘要

当绕过策略的条件评估为真但其授权检查失败,且没有其他适用策略时,绕过策略会错误地授权请求。

影响

具有绕过策略的资源在以下情况下可能被未经适当授权访问:

  • 绕过条件评估为真
  • 绕过授权检查失败
  • 存在其他策略但其条件不匹配

技术细节

漏洞代码位置

lib/ash/policy/policy.ex:69

1
2
3
4
5
{%{bypass?: true}, cond_expr, complete_expr}, {one_condition_matches, all_policies_match} ->
  {
    b(cond_expr or one_condition_matches),  # <- 漏洞:仅使用条件
    b(complete_expr or all_policies_match)
  }

授权决策逻辑

最终授权决策为:one_condition_matches AND all_policies_match

当绕过条件为真但绕过策略失败,且后续策略具有不匹配条件时:

  • one_condition_matches = cond_expr(绕过条件)= true(漏洞 - 应检查绕过是否实际授权)
  • all_policies_match = (complete_expr OR NOT cond_expr) 对于每个策略

对于不匹配的策略:(false OR NOT false) = true(策略不适用)

最终结果:true AND true = true(错误授权)

绕过条件单独满足"至少一个策略适用",即使绕过未能授权。

修复方案

主要修复

将第69行的cond_expr替换为complete_expr

1
2
3
4
5
{%{bypass?: true}, _cond_expr, complete_expr}, {one_condition_matches, all_policies_match} ->
  {
    b(complete_expr or one_condition_matches),  # <- 已修复
    b(complete_expr or all_policies_match)
  }

一致性修复

第52行也应更新以保持一致性:

1
2
3
4
5
{%{bypass?: true}, _cond_expr, complete_expr}, {one_condition_matches, true} ->
  {
    b(complete_expr or one_condition_matches),  # <- 保持一致性
    complete_expr
  }

漏洞验证

策略配置示例

1
2
3
4
5
6
7
8
9
policies do
  bypass always() do
    authorize_if actor_attribute_equals(:is_admin, true)
  end

  policy action_type(:read) do
    authorize_if always()
  end
end

非管理员用户可以执行创建操作(本应被拒绝)。

测试用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
test "bypass policy bug" do
  policies = [
    %Ash.Policy.Policy{
      bypass?: true,
      condition: [{Ash.Policy.Check.Static, result: true}],  # 条件 = true
      policies: [
        %Ash.Policy.Check{
          type: :authorize_if,
          check: {Ash.Policy.Check.Static, result: false},  # 策略 = false
          check_module: Ash.Policy.Check.Static,
          check_opts: [result: false]
        }
      ]
    },
    %Ash.Policy.Policy{
      bypass?: false,
      condition: [{Ash.Policy.Check.Static, result: false}],
      policies: [
        %Ash.Policy.Check{
          type: :authorize_if,
          check: {Ash.Policy.Check.Static, result: true},
          check_module: Ash.Policy.Check.Static,
          check_opts: [result: true]
        }
      ]
    }
  ]

  expression = Ash.Policy.Policy.expression(policies, %{})
  
  assert expression == false
  # 期望:false(拒绝)
  # 主分支实际结果:true(错误授权)
end

参考信息

安全指标

CVSS v4 基础指标

  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 所需权限: 低
  • 用户交互: 无
  • 机密性影响: 高
  • 完整性影响: 高
  • 可用性影响: 无

EPSS 评分

  • 被利用概率: 0.09%(第26百分位)

弱点分类

  • CWE: CWE-863 - 不正确授权

致谢

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