CLIProxyAPI /v1internal:method 未授权访问漏洞


一、漏洞简介

CLIProxyAPI 存在一处内部接口未授权访问漏洞。在特定部署场景下,外部攻击者无需提供有效 API Key,即可直接调用 /v1internal:method 相关接口,进而造成模型能力被匿名滥用、资源消耗异常、上游 provider 配额与费用损失等安全风险。

该问题的核心原因包括:

  • /v1internal:method 路由未纳入统一认证中间件保护;
  • 接口访问控制依赖 RemoteAddr == 127.0.0.1 的本地来源判断;
  • 当服务部署于同机反向代理场景(如 nginx 与 CLIProxyAPI 位于同一台主机)时,公网请求被代理转发后,后端可能将请求来源识别为本机地址,从而导致鉴权绕过。

根据公开披露信息,该漏洞在常见的 nginx 同机反代 部署方式下可被触发。Issue #2445 中的评论给出了影响说明、PoC、测试记录、受影响配置场景和临时缓解方案。(github.com)


二、风险等级与评分

  • 风险等级:高危
  • CVSS v3.1(建议评分):8.6 / 10.0
  • 建议向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:H

评分说明

该漏洞可通过网络远程利用,攻击复杂度低,不需要身份认证,也不需要用户交互。成功利用后,攻击者可直接调用模型相关内部接口,造成未授权资源消耗、服务滥用、上游计费损失,并可能触发进一步的内部转发能力调用。
这里的 CVSS 评分属于基于公开技术细节和典型部署影响的建议评分,用于安全通告和应急响应优先级参考。


三、漏洞简介

