CVE-2024-49756:AshPostgres 空原子非批量操作策略绕过漏洞
漏洞概述
在 AshPostgres 中,存在一个与空、原子、非批量操作相关的策略绕过漏洞,该漏洞可能导致副作用被意外执行。
严重程度:中等 GitHub 状态:已审核 发布时间:2024年10月23日 更新日期:2025年4月14日
受影响的包
- 生态系统:Erlang
- 包名:
ash_postgres - 受影响版本:>= 2.0.0, < 2.4.10
- 已修复版本:2.4.10
漏洞描述与影响
在非常特定的情况下,更新操作的策略检查可能被跳过。这种情况仅发生在“空”的更新操作上(即没有更改任何字段),并会导致其钩子(副作用)在不应执行时被执行。请注意,此漏洞不允许用户读取他们无权访问的新数据,只允许触发一个用户本应无法触发的副作用。
要使你的应用受到此漏洞影响,必须同时满足以下所有条件:
- 存在一个更新操作,其对应的资源不包含任何具有“更新默认值”的属性(例如
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
- 相关ID:
- CVE ID: CVE-2024-49756
- GHSA ID: GHSA-hf59-7rwq-785m
安全评分 (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