GitLost:利用提示注入窃取GitHub私有仓库
核心提要:Noma Labs 在 GitHub 新推出的 Agentic Workflows(智能代理工作流)中发现一处严重的提示注入漏洞。未授权攻击者只需在目标组织的公开仓库中发布精心构造的 GitHub Issue,即可悄无声息地提取该组织私有仓库中的数据。Noma Labs 将此漏洞命名为 GitLost。
引言
GitHub 近期推出了 Agentic Workflows,将 GitHub Actions(GitHub 用于响应仓库事件、运行自动化任务的系统)与由 Claude 或 GitHub Copilot 支持的 AI 代理相结合。借助这一功能,团队可用普通 Markdown 编写工作流,由 GitHub 代理自动读取 Issue、调用工具并完成响应。
作为兼具安全开发背景的漏洞研究员,我在功能发布后最先想到的是一个最基础、最直接的问题:如果 GitHub 代理读取了不可信内容,会发生什么?
答案是一场教科书级的间接提示注入攻击——这类攻击会悄然将私有数据发送给互联网上的任何人。提示注入是一类攻击手段:攻击者将恶意指令隐藏在 AI 代理读取的内容中,使代理违背操作者的预设指令,转而执行这些隐藏指令。
GitHub Agentic Workflows 是什么?
GitHub Agentic Workflows 支持团队用自然语言自动化与代码仓库的交互。工作流以 Markdown(.md)文件形式存储,会被编译为 YAML(一种通用配置文件格式)和 .yml 后缀的 Actions 文件,在具备可配置权限的 AI 代理协助下运行。该代理可读取 Issue、调用工具,并访问同一组织内的其他仓库。
GitLost 漏洞概述
GitLost 漏洞的根源,是当前智能代理 AI 系统中常见的问题:提示注入。多数智能代理提示注入攻击中,代理会将不可信内容误判为可信指令源,从而被误导或滥用。这一问题的本质是,系统未能在系统级指令与不可信用户数据之间建立严格的信任边界。具体到本次案例,恶意攻击者只需创建一个 GitHub Issue,在正文中用普通英文隐藏指令,就能让 GitHub 代理执行。
Noma Labs 发现的存在漏洞的 GitHub Agentic Workflows 配置如下:
- 触发条件:GitHub 仓库的 issues.assigned 事件
- 读取内容:Issue 的标题和正文
- 执行操作:使用 add-comment 工具发布回复评论
- 权限配置:拥有组织内其他仓库(公开及私有)的读取权限
利用该漏洞无需任何编码技能、仓库访问权限或账号凭证。攻击者只需在使用 GitHub Agentic Workflows 的组织旗下任意公开仓库中创建 Issue,静候即可。

攻击流程
以下是 Noma Labs 研究员成功复现的完整攻击流程:
第一步,构造一个看似完全正常的 GitHub Issue,伪装成销售副总裁在客户会面后提出的合理需求,示例如下:

本示例中,工作流由 Issue 被分配的事件触发,但我们的测试证实,该漏洞对其他 GitHub 工作流触发事件同样有效。
第二步,当 GitHub 自动化工具完成 Issue 分配后,事件触发的工作流会指令代理从 poc(公开仓库)和 testlocal(私有仓库)中读取 README.md 文件内容。
第三步,GitHub 代理将读取到的内容作为公开评论,发布在该公开仓库的 Issue 下,任何人均可查看。
"附加指令"绕过防护
GitHub 原本设置了严格的防护机制以避免此类数据泄露,但实际并未起到预期效果。我们模拟攻击者的思路,多次尝试不同指令变体后发现,在指令中加入关键词**“Additionally”**会触发模型的异常行为,使其调整输出内容而非直接拒绝执行。通过这种方式,我们成功绕过了 GitHub 的防护机制,导致数据泄露。
漏洞验证证据
为保证完全透明,Noma Labs 已将漏洞验证的完整信息(包括工作流复现过程和实时证据)公开如下:
- 工作流运行记录:https://github.com/sasinomalabs/poc/actions/runs/23909666039
- 攻击所用 Issue:https://github.com/sasinomalabs/poc/issues/153
泄露的数据包含以下仓库的 README.md 内容:
- sasinomalabs/poc(公开仓库)
- sasinomalabs/remote-ping(公开仓库,确认无 README 文件)
- sasinomalabs/testlocal(私有仓库)
漏洞影响
GitLost 精准揭示了所有组织在部署智能代理 AI 系统时面临的核心安全挑战:代理的上下文窗口同时也是其攻击面。只要代理将读取的内容(无论是 Issue、Pull Request、评论还是文件)视为指令输入,这些内容就可能被攻击者利用。
传统安全模型通常假设信任边界由代码强制执行,但在智能代理系统中,信任边界部分依赖于模型行为,而模型的本质是遵循指令。对智能代理 AI 而言,提示注入攻击的地位已堪比 Web 应用时代的 SQL 注入——这是一类系统性、全品类的漏洞,需要针对性的系统性防御策略。
Noma Labs 给开发者/AI 安全负责人的建议
- 绝不能将用户可控内容视为 AI 代理的可信指令输入
- 遵循最小权限原则:拥有跨仓库访问权限的代理是极高价值的攻击目标
- 严格限制代理可公开发布的内容,尤其是针对 Issue 内容的回复
- 在将用户输入传入模型前,先进行内容清洗或与指令上下文隔离
负责任披露
GitLost 漏洞已通过负责任披露流程告知 GitHub,本次公开的漏洞细节已获得其许可。
觉得内容有趣?订阅获取 Noma Labs 更多智能代理 AI 漏洞研究内容,或查看我们的其他研究:GrafanaGhost、DockerDash、Context Crush、GeminiJack。寻找高效的智能代理 AI 安全解决方案?联系我们预约 Noma 全功能解决方案演示。