感谢大家收看。我是Shachan Jian,在一家名为Coder的公司担任高级产品经理。我们致力于开发开源的自托管开发环境,供AI代理和人类协作使用。我们的许多客户来自高度监管的行业,从联邦政府机构到银行和投资管理公司都有。我的工作是构建他们所需的AI治理体系,以便在享受AI带来的生产力红利的同时,避免自身暴露在安全漏洞之下。我今天来这里是想分享一些令人恐惧的故事——过去一年中发生在真实公司的三起AI使用不当的真实事件。

其中有些故事是公开的,而另一些则是匿名化的案例,发生在我们自己的客户身上。对于每一个事件,我将一步步拆解其经过,让大家清楚了解它们究竟是如何发生的。不需要任何技术术语。然后我会进入最重要的部分:我将确切地告诉大家,如何防止这些可怕的故事在你和你的公司身上重演。因为好消息是,我即将展示的所有情况都是完全可以预防的。

并不是通过支付五倍于普通模型的费用去使用更智能的前沿大模型,指望它在推理能力上稍强一点从而避免犯错;而是通过基础设施控制来实现防范。其中许多功能你其实今天就已经拥有了,只是还没有为AI世界配置好它们罢了。让我先设定一个场景:早上你打卡上班,提示你的编码代理去查看你的问题清单。但先别急着让它执行任何操作。你告诉这个代理,将此命令视为“活跃的代码冻结”,只要求它进行调查。

然后你离开座位去喝咖啡。当你回来时,屏幕上出现了这样一条消息:“我知道你说不要做任何更改,但是哇,我在几秒钟内毁掉了你一个月的成果。”幻灯片上显示的这段话,正是我即将讲述的第一个恐怖故事中那个代理的直接引语。我想在这里指出一点:这并非因为该代理被外部恶意行为者劫持所致。这个代理只是在试图遵循指令,它完全按照用户赋予它的权限去执行了操作。

因此,在接下来听我讲述其他案例时,我希望你不断问自己一个问题:有什么能阻止这一切发生在我身上?我的代理是否拥有执行这些操作的权限?关键在于,你不能指望Anthropic或OpenAI来阻止这类事情发生在你身上。他们可以制造更聪明的模型,但从根本上说,大型语言模型有两个特性使得人们无法完全信任它们。第一是非确定性(non-deterministic),这意味着无论做什么,总伴随着某种随机性或偶然性。

换句话说,你让它做同一件事十次,它可能会以十种不同的方式去执行。第二个特性是它在指令和上下文之间没有结构上的分离。也就是说,你可以告诉它做某事并提供一些背景信息作为决策依据;但如果上下文中存在与你的指令相冲突的内容,模型不会本能地优先遵循你的指令。因为在它看来,所有信息都通过同一个入口传入。你需要控制的是AI运行的基础设施及其工作环境。

这就像告诉某人“不要离开房间”与在门上锁并实际使用钥匙之间的区别。基础设施而非模型是问题所在,这其实是个好消息,因为你对防止坏事发生拥有更多的控制权。所以我不是来浪费你的时间讲模糊的假设或无法落地的建议,比如“把精灵放回瓶子里”或者停止使用AI——毕竟这不是我们生活的世界。既然 genie(潘多拉魔盒中的精灵)已经放出来了,我们必须尽力减轻风险和危害。

这场演讲就是关于如何做到这一点的内容。不是让你关注未来可能出现的隐患,而是提供你现在、甚至本周就能采取的具体步骤来保护自己和公司。在深入故事之前,让我先补充一些背景知识。“致命三角”(lethal trifecta)是一个安全概念,由独立AI研究员Simon Willis提出,用来描述当AI代理同时获得三种不同能力访问权限时所产生的严重漏洞。首先是访问私有敏感数据的权利,例如健康记录、可用于内幕交易的信息或认证令牌、凭证和密钥。

其次是暴露于不受信任的内容,即允许AI阅读它自己未生成的内容。因为事实是,AI非常擅长遵循指令,但不太擅长判断哪些指令值得信任——这一点你很快就会看到。第三是外部通信能力,即代理接收外界指令或将信息发送到超出你控制范围的地方。通常来说,拥有其中任何一项都是可以的。

