人工智能正在以过去几十年来任何技术变革都无法比拟的速度改变软件开发。四十年前,当我在职业生涯初期编写代码时,过程极其复杂、耗时且容易出错。如今,开发人员只需一个提示词即可生成代码、测试用例、智能体(agents)、多步 AI 任务甚至工作流。简而言之,人工智能是一个游戏规则改变者。但这里存在一个挑战:为人类编写的代码和较慢的开发周期设计的安全实践,并不能自动扩展到 AI 辅助开发中。如果安全仅在流程末尾作为事后补救措施进行介入,质量就会受损,整个进程也会戛然而止。

解决方案来自一个意想不到的来源:碧昂丝(Beyoncé)在唱到“向左,左移”时确实言之有理。是的,安全需要左移(Shift Left)。如果做得正确,安全性始于开发的早期阶段并贯穿于整个软件开发生命周期。这些概念并不新鲜,尽管老实说我们过去并未始终如应地践行它们,但在 AI 时代,“左移”不仅仅意味着在流程早期运行几个安全工具。它意味着诸如以下这些内容:我们要验证什么?何时进行验证?以及如何建立对 AI 生成解决方案的信心呢?让我们来看看改善 AI 辅助开发结果的五大左移安全原则。

第一条原则很简单:AI 生成的代码不等于受信任的代码。相信结果,而不仅仅是生成过程。关于 AI 生成代码最具欺骗性的一点是:它看起来通常是正确的。它能编译、能运行,能通过所有安全测试。因此我们认为这没问题,但它仍可能在底层造成你看不到的安全风险,那是我们未意识到的部分。仅仅因为技术实现看起来成功并不意味着解决方案是安全的。开发人员越来越需要验证权限、数据泄露情况(如果发生的话)以及故障处理方式:系统是安全失败还是在开放的危险条件下失效?

例如,AI 生成的服务可能正确地从数据库中检索客户信息,但它真的应该有权访问其中所有信息吗?敏感数据是否正从组织中潜在地外泄?如果身份验证失败会发生什么?此外,如果有格式错误的数据进入数据库并导致其损坏又会发生什么?这些是不太容易看清的部分。这是提出问题的部分,不仅是“代码是否有效”,而是它是否安全?我们需要问的问题是:该解决方案是否能提供预期结果并在现实世界条件下安全地运行。这就是我们需要验证的结果。

第二条原则是:安全性始于开发阶段。传统上,许多组织几乎将安全审查视为事后补充。通常的情况是:开发人员完成编码,组件被构建,函数经过测试,代码提交后,安全审查才发生。基本上这只是流程末尾的一个勾选框。这种模式从未真正奏效,在 AI 辅助开发环境中更是举步维艰。因为历史告诉我们:越早发现漏洞,修复成本越低;一旦进入生产环境才发现,代价极其高昂。而在流程早期发现则便宜得多。

安全漏洞在此方面并无不同。当代码生成可以在几秒钟内完成时,等到最后才会造成瓶颈并增加风险。因此,左移安全将验证融入开发过程本身。这意味着在代码创建的同时自动运行静态源代码分析、动态渗透测试、漏洞扫描以查找嵌入式密钥、策略验证以及合规性检查。这样做的目标是通过左移来减少生命周期后期令人不快的意外惊喜。

这是 AI 生成开发的一个重要现实:AI 不仅创建代码,还引入了依赖项。因此我们有新的包、新库、新服务和新集成等事物出现。每个依赖项都增加了功能,这是好的;但每一个依赖项也带来了风险,这就不太好了。开发人员往往专注于审查生成的源代码,而忽视了该代码所依赖的内容。这一切都在幕后通过 AI 的奇迹发生,因此往往被视而不见、置若罔闻。但安全事件有时源于软件供应链而非仅仅是应用程序逻辑本身。

