Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-34048 — 仅检查登录状态的管理员终端引导路由,允许普通团队成员驱动Coolify的实时终端后端并在团队服务器上执行命令。 | Kitploit
工具/GitHubGitHub/0xmrma/cve-2026-34048
身份验证与授权权限提升漏洞分析漏洞利用Web应用程序漏洞利用渗透测试云安全命令与控制红队
GitHub0xmrma/cve-2026-34048

CVE-2026-34048

仅检查登录状态的管理员终端引导路由,允许普通团队成员驱动Coolify的实时终端后端并在团队服务器上执行命令。

11个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

CVE-2026-34048

仅检查登录状态的管理员终端引导路由,使得普通团队成员能够驱动 Coolify 的实时终端后端并在团队服务器上执行命令。

简介

我在审查 Coolify(一个开源的自托管 PaaS)时发现了这个问题,当时我心中有一个非常直接的安全性问题:

终端访问是否在后端信任边界处实际强制执行,还是仅在 UI 中?

在这个案例中,答案是糟糕的。

Coolify 本意是将终端访问限制为团队管理员和所有者,但实时终端引导路由仅检查用户是否已登录。这使得低权限的团队成员能够满足 websocket 终端的信任检查,从而在团队服务器上执行命令。

我从有漏洞的版本在本地实验室中端到端验证了这个问题,随后私下报告了它。该问题被分配为 CVE-2026-34048,评分为:

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Coolify: GitHub 上的 Coolify
CVE: CVE-2026-34048

这影响了 Coolify,一个开源的自托管 PaaS。在其官方网站上,Coolify 声称拥有 3,641+ 家云客户,并自称是一个用于部署网站、数据库、Web 应用程序以及 280+ 种一键服务 的平台。其官方 v4.0 更新日志还提到,数千家公司和人员已经在生产环境中使用 Coolify 1-2 年。

photo0


攻击链

低权限团队成员会话 -> /terminal/auth 和 /terminal/auth/ips 仅检查登录状态 -> 实时 websocket 信任这些响应 -> 成员枚举团队服务器和可见的 SSH 密钥 UUID -> /terminal/ws 接受会话 -> 生成 SSH 支持的 PTY -> 在团队服务器上获得 shell 访问


Coolify 的功能

Coolify 是一个自托管的 PaaS 和部署平台。

它管理:

  • 服务器
  • 应用程序
  • 部署
  • 私钥
  • 团队权限
  • 对托管基础设施的终端访问

最后这一项功能在这里是关键。

一旦一个平台能够打开托管主机的终端,其授权模型就不再只是应用逻辑了。 它变成了一个基础设施信任边界。

重要的问题不在于 /terminal 页面看起来是否只对管理员可见。

真正的问题是:

后端终端路径在创建 websocket 会话时是否实际强制执行相同的授权边界?

在这个案例中,答案是没有。


为什么这个漏洞值得关注

终端功能是基础设施软件中价值最高的攻击面之一。

为什么呢?

因为任何以下方面的不匹配:

  • UI 授权
  • 后端授权
  • websocket 引导逻辑
  • 主机命令执行

都可能将一个普通应用用户变成一个能获取 shell 的操作者。

这正是为什么这个攻击面值得测试。

我并不是在寻找随机的崩溃或表面的权限错误。

我寻找的是更强类型的失败:

一个仅限管理员的功能是否依赖于比 UI 所暗示的更弱的后端信任检查?

这就是正确的问题。


我关注的关键边界

我并没有通过模糊测试随机端点并希望发现有趣的东西来接近 Coolify。

更强的方法是先识别最高风险的边界。

对于 Coolify 来说,这个边界就是终端工作流:

  • UI 表示终端访问受限
  • 终端服务基于 websocket
  • websocket 服务通常有独立的引导信任逻辑
  • 终端命令最终从应用状态跨越到主机执行

这使得引导路由成为正确的检查点。

而问题就在这里。


根本原因

根本原因是终端 UI 和终端 websocket 引导路由之间的授权不匹配。

在有漏洞的版本中:

  • GET /terminal 由 can.access.terminal 保护
  • POST /terminal/auth 只检查 auth()->check()
  • POST /terminal/auth/ips 只检查 auth()->check()

这意味着 UI 受到终端授权的门控,但后端信任边界仅由简单的已验证会话存在性来门控。

然后实时服务完全信任这两个路由。

