整理 | 屠敏
出品 | CSDN(ID:CSDNnews)
GitHub Copilot 作为基于大模型语言的代码自动生成工具,自推出以来,受到了无数程序员的欢迎,其纷纷表示,终于有了不用加班的代码神器!
根据 CSDN 最新发起的《2023 AI 开发者生态调研问卷》中期收集的数据显示,已有 90% 的受访者表示在生产、测试、娱乐等不同场景使用了代码生成工具,其中 35% 的受访者称每天都在使用。
然而,需要注意的是,这些代码工具在提升工作效率之余,你是否想过,它带来的是福还是祸?生成的代码在「拿来即用」的基础上,真的安全吗?
近日,为了研究 Copilot 生成代码的安全性,来自武汉大学、华中师范大学、新西兰梅西大学、皇家墨尔本理工大学的六位高校研究员进行了一项关于 GitHub 上 Copilot 生成代码安全漏洞的实证研究,并发表了一篇主题为《Security Weaknesses of Copilot Generated Code in GitHub》的学术论文,最新揭晓了未来“动嘴即可完成编码”的 AI 编程神器的安全性。
论文地址:https://browse.arxiv.org/pdf/2310.02059.pdf
样本:生产环境中 435 段代码、覆盖 6 种主流编程语言
在实验过程中,研究人员从 GitHub 的公开项目中选取了 435 段由 GitHub Copilot 生成的代码片段,涵盖了 Python、JavaScript、Java、C++、Go 和 C# 多种主流编程语言。
与此同时,其采用了支持多种语言(包括 Java、JavaScript、C++、C# 和 Python)的开源静态分析工具 CodeQL,对代码片段进行安全扫描和分析,并使用常见漏洞枚举(CWE)分类代码段中的安全漏洞。
进而,研究人员基于下列研究流程,从三个维度提出了需要研究、验证的问题。
RQ1:GitHub 项目中的 Copilot 生成代码安全吗?
提出此问题的理由:Copilot 可能会生成包含安全漏洞的代码建议,而开发人员可能会接受这些建议,从而可能使程序容易受到攻击。RQ1 的答案有助于理解开发人员在生产中使用 Copilot 时遇到安全漏洞的频率。
RQ2:Copilot 生成的代码段中存在哪些安全漏洞?
提出此问题的理由:Copilot 生成的代码可能包含安全漏洞,开发人员在接受 Copilot 生成的代码之前,应进行严格的安全审查。正如 GitHub Copilot 的文档所明确的“Copilot 的用户有责任确保其代码的安全性和质量”。RQ2 的答案可以帮助开发人员更好地了解 Copilot 生成代码中的可能安全漏洞,从而可以更有效地防止和修复这些漏洞。
RQ3:有多少安全漏洞属于 MITRE CWE Top-25?
提出此问题的理由:该列表包含 25 个最危险的安全漏洞。RQ3 的答案可以帮助开发人员了解 Copilot 生成的代码是否包含被广泛认可的安全漏洞类型以及 Copilot 处理这些最常见漏洞的能力。
第一步:识别 GitHub 上「真」AI 生成的代码
之所以想要以 GitHub 作为回答研究问题的主要数据源,在研究人员看来,GitHub 包含了数百万公开代码库,可以访问大量代码资源,使其可以在研究中覆盖多种编程语言和项目类型。
然而,想要直接获取到 GitHub 中由 Copilot 生成的代码实则并不容易,因为即使有很多工具辅助,也难辨代码是出自 AI 还是人类工程师之手。
面对这种窘境,6 位研究人员选择通过搜索存储库描述和代码中提供的注释来识别许多代码段,譬如以“by GitHub Copilot”、“use GitHub Copilot”和“with GitHub Copilot”等关键词来搜索,最终得到了如下结果:
继而又从代码标签获得的不同语言类型的搜索结果数量:
接下来,进入过滤环节。在此,研究人员在论文中指出其主要遵循了三条规则:
1. 对于存储库标签下的搜索结果,在研究人员根据项目描述或相关自述文件中的声明,确定哪些是完全由 Copilot 生成的项目。进而,其保留了 Python、JavaScript、Java、C++、C# 和 Go 等 Copilot 支持的主要语言的代码文件。
2. 对于代码标签下的搜索结果,其保留显示代码由 Copilot 生成的文件注释。
3. 此次研究对象主要为实际项目中使用的代码片段,为此,会排除如 LeetCode 平台上用于解决简单算法问题的代码文件。
在完成试点数据标注后,论文的第一作者检查了其余搜索结果,并获得了总共 465 个代码片段。删除重复结果后,最后获得了 435 个不同的代码片段。其中 249 个来自存储库标签,186 个来自代码标签,详细如下所述:
第二步:数据分析
在测试环节中,研究人员为了提高结果的覆盖面和准确性,对每个代码段使用两种静态分析工具进行安全检查(即 CodeQL 加上特定语言的专用工具)。
在本研究中,研究人员首先使用 CodeQL 分析数据集中的代码。CodeQL 标准查询包中的默认查询套件为 codeql-suites /-code-scanning.qls。每个包的 codeql-suite 目录中都包含几个有用的查询套件。
同时,其使用了与安全弱点相关的 -security-and-quality.qls 测试套件扫描代码段。这些测试套件可以检查多个安全属性,涵盖许多CWE。例如:Python 测试套件提供了 168 项安全检查;JavaScript 测试套件提供了 203 项安全检查;C++ 测试套件提供了 163 项安全检查。
除此之外,研究员为每个编程语言选择了其他流行的静态安全分析工具对文件进行扫描。譬如,Python 使用 Bandit、JavaScript 使用 ESLint、C++ 使用 Cppcheck、Java 使用 Findbugs、C# 使用 Roslyn、Go 使用 Gosec。如果无法直接从扫描结果中获取与安全问题相关的 CWE ID,研究人员还会手动映射扫描结果提供的安全属性到相应的 CWE。
35.8% 的代码段有安全漏洞、C++ 代码漏洞最多、覆盖 42 种 CWE 类型
经过分析,研究人员基于上述提出的三个问题,得到了最终结论。
RQ1:GitHub 项目中的 Copilot 生成代码安全吗?
在 435 个由 Copilot 生成的代码段中,有 35.8% 包含安全漏洞,不管使用哪种编程语言,都会产生安全问题。
Python 和 JavaScript 代码中安全漏洞的比例略高,这些是开发者最常使用 Copilot 的语言。在收集的 251 个 Python 代码段中,有 39.4% 存在安全风险。在 79 个 JavaScript 代码段中,有 27.8% 存在安全风险。在所有编程语言中,C++ 代码段中安全漏洞的比例最高,达到 46.1%。Go 的安全风险比例也相对较高,为 45.0%。相比之下,C# 和 Java 代码中安全问题文件的比例较低,分别为 25% 和 23.2%。
RQ2:Copilot 生成的代码段中存在哪些安全漏洞?
为了回答 RQ2,研究员处理了 RQ1 进行的扫描结果,消除了在同一代码段位置检测到的重复安全问题。最终总共在 435 个代码段中识别出 600 个安全漏洞。
这些检测到的安全漏洞类型多样,与 42 个不同的 CWE 相关,其中 CWE-78(操作系统命令注入)、CWE-330(使用不安全的随机值漏洞)和 CWE-703(对异常条件检查或处理不恰当)出现频率最高。
RQ3:有多少安全漏洞属于 MITRE CWE Top-25?
在识别的 42 个 CWE 中,有 11 个属于目前公认的 2022 年 CWE Top-25 大漏洞。
写在最后
对此,也有网友调侃,自己写 Bug 的本领可能要比 GitHub Copilot 更高一些。
当然,本研究并非旨在劝说开发者不要在日常工作中使用 AI 辅助编码工具,而是想要表明在实际开发中使用 Copilot 生成代码能提高开发效率之时,也提醒大家自行进行安全评估。
同时,在接受 Copilot 的代码建议时运行适当的安全检查,有效避免一些潜在风险,降低损失。
更多详细内容,见论文:https://browse.arxiv.org/pdf/2310.02059.pdf
领取专属 10元无门槛券
私享最新 技术干货