因此,生成的依赖项也应接受与生成代码同等的审查力度。我们需要审查包声誉、漏洞、许可协议和源代码完整性等组织标准。在 AI 辅助开发中,依赖项验证不是可选的,它是安全代码生成的一部分。这可能是所有转变中最重要的一项。许多严重的安全问题并非由糟糕的编码实践引起,而是由错误的假设引起的。

考虑以下问题:谁实际上应该访问数据?允许哪些操作?需要应用什么业务规则?以及哪些信息应保持受保护状态?AI 模型可能会生成在技术上优雅且遵循开发最佳实践的代码,但如果需求被误解,解决方案仍可能违反安全策略。我的意思是:生成的工作流可能正确处理财务数据,但同时它也可能将该信息暴露给本不应看到它的用户。这与其说是编码问题,不如说是意图问题。

因此我们必须考虑这一点中的“意图”。对于 AI 而言,你必须特别明确这种意图。在希腊神话中,迈达斯国王希望他触摸的一切都会变成金子。他的愿望实现了,结果却差点饿死,因为事实证明你无法吃金子。随着 AI 以机器速度生成日益复杂的代码,开发人员对验证输出负有更多责任。你仍有工作要做:换句话说,我们不再仅仅审查代码质量,而是在审查 AI 是否以正确的方式解决了正确的问题。

第五条原则是:安全性必须成为一种持续的实践,而不仅仅是末尾的某个最终检查点。如前所述,组织历史上将安全活动集中在发布前的最后阶段。但 AI 辅助开发产生的……

变化是持续的,这也意味着安全验证必须同样持续进行。这意味着即使软件发布之后,这一过程也不会停止。如果我们审视整个流程——开发、测试、部署、监控和改进——所有这些环节都需要安全保障。安全运营贯穿于循环中的每一个组成部分。那么,我们该如何实现这一点呢?我们需要具备漏洞检测能力,利用一些最先进的AI前沿模型,以便牢牢掌握所有潜在的安全隐患。

我们将进行依赖项监控和补丁更新,同时执行策略验证与强制执行以及变更验证。关键问题不再仅仅是“它是否通过了一次测试”,而是“它是否能持续通过?”、“它能否保持安全状态?”。核心在于信心是否随时间得以维持。例如,最近一个AI前沿模型在一个开源操作系统中发现了一个零日漏洞,该漏洞在众目睽睽之下隐藏了27年。

这一案例带来的教训是:安全永无止境,它必须成为流程中活的一部分,随着软件的演进而不断进化。随着AI变得越来越具有代理性(agentic),它将越来越多地执行跨服务、仓库、管道和配置的复杂多步工作。在这种情况下,仅审查单个文件已显得不足。安全取决于对整个工作流程的理解。

最棘手的安全问题并不隐藏在某一个单独的函数中,而是存在于互联系统间的意外后果里。这意味着AI代理需要护栏来明确其权限边界:什么能做,什么不能做;什么是合适的,什么是不当的。它们需要身份标识以便问责,让我们知道是谁做了什么以及原因;还需要访问控制来限制其能力范围,防止它们更改我们未意图修改的内容。

此外,还需要监控和人工介入的监督(human-in-the-loop oversight)。如果没有适当的监督和强制执行机制,代理可能会失控,从生产力工具变成风险放大器。这就是新的现实:我们必须快速实现安全并持续进行验证。AI正在加速软件开发,这意味着我们在几分钟内生成的代码量可能超过过去一整天的产出。

这将导致生成更多的代码,而更多的代码意味着更多的功能,同时也意味着更高的复杂性。复杂性是安全的天敌。单纯的速度并不能创造价值,信任才是关键。成功的企业将是那些将安全直接嵌入日常开发工作流程的组织中的人。这不应仅仅被视为一种合规性练习或发布关卡,而应作为一种持续验证的实践。

因为在AI辅助开发时代,目标不再仅仅是审查代码本身。我们的目标是充满信心地验证结果,面对的是一个不断扩展且日益复杂的代码库,并且要以比以往任何时候都更快的速度完成这一任务。最后请记住:向左移(shift left),即安全左移。