漏洞概述
CVE-2024-49756 是一个影响 AshPostgres 库的中等严重性安全漏洞。该漏洞存在于 AshPostgres 2.0.0 至 2.4.9 版本中,可能导致在特定配置下,更新操作的授权策略被意外绕过,从而允许未经授权的侧效应(side-effects)执行。
影响范围
此漏洞仅影响满足以下所有严格条件的特定更新操作:
- 操作针对的资源不包含任何具有“更新默认值”的属性(例如
updated_at时间戳)。 - 操作可以原子方式执行(即未设置
require_atomic? false)。 - 操作至少配置了一个授权器(通常是
Ash.Policy.Authorizer)。 - 操作至少包含一个变更(定义在资源的变更块或操作本身中)。
重要说明:该漏洞不会导致攻击者读取本无权访问的数据。其风险仅限于可能触发用户本不应触发的侧效应操作。
受影响的调用方式
漏洞主要影响通过 Ash.update 函数手动调用的更新操作。需要注意的是,通过 AshGraphql 和 AshJsonApi 进行的调用不受影响,因为它们使用的是 Ash.bulk_update。
漏洞排查
为了帮助用户判断自身是否受影响,官方提供了一个检测脚本。该脚本可能存在误报,但不会有漏报。如果脚本报告“未发现潜在漏洞”,则只需将 ash_postgres 更新至修复版本即可。
检测脚本地址:https://gist.github.com/zachdaniel/e49166b765978c48dfaf998d06df436e
修复方案
官方补丁
此问题已在 ash_postgres 的 2.4.10 版本中得到修复。建议所有用户升级至此版本或更高版本。
临时缓解措施
如果无法立即升级,可以考虑以下变通方案:
- 使用上述脚本确认无操作受影响。
- 为任何可能受影响的更新操作添加
require_atomic? false配置。 - 将受影响的、使用
Ash.update的调用替换为Ash.bulk_update。 - 在相关操作中添加一个更新时间戳字段。
技术详情与参考
- 漏洞发现讨论:原始报告可在 Elixir 论坛查看。
- 修复提交:修复代码提交于 ash_postgres 仓库的
1228fcd提交。 - 相关标识:
- CVE ID: CVE-2024-49756
- GHSA ID: GHSA-hf59-7rwq-785m
- CVSS 3.1 评分: 5.3 (中危)
- 相关弱点 (CWE): CWE-552 - 外部各方可访问的文件或目录