Ash框架授权绕过漏洞分析:当绕过策略条件评估为真时

Ash授权绕过漏洞分析(CVE-2025-48044)

漏洞概述

Ash框架在特定条件下存在授权绕过漏洞,当绕过策略的条件评估为真但其授权检查失败,且没有其他适用策略时,系统会错误地授权请求。

受影响版本

  • 受影响版本:>= 3.6.3, <= 3.7.0
  • 已修复版本:3.7.1

漏洞详情

漏洞位置

lib/ash/policy/policy.ex:69

漏洞代码

elixir 复制代码
{%{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

elixir 复制代码
{%{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行也应更新以保持一致性:

elixir 复制代码
{%{bypass?: true}, _cond_expr, complete_expr}, {one_condition_matches, true} ->
  {
    b(complete_expr or one_condition_matches),  # <- 为保持一致性
    complete_expr
  }

漏洞验证

策略配置示例

elixir 复制代码
policies do
  bypass always() do
    authorize_if actor_attribute_equals(:is_admin, true)
  end

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

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

测试用例

elixir 复制代码
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总体评分:8.6(高危)
  • EPSS评分:0.104%(第29百分位)

参考链接

致谢

  • 报告者:jechol
  • 分析师:maennchen
  • 修复审查者:zachdaniel
相关推荐
测试员周周5 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
K姐研究社7 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu7 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
传说故事8 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
北京耐用通信8 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区8 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
小a彤9 小时前
GE 在 CANN 五层架构中的位置
人工智能·深度学习·transformer
前端若水9 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Upsy-Daisy9 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
企学宝9 小时前
企学宝5月专题课程丨《OpenClaw AI 智能体实战营:从零基础部署到全场景自动化落地》
人工智能·ai·企业培训