标签 CVE-2026-22687 下的文章

漏洞概述 CVE-2026-22687是一个存在于WeKnora Agent服务中的SQL注入漏洞。该漏洞由于后端代码对用户输入的SQL语句校验不严,导致攻击者可以通过精心构造的提示词绕过安全限制,执行任意SQL查询,从而获取数据库服务器中的敏感信息。 影响范围: <0.2.4 所有启用Agent服务的WeKnora实例 漏洞详情 漏洞位置 文件: /internal/agent/tools/database_query.go 函数: validateAndSecureSQL() (第249-373行) API端点: POST /api/v1/agent-chat/{session_id} 漏洞根因 1.后端 安全校验逻辑缺陷 在validateAndSecureSQL函数中,开发者试图通过正则表达式检查SQL语句中涉及的表名,只允许访问预定义的白名单表:

Plain Text

复制代码
allowedTables := []string{
"tenants", "knowledge_bases", "knowledges", "sessions",
"messages", "chunks", "embeddings", "models",
}

// 提取FROM和JOIN子句中的表名
tablePattern := regexp.MustCompile(`(?i)\b(?:from|join)\s+([a-z_]+)(?:\s+as\s+[a-z_]+|\s+[a-z_]+)?`)
matches := tablePattern.FindAllStringSubmatch(lowerSQL, -1)

2. 两处关键绕过点 第一处漏洞:未校验PostgreSQL内置危险函数
代码仅检查表名是否在白名单中,但完全忽略了对数据库函数的校验。攻击者可以利用PostgreSQL内置函数(如pg_ls_dir、pg_read_file等)进行文件系统操作。
第二处漏洞:未考虑SQL注释绕过
正则表达式使用\s+匹配空白字符,但攻击者可以使用/**/等SQL注释代替空格,从而绕过表名检测:

Plain Text

复制代码
-- 原始查询(会被拦截)
SELECT pg_ls_dir('/etc')

-- 绕过后的查询(使用注释代替空格)
SELECT/**/pg_ls_dir('/etc')

代码分析 代码执行流

Plain Text

复制代码
// 漏洞点1:原始SQL执行,无参数化查询
func (t *DatabaseQueryTool) Execute() {
// line 158: 直接执行原始SQL
t.db.WithContext(ctx).Raw(securedSQL).Rows()
}

// 漏洞点2:校验函数存在缺陷
func validateAndSecureSQL(sql string) error {
// 仅检查表名,不检查函数和存储过程
// 使用简单正则,易被注释绕过
}

1 缺少参数化查询:直接拼接用户输入执行SQL 2 函数名白名单缺失:未限制可执行的数据函数 3 SQL解析不完整:依赖简单正则而非完整SQL解析器 4 多层转义缺失:未对用户输入进行适当的转义处理 漏洞复现