AI编码助手:编程的加速器还是定时炸弹?

来源:那一片数据星辰

文章摘要
太长不看版 报告标题: AI编码助手 发布机构: 法国网络安全机构 (ANSSI) 和德国联邦信息安全办公室 (BSI) 摘要: 本报告由ANSSI和BSI联合编制,旨在提供关于安全使用AI编码助手的

太长不看版
报告标题: AI编码助手
发布机构: 法国网络安全机构 (ANSSI) 和德国联邦信息安全办公室 (BSI)
摘要:
本报告由ANSSI和BSI联合编制,旨在提供关于安全使用AI编码助手的建议。AI编码助手基于大型语言模型(LLMs),可以在软件开发的多个阶段提供帮助,包括代码生成、调试、测试用例生成、代码解释、代码格式化、自动化代码翻译以及提高生产力和员工满意度。
机遇:
代码生成: AI编码助手可以自动化创建常用代码块和功能。
调试: 它们能够辅助检测和修复代码中的错误。
测试用例生成: 它们能够自动提出测试用例,包括边缘情况。
代码解释: 帮助开发者理解新接触的代码。
代码格式化、注释和文档: 自动应用代码风格,提高代码的可读性和可维护性。
自动化代码翻译: 有助于将遗留代码翻译成现代编程语言。
提高生产力和员工满意度: 通过减少重复性任务,提高开发人员的工作效率和满意度。
风险:
输入的保密性缺失: 用户输入可能无意中成为训练数据,导致敏感信息泄露。
自动化偏见: 过度依赖AI生成的代码可能导致错误结论。
输出质量和安全性的缺失: AI生成的代码可能存在安全漏洞。
供应链攻击和恶意代码: 攻击者可能操纵AI助手生成恶意代码。
用于攻击的滥用: AI编码助手的能力可能被用于恶意目的。
建议:
管理层: 认识到AI编码助手不能替代经验丰富的开发人员,并进行系统性风险分析。
开发人员: 负责任地使用AI编码助手,并对生成的代码进行审查。
研究议程: 提高训练数据质量,推进软件的自动质量和安全控制研究。
结论: AI编码助手提供了显著的机遇,但必须负责任地使用,以确保安全和质量。组织应权衡使用AI编码助手的利弊,并采取适当的风险缓解措施。
1. 引言
1.1 什么是AI编码助手?
近年来,生成式人工智能引起了显著的媒体和社会关注。这些AI模型基于输入创建文本、图像或视频等内容。随着文本生成领域的重大进展,基于大型语言模型(LLMs)的AI编码助手最近被开发出来,用于(部分)自动化源代码生成。这些模型训练方法,要么是在大量文本上训练,然后使用源代码进行微调,要么是直接在大量源代码上训练。在应用中,这些模型可以像聊天机器人一样使用。用户给模型一个提示,可以是所需功能的描述或(带注释的)源代码骨架。输出是用户选择的编程语言中具有所需功能的源代码。当前一代的模型除了一个最佳建议外,还会生成几个替代方案——这是模型认为最可能正确的建议。用户可以选择这些建议之一,并将其纳入他们当前的软件项目中。这些AI编码助手通常通过集成开发环境(IDE)的插件访问。此外,开发人员还使用托管在云中或本地的通用聊天机器人进行编程。
1.2 本文件的目的
在本出版物中,我们检查了使用AI编码助手所带来的机遇和风险。AI编码助手的使用已经在许多组织中广泛存在,并将成为未来软件开发的一个组成部分。因此,我们向管理人员和开发人员提出了具体建议,说明如何处理这项技术。本报告旨在促进负责任和安全地使用AI编码助手。
本报告侧重于AI编码助手在专业软件开发中的使用。这里不涉及无代码/低代码应用程序的相关主题。虽然以下许多章节也与基于LLMs的通用聊天机器人相关,但它们不属于本报告的范围。依赖于其他形式的AI的非LLM基础编码助手,如基于规则的系统和传统机器学习算法,也不属于本报告的范围。
2. AI编码助手的机遇
AI编码助手在软件开发过程中带来了一系列的机遇,这些机遇涵盖了从代码生成到代码翻译等多个方面。以下是AI编码助手提供的一些关键机遇:
2.1 代码生成
基于自然语言或源代码的输入,编码助手能够生成方法、类和原型。这使得AI驱动的编码助手能够接管软件开发过程中的重复性任务,例如创建频繁出现的代码块和功能。例如,排序或图算法等基本算法为许多软件项目领域提供了重要的功能。AI编码助手可以(部分)自动化这些构建块的创建和适应特定上下文的过程。研究表明,当前的AI编码助手能够正确实现此类算法,并且提出的实现建议不仅在功能上正确,而且在运行时性能上也是最优的。对于更复杂的任务,技术的成功率有所下降,但仍然可以达到可用的性能水平。AI编码助手还可以用于代码补全,例如填写函数调用中缺失的参数,代码适应特定上下文或重构,即在不改变其功能的情况下重组代码。然而,它们在解决具有大型代码库的实际软件工程场景中的问题方面存在限制。
译者注:
在编程领域,"方法"、"类"和"原型"是面向对象编程(OOP)的基本概念。这句话的意思是,编码助手可以根据开发者提供的自然语言描述或部分源代码,自动生成相应的代码结构。下面是对这些术语的详细解释:
方法:
在面向对象编程中,方法是类中的一个函数,它定义了可以对对象执行的操作。方法通常与对象的状态(即数据)相关联,用于改变这个状态或者返回对象的状态信息。
例如,在Java中,如果你有一个名为 BankAccount 的类,你可以有一个名为 deposit 的方法,它接受一个金额并将其添加到账户余额中。
类:
类是定义对象属性和行为的模板。它定义了一组数据和操作这些数据的方法。类是面向对象编程的核心概念之一。
例如,BankAccount 类可以包含属性(如 accountNumber 和 balance)和方法(如 deposit 和 withdraw)。
原型:
原型在面向对象编程中通常指的是一个对象的初始状态或蓝图,用于创建其他相似的对象。在某些编程语言中,"原型"有更具体的含义。
在JavaScript这样的基于原型的语言中,原型是对象的基本概念,对象直接或间接地继承另一个对象的属性和方法。
在其他语言中,原型可以指一个示例对象,用于指导如何构建相似的对象。
2.2 调试
调试,即“查找和修复源代码中的错误”,是开发人员的一项耗时任务。2018年的一份报告表明,开发人员每周要花超过17个工作小时在这项任务上。使用AI支持调试可以减少软件开发的工作量。对于特定的编程语言,如JavaScript,已经证明可以训练AI模型自动检测错误并有效运作。此外,AI助手不仅可以检测错误,还可以直接修复错误。近年来的发展表明,AI编码助手有潜力减少与软件更正和维护相关的工作量,通常被称为“技术债务”。
2.3 测试用例生成
测试用例的生成是编码助手可以提供支持的另一个领域。它们可以自动提出测试用例和单元测试,通过分析现有代码并理解程序逻辑,甚至覆盖边缘情况。AI编码助手通过自动生成测试用例,减轻了开发人员在进行单元测试时的工作负担。这样做不仅可以提高代码的覆盖率——即测试用例覆盖到的源代码量——而且还能简化测试驱动开发(TDD)的过程。开发人员只需用自然语言描述所需的功能和相关参数,例如输入和输出的格式,AI助手就能够自动创建所需的测试用例。这样,可以利用这种软件开发范式的好处(例如,专注于设计和功能,减少调试工作量或更好的模块化),同时显著减少必要的额外工作量。
2.4 代码解释
对于软件开发人员来说,熟悉“外来”源代码是一项常见的任务。当新员工加入公司或在同一组织内切换新任务时,开发人员可能会接触到大量不熟悉的代码。AI编码助手可以通过允许开发人员用自然语言提出关于代码的具体问题,并以自然语言回答,从而减少熟悉工作所需的努力。这对于源代码审计也可能有益,例如在开源项目的背景下,问答功能可能允许专业审计员在较短的时间内找到关键的代码部分。
2.5 代码格式化、注释和文档
编码助手提供格式化和记录代码的支持。它们可以自动应用编码风格,以提高代码在更大团队中的标准化、可读性和可维护性,例如通过设置正确的缩进、空格和括号,重组代码或统一变量名。此外,它们还可以协助生成自动注释和文档块。这可以促进代码和文档的一致性,这在大型项目和团队中尤为重要。此外,全面且易于理解的文档对于软件产品的维护和现代化至关重要。
2.6 自动代码翻译
软件和IT产品通常包含在旧编程语言(如Cobol)中开发的重要的构建块,这些被称为遗留代码。当由于员工流动导致这些语言的专业知识丧失时,就会出现问题,并且由于缺乏(安全)更新,业务流程的维护受到威胁。将来,AI编码助手可能有所帮助,但当前的大型语言模型还不能准确翻译旧的编程语言。一项研究表明,在翻译中会发生语法、语义、依赖和逻辑错误。为了提高未来的结果,需要在源语言和目标语言中都需要更多的训练数据。然而,另一项研究表明,开发人员也可以从AI建议的翻译源代码中受益,尽管只是对于常见语言。未来在生成式AI方面的发展可能通过特定微调实现过时语言的翻译。已经有一些初步的倡议解决将内存不安全语言翻译为内存安全语言的翻译,例如DARPA旨在将C代码翻译成Rust以使其更安全的TRACTOR项目。
2.7 提高生产力和员工满意度
提供商通常宣传使用AI编程助手时潜在地增加生产力。尽管软件开发中的生产力难以量化,但软件程序员的自我评估可以提供对员工满意度的洞察。由AI编码助手提供商进行的用户调查分析发现,开发人员采用的编码助手建议越多,他们感觉越有生产力。进一步检查数据表明,通过减少重复性任务,减少了心理工作量并提高了员工满意度。另一项研究发现,使用AI编码助手并没有显著缩短编程任务的处理时间,但参与者普遍更喜欢它而不是传统的自动完成功能。特别是,参与者强调,取代繁琐的在线搜索被视为一个优势。初步结果表明,使用AI编码助手可能对员工满意度产生积极影响。目前,关于提高生产力的结论性证据尚缺乏。
3. 与AI编码助手相关的风险
AI编码助手的引入虽然带来了许多机遇,但同时也伴随着一系列风险,需要用户和组织在采用时仔细权衡。以下是与AI编码助手相关的一些主要风险:
3.1 输入数据的保密性缺失
AI编码助手通常使用机器学习进行训练和微调。根据产品和部署模型的不同,用户输入的机密信息可能会无意中流入助手的训练数据中。尽管一些提供商强调他们不会系统地存储或直接使用用户输入来改进模型,但这在一定程度上取决于用户选择的货币化模型。此外,存储在公共注册表中的敏感代码、登录凭据和API密钥可能会被输入到训练中。还有可能通过供应链攻击,攻击者可以提取此类敏感信息。
可能的缓解措施包括:
应禁止在云中通过员工的私人账户不受控制地访问AI编码助手进行商业软件开发。
通过提供明确规则的合法软件服务,并鼓励使用配置了安全措施的公司账户,公司可以有效减少员工使用未经授权的IT资源的情况,从而提高整体的IT治理和安全水平。
使用云服务时,应仔细检查合同条件,特别是关于数据进一步用于AI训练的条件。
开发人员和公司应仔细考虑他们在这些工具中披露的信息,并在必要时对敏感数据进行匿名处理,以保持其机密性。
公司内的员工、利益相关者和委员会(例如,人事/工作委员会)应对这个问题有所认识。
3.2 自动化偏见
大型语言模型通常生成语言上无懈可击且令人信服的文本,这可能会培养出类似人类能力的印象和对他们陈述的过度信任(自动化偏见),导致用户得出错误的结论或接受未经验证的陈述。对于初学者来说,AI编码助手可以提供有价值的学习资源,通过提供经过验证的解决方案的见解,但它们也存在过度依赖和对生成代码的不经批判接受的风险,因为即使有缺陷的解决方案也措辞良好。基于学习到的统计分布的输出可能导致不合逻辑或不切实际的建议,只有经验丰富的开发人员才能识别和评估。
可能的缓解措施包括:
公司内部的员工应对这个问题有所认识。
应对员工进行“提示”和“挑战”答案的培训。
在公司内部对AI生成的代码和使用的提示进行“解构”可能有助于在团队之间共享知识和经验。
3.3 输出质量和安全性的缺失
AI编码助手可以基于最佳实践提供代码建议,但存在生成错误、不安全或效率低下的代码的重大风险。Purdue University的一项研究比较了编程任务中的语言模型解决方案和开发者论坛上的答案,并得出结论,模型有50%的时间提供了错误的答案。纽约大学对编码助手生成的程序的安全性进行的另一项研究发现,大约40%的程序存在安全漏洞。当AI为同一个提示生成多个建议时,许多首要建议(约39%)是不安全的。这是有风险的,因为没有经验的使用者经常信任首要建议。这些安全漏洞的一个原因是AI模型的训练数据使用了过时的程序,导致建议过时且不安全的最佳实践。例如,在密码加密方面,不安全的方法如MD5或单次SHA-256仍然经常使用。斯坦福大学的一项研究证实了这些安全问题,并发现即使文档标记了安全问题,仍然建议使用不安全的库。
可能的缓解措施包括:
通常应由开发人员审查和理解生成的内容,特别是源代码。
应采用自动功能测试。
安全团队的额外代码审查可以作为降低风险的另一项措施。但应注意,AI辅助的开发人员可能会产生更多的代码,因此安全团队可能需要相应地扩大规模。
在公司内部对AI生成的代码和使用的提示进行“解构”可能有助于在团队之间共享知识和经验。
自动漏洞扫描器或批判性质疑生成的源代码的方法(“源代码评论家”)可以降低风险。
标记AI生成的代码块并记录使用的AI工具可能有助于安全测试,也可以为第三方审计员提供有用信息,例如在安全认证过程中。
公司内的员工应对这些问题有所认识。
3.4 供应链攻击和恶意代码
AI编码助手建议开发人员程序代码,包括适当的库。攻击者可以操纵或利用编码助手,目标是让他们生成恶意代码,调用特定恶意库,或泄露提示中的敏感信息。以下是这种攻击的几个例子。
3.4.1 方法和包的幻觉
AI编码助手可以使用自动补全向开发人员建议对于特定包不存在的方法和类。当AI编码助手生成引用或推荐不存在的包或库的代码时,就被称为包的幻觉。这些幻觉可以导致所谓的包混乱攻击。攻击者利用幻觉创建与幻觉包同名的包,并将其标记为恶意代码。如果开发人员使用了这个错误的包,它可能导致整个软件供应链受到威胁。攻击可能导致从AI决策中的微妙偏见到关键系统中的重大故障等一系列后果。在一项研究中,研究人员检查了Python和JavaScript中的16种不同代码生成模型。在模型中,生成了576,000个代码示例,总共导入了2.23百万个包。他们发现19.7%的导入包是幻觉。根据超参数的选择(例如,温度)和编程语言,模型之间在幻觉包的数量上存在很大差异。
可能的缓解措施包括:
通常应由开发人员检查和复制生成的源代码。
应对未知库进行合理性检查,例如它们是何时创建的,使用频率如何,或者源代码存储库的活跃程度如何。
如果公司有关于开发中可以使用哪些包的指导方针,可以进行允许包的白名单管理。
通过沙箱化开发环境,可以减少恶意库(如包含勒索软件)的影响。
创建软件材料清单(SBOM)可以让您回顾性地了解是否使用了有漏洞的库,并在某些组件的漏洞变得已知时,可以有针对性地做出响应。
公司内的员工应对这个问题有所认识。
3.4.2 间接提示注入
间接提示注入是攻击者通过第三方将恶意输入插入到AI模型请求中的攻击。这些输入可以操纵AI模型的行为并生成不期望的输出。此类攻击旨在使AI执行某些操作或披露通常无法访问的信息。由于AI编码助手基于LLMs,提示注入可能带来重大的安全风险。例如,攻击者可以将恶意指令写入软件包的文档中。如果这些最终进入提示(可能在LLM的上下文窗口中,用户可能看不到),LLM可能会响应命令,并将恶意命令或代码片段作为补全攻击的一部分建议给开发人员。提示注入攻击的另一个例子可能来自不可信的第三方LLM提供商,他们将合法的LLM重新打包为带有恶意提示的版本,这可能导致错误或有害的代码。针对性的提示注入也可以被攻击者用来通过生成访问时会将敏感信息传输到准备好的服务器的链接来提取敏感数据。比如在Markdown格式的文档中,攻击者可能会插入特殊的图像链接,这些链接实际上是钓鱼网站或恶意软件的下载链接。当用户尝试查看图像时,他们可能会无意中泄露信息或下载恶意软件。
可能的缓解措施包括:
提供商和制造商应减轻间接提示注入。
例如,他们可以限制仅显示来自受信任来源的图像,以使通过这种方式泄露信息变得更加困难。
提供IDE的AI插件的提供商应清楚地传达哪些信息可能最终进入AI模型的提示(上下文窗口)并允许例外(例如,某些文件夹)。
用户应询问他们的提供商他们对这种攻击向量采取了哪些缓解措施。
当使用常规聊天机器人时,应尽可能避免将敏感信息(如API密钥)包含在提示中。
公司内的员工应对这个问题有所认识,特别是点击AI生成的链接可能导致敏感信息流出。
3.4.3 数据和模型中毒
AI编码助手通常在大型源代码存储库上进行训练,例如GitHub或HuggingFace。攻击者可能会因此在这些平台上发布代码,目标是毒化训练数据,这可能导致生成不安全的代码。AI编码助手的中毒可能性是一个活跃的研究领域。
攻击者还可以通过供应链妥协直接毒化模型权重。这种攻击方式可能发生在以下情况:
数据投毒:攻击者在训练数据中故意注入恶意或错误的数据,导致模型学习到这些恶意模式。
模型逆向工程:攻击者通过分析模型的输出来推断和篡改模型的权重。
供应链入侵:攻击者通过入侵模型的开发、训练或部署过程,直接修改权重文件。
例如,假设一个公司开发了一个用于审核金融交易的AI系统。攻击者通过入侵模型的服务器,篡改了模型的权重,使得模型总是将特定的欺诈性交易误判为合法。这样,攻击者就可以在不被发现的情况下进行非法操作。
可能的缓解措施包括:
制造商有责任通过仔细选择、保护和分析训练数据来减轻中毒攻击。
在供应链中毒攻击公开后,比如通过安全事件的报道,拥有详尽的AI编码助手和库的软件材料清单(SBOM)文档记录将大大有助于我们快速确定自己的系统是否受到了影响。
第3.3节和3.4.1节中的缓解措施也适用于这种情况。
3.4.4 编码助手的扩展
现代编码助手通常可以通过扩展来增强,这些扩展可以代表程序员执行操作。在这种情况下,员工应特别注意这些扩展的安全性及其与应用程序的交互,特别是当它们可以访问内部资源(例如日志、邮件)时。
可能的缓解措施包括:
限制扩展的使用。
审计并预测这些扩展与开发、生产和CI/CD环境的交互影响。
3.5 用于攻击的滥用
LLMs生成程序代码的能力也可以被攻击者用来生成、修改或改进恶意代码。此外,该技术还可以协助反编译二进制文件。有关详细讨论,请参阅BSI和NCSC的相应出版物。
4. 结论和建议
基于对AI编码助手带来的机遇和风险的分析,BSI和ANSSI提出了一系列建议,旨在指导组织和开发人员负责任和安全地使用这项技术。
4.1 管理
在管理层面上,组织在采用AI编码助手时应考虑以下要点:
AI编码助手不能替代经验丰富的开发人员。不受限制地使用这些工具可能会带来严重的安全影响。
为了防止员工因不满意或觉得现有工具不适用而私下寻找并使用未经授权的IT工具和服务(即影子IT),公司应该主动向开发人员提供合适的资源和工具,确保他们的需求得到满足。例如,本地托管开源模型可以防止敏感信息的丢失。在使用云服务时,使用受控和可配置的公司账户比员工使用私人访问要好。建议审查提供商的合同条件,特别是关于数据使用(例如,数据是否用于重新训练和优化AI模型)。
在引入AI工具之前应进行系统性风险分析。这应特别考虑当前如何管理机密(例如,API密钥)以及将来如何防止泄露。
应在公司内建立安全指南,并采取适当的缓解措施。第3章中给出了示例。
开发人员在AI的帮助下可能更快地编写程序代码。重要的是,公司中的其他团队(如质量保证(AppSec, DevSecOps等))也能通过AI获得类似的生产力增长,或者在人员方面进行相应的扩展。
必须让员工意识到风险,并对使用AI工具进行培训。
必须为员工提供明确的指南,说明他们可以使用哪些工具以及用于什么目的。
建议进行评估阶段,并监控相关的关键绩效指标(例如,新提交的代码数量或安全团队的工作量),设定可衡量的目标,并进行相应的成功控制,以更好地了解技术实施的影响,并应对可能出现的问题。
4.2 开发
在员工层面上,使用AI编码助手时应考虑以下要点:
负责任地使用AI编码助手需要了解系统的局限性和安全问题。必须谨慎使用AI工具,特别注意保护敏感信息。
通常应由开发人员检查和复制生成的源代码。应特别批判性地审查幻觉和安全风险。
员工需要有明确的指导,说明他们可以使用哪些工具以及用于什么目的。员工应感到鼓励与同事就规则进行对话,如果他们对规则感到不确定。
应参加有关有效使用AI编码助手的进一步培训(关键词提示工程)。
应与同事就这个话题进行积极的交流,以确保在公司内有效和安全地使用(考虑人为因素),并共享最佳实践。
4.3 研究议程
大型语言模型以其数据集中的问题而闻名。这也适用于AI编码助手。通过在大量开源程序上进行训练和微调,这些程序中常见的许多问题在模型的输出中得到了反映(Siddiq, et al., 2022; Pearce, et al., 2022)。因此,研究目标应该是提高训练数据的质量,特别注意减少安全漏洞。
需要专门针对将一种编程语言翻译成另一种编程语言的数据集,以确保自动源代码翻译。在这里,必须考虑要翻译的语言。仅使用公开可用的源代码存在风险,即翻译模型可能会发展出对现代编程语言的编程范式和语法的偏见。这种偏见之所以产生,是因为现代编程语言构成了公共源代码的绝大部分(Github-2, 2022)。要可靠地翻译过时的编程语言,今天必须投入努力创建有意义的训练数据。
此外,必须推进软件的自动质量和安全控制领域的研究。如果AI编码助手导致源代码的输出增加,安全团队也必须相应地扩大规模,以应对安全漏洞的显著扩散。
最后,必须指出,根据当前的研究结果,很难确定AI编码助手是否真的可以提高软件开发的生产力。需要进行全面的、有意义的和独立的研究,以检验提供商的这一主张。

技术驱动法律,专业成就未来