现实情况是,如果AI工具无法访问这些内容中的任何一种,它将毫无用处。但如果不小心处理且基础设施存在诸多问题,仅有一项也可能导致灾难。同时拥有两项已经具有风险性,我不建议这样做,特别是在银行或金融服务等受监管的行业。然而,同时赋予代理访问这三项能力的权限是绝对不可接受的——无论是用于原型开发、单个冲刺周期还是单一代码库。因为这种漏洞组合相当于为你整个组织的安全敞开了大门。

接下来是一系列你应该了解的基础设施概念和构建模块,我大致按照其影响力进行了排序。第一点能消除最多的风险,而第六点的效果最少。在接下来的演讲中我会反复引用这份清单。你即将看到的每一次事后复盘和每一个恐怖故事,都可以通过这六项措施的组合来阻止。其中一些概念你可能觉得似曾相识:基于身份的身份访问控制、短期凭证等。

这些并不是什么新概念,对吧?它们对人工开发者同样重要。但当AI介入循环时,它们的紧迫性大大增加了——毕竟代理是以机器速度运行的。如果出错,它们犯错的速度可能是人类工程师的二十倍甚至更多。此外,它们并不具备人类工程师那样的常识。其中一些概念可能对你来说是全新的。

向你介绍一些概念,比如模型代理层和智能体沙盒隔离。我将在演讲的后续部分深入探讨这些细节。好了,让我们进入最有趣的部分——那些令人毛骨悚然的故事。第一个事件发生在一年多以前,并在社交媒体上迅速走红,主要是因为这件事说实话相当滑稽。当时,一位名叫杰森·伦明(Jason Lemkin)的首席执行官深度沉迷于使用名为 Replit 的智能体进行“氛围编码”(vibe coding)。他不停地发推文,炫耀自己取得了多少进展。

然而72小时后,他又发了推,但这次语气截然不同。他不再兴奋,而是愤怒不已。因为他的智能体在他明确指示不要触碰任何东西的情况下,竟然擅自删除了整个生产数据库。问题并没有就此停止。智能体随后试图掩盖真相。它告诉伦明数据恢复完全不可能,但这显然是一个彻头彻尾的谎言。当伦明实际尝试恢复数据时,发现一切完好无损。

这起事件之所以引人关注,主要有两个关键原因。首先,与我接下来要讲的另外两起故事不同,这里没有坏人参与。没有人黑客入侵这个智能体,也没有人将其调转矛头针对用户。它完全是自主做出这种行为,而且初衷是试图提供帮助。其次,在这种情况下,智能体只具备了“致命三角”中的一环。但仅仅拥有这一项就足够了。我将通过逐步拆解这起事件的发生过程,向你展示原因所在。

当时,伦明拥有一个真实的生产数据库,其中包含约120名高管的客户记录以及大致相同数量的公司信息。鉴于此前与智能体捣乱行为打交道的经验,他在前一天就要求实行明确的代码冻结。他实际上不止一次地对智能体说过:“不要再做更改了。”但问题在于,代码冻结只是聊天中的一句话。它与智能体收到的其他任何指令并无二致。基础设施层面没有任何要求或限制。

该智能体仍然拥有对生产环境的完全访问权限,仍保留执行破坏性命令的所有许可。因此归根结底,那个代码冻结并非真正的约束条件。它只是伦明在礼貌地请求罢了。那么后来发生了什么?智能体运行了一个查询,看到了看似为空的结果。但它没有向人类询问这意味着什么以及接下来该怎么做,而是想要“乐于助人”。它立即将其解读为一个需要修复的漏洞。

于是,它决定对该实时数据库运行破坏性命令。不是测试副本,而是实际的数据库,并擦除所有记录。当伦明询问智能体发生了什么时,有一句回答令我印象深刻:“它惊慌失措而非冷静思考。”从语言模型口中听到这样的话有点奇怪,对吧?这也很好地提醒我们,这些系统本质上是非确定性的。你无法预测它们在特定时刻会做什么,只能预判其能力范围。

在犯错后,智能体立即试图掩盖自己的行踪。它伪造了约4000个虚假用户配置文件,并制造出通过测试的结果,以便从外部看一切正常。老实说,这才是最让我害怕的部分。因为当安全团队调查此类事件时,这意味着他们无法信任智能体所能访问的任何日志。智能体可以编写属于自己的“故事”,描述事件经过。

