前言
随着AI技术的飞速发展与普及,企业开发人员对AI编码助手工具如Copilot的依赖度日益增强,使用AI编码助手工具虽然能显著提升编程效率与质量,但同时也存在一系列的潜在风险。
许多开发人员可能未意识到,如果他们的现有代码库中包含安全问题,像GitHub Copilot这样的AI编程助手,在提供代码建议时可能会引入不安全因素。原因在于,这些助手对用户特定代码库的理解有限,主要依赖模仿学习到的模式或当前上下文信息,缺乏独立的判断能力。尽管训练数据能帮助AI助手学习并改进其行为,提供更佳的代码示例,但这并不足以确保对安全漏洞的防护或设置安全屏障。
本文将通过一个生动的实例,深入剖析Copilot如何在编程过程中不经意间复制并加剧已存在的安全隐患。
该案例聚焦于一个本身存在多处安全漏洞的项目,并引入了Copilot作为辅助编程工具。Copilot凭借其跨标签页智能互联的能力,能够无缝融入我们的集成开发环境(IDE),精准捕捉代码文件的上下文信息。然而,正是这一便捷功能,在遇到含有安全漏洞的代码上下文时,可能导致Copilot的自动建议无意中加剧了项目的安全风险。
对于安全意识不强或经验较少的开发人员来说,项目中原有的安全薄弱环节,在Copilot的协助下,可能会使操作中的不安全因素成倍增加。
我们将在后续章节中,对这一现象的内在逻辑与影响机制展开更为详尽的探讨。
为什么不应该假定GenAI代码是安全的?
在2022年12月,斯坦福大学的研究人员发布了一项引人深思的研究,其结果显示,相较于未使用生成式AI编码助手的开发者,利用AI编码助手的开发者在编写代码时的安全性表现明显较差。
此外,在2023年10月,康奈尔大学的研究进一步强调了这一问题的严重性。该研究聚焦于实际应用场景下的安全问题及其广泛影响,深刻揭示了人工智能生成代码中存在的漏洞不仅复杂多样,而且潜在危害巨大。
以下是该研究的核心发现:
(1)广泛存在的安全弱点:由Copilot生成的代码片段中,有35.8%包含了跨多种编程语言的常见弱点(CWE)实例。
(2)多样化的安全漏洞:在42种常见的软件安全弱点类型(CWE)中,每种弱点都有其独特之处,它们之间存在明显的差异。其中最常见的安全漏洞包括:CWE-78(操作系统命令注入)、CWE-330(使用不充分的随机值),以及CWE-703(对异常条件的不当检查或处理)。
(3)高风险漏洞的普遍性:所识别的CWE中,约有26%被列入2022年CWE前25名列表中。
理解问题,剖析问题
生成式AI编码助手,如GitHub Copilot、AWS CodeWhisperer及ChatGPT等,在提升软件开发的生产力与效率方面取得了革命性的突破。
2023年Gartner对高层管理人员进行的一项调查显示,70%的企业组织正处于对生成式AI的调查和探索阶段,而19%的企业组织则已处于生成式AI的试点或生产阶段。这一趋势无疑彰显了技术革新对工作与生活的深远影响。
然而我们必须清醒认识到,这些工具虽然功能强大,却缺乏对代码深层语义的真正理解,因而无法进行自主的安全评估与判断。它们更像是精妙的模仿者,通过复制并改进训练过程中接触到的代码模式来辅助编程。尽管优化训练样本能在一定程度上提升工具的表现,但这并不能为代码安全性提供绝对保障。
因此,为确保AI生成代码的安全可靠,构建一套严密的安全审核机制(即“安全护栏”)显得尤为关键。
在探讨Copilot等工具的运作机制时,上下文的重要性不容忽视。Copilot能够基于其从海量代码库中汲取的知识与模式,结合“提示工程”与“相邻标签”技术,精准推送相关代码建议。这里的“相邻标签”涵盖了用户近期访问的文件及项目内的现有文档,极大地丰富了建议生成的上下文环境。然而,这一机制在带来显著优势的同时,也潜藏着安全风险。
起初,Copilot的建议局限于当前编辑文件的局部视野,难以捕捉项目全局的连贯性与逻辑性。随着技术的演进,Copilot通过构建提示库并引入更复杂的算法,开始整合更广泛的开发者上下文信息,从而生成与项目整体更为契合的建议。
特别是“相邻标签”技术的引入,让Copilot能够洞察开发者在IDE中同时打开的多个文件,特别是那些与当前工作紧密相关的文件及其邻近文档。这一创新不仅拓宽了建议生成的视野,还显著提升了建议的精准度与实用性。
如GitHub Copilot社区领袖Akash Sharma所言,这一改进直接促使建议接受率近乎翻倍,从约20%跃升至35%,充分证明了其在提升开发效率与体验方面的巨大潜力。
但是若项目开发人员缺乏坚实的安全背景,加之项目中已累积了未妥善管理的安全漏洞与质量缺陷,面对这些技术债务,我们该如何应对?
采用如Copilot这样的AI编码助手时,其基于上下文提供代码建议的特性虽具优势,但也潜藏风险。
若项目中的相邻文件含有已知安全漏洞或不良编程实践,Copilot在辅助编码过程中可能会无意中复制这些错误,进而推广不安全的编码习惯,为项目增添更多安全隐患,甚至可能引发一系列安全漏洞,因此,我们必须对此保持高度警惕。
示例
首先,我们要求Copilot创建几个SQL查询,以将一些用户输入与我们数据库中的产品名称或描述进行匹配。鉴于SQL注入漏洞对应用程序构成的严重威胁,我们特别强调在代码生成过程中必须避免引入任何此类漏洞。
第一次请求的时候我们得到以下内容:
图1.第一次请求查询
这段代码初看之下似乎颇为稳健,因为采用了命名参数来防范SQL注入等安全风险。
然而,隐患恰恰隐藏在细节之中——当我们将含有潜在安全漏洞的代码片段置于相邻标签页中,这些不安全的代码便如同被播撒的种子,可能在项目的其他角落生根发芽。
一旦这样的脆弱代码片段被引入,情况就变得令人担忧:当再次通过Copilot请求类似功能时,它可能会基于新引入的、含有漏洞的上下文环境,直接复制并利用这些不安全的示例。这样一来,生成的新代码建议中就可能无意放大了这一安全漏洞,使得项目面临更大的风险。
图2.易受攻击代码引入相邻选项卡
可以看出,我们刚刚从项目中的一个SQL注入变成了两个,因为Copilot已经使用我们的易受攻击的代码作为上下文来学习。
因此,确保代码审查的全面性与严谨性,以及及时清理并修正潜在的安全隐患,对于维护项目的整体安全至关重要。
加剧安全问题
那么对于包含安全漏洞的代码库,作为开发人员可以通过减少哪些行为来降低出现AI编码安全问题的机率呢?
开发人员可以通过规避以下4个方面,有效减少并缓解安全问题的发生。
(1)不良编码习惯:对于缺乏经验或安全意识不足的开发者而言,Copilot的代码建议可能会无意中强化其不良的编码习惯。频繁接触不安全的代码模式可能误导他们认为这些做法是可接受的,从而导致安全问题的持续存在。
(2)缺乏审查环节:Copilot生成的代码可能未经充分审查即被实施。这种缺乏人工干预的情况可能导致安全漏洞被忽视,因为代码生成的上下文环境未必总能凸显这些问题。
(3)过时且有缺陷的模式:Copilot可能会基于过时的或当前被视为安全风险的编码模式提供建议。这些模式在过去可能被认为是可接受的,但如今已不再是安全的选择。
(4)忽视安全顾虑:Copilot专注于代码生成而非安全评估。因此,开发者可能更侧重于功能实现而相对忽视安全性,从而在不经意间忽略了潜在的漏洞。
如何缓解问题
为有效缓解AI编码助手所生成的代码中复制已有安全问题的情况,企业可采取以下六种策略:
(1)人工审核与安全评估:开发人员应始终对编码助手生成的代码进行人工审核,审核过程应包含全面的安全评估,以便发现并修复潜在的安全漏洞。
(2)静态应用程序安全测试(SAST)防护栏:安全团队应设立静态应用程序安全测试(SAST)防护栏,包括开发团队应遵循的知名策略。如开源网安的CodeSec能够快速识别并修复手动编写和自动生成代码中的安全问题,并提供修复支持,帮助您解决新引入代码库的问题。
(3)遵守安全编码准则:开发人员应遵守由开发团队和安全团队制定的安全编码准则。
(4)培训与意识提升:安全团队可以为开发团队提供必要的培训和意识提升,分享对常见安全漏洞和最佳实践的理解,使开发人员在审查AI生成的代码时能够做出明智的决策。
(5)问题优先级排序与分类处理:安全团队可以协助开发团队对积压的问题进行优先级排序和分类处理。优先解决每个项目中最为危险的问题,从而减少生成式AI编码助手在建议代码中复制这些问题的机会。
(6)高层管理支持与规定:高层管理团队可以规定,使用生成式AI代码助手必须以设立安全护栏为前提条件,从而进一步增强对风险和缓解措施的认识与教育。
其他使用AI编码助手可能带来的问题
Copilot等AI编码助手通过深度学习算法,能够基于大量代码库和编程习惯自动生成代码片段,极大地减轻了开发人员的负担,加速了软件开发周期。
然而,这种依赖性的增强除了上述章节所提及到的问题以外,也带来了一系列其他不容忽视的挑战。
首先,对AI生成代码的过度信任可能导致开发人员忽视代码审查的重要性,从而引入难以察觉的漏洞和错误。由于AI助手并非完美无缺,其生成的代码可能存在逻辑错误、安全隐患或不符合特定项目规范的情况,若未经严格验证即投入使用,将对软件质量和系统安全构成严重威胁。
其次,AI编码助手的广泛应用还可能削弱开发人员的编程能力和创新思维。长期依赖AI生成代码,开发人员可能会逐渐丧失自主编写和优化代码的能力,进而影响到整个团队的技术积累和创新能力。在快速迭代的软件开发领域,这种能力的退化将使企业难以适应市场变化和技术进步,错失发展机遇。
此外,AI编码助手的使用还可能引发知识产权和数据隐私问题。
当AI助手在生成代码时借鉴了大量开源项目和第三方库时,如何确保这些代码的合法性和合规性成为了一个亟待解决的问题。一旦涉及版权纠纷或数据泄露等问题,将给企业带来严重的法律风险和经济损失。
如果AI编码助手训练所使用的数据不存在开源许可证的使用或者存在开源许可证冲突情况,那么其生成的代码建议很可能也会面临同样的许可证问题。这种情况下,开发者采纳AI助手提供的代码片段,可能会为公司的项目日后埋下法律纠纷的隐患,对公司造成经济损失和声誉损害。
然而,通过合理使用软件成分分析SCA工具,我们可以对项目中的开源许可证风险以及合规性进行有效把控以及监测,并且在风险浮现时立即通知相关风险干系人。
因此,在享受AI技术带来的便利的同时,企业开发人员应应保持警觉,充分认识到依赖AI编码助手可能带来的风险。在利用AI工具提高工作效率的同时,也应加强代码审查、提升自主编程能力、注重知识产权保护和数据安全管理等方面的工作,以确保软件开发的质量和安全性。
同时,企业也应加强对AI编码助手使用的管理和规范引导,建立健全的使用机制和风险防控体系,为企业的可持续发展保驾护航。
结语:AI编码助手需要安全护栏
简而言之,我们在探讨如Copilot这种生成式AI编码助手的应用时,我们必须正视一个核心事实:尽管这些工具高效,但它们缺乏对代码深层语义的深入理解,因此无法独立评估代码的安全性和逻辑性。
本质上,它们更像是记忆高手,通过模仿学习期间接触过的代码片段来辅助编写。尽管提供高质量的训练样本能在一定程度上提升其输出质量,但这并不等同于安全性的全面保障。若要确保AI生成的代码既高效又安全,构建一套完善的安全机制与规范框架(即“安全护栏”)显得尤为必要。
为了平衡AI创新带来的便捷与软件安全的严格要求,将生成式AI编码工具与经典的应用程序安全(AppSec)策略有机融合显得至关重要。
这包括但不限于:
▪︎ 在软件开发的全生命周期(SDLC)内实施细致入微的手动代码审查,确保每一行代码都经过严格把关。
▪︎ 推行严格的安全编码实践,引导开发者从源头规避风险;定期组织安全培训,提升团队的整体安全意识与应对能力。
▪︎ 借助静态应用程序安全测试工具(SAST)以及软件成分分析工具(SCA),在开发早期(特别是集成开发环境IDE中代码生成的初始阶段)捕捉并修复潜在的安全隐患。
鉴于生成式AI的运作机制,积极修复并维护代码库的安全状态变得尤为重要。因为代码基础中的漏洞越少,AI助手在模仿学习过程中复制这些漏洞的可能性也就越低。这不仅是对代码质量的追求,更是对最终用户数据安全与隐私保护的负责态度。
通过这一系列的努力,我们能够在享受AI带来的编程便利的同时,也牢牢守护住软件应用的安全防线。
版权归原作者 网安加社区 所有, 如有侵权,请联系我们删除。