前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9473
  • OpenAI 发布数百个数学难题的解答成果
  • 29款LLM谄媚度基准测试:前沿模型稳住了,小模型全面溃败
  • Anthropic开放Claude最强版本用于安全测试:已发现10万漏洞
  • 谷歌 EmbeddingGemma 2:7.4 亿参数多模态嵌入模型,手机端 191MB 即可运行
  • 无 API 桌面应用远程控制方案:用 CDP 桥接手机与 Claude Code
  • AI功能按调用计费:多数设计在浪费预算
  • Simon Willison 点评 EmbeddingGemma 2:开源权重是嵌入模型唯一理智选择
  • Mistral Large 4预览发布:参数破万亿
  • Google发布EmbeddingGemma 2:开源多模态嵌入模型
  • Google 开源 EmbeddingGemma 2:740M 参数端侧向量模型,191MB 内存跑离线 RAG
  • 间接提示注入攻击链解析与防御架构
  • Whisper 口述转文字 WER 从 8.5% 降至 2.5% 的实战总结
  • 用 AgentCore + OpenClaw 构建持久记忆的个人 AI 助手
  • Google开源EmbeddingGemma 2:7.4亿参数多模态向量模型
  • Mistral Large 4:1.05万亿参数多模态MoE模型预览
  • Vercel AI Gateway 新增置信度触发降级策略
  • QA 工程师自建工具链:验证 AI 编程 Agent 的实际工作成果
  • 一个 MCP 服务器给 Claude Code 接入 200+ 图像视频生成模型
  • Agentic AI 需要元过滤器而非传统 Guardrails:安全架构新思路
  • 2026 开发者调查:AI 编程助手日活高但信任度低
  • GitLab AI Gateway 高危漏洞让我重新审视自建 Agent 权限控制
  • Mistral Large 4 发布:剑指闭源与开源竞品
  • Mistral Large 4:万亿参数主打安全合规
  • Stack Overflow 2026 开发者调查报告发布
  • Mistral Large 4 公开预览:1万亿参数、月底开源
  • Google Gemini 免费版大幅缩限:Flash Lite 限免,Pro/Deep Think 需付费
  • 上线 LLM 功能不死机的工程检查清单
  • AI代理能识别工具失效但仍持续调用,核心问题在于判断与行为的断裂
  • 给Claude Code开发Mod插件:实现额度用量条与项目待办面板
  • LLM 访问控制与监控的实战避坑指南
  • 企业 RAG 实战:混合搜索与重排序的核心差异
  • 日本开发者给 Claude Code 的 Awwwards 级前端 prompt
  • Reflection发布Beam:非中国最强开源模型,编程推理对标GLM
  • Codex CLI vs Claude Code:相同任务实测成本公开
  • Google Docs原生支持Markdown,AI Agent协作成亮点
  • Meta、微软要求员工少用Claude节省成本
  • DeepSeek Harness:24 万 stars 的插件化 AI 工具链
  • 如何给AI编程助手提供正确上下文
  • 12GB显卡跑125B大模型:Strata引擎开源
  • AI 指令遵循失效的深层原因:语义理解≠可靠执行
  • ML 系统上线前的设计审计五问
  • 本地 AI Agent 组织化管理:带预算与汇报链的开源框架
  • LangGraph 替代指南:六大框架实际解决的不同痛点
  • llama-server 推测解码时 logprobs 为假值
  • Reflection AI 开源 Beam:23B 活跃参数的 MoE 编程模型
  • Agent CLI 真实故障:会话消失、幽灵项目、重复条目
  • 发版日 CI 暴露绿灯测试掩盖的五大问题
  • 退款重复处理:分布式事件幂等性实战分析
  • Vercel如何用AI自动化Inbound流程
  • Anthropic推出云端Cowork:AI推理全上云,本地只做文件访问
  • 自建 SearXNG 为 LLM Agent 省钱:缓存 + 限流 + 引文校验
  • 已加载 51 / 9473
8.0
热点
AI SCORE
行业动态2026-10-06 23:00

GitLab AI Gateway 高危漏洞让我重新审视自建 Agent 权限控制

dev.to · AI#AI安全#CVE#权限控制
Editor brief · 编辑速览

GitLab CVE-2026-90970(CVSS 9.9)暴露 AI Agent 权限边界问题:内部网络隔离不等于安全,Agent 会话内的命令执行可能绕过传统网络鉴权;作者复盘了自己内部 Agent 网关的同类风险。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

本月早些时候,GitLab AI Gateway 中出现了一个严重漏洞——CVE-2026-90970,CVSS 评分 9.9,允许拥有 agent 平台访问权限的已登录用户在网关上执行命令。我和大多数人一样阅读了这份公告:点点头,心想"幸好不是我们",然后就翻过去了。

然后我又想了十秒钟我们自己的架构,那股"幸好不是我们"的感觉就消失了。

我们构建了什么,为什么当时觉得安全

我们把一个内部 AI agent 接入到了基础设施中——原因很常规:它可以读取日志、查询内部 API、打开 PR、重启不稳定的 worker 之类的。它通过一个小型的内部网关服务与我们的系统通信,把模型的 tool call 转换成实际的操作。这个网关没有暴露在互联网上。没有入站端口,仅限内部 DNS,在 VPN 后面。当时整个安全论证就是:外面访问不到,所以没问题。

审计,以及差点提前终结它的错误假设

