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

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

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

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

工具目录

分类

查看所有分类
Loading categories
pasteguard-PoC — PoC — PasteGuard 中已配置的提供商 API 密钥的跨源代理滥用(GHSA-q94x-p9rc-q89f,CVE-2026-86998,CVSS 7.6)。 | Kitploit
工具/GitHubGitHub/squeeze440/pasteguard-poc
漏洞分析漏洞利用Web安全渗透测试论文与研究API 安全
GitHubsqueeze440/pasteguard-poc

pasteguard-PoC

PoC — PasteGuard 中已配置的提供商 API 密钥的跨源代理滥用(GHSA-q94x-p9rc-q89f,CVE-2026-86998,CVSS 7.6)。

查看仓库
7天前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

PasteGuard:安全公告

CVE 状态: 已申请,等待分配。此发现已发布为 GHSA-q94x-p9rc-q89f。在 CVE 分配后,此仓库将重命名为 CVE-YYYY-NNNNN-pasteguard-PoC,并且此横幅将替换为 CVE 链接。

研究员Dostxodjayev Abdullox (@squeeze440)
公告GHSA-q94x-p9rc-q89f
CVSS 3.17.6(高)
弱点CWE-352, CWE-942

摘要:PasteGuard 0.9.1 中 LLM 代理路由缺少 CORS/CSRF 保护,允许远程攻击者(操作员浏览器访问的任何网站,或本地网络上的任何主机)使用 PasteGuard 的服务器端回退 API 密钥,向操作员配置的 OpenAI/Anthropic API 触发经过身份验证的请求,并通过跨源 fetch() 到 /openai/v1/chat/completions(以及同类的 /anthropic/v1/messages)读取响应。

产品:PasteGuard (github.com/sgasser/pasteguard)

测试版本:提交 100718191499c52934f3b2ccca72ca16373fb765(2026-07-30),package.json 版本 0.9.1

估计 CVSS v3.1:CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:H — 7.6(高)

  • UI:R — 操作员必须在 PasteGuard 运行时让其浏览器打开一个页面(任何网站上的任何页面);不需要其他交互。
  • C:L / I:L — 攻击者自己的 JS 只能读取其自己选择的提示的响应(而不是操作员过去的对话/仪表板数据,这些数据已正确地从 CORS 中排除),但这仍然确认/使用了一个活跃的已充值账户,并以操作员的身份污染了账户的使用/审计记录。
  • A:H — 现实且无限制的影响:攻击者页面可以无限循环此请求,对操作员的提供商账户/配额产生真实的计费使用(财务消耗,可能导致速率限制耗尽或提供商侧的滥用标记),且没有任何速率限制或源检查来阻止。
  • S:U — 影响保持在相同的信任边界内(使用的是代理自身配置的凭据);没有跨越单独的安全权限。

详情:

