AshPostgres 安全漏洞:策略绕过与空更新操作风险分析
漏洞概述
在 AshPostgres 中,存在一个涉及空、原子性、非批量操作以及策略绕过的副作用漏洞。该漏洞被标识为 CVE-2024-49756,已收录于 GitHub 安全公告数据库。
漏洞详情
影响与范围
漏洞类型与受影响对象 在非常特定的情况下,更新操作的策略检查可能会被跳过。这种情况仅发生在“空”更新操作(即没有更改任何字段)上,会导致本不应执行的钩子(副作用)被触发。需要注意的是,此漏洞不允许用户读取其本无权访问的新数据,仅允许用户触发一个本不应触发的副作用。
漏洞触发条件
要触发此漏洞,必须满足以下所有条件:
- 更新操作针对的资源不包含具有“更新默认值”的属性(例如
updated_at时间戳)。 - 该操作可以原子性地执行。
- 该操作没有设置
require_atomic? false。 - 该操作至少配置了一个授权器(通常是
Ash.Policy.Authorizer)。 - 该操作至少配置了一个变更(在资源的变更块中或在操作本身中)。这里就是副作用本不应执行却会被执行的地方。
受影响的操作调用方式
- 是否存在通过
Ash.update手动调用此操作的情况?- 注意:通过 AshGraphql 和 AshJsonApi 进行的操作调用不受影响,因为它们使用
Ash.bulk_update。
- 注意:通过 AshGraphql 和 AshJsonApi 进行的操作调用不受影响,因为它们使用
- 如果存在手动调用,是否曾出现过调用时输入为零且不产生任何字段更改的情况?
- 如果是,那么该操作是否会产生副作用?这意味着你将有一个
after_action钩子来调用其他资源。 - 如果是,该副作用是否会绕过其他资源的策略检查?例如,使用
authorize?: false,或未提供相同的参与者。
注意:以上(分隔线以上)部分可以通过提供的脚本进行检查。分隔线以下的部分必须手动检查。检查脚本位于“我可能受影响吗?”部分。该脚本可能存在误报,但不会有漏报。因此,如果你运行脚本后显示“未发现潜在漏洞”,那么你只需更新 ash_postgres 即可。
修复与缓解
补丁
此问题已在 ash_postgres 的 2.4.10 版本中得到修复。
临时解决方案
你可以采取以下措施之一:
- 使用脚本确定没有任何操作易受攻击。
- 为任何可能受影响的更新操作添加
require_atomic? false。 - 将受影响操作的所有
Ash.update调用替换为Ash.bulk_update。 - 为你的操作添加一个更新时间戳。
检测与参考
我可能受影响吗?
此 Gist 提供了一个可运行的脚本,用于检测你是否可能受到此漏洞影响: https://gist.github.com/zachdaniel/e49166b765978c48dfaf998d06df436e
相关参考
- 原始报告/发现:https://elixirforum.com/t/empty-update-action-with-policies/66954
- 修复提交:ash-project/ash_postgres@1228fcd
- 其他参考:
- GHSA-hf59-7rwq-785m
- https://nvd.nist.gov/vuln/detail/CVE-2024-49756
技术信息
漏洞严重程度
- 等级:中等
- CVSS 总体评分:5.3 / 10
CVSS v3 基础指标
- 攻击向量:网络
- 攻击复杂度:低
- 所需权限:无
- 用户交互:无
- 影响范围:未改变
- 机密性影响:无
- 完整性影响:低
- 可用性影响:无
CVSS 向量字符串: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
相关弱点
- CWE ID: CWE-552 - 外部方可访问的文件或目录
标识符
- CVE ID: CVE-2024-49756
- GHSA ID: GHSA-hf59-7rwq-785m