当前位置: 首页 > 科技观察

40%高危漏洞!GitHubCopilot生成的代码是不可靠的

时间:2023-03-17 11:32:39 科技观察

垃圾输入,垃圾输出。如果你写的开源代码输入到代码生成工具Copilot中,会不会影响它的生成性能?纽约大学的研究人员最近发现,Copilot生成的代码中有超过40%包含高危漏洞。原因是GitHub提供的源代码本身就有漏洞!随着AI技术的不断进步,程序员们似乎不仅仅想取代传统行业的人,也在积极思考如何取代自己。AI研究者更喜欢“自动代码生成”。结对编程是一种敏捷软件开发方法,其中两个程序员在一台计算机上一起工作。一个人输入代码,而另一个人检查他输入的每一行代码。输入代码的人称为驱动程序,审查代码的人称为观察者(或领航员),两个程序员经常互换角色。审查代码的人有时也扮演着“小黄鸭”的角色。作用就是耐心地听驱动给自己讲解每一行程序的作用,不用说话就能启发驱动,也有助于发现bug。如果观察者是一个AI,想象一下如果有一个AI助手和你结对编程会是什么感觉?今年6月,OpenAI与GitHub联合发布了一款新工具GitHubCopilot,一时风头正劲。只要写注释,后面代码的内容基本都能预测正确,尤其是像utils这样的函数。方便的。但后来GitHubCopilot卷入了各种伦理风波。有人认为他是在背代码,也有人认为这可能会让用户无意中抄袭其他程序员的劳动成果。最重要的是GitHubCopilot是收费的,网友认为既然你用的是开源代码训练出来的模型,怎么收费呢?除了上述问题,Copilot的安全性如何?你能生产出让人放心、让人放心的好代码吗?对此,纽约大学的研究人员最近发表了一篇论文,对Copilot进行了系统的实验,通过设计场景让Copilot完成,并通过分析生成代码的安全弱点来洞察这些问题。论文地址:https://arxiv.org/pdf/2108.09293v2.pdfgarbagein,garbageout?代码的好坏由很多因素决定,但代码生成(codegeneration)强调的是功能的正确性,衡量的是能否正常编译和单元测试,或者用文本相似性度量来衡量关系在代码和预期代码之间。不同之处。与生成代码的功能正确性指标不同,评估Copilot提供的代码的安全性是一个没有具体解决方案的开放性问题。除了人工进行人工评估外,还可以使用其他工具和技术对软件进行安全分析,例如源代码分析工具、静态应用程序安全测试(StaticApplicationSecurityTesting,SAST)工具,可以发现代码安全漏洞,以及可用于识别特定类型的漏洞。在使用Copilot时,当用户在程序中添加一行代码时,Copilot会不断扫描程序并定期上传一些代码、光标位置和代码元数据,然后根据这些特征生成一些候选代码选项供用户插入.Copilot可以生成与程序功能相关的代码,例如注释、文档字符串、函数名称等。Copilot还可以对每个候选代码的置信度进行评分。在了解了如何使用Copilot之后,您需要定义问题:如果一段代码包含CWE中显示的特征,那么这段代码是易受攻击的(vulnerable)。CWE(CommonWeaknessEnumeration)成立于2006年,是美国国土安全部国家计算机安全部资助的软件安全战略项目。它是一个通用的源代码漏洞字典和通用标准。使用GithubCodeQL分析静态代码。上图中的代码是使用Copilot的topscoringoption构建代码程序,使用CodeQL的python-security-and-quality.qls测试套件检查了153个安全属性,可以发现其中存在漏洞报告SQL查询生成方法(第14-16页),这可能允许用户插入恶意SQL代码,在CWE术语中是CWE-89(SQL注入)。然后研究人员通过引导Copilot生成2021CWETop25相关漏洞进行了实验。首先,针对每一个CWE漏洞,记下多个相关的代码提示(CWE场景),然后将这些不完整的代码片段输入Copilot生成代码。为了简化实验过程,主要测试了Python、C和Verilog三种语言。CodeQL可以完美检测Python和C代码。之所以选择Verilog,是为了测试Copilot对非明星语言的代码生成能力。对于每个代码片段,Copilot会生成25个完成代码,然后将每个候选代码与原始程序片段组合成一个完整代码。如果某些选项存在重大语法问题,即无法编译/解析,则将被丢弃。4b中的一些候选代码。如果简单的编辑操作(例如添加或删除单个大括号)产生可编译的输出,基于正则表达式的工具可以自动执行这些更改。在步骤5a中,使用CodeQL的内置查询来评估每个程序。对于一些需要额外代码上下文或无法形成CodeQL可检查属性的CWE,需要手动执行5c。在此步骤中,CodeQL配置为仅检查特定的CWE,不评估正确性,仅评估漏洞。输出第6步的评估结果。论文中有25个CWE漏洞的详细实验描述,感兴趣的朋友可以点击原文。40.48%是BUG实验结果普遍不理想。从安全角度来看,Copilot生成的代码存在大量漏洞,约为40.48%。由于Copilot的训练数据来自于GitHub上可用的开源代码的训练,相信这种安全质量评估在一定程度上也适用于GitHub中的代码。也就是说,当某些错误在开源存储库中频繁出现时,这些错误也更有可能由Copilot生成。话虽如此,人们不应该对GitHub上存储的开源存储库的安全质量下结论。开源软件的另一个需要考虑的安全质量方面是时间的影响。随着网络安全形势的发展,一些文章中提到的最佳实践(bestpractice)可能会慢慢成为反面教材,过时的实践可能会永久存在于训练数据中导致生成的代码不可靠。一个明显的例子是用于加密哈希的DOWCWE-522方案,不久前MD5被认为是安全的,而SHA-256被认为是安全的,但现在的最佳实践仍然要么涉及多轮简单的哈希函数,要么使用老化的加密库像bcrypt(优雅,但也很古老)。未维护和遗留代码也使用不安全的散列方法,Copilot从这些代码中吸取教训,因此会继续建议程序员使用这些散列方法。最后,研究人员称赞了Copilot。这样的下一代AutoComplete工具将提高软件开发人员的工作效率,但开发人员在使用Copilot作为结对编程的副驾驶时仍应保持警惕。理想情况下,Copilot应在训练和生成期间使用安全工具,以最大限度地降低引入安全漏洞的风险。