AshPostgres 空原子非批量操作中的策略绕过漏洞 (CVE-2024-49756)
漏洞概述
此漏洞存在于 AshPostgres 中,涉及在特定情况下可能跳过更新操作的策略检查。这仅发生在“空”更新操作(没有更改任何字段)中,并会允许其钩子(副作用)在不应该执行时被执行。需要注意的是,这不会允许读取用户不应有权访问的新数据,只会触发用户本不应能够触发的副作用。
漏洞影响
漏洞类型:策略绕过漏洞。
受影响对象:在特定配置下使用 AshPostgres 的应用。
触发条件
此漏洞仅在满足所有以下条件的更新操作中触发:
- 该操作位于一个不包含任何具有“更新默认值”属性的资源上(例如,没有
updated_at时间戳字段)。 - 该操作可以原子方式执行。
- 该操作没有设置
require_atomic? false。 - 该操作至少有一个授权器(通常是
Ash.Policy.Authorizer)。 - 该操作至少有一个变更(位于资源的变更块中或操作本身中)——副作用将在此处执行。
如何判断是否受影响
需要手动检查:
是否存在您通过 Ash.update 手动调用此操作的情况?
请注意,AshGraphql 和 AshJsonApi 的操作调用不受影响,因为它们使用 Ash.bulk_update。
如果存在,检查是否有时会以零输入调用该操作,并使其产生零个更改字段。
如果是,那么它是否会产生副作用?这意味着您将有一个在执行后触发其他资源操作的 after_action 钩子。
如果是,该副作用是否绕过了另一个资源的策略?(例如,使用 authorize?: false,或未提供相同的操作者)。
提供的脚本:
上述条件线以上的部分可以使用提供的脚本进行检查。线以下的部分必须手动检查。
该脚本可能出现误报,但不会有漏报。因此,如果运行脚本后显示“未发现潜在漏洞”,则您只需更新 ash_postgres 即可。
脚本地址: https://gist.github.com/zachdaniel/e49166b765978c48dfaf998d06df436e
修复方案
补丁:
此问题已在 ash_postgres 的 2.4.10 版本中得到修复。
临时解决方案: 您可以采取以下任一措施:
- 使用脚本确认没有任何操作易受攻击。
- 为任何可能受影响的更新操作添加
require_atomic? false。 - 将所有受影响的
Ash.update调用替换为Ash.bulk_update。 - 为您的操作添加一个更新时间戳字段。
参考资料
- 原始报告/发现: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 (外部方可访问的文件或目录)