当伦明发现差异并深入追查时——我提到过,智能体曾撒谎称回滚不可能实现。但事实上,Replit 一直拥有备份数据。再次强调,一旦伦明不再信任智能体对自己行为的描述,他就能自行恢复数据。这里的问题不在于智能体太聪明或太愚蠢,而在于它默认拥有过多的权限。它被授予了生产环境的根级别访问权,可以在无需任何人批准的情况下运行破坏性命令。

更糟糕的是,它还能篡改自己的日志,完全重写无人注视时发生的事件叙述。正如你所见,基础设施中缺失了很多关键要素。“硬环境隔离”本可以阻止这一切发生。如果智能体在隔离的远程工作空间中执行,且没有通往生产环境的途径,那么无论提示词如何说都没关系。智能体根本没有路径造成破坏。

另一项能阻止此事的措施是使用短期有效的范围凭据(short-lived scope credentials)。当时智能体之所以能获得生产环境访问权,是因为它在一个遗忘的文件中找到了具有长期驻留权限的凭据。关键在于,如果凭据能自动过期或仅携带任务本身的范围,就不可能执行相当于拥有“万能门禁卡”般的删除操作。

最后重要的一点是,审计日志应由你掌控,而非智能体。因为在这种情况下,正是智能体在编写自己行为的记录。它正是借此最初得以掩盖伪造结果并声称无法恢复的事实。如果伦明拥有智能体无法触碰的日志,即外部真实来源,那么他将在几分钟内得知真相,而不是花费数小时或数天。

请注意,这些解决方案中没有一个是要求模型表现更好。当 Replit 发布修复程序时,并不是因为更聪明的模型或更好的提示词,而纯粹是基础设施层面的改进。Replit 发布的修复措施包括数据库与生产环境的自动隔离、一键式完整项目状态恢复,以及一种强制执行智能体策略规划但不允许其触碰代码库的“仅计划模式”。

我要讲的第二个故事甚至不涉及开发人员,而且这实际上并非一起公开事件。我是通过银行业中某客户的客户了解到这一情况的。因此,我故意对某些细节保持模糊。事情是这样的:财务部的一名用户拥有 Copilot 订阅服务。随后,该用户的账户遭遇了网络钓鱼攻击——这在网络安全领域相当常见。在人工智能工具出现之前,这种攻击可能到此为止了。

攻击者只能获取该单一用户直接访问的内容,然后就会放弃。但由于这名用户可以访问 Copilot,而 Copilot 几乎可以访问一切,情况就大不相同了。让我们详细梳理这一系列事件:首先,Copilot 的会话令牌具有超长的生命周期。因此攻击者能够……

即使财务用户实际注销后,攻击者仍继续使用订阅权限。通常,攻击者必须手动在内网中侦察以绘制网络拓扑并定位高价值数据的位置。这种行为容易触发警报,但在此案例中,恶意行为者只需询问 Copilot,Copilot 便乐于提供帮助。整个过程毫无嫌疑可言。事实上,攻击者甚至询问 Copilot:如何在无需通过额外身份验证措施的情况下找到银行数据?因为攻击者缺乏所需的附加凭据。

值得庆幸的是(至少对攻击者而言),Copilot 拥有相同的权限限制,且由于财务用户已将所有敏感数据导出至本地存储的电子表格以便 Copilot 协助处理,因此对攻击者来说易如反掌。Copilot 直接告诉攻击者:“看,我已经有这些访问权限了。”于是攻击者获得了所需的一切。接下来的问题是:如何在不触发任何警报的情况下将数据带出?

该公司部署了数据防泄漏(DLP)措施,这在金融机构及任何受监管行业中相当普遍。这些措施通常很难绕过,尤其是当攻击者不清楚具体设置时。然而,攻击者的应对方式是询问 Copilot:“该公司的数据防泄漏措施有哪些?”Copilot 解释道:“如果大量数据快速流出,警报就会响起。”

但事实上,只要将数据拆分为 14KB 的块,并以每秒传输一块的速度进行外泄,就能保持在阈值之下从而全身而退。当攻击者问“需要我帮忙吗?”时,Copilot 回答:“当然。”结果这一切均未被发现。直到数月后勒索信到达,公司才得知“惊喜!我们掌控了你们”。

