PostgreSQL 修补了 BeyondTrust 攻击中使用的漏洞

所有受支持的 PostgreSQL 分支 17.3、16.7、15.11、14.16 和 13.19 都生成了纠正更新,修复了 70 多个错误并消除了 2025 月底针对 BeyondTrust 和美国财政部的攻击中使用的漏洞 (CVE-1094-2024)。 PostgreSQL 中的问题是在分析 BeyondTrust PRA(特权远程访问)和 BeyondTrust RS(远程支持)服务中的远程漏洞(CVE-12356-0)时发现的,该漏洞的利用还涉及 libpq 中一个以前未知的(XNUMX 天)漏洞。

攻击的结果是,攻击者设法获得了用于远程向 BeyondTrust SaaS 客户提供技术支持服务的 API 的密钥。该 API 被用于重置密码并破坏使用 BeyondTrust 产品的美国财政部基础设施。在攻击期间,攻击者能够下载机密文件并访问该部员工的工作站。

该漏洞出现在 libpq 库中,该库提供了从 C 程序与 DBMS 交互的 API(该库之上还实现了 C++、Perl、PHP 和 Python 的绑定库)。该问题影响使用 PQescapeLiteral()、PQescapeIdentifier()、PQescapeString() 或 PQescapeStringConn() 函数转义特殊字符和中和引号的应用程序。

如果从外部接收的文本在 SQL 查询中使用之前使用上述 libpq 函数进行转义,则攻击者可以实现 SQL 替换。在 BeyondTrust 应用程序中,以这种方式转义的查询通过 psql 命令行实用程序传递。该漏洞是由于转义函数中缺少对文本中使用的 Unicode 字符的正确性的检查而导致的,这使得通过指定不正确的多字节 UTF-8 序列可以绕过引号的规范化。

为了利用此漏洞,可以使用由字节 8xC0 和 0x0(“└'”)组成的无效 UTF-27 字符。 ASCII 编码中的字节 0x27 对​​应必须转义的单引号 (“'”)。在转义码中,字节 0xC0 和 0x27 的组合被视为单个 Unicode 字符。因此,尽管在 psql 实用程序中处理 SQL 查询时将字节 0x27 处理为引号,但此类序列中的字节 XNUMXxXNUMX 仍保持未转义状态。

运行 SQL 查询 使用 psql 工具来组织任意代码的执行,可以在命令字符串中使用替换符“\!”,psql 的这个替换符用于运行任意程序。例如,要在……上运行 服务器 可以将值“hax\xC0′; \! id #”传递给“id”实用程序。下面的示例调用 PHP 脚本 dbquote 进行转义,使用 PHP 函数 pg_escape_string,该函数基于 libpq 中的 PQescapeString 函数:$ echo -e "hello \xC0'world'" | ./dbquote 'hello └'world"' $ quoted=$(echo -e "hax\xC0′; \! id # " | ./dbquote) $ echo "SELECT COUNT(1) FROM gw_sessions WHERE session_key = $quoted AND session_type = 'sdcust' AND (expiration IS NULL OR expiration>NOW())" | psql -e SELECT COUNT(1) FROM gw_sessions WHERE session_key = 'hax└'; ERROR: invalid byte sequence for encoding "UTF8": 0xc0 0x27 uid=1000(myexamplecompany) gid=1000(myexamplecompany)

来源: opennet.ru

添加评论