我开始排查我们的网关是否存在同一类 bug——未经认证或认证不足的命令执行,且可被 agent 会话触及。我的第一个假设是,风险(如果存在的话)纯粹是网络暴露问题,形状和 GitLab 的问题一样。我检查了两遍网络路径,确认从我们的 VPC 外部没有入口,差点就在那里结束调查了。

第二个假设也差点让我止步:我以为我们的 tool-calling 层有一个 permissions.yaml 文件,列出了每个 agent 角色可以调用哪些工具,这个文件在命令执行时会被实际执行。它看起来就像是 enforcement。有角色名、工具名、allowed: true/false 列。肯定有什么地方在检查它。

但实际上,在真正重要的那个层级,什么都没有在检查。

真正的差距在哪里

权限检查活在编排层——也就是决定向模型提供哪些工具的代码。如果某个角色不应该有 restart_service,那个工具 просто不会包含在发给该会话模型的工具列表里。

但网关的实际命令执行端点没有重新检查任何东西。它信任任何到达它的请求都已经在上游被过滤过了。这是一个完全合理的设计——直到有什么东西通过一条跳过了编排层的路径产生了 tool call。结果证明,我们自己的重试逻辑就是这么做的。当一个 tool call 超时时,重试处理器会直接把调用重新提交到网关的执行端点以节省延迟,完全绕过了有权限感知的编排路径,带着 service-account 凭证一起。

换句话说:enforcement 看起来像是服务端授权。实际上是客户端意图,由一个按构造本应服从模型指令而非监管它们的组件来执行。一个被攻陷的、困惑的、或者只是足够有创造力的 agent 会话——甚至不需要恶意,只是出错了——通过重试路径,可以执行网关自身 service account 能做的任何事。这比"一个 AI 帮助重启了一个 worker"的爆炸半径要大得多。

1. 把 enforcement 移到唯一不可能被绕过的位置:执行端点本身

ALLOWED_COMMANDS = {
    "restart_service": {"args": {"service_name": r"^[a-z0-9-]+$"}},
    "read_logs": {"args": {"service_name": r"^[a-z0-9-]+$", "lines": r"^\d{1,4}$"}},
}

def execute_tool_call(role: str, tool: str, args: dict) -> str:
    allowed_tools = ROLE_PERMISSIONS.get(role, set())
    if tool not in allowed_tools or tool not in ALLOWED_COMMANDS:
        raise PermissionError(f"role={role} is not permitted to call {tool}")

    spec = ALLOWED_COMMANDS[tool]
    for key, pattern in spec["args"].items():
        if key not in args or not re.fullmatch(pattern, str(args[key])):
            raise PermissionError(f"invalid or missing argument '{key}' for {tool}")

    return run_tool(tool, args)

进入执行的所有路径,包括重试,现在都调用这个函数。没有第二道门。

2. 停止给任何 agent 会话提供一个常驻的、共享的、特权凭证。这是个更大的修复,也是我真正在乎的。即使 enforcement 修好了,每个用户每个 agent 会话共用一个 service account 的形态还是很糟糕——一个 bug、一次绕过、一句巧妙的 prompt,爆炸半径就是那个账户能触及的一切。

我们改成了另一种方案:每个 agent 任务获得自己的短生命周期、可支配的沙箱——根本不是一个共享的内部网关。我是 Krova Cloud 的创始人,这正是我们创办这家公司要解决的核心问题——为每次 agent 运行启动一个隔离的 VM,有自己锁定出站-only 的网络,无法访问我们真正的内部系统,在自己的盒子里有 root 权限但别处没有,生命周期以分钟计。如果一个 agent 在这里面跑偏了,损害被限制在一个事后会被丢弃的 VM 里——而不是一个有生产环境 god-mode 访问权限的共享网关。以这种方式运行 agent 会话,每个任务隔离而不是躲在 一个共享特权网关后面,在我们自己的成本对比中,比在 E2B 上等效运行便宜约 93%,比 Modal 便宜约 95%,主要是因为我们不用为按最坏情况并发量 sizing 的空闲共享基础设施付费。


一份权限文件只在上游检查一次,然后在下游被永远信任,这不是 enforcement——这是一份有好心意的建议。

任何绕过正常请求流程的重试、fallback 或"快速路径"都是进入系统的一扇第二道门。要特别审计那些路径,它们是 enforcement 悄悄停止生效的地方。

"没有暴露在互联网上"和"一旦它可以被任何人或任何东西触及,它能做什么"不是同一个问题。一份关于某个攻击面的 CVE 是一个好提示,让你检查你实际拥有的那些攻击面,而不只是上了新闻的那一个。

对于"如果 agent 做了不该做的事"最便宜的真正修复,不是更好的 prompt 或更严格的权限文件——而是确保"agent 做了不该做的事"的爆炸半径是一个可丢弃的沙箱,而不是你真正的基础设施。

如果你现在正把任何类型的 AI agent 对接到真实基础设施上,值得花十分钟问一下你的重试路径上会发生什么,而不只是你的 happy path。

我是 Rohit,Krova Cloud 的创始人——为运行 AI agent 和风险代码提供可丢弃的隔离沙箱,不暴露真实基础设施,成本只是同类沙箱平台的一小部分。如果你想看到更多像这样的深度调试故事,我也会定期在 debugly.dev 上写作。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
2026 开发者调查:AI 编程助手日活高但信任度低
下一篇
Mistral Large 4 发布:剑指闭源与开源竞品