在 docker/coolify-realtime/terminal-server.js 中:

  • verifyClient() 向 /terminal/auth 发送 POST 请求
  • websocket 会话设置向 /terminal/auth/ips 发送 POST 请求
  • websocket 处理程序在仅检查目标主机是否出现在返回的主机列表中后,接受攻击者提供的终端命令输入

这就是整个漏洞链。

为什么这是可利用的

因为一个普通团队成员可以从常规的应用表面构建所需的输入:

  • /servers 暴露了可见的服务器 UUID
  • /server/{uuid} 以渲染的表单字段形式暴露了 ip、user 和 port
  • /security/private-key 暴露了可见的团队私钥 UUID
  • 终端路径通过确定性的路径引用密钥,格式如下:
root@kitploit:~
/var/www/html/storage/app/ssh/keys/ssh_key@<uuid>

因此利用路径非常简单:

  • 以非管理员团队成员身份登录
  • 调用 /terminal/auth
  • 调用 /terminal/auth/ips
  • 枚举可见的服务器
  • 枚举可见的密钥 UUID
  • 连接到 /terminal/ws
  • 发送后端期望的相同 SSH 命令格式
  • 从团队主机接收 shell 输出

这不是理论上的不匹配。 这是实际的后端授权失败。


为什么这是一个安全问题,而不仅仅是 UI 不匹配

重要的区别在于后端信任和命令执行。

许多漏洞看起来像:

  • “按钮被隐藏了”
  • “页面被阻止了”
  • “UI 告诉你你不应该在这里”

这本身是不够的。

真正的问题是:

低权限用户是否仍然能满足关键的后端信任检查?

在这个案例中,答案是肯定的。

这不是:

  • 一个损坏的菜单
  • 一个缺失的前端检查
  • 一个表面上的路由问题

这是:

  • websocket 引导授权过于薄弱
  • 终端主机授权衍生自那个薄弱的信任边界
  • 在托管基础设施上的实际 shell 访问

这就是为什么这是一个真正的安全问题。


PoC

我在一个受控的本地实验室中验证了这一点,该实验室基于以下版本构建:

root@kitploit:~
06f60c9a98bead0c932c6adf7fd43a45d9149048

实验室使用:

  • 基础 URL:http://127.0.0.1:18000
  • 低权限成员账户:[email protected]
  • 目标服务器:localhost -> coolify-testing-host:22 as root
  • 可见的密钥 UUID:ssh
  • websocket 端点:ws://127.0.0.1:6002/terminal/ws

步骤 1:确认 UI 边界

该成员账户本不应通过普通管理员界面拥有终端访问权限。

这确立了预期的安全边界。

步骤 2:直接调用引导路由

使用成员会话,我发送了:

  • POST /terminal/auth
  • POST /terminal/auth/ips

两者均成功。

/terminal/auth/ips 返回了终端授权的主机,包括:

root@kitploit:~
coolify-testing-host
host.docker.internal
localhost
127.0.0.1

这证明了后端引导路由信任了成员会话。

步骤 3:枚举服务器和密钥元数据

从普通的认证页面,同一个成员可以枚举:

  • 可见的服务器 UUID
  • 服务器连接字段
  • 可见的团队私钥 UUID

这足以驱动终端路径,而无需泄露密钥材料。

步骤 4:打开终端 websocket

使用相同的已验证会话和 XSRF 令牌,我连接到了:

root@kitploit:~
ws://127.0.0.1:6002/terminal/ws

步骤 5:发送终端命令负载

负载使用了终端后端所期望的相同命令格式:

root@kitploit:~
{"command":["timeout 30 ssh -i /var/www/html/storage/app/ssh/keys/ssh_key@ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PasswordAuthentication=no -o ConnectTimeout=10 -o ServerAliveInterval=5 -o RequestTTY=no -o LogLevel=ERROR -p '22' 'root'@'coolify-testing-host' 'bash -se' << \\P0C\nprintf '__COOLIFY_POC_BEGIN__\\n'; id; whoami; hostname; printf '__COOLIFY_POC_END__\\n'\nP0C"]}

步骤 6:观察远程 shell 输出

websocket 返回了:

root@kitploit:~
pty-ready
__COOLIFY_POC_BEGIN__
uid=0(root) gid=0(root) groups=0(root)
root
efa027413801
__COOLIFY_POC_END__

这是重要的证明。

不仅仅是:

  • 路由访问
  • 不仅仅是 websocket 接受
  • 不仅仅是元数据暴露