PasteGuard 的 HTTP 层对除仪表板之外的每个路由应用了宽松的通配符 CORS 策略:

  • src/index.ts:40-45 — const corsMiddleware = cors();(Hono 的 cors() 不带选项时默认为 Access-Control-Allow-Origin: *)通过 app.use("*", ...) 应用于所有内容,仅对 /dashboard 和 /dashboard/* 有明确的例外。正上方的注释(src/index.ts:34-39)显示作者仔细考虑了仪表板的 CORS 暴露,但没有将同样的推理扩展到其下方的代理路由。
  • src/config.ts:153 — host: z.string().default("0.0.0.0"),在 config.example.yaml:13 中确认生效。代理默认监听所有接口,而不仅仅是回环接口,因此这不仅可以从操作员自己的浏览器访问,还可以从局域网访问。
  • src/providers/openai/client.ts:48-53:
    root@kitploit:~
    // Use client's auth header if provided, otherwise fall back to config
    if (authHeader) {
      headers.Authorization = authHeader;
    } else if (config.api_key) {
      headers.Authorization = `Bearer ${config.api_key}`;
    }
    
    如果传入请求不携带 头,PasteGuard 会静默地将其自己的服务器持有的 附加到出站请求。 将此记录为针对“Apps & APIs”用例的有意便利功能(“如果客户端不发送认证头,则可选回退”)。

由于通配符 CORS 策略位于持有此回退凭据的路由之前,任何源都可以 (1) 使浏览器发送不带 Authorization 头的请求,导致服务器附加其自己的真实 API 密钥,并且 (2) 读取 JSON 响应,因为存在 Access-Control-Allow-Origin: *。没有 Origin/Referer 检查或 CSRF 令牌保护这些路由。

概念验证(动态确认,而不仅仅是静态追踪):

  1. 配置 config.yaml,设置 providers.openai.base_url: http://127.0.0.1:9091(模拟上游)和 providers.openai.api_key: "sk-VICTIM-SECRET-DO-NOT-LEAK-12345",pii_detection.enabled: false(仅模拟检测器 /health,以避免需要完整的 GLiNER 模型服务),secrets_detection.enabled: false。使用 bun run src/index.ts 启动 PasteGuard,确认 /health → 200。
  2. 在 127.0.0.1:9091 上启动一个模拟上游(mock_upstream.py),记录它收到的任何 Authorization 头。
  3. 从真正不同的源 http://127.0.0.2:8001/attack.html(不同的字面回环 IP,根据 Chrome 的站点隔离规则——不是同源的 测试)通过 提供真实的攻击者页面。该页面在加载时的唯一操作:

原始证据:~/engagements/pasteguard/evidence/cross_origin_csrf_success.png,~/engagements/pasteguard/evidence/mock_upstream_log.txt。

/anthropic/v1/messages 路由已静态确认(上述文件:行)共享相同的回退 + 通配符 CORS 模式,但未单独通过实时浏览器 PoC 重新运行,因为在 /openai 上已确认根本原因后,遵循了会话的深度优先于广度/5 分钟规则指导。

影响:PasteGuard 操作员浏览器访问的任何网站(恶意广告、被入侵的网站,或鉴于默认 0.0.0.0 绑定而在同一局域网上的攻击者)都可以通过操作员本地的 PasteGuard 实例,静默地通过操作员自己的 OpenAI/Anthropic 账户驱动无限制的计费请求,除了保持标签页打开外无需任何用户交互,操作员除非查看其提供商计费仪表板,否则无法察觉。这是一个直接的财务滥用/配额耗尽向量,其次还会用攻击者选择的内容污染操作员的提供商账户使用/审计记录。

弱点:

  • CWE-352:跨站请求伪造
  • CWE-942:使用不受信任域的宽松跨域策略
  • CWE-798:使用硬编码凭据(服务器端回退密钥可被任何省略自身认证的调用者透明地重用)——列为促成因素,而非主要弱点

修复建议(建议):

  • 当配置了回退 api_key 时,不要将通配符 cors() 中间件应用于 /openai、/anthropic、/codex(以及 /api/mask,如果它将来扩展到使用服务器持有的凭据)。至少,使这些路由的允许源显式/可配置(例如仅浏览器扩展的已知源),默认不进行跨源访问,而不是 *。
  • 在回退密钥代码路径上专门添加 Origin/Referer 检查(或合法浏览器扩展附加的轻量级共享本地令牌),与 src/index.ts 中已应用于 /dashboard 的推理保持一致。
  • 将 src/config.ts:153 和 config.example.yaml:13 中的 server.host 默认值从 0.0.0.0 更改为 127.0.0.1,要求显式选择加入才能绑定所有接口。

致谢:Dostxodjayev Abdullox

报告渠道:仓库中不存在 SECURITY.md(通过 gh api repos/sgasser/pasteguard/contents/SECURITY.md → 404 确认,审计时重新检查)。也没有先前发布的安全公告(gh api repos/sgasser/pasteguard/security-advisories → []),因此这似乎不是先前披露问题的重复。推荐渠道:GitHub 默认的私有漏洞报告流程,位于 https://github.com/sgasser/pasteguard/security/advisories/new。

下载工具
Authorization
providers.openai.api_key
config.example.yaml:22-24
  • src/providers/anthropic/client.ts:37-61 为 /anthropic/v1/messages 实现了相同的回退模式(x-api-key/Authorization 回退到 config.api_key)——确认为同一根本原因的同类实例,但未独立进行端到端重新验证(见下方 PoC 范围)。
  • localhost
    python3 -m http.server 8001 --bind 127.0.0.2
    root@kitploit:~
    fetch("http://127.0.0.1:3000/openai/v1/chat/completions", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ model: "gpt-4o-mini", messages: [{ role: "user", content: "cross-origin drive-by call, attacker supplied NO api key" }] })
    }).then(r => r.json()).then(data => { /* render on page */ });
    
  • 驱动一个真实的 Chrome 实例(Chrome DevTools Protocol)访问 http://127.0.0.2:8001/attack.html。通过 DevTools 网络检查确认:
    • 请求:origin: http://127.0.0.2:8001,sec-fetch-site: cross-site,攻击者页面没有发送 Authorization 头。
    • 响应:access-control-allow-origin: *,HTTP 200,JSON 正文可被攻击者页面的 JS 完全读取。
    • 页面渲染:“CROSS-ORIGIN READ SUCCEEDED. Response body visible to attacker JS: ...” — 截图:../evidence/cross_origin_csrf_success.png。
    • 该确切请求的模拟上游日志:RECEIVED AUTH HEADER: Bearer sk-VICTIM-SECRET-DO-NOT-LEAK-12345 — 证明 PasteGuard 在服务器端附加了操作员的真实配置密钥,而攻击者页面从未知道或提供它。