AshPostgres 策略绕过漏洞深度解析:空更新操作中的副作用风险

本文详细分析了CVE-2024-49756漏洞,该漏洞存在于AshPostgres中,允许攻击者在特定条件下绕过资源更新策略,执行未授权的副作用操作。文章涵盖了漏洞影响、触发条件、修复方案及检测脚本。

AshPostgres 空原子非批量操作中的策略绕过漏洞 (CVE-2024-49756)

漏洞概述

此漏洞存在于 AshPostgres 中,涉及在特定情况下可能跳过更新操作的策略检查。这仅发生在“空”更新操作(没有更改任何字段)中,并会允许其钩子(副作用)在不应该执行时被执行。需要注意的是,这不会允许读取用户不应有权访问的新数据,只会触发用户本不应能够触发的副作用。

漏洞影响

漏洞类型:策略绕过漏洞。

受影响对象:在特定配置下使用 AshPostgres 的应用。

触发条件

此漏洞仅在满足所有以下条件的更新操作中触发:

  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_postgres2.4.10 版本中得到修复。

临时解决方案: 您可以采取以下任一措施:

  1. 使用脚本确认没有任何操作易受攻击。
  2. 为任何可能受影响的更新操作添加 require_atomic? false
  3. 将所有受影响的 Ash.update 调用替换为 Ash.bulk_update
  4. 为您的操作添加一个更新时间戳字段。

参考资料

  • 原始报告/发现:https://elixirforum.com/t/empty-update-action-with-policies/66954
  • 修复提交:ash-project/ash_postgres@1228fcd
  • CVE 详情:https://nvd.nist.gov/vuln/detail/CVE-2024-49756
  • GitHub 安全通告 ID:GHSA-hf59-7rwq-785m

漏洞详情

  • CVE ID: CVE-2024-49756
  • 软件包: ash_postgres (Erlang)
  • 受影响版本: >= 2.0.0, < 2.4.10
  • 已修复版本: 2.4.10
  • 严重程度: 中危 (CVSS 评分: 5.3)
  • 弱点类型: CWE-552 (外部方可访问的文件或目录)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计