我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

任意注册用户均可完全接管 Postiz(CVE-2026-115931、CVE-2026-115932、CVE-2026-115933)

在自托管 Postiz 2.23.0 至 2.25.2 中,任意注册用户都能读取服务器文件;在 2.15.0 至 2.25.2 中,还能伪造登录令牌接管其他组织。2.25.3 已修复。

要点速览

  • Postiz 社交媒体排程应用中的三个严重漏洞可被任何普通账户用户利用。不受限制的 provider 方法调用(CVE-2026-115931)和媒体路径遍历(CVE-2026-115932),允许用户读取后端能读取的任何文件,包括 JWT 签名密钥,并用一次请求使后端崩溃。共享密钥令牌伪造(CVE-2026-115933)则允许其以任意用户或任意组织超级管理员身份登录。Anthropic 安全团队发现了全部三个漏洞;公告分别评为 CVSS v3.1 9.9(CVE-2026-115931)、9.6(CVE-2026-115932)和 9.9(CVE-2026-115933)。
  • 默认配置开放自助注册,因此攻击者不需要已有账户、特权或任何其他人的操作。受影响实例均为自托管。撰文时,仓库有 37,856 个 GitHub star 和 7,395 个 fork,可粗略反映部署范围。
  • 三个漏洞均于 2026 年 10 月 23 日披露,并在一天内修复:2.25.2 修复文件读取(CVE-2026-115931),2.25.3 修复令牌伪造(CVE-2026-115933)和媒体路径遍历(CVE-2026-115932)。
  • 升级至 2.25.3 或更高版本,然后轮换 JWT 签名密钥、数据库和 Redis 凭据,以及每个已连接 provider 的 API 密钥。升级前,设置 DISABLE_REGISTRATION=true,并阻止 POST /integrations/extension-refresh。

我是否受到影响?

如果您自托管 Postiz(gitroomhq/postiz-app 项目,通常通过其 Docker 镜像部署),且满足以下任一条件,就会受到影响:

  • 实例运行 2.23.0 至 2.25.1,受不受限制函数调用漏洞(CVE-2026-115931)影响,2.25.2 已修复。
  • 实例运行 2.23.0 至 2.25.2,受媒体路径遍历漏洞(CVE-2026-115932)影响,2.25.3 已修复。2.25.2 仍受影响。
  • 实例运行 2.15.0 至 2.25.2,受签名令牌伪造漏洞(CVE-2026-115933)影响,2.25.3 已修复。
漏洞 受影响版本 修复版本
CVE-2026-115931,不受限制的 provider 方法调用(文件读取、后端崩溃) 2.23.0 至 2.25.1 2.25.2(2026 年 10 月 23 日)
CVE-2026-115932,媒体路径遍历(将任意读取文件交付攻击者) 2.23.0 至 2.25.2 2.25.3(2026 年 10 月 24 日)
CVE-2026-115933,签名令牌伪造(会话、邀请、密码重置、企业) 2.15.0 至 2.25.2 2.25.3(2026 年 10 月 24 日)

检查部署版本及是否开放自助注册:

docker inspect --format '{{.Config.Image}}' $(docker ps -q --filter name=postiz)   # the image tag you run
docker compose config | grep -iE 'image:|DISABLE_REGISTRATION'                    # compose pin and the registration flag

如果在 2026 年 10 月 24 日之前拉取过浮动的 latest 标签,应假定实例曾受影响。除非显式将 DISABLE_REGISTRATION 设为 true,否则自助注册默认开放;即使关闭注册,任何已有用户仍可利用全部三个漏洞。两个配置细节影响文件读取:

  • 开发 Dockerfile 和发布的容器以 root 运行进程,因此所有 root 可读文件均可触及。
  • 主要路径遍历投递路径需要配置 Discord provider,而随附 docker-compose 中该配置为空。

如何修复?

更新至包含全部三个修复的 Postiz 2.25.3 或更高版本,然后重启后端和发布工作进程:

  1. 在 compose 文件中将镜像固定至 v2.25.3 或更高版本,然后运行 docker compose pull && docker compose up -d --force-recreate,以修补后的构建重建容器。
  2. 轮换 JWT 签名密钥(JWT_SECRET 环境变量):只要旧密钥仍在,攻击者升级前伪造的令牌仍能验证通过;轮换密钥会同时使所有会话、邀请、密码重置和企业令牌失效。
  3. 轮换数据库和 Redis 凭据,以及每个已连接 provider 的 API 密钥,因为公告指出存放它们的环境可通过文件读取漏洞读取。
  4. 检查用户列表中非您创建的账户,以及组织列表中意外出现的超级管理员;接管路径可能留下这两种痕迹。

