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

本文详细分析了AshPostgres数据库框架中存在的策略绕过漏洞CVE-2024-49756,该漏洞允许在特定条件下绕过更新操作的安全策略执行副作用,影响版本2.0.0至2.4.9。

CVE-2024-49756:AshPostgres空原子更新操作策略绕过漏洞

漏洞概述

在AshPostgres特定场景下,存在策略绕过漏洞,允许在空更新操作中绕过策略检查执行副作用。该漏洞仅影响"空"更新操作(无字段变更),会允许其钩子(副作用)在不应执行时被执行。

影响范围

受影响版本

  • AshPostgres >= 2.0.0, < 2.4.10

已修复版本

  • AshPostgres 2.4.10

漏洞详情

触发条件

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

  1. 更新操作位于没有包含"更新默认值"属性的资源上(例如updated_at时间戳)
  2. 能够以原子方式执行
  3. 未设置require_atomic? false
  4. 至少有一个授权器(通常是Ash.Policy.Authorizer)
  5. 至少有一个变更(在资源的变更块或操作本身中)

影响分析

此漏洞不会允许用户读取不应访问的新数据,仅会触发用户本不应能够触发的副作用。具体表现为:

  • 在手动调用Ash.update时可能受到影响
  • AshGraphql和AshJsonApi操作调用不受影响(因为它们使用Ash.bulk_update
  • 当使用零输入调用操作并产生零个变更字段时可能产生副作用

检测与修复

检测脚本

GitHub Gist提供了检测脚本,可用于识别潜在漏洞: https://gist.github.com/zachdaniel/e49166b765978c48dfaf998d06df436e

该脚本可能存在误报,但不会有漏报。如果脚本显示"未发现潜在漏洞",则只需更新ash_postgres即可。

修复方案

官方补丁

  • 已通过ash_postgres 2.4.10版本修复

临时解决方案

  1. 使用脚本确认无漏洞操作
  2. 为可能受影响的操作添加require_atomic? false
  3. 将受影响操作的Ash.update用法替换为Ash.bulk_update
  4. 为操作添加更新时间戳

技术参考

  • 原始报告:https://elixirforum.com/t/empty-update-action-with-policies/66954
  • 修复提交:ash-project/ash_postgres@1228fcd
  • GHSA ID:GHSA-hf59-7rwq-785m
  • CVE ID:CVE-2024-49756

安全评分

  • 严重程度:中等
  • CVSS评分:5.3
  • CVSS向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
  • EPSS评分:0.056%(第18百分位)

弱点分类

  • CWE ID:CWE-552
  • 描述:文件或目录可被外部方访问
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计