AshPostgres 安全漏洞:策略绕过与空更新操作风险分析

本文详细分析了 AshPostgres 数据库框架中的一个安全漏洞(CVE-2024-49756),该漏洞允许在特定条件下绕过策略检查执行副作用。文章涵盖了漏洞影响、触发条件、修复版本及检测脚本,适用于关注应用安全的开发者。

AshPostgres 安全漏洞:策略绕过与空更新操作风险分析

漏洞概述

在 AshPostgres 中,存在一个涉及空、原子性、非批量操作以及策略绕过的副作用漏洞。该漏洞被标识为 CVE-2024-49756,已收录于 GitHub 安全公告数据库。

漏洞详情

影响与范围

漏洞类型与受影响对象 在非常特定的情况下,更新操作的策略检查可能会被跳过。这种情况仅发生在“空”更新操作(即没有更改任何字段)上,会导致本不应执行的钩子(副作用)被触发。需要注意的是,此漏洞不允许用户读取其本无权访问的新数据,仅允许用户触发一个本不应触发的副作用。

漏洞触发条件

要触发此漏洞,必须满足以下所有条件:

  1. 更新操作针对的资源不包含具有“更新默认值”的属性(例如 updated_at 时间戳)。
  2. 该操作可以原子性地执行。
  3. 该操作没有设置 require_atomic? false
  4. 该操作至少配置了一个授权器(通常是 Ash.Policy.Authorizer)。
  5. 该操作至少配置了一个变更(在资源的变更块中或在操作本身中)。这里就是副作用本不应执行却会被执行的地方。

受影响的操作调用方式

  • 是否存在通过 Ash.update 手动调用此操作的情况?
    • 注意:通过 AshGraphql 和 AshJsonApi 进行的操作调用不受影响,因为它们使用 Ash.bulk_update
  • 如果存在手动调用,是否曾出现过调用时输入为零且不产生任何字段更改的情况?
  • 如果是,那么该操作是否会产生副作用?这意味着你将有一个 after_action 钩子来调用其他资源。
  • 如果是,该副作用是否会绕过其他资源的策略检查?例如,使用 authorize?: false,或未提供相同的参与者。

注意:以上(分隔线以上)部分可以通过提供的脚本进行检查。分隔线以下的部分必须手动检查。检查脚本位于“我可能受影响吗?”部分。该脚本可能存在误报,但不会有漏报。因此,如果你运行脚本后显示“未发现潜在漏洞”,那么你只需更新 ash_postgres 即可。

修复与缓解

补丁

此问题已在 ash_postgres 的 2.4.10 版本中得到修复。

临时解决方案

你可以采取以下措施之一:

  1. 使用脚本确定没有任何操作易受攻击。
  2. 为任何可能受影响的更新操作添加 require_atomic? false
  3. 将受影响操作的所有 Ash.update 调用替换为 Ash.bulk_update
  4. 为你的操作添加一个更新时间戳。

检测与参考

我可能受影响吗?

此 Gist 提供了一个可运行的脚本,用于检测你是否可能受到此漏洞影响: https://gist.github.com/zachdaniel/e49166b765978c48dfaf998d06df436e

相关参考

技术信息

漏洞严重程度

  • 等级:中等
  • 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

源代码仓库

ash-project/ash_postgres

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计