如果今天无法升级,以下三个措施可降低暴露。每个措施都有公告指出的局限:

  • 设置 DISABLE_REGISTRATION=true。这会移除匿名进入路径,但不能防范任何已有用户。
  • 如果不使用依赖 Postiz 浏览器扩展的渠道,在反向代理处阻止 POST /integrations/extension-refresh。这会移除主要令牌伪造签名路径,但仍保留范围较窄的邀请路径。
  • 不设置 Discord 客户端 ID、客户端密钥和机器人令牌。这会移除路径遍历的主要外传路径,但仍留下另外两条路径。

根本原因是什么?

三个漏洞分别缺少不同检查,均位于后端处理已登录用户请求的过程中。

CVE-2026-115931:后端按名称运行 provider 方法,没有允许列表。POST /integrations/function 路由接收渠道和函数名,在 provider 对象上调用该函数,并将渠道存储的令牌作为第一个参数传入。

修复前,唯一检查是对象上是否存在该名称的方法。修复提交 9383f5be 将路由限制为注册为 @Tool 或由新增 @DashboardFunction 装饰器标记的方法。

现已阻止的一个内部辅助函数,会读取第一个参数指定路径的文件,因此如果渠道存储的令牌是文件路径,该路由就会变成文件读取器;另一个辅助函数则会退出后端进程。

