AshPostgres 非空更新操作策略绕过与侧效应漏洞深度解析

本文详细分析了 CVE-2024-49756 漏洞,该漏洞影响 AshPostgres 2.0.0 至 2.4.9 版本,允许在特定条件下绕过更新操作的授权策略,执行本应被阻止的侧效应操作。

漏洞概述

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 版本中得到修复。建议所有用户升级至此版本或更高版本。

临时缓解措施

如果无法立即升级,可以考虑以下变通方案:

  1. 使用上述脚本确认无操作受影响。
  2. 为任何可能受影响的更新操作添加 require_atomic? false 配置。
  3. 将受影响的、使用 Ash.update 的调用替换为 Ash.bulk_update
  4. 在相关操作中添加一个更新时间戳字段。

技术详情与参考

  • 漏洞发现讨论:原始报告可在 Elixir 论坛查看。
  • 修复提交:修复代码提交于 ash_postgres 仓库的 1228fcd 提交。
  • 相关标识
    • CVE ID: CVE-2024-49756
    • GHSA ID: GHSA-hf59-7rwq-785m
  • CVSS 3.1 评分: 5.3 (中危)
  • 相关弱点 (CWE): CWE-552 - 外部各方可访问的文件或目录
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计