AshPostgres 空更新操作策略绕过漏洞深度解析

本文详细分析了CVE-2024-49756漏洞,该漏洞存在于AshPostgres中,在特定条件下可能导致策略检查被绕过,从而执行本应被阻止的副作用操作。文章包含漏洞影响、触发条件、修复方案和检测脚本信息。

CVE-2024-49756:AshPostgres 空原子非批量操作策略绕过漏洞

漏洞概述

在 AshPostgres 中,存在一个与空、原子、非批量操作相关的策略绕过漏洞,该漏洞可能导致副作用被意外执行。

严重程度:中等 GitHub 状态:已审核 发布时间:2024年10月23日 更新日期:2025年4月14日

受影响的包

  • 生态系统:Erlang
  • 包名ash_postgres
  • 受影响版本:>= 2.0.0, < 2.4.10
  • 已修复版本:2.4.10

漏洞描述与影响

非常特定的情况下,更新操作的策略检查可能被跳过。这种情况仅发生在“空”的更新操作上(即没有更改任何字段),并会导致其钩子(副作用)在不应执行时被执行。请注意,此漏洞不允许用户读取他们无权访问的新数据,只允许触发一个用户本应无法触发的副作用

要使你的应用受到此漏洞影响,必须同时满足以下所有条件:

  1. 存在一个更新操作,其对应的资源不包含任何具有“更新默认值”的属性(例如 updated_at 时间戳)。
  2. 该更新操作可以原子方式执行。
  3. 该操作没有设置 require_atomic? false
  4. 该操作至少有一个授权器(通常是 Ash.Policy.Authorizer)。
  5. 该操作至少有一个变更(在资源的变更块中或操作本身中)。副作用就是在这里被执行的。

漏洞检测与手动检查

关于操作调用

  • 你是否曾经手动调用此操作(例如使用 Ash.update)?
  • 注意:AshGraphqlAshJsonApi 的操作调用不受影响,因为它们使用的是 Ash.bulk_update

如果存在手动调用,请检查:

  • 是否存在使用零输入调用该操作,并且不产生任何更改字段的情况?
  • 如果存在,它是否会产生副作用?(这意味着你有一个 after_action 钩子来调用其他资源。)
  • 如果存在,该副作用是否会绕过另一个资源的策略?(例如,使用 authorize?: false,或未提供相同的执行者。)

检测脚本

  • 上述横线以上的条件可以通过提供的脚本进行检查。
  • 横线以下的条件必须手动检查。
  • 该脚本可能存在误报,但不会有漏报。因此,如果你运行脚本后显示“未发现潜在漏洞”,那么你只需要更新 ash_postgres 即可。
  • 脚本链接:https://gist.github.com/zachdaniel/e49166b765978c48dfaf998d06df436e

修复与解决方案

  • 补丁:此问题已在 ash_postgres 的 2.4.10 版本中修复。
  • 临时解决方案
    1. 使用脚本确定没有任何操作是易受攻击的。
    2. 为任何可能受影响的更新操作添加 require_atomic? false
    3. 将受影响操作的任何 Ash.update 用法替换为 Ash.bulk_update
    4. 为你的操作添加一个更新时间戳。

参考信息

安全评分 (CVSS v3.1)

  • 总体评分:5.3(中等)
  • 向量:AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
  • 基本指标
    • 攻击向量:网络
    • 攻击复杂度:低
    • 所需权限:无
    • 用户交互:无
    • 影响范围:未改变
    • 机密性影响:无
    • 完整性影响:低
    • 可用性影响:无

弱点 (CWE)

  • CWE-552:对外部各方可访问的文件或目录

致谢

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