CLIProxyAPI 的 POST /v1internal:method 接口用于处理 Gemini CLI 相关内部调用。公开披露显示,该接口未像 /v1/* 与 /v1beta/* 一样接入统一鉴权中间件,而是通过请求来源地址是否为 127.0.0.1 来判定是否允许访问。

这一设计在“服务仅本地访问、无反向代理暴露”的理想条件下看似可行,但在同机反向代理部署场景中会失效:
外部攻击者请求先到 nginx,再由 nginx 转发到本机上的 CLIProxyAPI,后端看到的连接来源可能为本地回环地址,因此原本 intended 的“仅本机可访问”限制被绕过。

一旦后端已配置可用模型 provider,攻击者即可无需 API Key 直接调用内部模型接口,形成未授权调用与资源盗刷风险。(github.com)


四、漏洞影响产品

  • 产品名称:CLIProxyAPI
  • 项目仓库:router-for-me/CLIProxyAPI
  • 受影响接口:
    • POST /v1internal:method
    • 可被利用的典型路径包括:
    • /v1internal:generateContent
    • /v1internal:streamGenerateContent

五、版本信息

受影响版本

  • 低于 v6.9.12 的版本

修复版本

  • v6.9.12 及以上版本

修复说明

公开信息显示,v6.9.12 的 release 已包含与该问题相关的安全修复说明,提交信息为:

  • adb580b
  • feat(security): add configuration to toggle Gemini CLI endpoint access

这表明项目已在 v6.9.12 中引入针对 Gemini CLI 端点访问控制的安全修复或缓解能力。(github.com)

修复版本表格

项目 信息
受影响产品 CLIProxyAPI
受影响版本 < v6.9.12
修复版本 >= v6.9.12
相关修复提交 adb580b
提交说明 feat(security): add configuration to toggle Gemini CLI endpoint access

六、受影响配置场景

该漏洞能否成功利用,与部署方式高度相关。

1. 高风险场景

以下场景存在较高风险:

  • 使用 nginx 反向代理
  • nginx 与 CLIProxyAPI 部署在同一台主机
  • nginx 将外部请求转发至本机 127.0.0.1:<port> 或等效本地监听地址
  • 未在代理层显式拦截 /v1internal* 路径
  • 后端已配置可用的 provider 或模型调用能力

在上述条件下,外部请求经 nginx 转发后,后端应用可能将反代请求来源识别为 127.0.0.1,从而绕过“仅本机访问”的限制。

2. 低风险或不易利用场景

以下场景中通常较难直接利用:

  • 服务未经过同机反向代理,而是直接暴露后端端口;
  • nginx 与后端位于不同主机,后端看到的来源地址不再是 127.0.0.1;
  • 网关、WAF、Ingress 或反向代理层已主动拦截 /v1internal*;
  • 虽然接口可访问,但后端未配置可用 provider,因此调用无法真正执行。

七、漏洞成因分析

1. 路由未接入统一鉴权

公开披露指出,/v1internal:method 路由是直接注册在根引擎上的,没有像 /v1/* 和 /v1beta/* 一样使用统一认证中间件 AuthMiddleware 进行保护。

存在问题的注册方式示例如下:

// No AuthMiddleware — unlike /v1/* and /v1beta/* route groups
s.engine.POST("/v1internal:method", geminiCLIHandlers.CLIHandler)

而正常受保护的路由则类似于:

v1 := s.engine.Group("/v1")
v1.Use(AuthMiddleware(s.accessManager))

v1beta := s.engine.Group("/v1beta")
v1beta.Use(AuthMiddleware(s.accessManager))

这意味着 /v1internal:method 与正式 API 路由相比,缺失同等级别的身份认证保护。(github.com)

2. 依赖 RemoteAddr 的本地来源判断不可靠

评论中进一步指出,处理逻辑会检查 c.Request.RemoteAddr 是否为 127.0.0.1。这一方式在存在反向代理时并不可靠。

在 nginx 与应用同机部署时,真实公网客户端请求虽然来自外部,但经过 nginx 转发后,后端应用建立连接的对端实际上是本机上的 nginx 进程,因此看到的来源地址可能为 127.0.0.1。
这样一来,接口会错误地将外部请求判定为“本地请求”,从而允许继续访问。(github.com)

3. 根本原因总结

该漏洞本质上属于以下几类安全问题的组合:

  • 内部接口缺失统一认证;
  • 以来源地址代替身份认证;
  • 错误信任反向代理后的网络边界;
  • 内部接口在公网部署中被意外暴露。

八、漏洞复现

以下 PoC 仅用于授权测试、自查与应急验证,请勿用于未授权目标。

1. 复现条件

满足以下条件时,通常可以复现:

  • 目标运行受影响版本的 CLIProxyAPI;
  • 部署在 nginx 同机反向代理场景;
  • /v1internal* 未在网关或代理层被拦截;
  • 后端已配置可用 provider。

2. 测试 PoC

无需 API Key,直接调用内部接口:

curl -X POST "https://<your-domain>/v1internal:streamGenerateContent" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4",
    "request": {
      "contents": [{"role": "user", "parts": [{"text": "Say hi"}]}],
      "generationConfig": {"maxOutputTokens": 10}
    }
  }'

如果目标存在漏洞,可能直接返回模型输出,说明攻击者无需认证即可调用模型能力。(github.com)

3. 对照测试

正常受保护的接口在无有效 API Key 时应返回鉴权失败,例如:

curl -X POST "https://<your-domain>/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer fake-key" \
  -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "hi"}]}'

预期结果:

{"error":"Invalid API key"}

如果普通接口返回 401 或鉴权错误,而 /v1internal:* 却可以返回正常模型结果,则基本可以确认存在未授权访问风险。(github.com)

没有反代的版本版本会提示:CLI reply only allow local access

v6.9.12 版本修复后会提示: Gemini CLI endpoint is disabled


九、测试记录

根据公开披露的测试结果,研究者对 5 个公网实例进行了验证:

实例 部署方式 是否绕过 IP 检查 模型调用结果
Instance A nginx 同机反代 是 成功,返回模型输出
Instance B nginx 同机反代 是 失败,无 provider 配置
Instance C nginx 同机反代 是 失败,无 provider 配置
Instance D 直接暴露,无反代 否 返回 403
Instance E nginx 异机反代 否 返回 403

测试结论

  • 5 个样本中有 3 个 可以绕过本地来源校验;
  • 至少 1 个实例 已达到完全可利用状态,可直接匿名调用模型;
  • 是否造成实际资源盗刷,与目标实例是否配置可用 provider 密切相关。(github.com)

十、漏洞影响

该漏洞可能带来以下影响:

1. 未授权调用模型接口

攻击者无需提供有效 API Key,即可访问内部模型接口并发起调用。

2. 资源盗刷与费用损失

若后端对接了计费型模型或上游 provider,攻击者可以持续发起请求,造成:

  • 额度消耗;
  • 计费增长;
  • provider 配额异常下降;
  • 服务资源被第三方占用。

3. 服务被匿名滥用

攻击者可将受害实例作为匿名代理调用点,用于:

  • 大量生成式请求;
  • 流式输出请求;
  • 批量模型调用;
  • 规避其自身账号或 API Key 管控。

4. 潜在的更大内部攻击面

公开披露指出,除已验证的 /v1internal:generateContent、/v1internal:streamGenerateContent 外,其他 /v1internal:* 分支还可能直接转发至 cloudcode-pa.googleapis.com。这意味着其风险不止于简单的模型文本调用,还可能涉及额外的内部转发能力暴露。(github.com)


十一、如何修复

1. 立即升级到安全版本

建议受影响用户尽快升级到 v6.9.12 或更高版本。
该版本已公开说明包含与 Gemini CLI 端点访问控制相关的安全修复。(github.com)

2. 代码层修复建议

若暂时无法升级,可参考披露建议,对 /v1internal:method 路由增加统一鉴权中间件:

// Before (vulnerable)
s.engine.POST("/v1internal:method", geminiCLIHandlers.CLIHandler)

// After (fixed)
s.engine.POST("/v1internal:method", AuthMiddleware(s.accessManager), geminiCLIHandlers.CLIHandler)

3. 修复原则

除直接补丁外,还建议遵循以下安全原则:

  • 内部接口默认不应直接暴露到公网;
  • 不要仅依赖 RemoteAddr 判断“是否可信”;
  • 不要将“来自本机”视为“已经认证”;
  • 若必须保留内部接口,应采用独立认证、访问白名单、内网监听或更严格的信任边界控制;
  • 对所有 internal、admin、debug、management 类路由进行统一审计。

4. 架构层加固建议

建议进一步采取以下措施:

  • 将内部接口绑定到仅本地或内网可达的监听地址;
  • 在反向代理层显式拒绝访问内部路径;
  • 对反代后的真实客户端身份进行明确校验,而非仅使用 TCP 对端地址;
  • 针对敏感接口引入单独令牌、mTLS 或管理平面专用入口。

十二、临时防御措施

如果暂时无法升级到修复版本,可优先采取以下缓解措施:

1. 在 nginx 层封禁 /v1internal*

location ~ ^/v1internal {
    return 403;
}

这是公开披露中明确建议的临时缓解方式,可直接阻断外部访问。(github.com)

2. 缩小暴露面

  • 禁止公网直接访问内部接口;
  • 检查 CDN、LB、Ingress、WAF 是否会将 /v1internal* 转发到后端;
  • 仅保留必要对外 API,显式拒绝 internal 路径;
  • 如果可能,将相关接口迁移到仅本地监听或管理平面专用端口。

3. 审计访问日志与账单

建议重点排查以下内容:

  • 是否存在 /v1internal:generateContent、/v1internal:streamGenerateContent 的公网访问日志;
  • 是否存在无认证头、伪造认证头或异常 User-Agent 的请求;
  • 是否存在 provider 配额异常下降;
  • 是否存在调用量、并发量、流式输出请求异常上升;
  • 是否存在账单突增、令牌消耗异常等现象。

4. 必要时轮换凭据并临时停用 provider

虽然该漏洞不一定意味着密钥泄露,但若已发现异常调用,仍建议:

  • 排查 provider 使用记录;
  • 临时停用受影响实例的相关 provider;
  • 视情况轮换认证凭据和上游配置;
  • 在完成升级与验证后再恢复服务。

十三、自查方法

建议管理员按以下步骤自查:

  1. 确认当前版本是否低于 v6.9.12;
  2. 检查是否启用了 /v1internal:method;
  3. 检查该路由是否未使用统一鉴权中间件;
  4. 检查部署是否属于 nginx 与后端同机的反向代理模式;
  5. 从公网以无 API Key方式请求 /v1internal:streamGenerateContent;
  6. 若接口返回模型结果而非鉴权失败,则说明存在风险;
  7. 进一步排查历史访问日志与 provider 消耗记录。

十四、时间线

时间 事件
2026-04-01 Issue #2445 中已有用户反馈存在相关现象
2026-04-02 评论 #4174720882 公开披露漏洞成因、PoC、测试记录、影响场景及缓解建议
后续 项目发布 v6.9.12,release 说明包含 Gemini CLI 端点访问控制相关安全修复
当前 建议所有受影响用户尽快升级并排查历史访问情况

时间线中的 issue 评论与 release 信息均可从项目公开仓库信息中获得。(github.com)


十五、致谢

感谢安全研究人员 Dismantle0488 在 Issue #2445 的评论 #4174720882 中公开披露该问题的技术细节、影响说明、复现方式、测试结果以及缓解建议,为受影响用户及时处置风险提供了重要参考。(github.com)

同时也感谢项目维护者对相关问题进行处理和发布修复版本。


十六、参考信息

  • 项目 Issue:router-for-me/CLIProxyAPI#2445
  • 关键披露评论:#4174720882
  • 修复版本:v6.9.12
  • 相关修复提交:adb580b

手机扫码阅读

孚盟云CRM AjaxTrackInfo.ashx SQL注入漏洞

深科特 LEAN MES系统 SetDataSource.aspx SQL注入漏洞

评 论