-    // @ts-ignore
-    if (integrationProvider[body.name]) {
+    if (
+      this._integrationManager.isDashboardCallable(
+        integrationProvider,
+        body.name
+      )
+    ) {

CVE-2026-115933:共用一个签名密钥、没有令牌类型标记,并且存在对请求数据签名的路由。Postiz 用同一共享密钥签署会话、邀请、密码重置和企业令牌,且不在令牌中记录其类型。

浏览器扩展的凭据刷新路由对取自请求本身的 JSON 载荷签名,并将结果存储在请求用户可读回的位置。这让用户获得了声明内容任意选择、签名有效的令牌。

修复提交 a5affe62 停止对请求数据签名(AuthService.signJWT 改为 AuthService.fixedEncryption,“像 connectSocialMedia 一样加密存储,绝不签名”)。它还加入令牌类型区分。每个消费令牌的路由现在拒绝包含其他令牌类型字段的载荷,例如团队邀请的 timeLimit 和密码重置的 expires。

CVE-2026-115932:信任媒体路径始终位于上传目录内。发布帖子时,Postiz 将不是 Web 地址的媒体路径视为磁盘文件,却不检查该文件是否位于上传目录内。

注册用户可随帖子存储特制媒体路径,并通过通常用于限制它的检查。发布工作进程随后读取该文件,将其作为附件发送至用户控制的 Discord 服务器。

修复提交 12db9bd2 拒绝包含 / 或 \ 的媒体名称,将工作进程的文件读取限制在上传目录,并让受用户影响的 URL 抓取通过 provider 所用的同一防 SSRF HTTP 客户端执行。

如何利用?

三条链都只需自助注册账户:文件读取(CVE-2026-115931)、令牌伪造接管(CVE-2026-115933)和媒体外传(CVE-2026-115932)。报告者针对提交 3a7d28b7ad96 的未修改构建,端到端演示了每一条:

  • 文件读取(CVE-2026-115931):注册,连接一个存储令牌为文件路径的渠道,通过 POST /integrations/function 调用内部读取辅助函数,以字节形式收到文件内容。演示返回了放在应用目录之外的文件,还读取了进程环境:后端启动时使用的 JWT 密钥、数据库地址、Redis 连接字符串及已连接 provider 的凭据。
  • 接管(CVE-2026-115933):通过扩展刷新路由获得声明内容任意选择、签名有效的令牌,然后以以下类型提交:

    • 另一个用户的会话。无需知道其 ID。令牌声明被用作数据库过滤条件,因此匹配其他用户的过滤对象会选中该用户。
    • 带超级管理员角色的组织邀请,适用于任何通过共享帖子预览链接暴露 ID 的组织。
    • 已知 ID 用户的密码重置。
    • 为组织授予终身最高级订阅的企业开通令牌。

    演示将第二个自助注册用户变为另一个用户组织的超级管理员,并读取了组织 API 密钥。伪造令牌不会过期,也无法与真实令牌区分。 - 外传(CVE-2026-115932):存储一个媒体路径指向上传目录外的帖子,发布后,在攻击者 Discord 服务器上以附件接收文件原始字节。第二条路径泄露路径是否存在,指向设备文件时还可耗尽后端内存;第三条路径在本地存储实例上实现同样读取。

攻击如何展开?

未修补实例上的自助注册账户读取会话签名密钥,然后将自己签署为任何用户。

flowchart LR A["在实例上自助注册
(默认开放)"] --> B["连接渠道,将其存储
令牌设置为文件路径"] B --> C["POST /integrations/function
调用内部读取辅助函数"] C --> D["返回环境文件,
包含 JWT 签名密钥"] D --> E["伪造包含任意声明的
会话令牌"] E --> F["以任意用户或任意组织
超级管理员身份登录"]

令牌伪造漏洞无需文件读取,就能达到同一结果:以任意用户或任意组织超级管理员身份登录。路径遍历漏洞则实现同样的文件读取,并将文件内容发送到攻击者控制的 Discord 服务器。

攻击者能做什么?

攻击者可读取后端能读取的任何文件,以任意用户或任意组织超级管理员身份登录,用一次请求停止后端,并解密使用共享密钥加密的数据。根据公告的影响说明,完整能力如下:

  • 以原始字节读取后端进程可读的任何文件,因此二进制文件也可读取。在发布的 root 运行容器中,这意味着 root 可读的所有文件,包括环境文件、挂载的密钥和应用日志。
  • 以任意用户身份登录,以超级管理员身份加入任意组织,读取其 API 密钥和渠道列表,并通过其连接的社交账户安排发布帖子。
  • 重置任何已知 ID 用户的密码。
  • 通过企业端点创建拥有终身最高级订阅的组织。
  • 通过崩溃辅助函数(CVE-2026-115931)或内存耗尽路径(CVE-2026-115932),用单次请求停止后端,每次重启后均可重复。
  • 解密应用使用与 JWT 签名密钥相同的密钥加密存储的数据。

条件是普通账户(默认实例可通过自助注册获得)、能通过网络访问 Postiz Web 界面,以及对于主要外传路径,已配置 Discord provider。不需要其他用户执行任何操作,也不需要账户之外的权限。

为什么修复有效?

每项修复都补上缺失检查,而非仅掩盖路由问题。

  • 函数调用允许列表。调用方提供的名称只能到达被声明为可从仪表板安全调用的方法。任何读取文件或退出进程的内部辅助函数都不能再按名称访问。
  • 加密替代签名。扩展刷新路由现在加密请求数据而不签名,因此无法再发放有效签名。令牌类型区分确保签名载荷只能由字段集合匹配的路由接受。
  • 媒体路径验证。包含分隔符的名称被拒绝,读取限制在上传目录内,因此存储帖子无法让发布工作进程访问目录外。

同一批修复还封堵公告列出的三条较窄路径:邀请签名路径、泄露路径是否存在并可耗尽内存的路径遍历路径,以及本地存储文件读取。

如何检查是否已遭入侵?

这些漏洞没有已发布的入侵指标,也未报告在野利用。可针对已记录影响执行以下检查:

  • 审查实例用户列表,查找未经管理员邀请、通过自助注册创建的账户;检查每个组织成员列表中意外出现的超级管理员。
  • 检查已连接渠道,寻找存储令牌看起来像文件路径而非 provider 凭据的渠道,这是文件读取链的痕迹。
  • 检查已发布帖子的媒体路径是否解析到上传目录外,并审计带有非您发送文件附件的 Discord Webhook 投递。
  • 如果实例运行过受影响版本,且开放注册或至少有一个用户账户,应将 JWT 密钥、数据库和 Redis 凭据,以及每个已连接 provider 的 API 密钥视为已暴露,因为任何已验证用户都能触及漏洞。轮换它们。无法通过检查区分伪造与真实令牌,因此轮换才是可靠措施。

时间线

  • 2026-10-23 17:45 UTC:Anthropic 向 Postiz 披露 CVE-2026-115932 和 CVE-2026-115933,并提供可运行的概念验证;Postiz 在 15 分钟内复现两者。
  • 2026-10-23 19:45 UTC:Anthropic 披露 CVE-2026-115931,附可运行概念验证;Postiz 复现并着手修复。
  • 2026-10-23 21:33 UTC:Postiz 推送并验证 CVE-2026-115931 修复。
  • 2026-10-23 21:59 UTC:Postiz 发布包含 CVE-2026-115931 修复的 2.25.2,并发布公告。
  • 2026-10-24 12:26 和 13:27 UTC:Postiz 推送并验证 CVE-2026-115932 和 CVE-2026-115933 修复。
  • 2026-10-24 14:16 UTC:Postiz 发布包含两项修复的 2.25.3,并发布公告。
  • 2026-10-26:本文发布。

常见问题

三个漏洞可以串联吗?

可以,而且每个漏洞也能独立实现接管。文件读取(CVE-2026-115931)和路径遍历(CVE-2026-115932)都能暴露 JWT 签名密钥,持有密钥的任何人都能伪造有效令牌。令牌伪造(CVE-2026-115933)则无需先读取密钥,直接生成签名有效的令牌。

托管 Postiz 服务受影响吗?

公告针对自托管 postiz-app 仓库,并列出其受影响和修复版本。对于任何托管服务,暴露取决于运营方的部署版本和补丁状态。对于您自己的实例,可使用 docker inspect --format '{{.Config.Image}}' $(docker ps -q --filter name=postiz) 检查容器运行的镜像。

今天无法升级,什么最能降低暴露?

关闭自助注册(DISABLE_REGISTRATION=true);如果不使用浏览器扩展,在反向代理处阻止 POST /integrations/extension-refresh;并不设置 Discord provider 凭据。每项措施移除一条路径,但都不会移除漏洞本身,已有用户仍能利用保留开放的部分。

升级后必须轮换什么?

首先轮换 JWT 签名密钥,因为升级前伪造的令牌在密钥改变前仍能验证通过;然后轮换数据库和 Redis 凭据及每个已连接 provider 的 API 密钥,因为公告指出存放它们的环境可被读取。密钥轮换也会使会话失效。

有公开概念验证吗?

没有公开代码。向 Postiz 的每次披露都包含可运行概念验证,报告者在未修改构建上端到端演示了全部三条链,但公告描述机制而未发布脚本。尚未报告在野利用。

这些问题如何被发现?

Anthropic 安全团队报告了全部三个问题。Enno Gelhaus 通过 GAdvisory 协调披露。Nevo David 完成修复,每项修复都在数小时内得到验证。

参考资料

  • PSA-2026-JNXM56,CVE-2026-115931 公告,包含 CVSS v3.1 9.9 向量、受影响范围、临时措施、已演示影响及时间线:https://gadvisory.org/advisories/PSA-2026-JNXM56 (2026 年 10 月 26 日核查)
  • PSA-2026-YT2HMH,CVE-2026-115933 公告,包含 CVSS v3.1 9.9 向量和接管影响:https://gadvisory.org/advisories/PSA-2026-YT2HMH (2026 年 10 月 26 日核查)
  • PSA-2026-E9AHFV,CVE-2026-115932 公告,包含 CVSS v3.1 9.6 向量和各路径配置前提:https://gadvisory.org/advisories/PSA-2026-E9AHFV (2026 年 10 月 26 日核查)
  • 对应同样三个漏洞的 GitHub 公告 GHSA-h5r5-h782-vqvp、GHSA-9j6f-8rw3-93c4 和 GHSA-rmc2-p2gv-m88f:https://github.com/gitroomhq/postiz-app/security/advisories (2026 年 10 月 26 日核查)
  • 修复提交:9383f5be(provider 方法允许列表,CVE-2026-115931)、a5affe62(以加密替代签名并区分令牌类型,CVE-2026-115933)和 12db9bd(媒体路径验证和上传目录约束,CVE-2026-115932):https://github.com/gitroomhq/postiz-app/commit/9383f5be4d310c346e33a3748a9a7ded64c96fed, https://github.com/gitroomhq/postiz-app/commit/a5affe62c74e39c1e7ac960d50d8418b807d532c, https://github.com/gitroomhq/postiz-app/commit/12db9bd2f428b628a62809669c3d76297e07750a (2026 年 10 月 26 日核查)
  • Postiz 2.25.2 发布说明,2026 年 10 月 23 日,处理 PSA-2026-JNXM56:https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.2 (2026 年 10 月 26 日核查)
  • Postiz 2.25.3 发布说明,2026 年 10 月 24 日,处理 PSA-2026-E9AHFV 和 PSA-2026-YT2HMH:https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.3 (2026 年 10 月 26 日核查)
  • Postiz 仓库,其 star 和 fork 数量(2026 年 10 月 26 日为 37,856 和 7,395)可作为自托管部署范围的近似指标:https://github.com/gitroomhq/postiz-app (2026 年 10 月 26 日核查)