使用AI编码,这些安全风险你真的了解吗?
前言
随着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带来的编程便利的同时,也牢牢守护住软件应用的安全防线。
相关文章:
使用AI编码,这些安全风险你真的了解吗?
前言 随着AI技术的飞速发展与普及,企业开发人员对AI编码助手工具如Copilot的依赖度日益增强,使用AI编码助手工具虽然能显著提升编程效率与质量,但同时也存在一系列的潜在风险。 许多开发人员可能未意识到,如果他们的现有代码库中…...
计算机网络实验一:组建对等网络
实验一 组建对等网络 实验要求: 1. 组建对等网络,会在命令行使用ipconfig,两网络能够相互ping通,尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer,模拟组建对等网并测试对等网 1、组建对等网络 连…...
R语言绘制折线图
折线图是实用的数据可视化工具,通过连接数据点的线段展示数据随时间或变量的变化趋势。在经济、科学、销售及天气预报等领域广泛应用,为决策和分析提供依据。它能清晰呈现经济数据动态、助力科学研究、反映企业销售情况、预告天气变化,以简洁…...
基于组合模型的公交交通客流预测研究
摘 要 本研究致力于解决公交客流预测问题,旨在通过融合多种机器学习模型的强大能力,提升预测准确性,为城市公交系统的优化运营和交通管理提供科学依据。研究首先回顾了公交客流预测领域的相关文献,分析了传统统计方法在处理大规…...
docker环境redis启动失败
现象: 查看日志错误为 Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 经查询为aof文件损坏导致,修复aof即可 解决方法: 1.查看执行的docker命令&…...
Pandas库详细学习要点
Pandas库是一个基于Python的数据分析库,它提供了丰富的数据结构和数据分析工具,非常适合数据科学和数据分析领域的工作。以下是Pandas库详细学习的一些要点: 1. 数据结构 - Series:一维带标签数组,类似于NumPy中的一…...
光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输
自动驾驶技术正快速演进,对实时数据处理能力的需求激增。光路科技推出的TSN(时间敏感网络)交换机,在比亚迪最新车型中的成功应用,显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…...
【含开题报告+文档+PPT+源码】基于SpringBoot的社区家政服务预约系统设计与实现【包运行成功】
开题报告 社区家政服务是满足居民日常生活需求的重要组成部分,在现代社会中发挥着越来越重要的作用。随着城市化进程的不断加速,社区家政服务需求量呈现持续增长的趋势。然而,传统的家政服务模式存在一些问题,如预约流程繁琐、信…...
2024最新【Pycharm】史上最全PyCharm安装教程,图文教程(超详细)
1. PyCharm下载安装 完整安装包下载(包含Python和Pycharm专业版注册码):点击这里 1)访问官网 https://www.jetbrains.com/pycharm/download/#sectionwindows 下载「社区版 Community」 安装包。 2)下载完成后&#…...
llama3 implemented from scratch 笔记
github地址:https://github.com/naklecha/llama3-from-scratch?tabreadme-ov-file 分词器的实现 from pathlib import Path import tiktoken from tiktoken.load import load_tiktoken_bpe import torch import json import matplotlib.pyplot as plttokenizer_p…...
照片在线转成二维码展示,更方便分享图片的好办法
怎么能把照片生成二维码后,分享给其他人展示呢?现在很多人为了能够更方便的将自己的图片展现给其他人会使用生成二维码的方式,将图片存储到云空间,通过扫码调取图片查看内容。与其他方式相比,这样会更加的方便…...
『网络游戏』登陆协议制定客户端发送账号密码CMD【19】
修改服务器脚本:ServerSession 修改服务器脚本:GameMsg 修改客户端脚本:ClientSession.cs 修改客户端脚本:NetSvc.cs 修改客户端脚本:WindowRoot.cs 修改客户端脚本:SystemRoot.cs 修改客户端脚本ÿ…...
独享动态IP是什么?它有什么独特优势吗?
在网络世界中,IP地址扮演着连接互联网的关键角色。随着互联网的发展,不同类型的IP地址也应运而生,其中独享动态ip作为一种新型IP地址,备受关注。本文将围绕它的定义及其独特优势展开探讨,以帮助读者更好地理解和利用这…...
gaussdb hccdp认证模拟题(单选)
1.在GaussDB逻辑架构中,由以下选项中的哪一个组件来负责提供集群日常运维、配置管理的管理接口、工具?(1 分) A. CN B. DN C. GTM D. OM --D 2.在以下命令中,使用以下哪一个选项中的命令可以以自定义归档形式导出表t1的定义…...
【斯坦福CS144】Lab1
一、实验目的 1.实现一个流重组器——一个将字节流的小块 (称为子串或段 )按正确顺序组装成连续的字节流的模块; 2.深入理解 TCP 协议的工作方式。 二、实验内容 编写一个名为"StreamReassembler"的数据结构,它负责…...
药箱里的药及其常见药的作用
药箱里有常备药,经常买药,但是忘了自己有什么药。容易之间弄混,以此作为更新存储的媒介。 1、阿莫西林胶囊 处方药 是指需要由医师或者医疗人员开局处方才能购买的药物(常见的OTC是非处方药的意思)。 截止时间 2024 10/10 药品资料汇总&am…...
Android屏幕旋转流程(2)
(1)疑问 (1)settings put system user_rotation 1是什么意思? 答:设置用户期望的屏幕转向,0代表:Surface.ROTATION_0竖屏;1代表:Surface.ROTATION_90横屏&a…...
gaussdb hccdp认证模拟题(判断)
1.在事务ACID特性中,原子性指的是事务必须始终保持系统处于一致的状态。(1 分) 错。 2.某IT公司在开发软件时,需要使用GaussDB数据库,因此需要实现软件和数据的链接,而DBeaver是一个通用的数据库管理工具和 SQL 客户端ÿ…...
高效架构设计:JPA 实现单据管理,MyBatis 赋能报表查询的最佳实践
在现代企业应用开发中,数据持久层的设计与实现是至关重要的部分。开发者常常会面临选择如何合理地使用不同的数据访问框架,以最大限度地提升系统性能和开发效率。本文将讨论一种有效的搭配方案:使用 JPA 处理单据的增删改查操作,使…...
深入理解 CSS 浮动(Float):详尽指南
“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言文章有误敬请斧正 不胜感恩!目录1. 什么是 CSS 浮动?2. CSS 浮动的历史背景3. 基本用法float 属性值浮动元素的行为 4. 浮动对文档流的影响5. 清除浮动clear 属性清除浮动的技巧1. 使用…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
