ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSeek总结的pgvector那个谎报自己维度的向量

DeepSeek总结的pgvector那个谎报自己维度的向量 https://thebuild.com/blog/the-vector-that-lied-about-its-dimensions/那个谎报自己维度的向量pgvector 0.8.7 修复了 CVE-2026-103484一个能够创建 IVFFlat 索引的数据库用户可以导致后端越界写入进而可能引发任意代码执行。直到 0.8.6 的所有版本都受影响。请升级。这部分很简单。另外两部分则不简单谁实际上能够触达这个漏洞以及对于一个自上周二起就一直在运行的后端来说“已升级”意味着什么。出了什么问题IVFFlat 构建会抽样表对样本运行 k-means 以选出列表中心然后把每一行分配到最近的中心。索引的维度计数来自列的类型修饰符vector(1536)中的 1536构建过程会按其大小分配工作数组。在修复之前将样本向量累加进这些数组的 k-means 步骤其循环上界却取自每个向量自己的头部。如果某个向量与类型修饰符不一致循环就会在数组结束后继续写入。修复将索引的维度计数向下传递用它对每个向量进行检查并在 IVFFlat 和 HNSW 接受向量的所有位置——构建、插入和扫描——都加上了同样的检查。公告没有说明攻击者如何让一个不匹配的向量绕过类型修饰符在修复发布四天后我不打算在公开场合猜测。如果你编写扩展这个教训可以推广。类型修饰符是对列的一种声明。它不是交给你的访问方法的字节的属性而那种用一个来源确定缓冲区大小、却用另一个来源做循环上界的 C 代码距离自己发布一份安全公告只差一个坏值。今年第三次这是 2026 年 pgvector 索引构建代码中的第三个内存安全 CVECVE-2026-31722 月在 0.8.2 中修复。并行 HNSW 构建中的整数回绕任何能够使用并行 worker 创建或重建 HNSW 索引的人都可以触达。数据泄露或崩溃。CVE-2026-180227 月在 0.8.6 中修复。32 位系统上 IVFFlat 构建中的整数回绕。越界写入。CVE-2026-103484在 0.8.7 中修复。就是上面那个没有 32 位限定条件。三种不同的机制同一个地带。构建代码每个索引只运行一次而不是每个查询运行一次因此它获得的演练只占扫描路径所获演练的一小部分而它却要对来自元数据的大小做大量算术运算。如果我要拿模糊测试器指向一个向量扩展我就会指向那里。这个漏洞的功劳归于 Compass Security 的四位研究员。没人把它当特权看待的特权“一个有能力创建 IVFFlat 索引的数据库用户”听起来像是一份很短的名单。并不是。CREATE INDEX要求拥有该表而在数量令人沮丧的应用中拥有这些表的角色就是应用连接所用的角色因为迁移框架就是以那个角色运行的。所以这份名单是“你的应用以及任何能让它运行 SQL 的人”。REINDEX也应该列在名单上。它会通过同一套构建代码重建索引而且自 PostgreSQL 17 起它可以通过MAINTAIN特权或pg_maintain预定义角色授予那些什么都不拥有的角色。2 月的公告明确提到了重建索引。去查查谁拥有这些权限。持久的修复很乏味一个拥有 schema 的迁移角色和一个只有SELECT、INSERT、UPDATE、DELETE的应用角色仅此而已。改造起来很繁琐。但这也决定了这个 CVE 是适用于你的应用角色还是不适用。正确地升级安装软件包并不是终点。修复存在于 vector 共享库中而一个加载了旧库的后端会继续运行旧代码直到它退出。连接池中的连接可以存活数天。因此在新软件包就位后回收每一个在该包落地之前启动的后端复制SELECTpid,usename,application_name,backend_startFROMpg_stat_activityWHEREbackend_typeclient backendANDbackend_start2026-10-05 09:00:00-07;-- 软件包落地时间如果你够果断pg_terminate_backend()就在那里。如果你运行 PgBouncer管理控制台上的RECONNECT会在每个服务器连接被释放时将其关闭否则server_lifetime默认 3600 秒会按它自己的节奏达到目的。如果你把 vector 放在shared_preload_libraries中它不需要放在那里请重启服务器。而且不要把pg_extension.extversion当作任何事情的证据它报告的是哪个 SQL 脚本运行过而不是某个给定后端映射了哪个库。如果你从源码构建或使用 PGDG 软件包确认你确实拥有 0.8.7。v0.8.7 标签处的 changelog 将发布日期标为 10 月 1 日master 上的 changelog 仍将 0.8.7 列为未发布并且没有提到这个溢出问题。pgvector 发布的是 git 标签而不是 GitHub releases所以如果你的告警监视的是 Releases 页面它什么也看不到。去读标签。如果你使用托管服务你运行的是你的提供商交付的任何东西在他们交付的任何时候。问他们你用的是哪个版本以及 0.8.7 何时落地在它落地之前仔细审查哪些角色可以创建索引。我通过 PGX Inc. 提供 PostgreSQL 咨询服务。相关pgvector 0.8.2 与并行 HNSW 的麻烦今天就打补丁CVE-2026-6473二十年两次 RCEpgcrypto 自 2005 年以来一直在做什么
返回列表