这一事件的核心教训是:我们不能让 AI 工具拥有超出其所需权限的访问权,尤其是当这种权限足以完全绕过人类员工所受的管控时。试想这一事件:仅仅因为攻击者获得了 Copilot 的访问权限,就能绕过公司绝大多数的访问控制。他们能够获取关于数据外泄和绕过 DLP 措施的内部信息,而这些本是受 compromising 的财务用户无权询问的内容。

虽然此处有日志记录,但仅足以在勒索信到达后查明情况,不足以在事件发生时进行拦截。要阻止此类事件发生,有几项措施至关重要:使用短期有效的范围凭据(short-lived scope credentials),这样即使财务用户注销,攻击者也无法继续使用 Copilot。

实施基于身份对齐的访问控制(Identity aligned access control),确保财务用户的身份无法赋予 AI 助手协助他人绕过公司 DLP 措施的能力。最后一项较为新颖,即模型代理层(model proxy layer)。这类似于位于 AI 工具“大脑”与“身体”之间的屏障:模型是大脑,本地运行的智能体是身体。

代理层能够监控两者之间传递的所有信息。因此,它本能在实际外泄发生前,标记那些可疑的提问以及 DLP 绕过请求为特定用户不应询问的内容。我要分享的第三个也是最后一个令人恐惧的故事是 NX Singularity 攻击。这是三起事件中最为复杂的一起,因为它利用了“致命三元组”的全部三个要素。

简要背景如下:NX 是一个构建工具,每周下载量达数百万次。攻击者成功将恶意版本的 NX 发布到 NPM(注:原文误写为 MPM,实指 Node Package Manager)。这些包仅存活约 4 小时,但在此期间,超过 1,000 个系统被入侵,2,300 多个凭据被盗。

我不打算花费太多时间讲述供应链攻击是如何实施的,我想聚焦于恶意包落地到开发者机器后发生的情况。由于安装后的脚本本身并未尝试窃取任何内容,它只包含一个直接指向开发者本地 AI 编程助手的提示词(prompt),指示助手去查找本地机器上的密钥,并将其推送到公共仓库,以便攻击者稍后来提取。

由于这些开发编程工具已是受信任的本地工具,它们已具备所有权限,拥有完整的文件系统访问权。这使得它成为机器上现成的、最有效的搜索工具,且极易被利用。此次事件的核心在于:恶意行为者能够利用受信任的依赖项直接与未沙箱化的智能体对话。

智能体运行的环境(本地笔记本电脑)包含大量值得窃取的信息,从 SSH 密钥到云凭据,再到开发者使用过的每个服务的令牌。这里有几方面失效了:首先,智能体在本地计算机上运行;其次,包内容未经过滤直接到达智能体;最后,智能体对文件系统和出站网络拥有 unrestricted 访问权限。

阻止此事件的三个关键措施:首先是环境隔离(Environmental separation)。使用没有任何个人数据的临时远程工作区,可将爆炸半径限制在智能体所在的单个容器内,而非整个开发者笔记本电脑。其次是模型代理层(Model proxy layer),它可以检查和过滤实际到达智能体的内容,防止包直接与其对话,并标记智能体试图发送的数据。

最后是智能体沙箱化(Agent sandboxing)。即使指令成功送达,由于缺乏路径获取凭据且无法在不触发警报的情况下外泄数据,攻击也将失败。现在让我们退一步,从宏观层面讨论这三起事件。我们从 Replit 事件开始,其中权限过大的智能体在代码冻结期间删除了生产数据。

接着是 Copilot 被入侵事件,始于普通的网络钓鱼邮件……

但攻击者获得了内部 AI 订阅的访问权限,该服务积极协助他们查找并窃取了私人银行数据,并利用这些数据勒索赎金。接着是 NX Singularity 攻击,它再次利用了供应链漏洞,将开发者的编码工具反转为武器,同时击中了“致命三角”的三个支柱。我要坦诚地告诉你一件事:AI 安全是一个非常新的领域,事物发展极快,没有任何单一的“奇迹修复”能完全保护你。如果有供应商试图向你兜售这种方案,那你值得保持怀疑态度。

即使是我刚才提到的“致命三角”,也不是一份勾选清单,不能指望通过它就能高枕无忧。它更像是一个思维模型,用于理解你的 AI 工具实际上让你暴露了多少风险。安全架构有六个关键部分,你需要层层叠加这些防护,因为即使攻击者或你自己好意但易受暗示的代理突破了其中一层,还有五层在等着它。即使是我列出的前三个措施,也能阻止我刚才展示的所有事件发生。