而是通过仅限管理员使用的终端路径在托管主机上实际执行命令。


为什么这个 PoC 很强

这个链条中的任何一部分本身就已经值得关注。

例如:

  • 成员对 /terminal/auth 的访问
  • 或者成员对 /terminal/auth/ips 的访问

但这仍然可能被驳回。

更强的验证是端到端的:

  • 成员会话
  • 后端引导成功
  • websocket 接受
  • PTY 创建
  • 远程 shell 输出

这填补了“理论上的授权漏洞”与“实际的基础设施影响”之间的差距。

它也使得严重性的辩护更加容易。


严重性和分类

该问题被正确分类为 严重。

分类是:

  • CWE-862:缺少授权
  • CVSS:
root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

这是合理的。

这里的主张并不是说一个未认证的攻击者可以从零开始获得 shell 访问。

主张是:

  • 一个低权限的团队成员
  • 能够满足后端终端信任检查
  • 并在团队基础设施上达到命令执行

这是一个从应用程序 RBAC 失败到托管主机影响的重大范围变化。

因此,即使权限是低的而不是没有,结果仍然是明显的严重。


为什么这仍然值得报告

有些人低估了以 PR:L 开头的漏洞。

当涉及的特性是终端访问时,那是一个错误。

真正的问题不是:

“攻击者是否已经登录了?”

真正的问题是:

“当后端授权错误时,那个低权限用户能够触及什么?”

在这个案例中,答案是:

  • 主机选择数据
  • 终端引导信任
  • SSH 支持的 PTY 执行
  • 在团队服务器上的 shell 访问

这远远超出了普通的成员权限漏洞。


修复分析

最低限度的正确修复是直接的:

  • 将 can.access.terminal 应用到 POST /terminal/auth 和 POST /terminal/auth/ips
  • 确保非管理员成员被这两个路由拒绝
  • 添加回归测试覆盖:
    • 未认证用户被拒绝
    • 已验证的成员被拒绝
    • 授权管理员和所有者被允许

这解决了直接的信任边界失败。

在我的本地验证补丁中,将终端授权中间件应用于这两个路由移除了成员到终端的路径。

但更强的教训是,后端不应信任攻击者控制的 SSH 命令字符串作为目标元数据的主要来源。

推荐的加固措施是:

  • 将终端请求绑定到由服务端授权的服务器或容器标识符
  • 在命令执行时重新验证授权,而不仅仅在 websocket 打开时
  • 减少对客户端提供的终端命令结构的依赖以进行安全决策

这就是你希望为终端功能所做的修复:

  • 修复直接的缺失授权
  • 然后收紧更深层的信任模型

披露

该问题通过 GitHub 的安全报告流程私下报告。

报告包括:

  • 授权不匹配
  • 受影响的路由
  • 实时后端信任路径
  • 有效的本地实验室验证
  • 显示远程 shell 输出的端到端证明

该问题后来被分配:

CVE-2026-34048


这个漏洞实际教会了我们什么

这里的主要教训很简单:

如果后端引导通道信任更弱的状态,仅限管理员的 UI 就无关紧要。

这是真正的问题类别。

  • 一个页面可以正确保护。
  • 一个菜单可以正确隐藏。
  • 一个终端屏幕可以正确阻止。

如果以下情况成立,这些都不重要:

  • websocket 引导路径仅检查登录状态
  • 终端后端信任这些引导响应
  • 并且结果会话能够达到主机命令执行

一旦平台管理基础设施,授权不匹配就不再是普通的访问控制错误。 它们变成了影响基础设施的漏洞。

这是真正的收获。


关键点

  • websocket 引导端点是真正的安全边界
  • 仅 UI 授权对于终端功能是不够的
  • 当后端信任错误时,低权限用户仍然可能产生严重的影响
  • 枚举服务器元数据加上可见的密钥 UUID 使得这个漏洞变得实用
  • 端到端的运行时验证在捍卫严重性时很重要
  • 正确的修复是一致性的后端授权,而不是更强的前端门控

最后的话

这个漏洞并非关于巧妙的负载。

而是关于识别正确的信任边界。

Coolify 本意是仅限管理员访问终端。 但实时终端后端信任了仅检查用户是否登录的路由。

从这里,一个低权限的团队成员能够驱动 websocket 终端路径,并在团队服务器上达到 shell 执行。

这就是为什么它变成了 CVE-2026-34048。

下载工具