漏洞总结:PostgreSQL SQL 净化器溢出漏洞 漏洞概述 PostgreSQL 的 SQL 净化器(SQL sanitizer)在处理包含美元引号字符串(dollar-quoted strings)和占位符(placeholders)的查询时存在逻辑错误。 1. 美元引号处理错误:净化器将 、 和 等占位符错误地识别为美元引号字符串的起始标签。这导致净化器将后续内容视为字面文本,从而跳过了对其中潜在恶意 SQL 代码的净化。 2. 占位符溢出:当占位符数字超过 时,净化器会将其回绕(wrap)到负数。如果该负数恰好落在一个有效的正索引位置,会导致参数错位(aliasing),从而绕过安全检查。 影响范围 使用 PostgreSQL 数据库的应用程序。 依赖 Go 语言标准库或相关组件进行 SQL 查询参数化处理的代码。 攻击者可通过构造包含特殊美元引号字符串或超大占位符数字的恶意 SQL 注入攻击,绕过现有的 SQL 净化机制。 修复方案 1. 改进美元引号识别:更新词法分析器(lexer),使其能够正确识别 PostgreSQL 的美元引号语法( ),并保留其内容不变,避免误判。 2. 限制占位符范围:将占位符数字限制在 范围内,防止因溢出导致的参数错位。如果占位符落在有效的正索引位置,应报错而非静默处理。 3. 增加测试用例**:添加单元测试、模糊测试种子和集成测试 PoC,以验证修复的有效性。 POC 代码