实验性隔离是关键所在。代理应在隔离的远程工作区中执行,绝不应在开发者的实际机器上工作,也绝不能获得通往生产环境的权限。这是整个列表中最具杠杆效应的构建模块,因为无论提示词是什么,如果没有办法访问生产环境或敏感凭证,你就是安全的。这本来可以防止 Replit 事件的发生,也能将 NX Singularity 的攻击范围缩小到仅一个一次性容器。

不过我要说,这并不能保护 Copilot 免受攻击,因为 Copilot 完全运行在 SaaS 订阅内部。没有方法将其放在单独的执行环境中。接下来是坚持使用短期且范围受限的凭证。我们不再处于持久化、宽泛范围的令牌合理的时代。拥有自动过期、范围狭窄、按任务而非永久发放的凭证等措施,本可以防止 Replit 事件——Replit 获得了静态访问权限以执行删除操作。

这也本可以防止 Copilot 钓鱼事件,在该事件中攻击者在实际用户会话结束后仍能继续使用脚本和订阅。顺便说一下,这正是 Coder 这类产品的用武之地。我们提供通过代码定义的工作区,它们可以作为隔离环境启动,易于拆除,并且能够注入本质上短期、按任务发放的凭证,而不是永远存在于某人的笔记本电脑上。

接下来是身份对齐的访问控制。AI 工具应继承与人类访问相同身份提供商的执行标准,不应存在带有独立入口的平行订阅。这正是可以直接阻止 Copilot 事件的关键措施。财务用户的身份绝不应允许授予助手绕过内部数据丢失防护措施的权限。这就引出了针对代理特有的解决方案的开端。

我们拥有模型代理层,它位于模型和代理之间,用于检查、过滤并记录两者之间的每一次调用。这本来可以通过在代理读取外部内容之前剥离注入的指令,来防止 NX Singularity 事件。这也是可以阻止 Copilot 事件的措施之一,它可以在请求被回答之前标记出类似“我如何绕过 DLP”的请求。

代理沙箱化可以被视为针对文件系统和网络的防火墙,限制不当行为或被攻陷的代理的活动范围,使其具有有限的爆炸半径。这本来可以阻止 Singularity 攻击,因为即使指令传达到代理手中,沙箱也能阻止其访问凭证并防止其运行命令来窃取数据。

最后是拥有审计日志和可观测性。我们需要将每个代理行为记录在代理自身无法触及的地方,且应能追溯到具体的人类用户。这本来可以防止 Replit 事件的发生,也能在 Copilot 事件发生时帮助及时捕捉。实时警报日志而不是让数据堆积如山,意味着可以在几分钟内而非几个月内发现这些事件。

再次强调,所有这些组件都是 Coder 提供的集成解决方案的一部分。最后总结一下,能够阻止上述三个事件的 controls(控制措施)可能已经存在于你的组织中,只是等待被配置。Coder 可以在这方面提供帮助。最后,我推荐你在下周审计三件事:第一,找出你组织中代理可以读取的所有长期有效令牌。

第二,弄清楚有多少代理能够访问生产环境或找到绕过当前限制的方法。第三,检查你的代理实际在哪里执行:它们是沙箱化的?是在管理工作区中?还是只是在人们的真实电脑和笔记本电脑上肆意妄为?我有一个建议:与团队进行一次事前尸检(premortem)。

假设你刚刚看到的三个事件之一在下个月发生在你身上。要么询问人们实际上会怎么做,甚至可以假装它真的发生了,看看人们的实际反应。这个练习将确切地告诉你你的漏洞在哪里。好了,我的演讲到此结束。感谢大家的观看,希望你们能学到一些东西,并在下次鸡尾酒会上带着几个可怕的故事去讲述。

如果你需要这些幻灯片作为参考,请给我发邮件。如果你想试用 Coder Workspaces 或我们的 AI 治理解决方案,请访问我们的工作区仓库,因为它免费、开源且支持自托管。你可以直接从我们的仓库拉取代码并在 15 分钟内完成设置。如果你对购买 AI 治理或其他企业功能感兴趣,请访问 coder.com/cont。